View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.common.ui.client.configurable.mvc.binding;
17  
18  import org.kuali.student.common.ui.client.configurable.mvc.multiplicity.MultiplicityGroupItem;
19  import org.kuali.student.common.ui.client.configurable.mvc.sections.Section;
20  import org.kuali.student.common.ui.client.configurable.mvc.sections.SectionBinding;
21  import org.kuali.student.common.ui.client.mvc.DataModel;
22  import org.kuali.student.r1.common.assembly.data.QueryPath;
23  
24  import com.google.gwt.core.client.GWT;
25  import com.google.gwt.user.client.ui.Widget;
26  
27  /**
28   * This binding simply adds an index key to the multiplicity item's parent path and then calls the binding ModelWidgetBinding
29   * of the underlying multiplicity item's widget.
30   *
31   * @author Kuali Student Team
32   */
33  public class MultiplicityGroupItemBinding extends ModelWidgetBindingSupport<MultiplicityGroupItem> {
34      public static MultiplicityGroupItemBinding INSTANCE = new MultiplicityGroupItemBinding();
35  
36      protected static final String RT_CREATED = "_runtimeData" + QueryPath.getPathSeparator() + "created";
37      protected static final String RT_UPDATED = "_runtimeData" + QueryPath.getPathSeparator() + "updated";
38      protected static final String RT_DELETED = "_runtimeData" + QueryPath.getPathSeparator() + "deleted";
39  
40      private MultiplicityGroupItemBinding() {};
41  
42      /**
43       * @see ModelWidgetBindingSupport#setModelValue(Object,
44       *      org.kuali.student.common.ui.client.mvc.DataModel, String)
45       */
46      @Override
47      public void setModelValue(MultiplicityGroupItem multiplicityItem, DataModel model, String path) {
48          String itemPath = QueryPath.concat(path, String.valueOf(multiplicityItem.getItemKey())).toString();
49      	String itemRuntimePath = itemPath;
50          Widget widget = multiplicityItem.getItemWidget();
51          
52          boolean multiplicityItemIsDirty = false;
53          if (widget instanceof Section) {        	
54          	if (((Section)widget).isDirty()){
55          		//Only update model if multiplicity section is dirty.
56  	        	itemPath = "";
57  	            SectionBinding.INSTANCE.setModelValue((Section) widget, model, itemPath);
58  	            multiplicityItemIsDirty = true;
59          	} 
60          } else if (widget instanceof ModelWidgetBinding) {
61              ((ModelWidgetBinding) widget).setModelValue(widget, model, path);
62              multiplicityItemIsDirty = true;
63          } else {
64              GWT.log(itemPath + " has no widget binding.", null);
65          }
66  
67          // Multiplicity metadata?
68         if (multiplicityItemIsDirty || multiplicityItem.isDeleted()){
69  	        QueryPath qPath;
70  	        if (multiplicityItem.isCreated()) {
71  	            qPath = QueryPath.parse(itemRuntimePath + QueryPath.getPathSeparator() + RT_CREATED);
72  	        } else if (multiplicityItem.isDeleted()) {
73  	            qPath = QueryPath.parse(itemRuntimePath + QueryPath.getPathSeparator() + RT_DELETED);
74  	        } else {
75  	            qPath = QueryPath.parse(itemRuntimePath + QueryPath.getPathSeparator() + RT_UPDATED);
76  	        }
77  	        try {
78  	            Boolean oldValue = model.get(qPath);
79  	            Boolean newValue = true;
80  	            if (!nullsafeEquals(oldValue, newValue)) {
81  	                model.set(qPath, newValue);
82  	                setDirtyFlag(model, qPath);
83  	            }
84  	        } catch (IllegalArgumentException e) {
85  	            // model.get(qPath) will throw this exception if there is no such path
86  	            GWT.log("Warning: Ignoring error attempting to setValue for " + widget.getClass().getName() + " path: " + qPath, e);
87  	        }
88         }
89  
90      }
91  
92      /**
93       * @see ModelWidgetBindingSupport#setWidgetValue(Object,
94       *      org.kuali.student.common.ui.client.mvc.DataModel, String)
95       */
96      @Override
97      public void setWidgetValue(MultiplicityGroupItem multiplicityItem, DataModel model, String path) {
98  //        String itemPath = path + QueryPath.getPathSeparator() + multiplicityItem.getItemKey();
99          String itemPath ="";
100         Widget widget = multiplicityItem.getItemWidget();
101         if (widget instanceof Section) {
102             SectionBinding.INSTANCE.setWidgetValue((Section) widget, model, itemPath);
103         } else if (widget instanceof ModelWidgetBinding) {
104             ((ModelWidgetBinding) widget).setWidgetValue(widget, model, path);
105         } else {
106             GWT.log(itemPath + " has no widget binding.", null);
107         }
108 
109         multiplicityItem.setCreated(false);
110         multiplicityItem.setCreated(false);
111     }
112 
113 
114 }