Coverage Report - org.kuali.student.lum.lu.ui.tools.client.configuration.ClusetView
 
Classes in this File Line Coverage Branch Coverage Complexity
ClusetView
0%
0/137
0%
0/34
1.667
ClusetView$1
0%
0/7
N/A
1.667
ClusetView$1$1
0%
0/8
0%
0/2
1.667
ClusetView$2
0%
0/4
N/A
1.667
ClusetView$3
0%
0/20
0%
0/12
1.667
ClusetView$4
0%
0/3
N/A
1.667
ClusetView$5
0%
0/6
0%
0/6
1.667
ClusetView$CluSetsManagementViews
0%
0/5
N/A
1.667
ClusetView$Picker
0%
0/13
N/A
1.667
 
 1  
 package org.kuali.student.lum.lu.ui.tools.client.configuration;
 2  
 
 3  
 import java.util.Date;
 4  
 import java.util.List;
 5  
 
 6  
 import org.kuali.student.common.ui.client.application.Application;
 7  
 import org.kuali.student.common.ui.client.application.KSAsyncCallback;
 8  
 import org.kuali.student.common.ui.client.configurable.mvc.FieldDescriptor;
 9  
 import org.kuali.student.common.ui.client.configurable.mvc.FieldDescriptorReadOnly;
 10  
 import org.kuali.student.common.ui.client.configurable.mvc.SectionTitle;
 11  
 import org.kuali.student.common.ui.client.configurable.mvc.binding.ModelWidgetBinding;
 12  
 import org.kuali.student.common.ui.client.configurable.mvc.binding.ModelWidgetBindingSupport;
 13  
 import org.kuali.student.common.ui.client.configurable.mvc.sections.Section;
 14  
 import org.kuali.student.common.ui.client.configurable.mvc.sections.VerticalSection;
 15  
 import org.kuali.student.common.ui.client.configurable.mvc.views.VerticalSectionView;
 16  
 import org.kuali.student.common.ui.client.mvc.Callback;
 17  
 import org.kuali.student.common.ui.client.mvc.Controller;
 18  
 import org.kuali.student.common.ui.client.mvc.DataModel;
 19  
 import org.kuali.student.common.ui.client.mvc.DataModelDefinition;
 20  
 import org.kuali.student.common.ui.client.mvc.history.HistoryManager;
 21  
 import org.kuali.student.common.ui.client.widgets.KSDatePicker;
 22  
 import org.kuali.student.common.ui.client.widgets.KSLabel;
 23  
 import org.kuali.student.common.ui.client.widgets.KSTextArea;
 24  
 import org.kuali.student.common.ui.client.widgets.field.layout.element.MessageKeyInfo;
 25  
 import org.kuali.student.common.ui.client.widgets.headers.KSDocumentHeader;
 26  
 import org.kuali.student.common.ui.client.widgets.search.KSPicker;
 27  
 import org.kuali.student.common.ui.client.widgets.search.SelectedResults;
 28  
 import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableFieldBlock;
 29  
 import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableFieldRow;
 30  
 import org.kuali.student.common.ui.client.widgets.table.summary.SummaryTableSection;
 31  
 import org.kuali.student.core.assembly.data.LookupMetadata;
 32  
 import org.kuali.student.core.assembly.data.Metadata;
 33  
 import org.kuali.student.core.assembly.data.QueryPath;
 34  
 import org.kuali.student.lum.common.client.lu.LUUIConstants;
 35  
 import org.kuali.student.lum.common.client.widgets.CluSetDetailsWidget;
 36  
 import org.kuali.student.lum.common.client.widgets.CluSetEditorWidget;
 37  
 import org.kuali.student.lum.common.client.widgets.CluSetManagementRpcService;
 38  
 import org.kuali.student.lum.common.client.widgets.CluSetManagementRpcServiceAsync;
 39  
 import org.kuali.student.lum.common.client.widgets.CluSetRetriever;
 40  
 import org.kuali.student.lum.common.client.widgets.CluSetRetrieverImpl;
 41  
 
 42  
 import com.google.gwt.core.client.GWT;
 43  
 import com.google.gwt.dom.client.Style;
 44  
 import com.google.gwt.event.dom.client.ClickEvent;
 45  
 import com.google.gwt.event.dom.client.ClickHandler;
 46  
 import com.google.gwt.i18n.client.DateTimeFormat;
 47  
 import com.google.gwt.user.client.Window;
 48  
 import com.google.gwt.user.client.rpc.AsyncCallback;
 49  
 import com.google.gwt.user.client.ui.Anchor;
 50  
 import com.google.gwt.user.client.ui.HasText;
 51  
 import com.google.gwt.user.client.ui.SimplePanel;
 52  
 import com.google.gwt.user.client.ui.Widget;
 53  
 
 54  0
 public class ClusetView extends VerticalSectionView {
 55  
 
 56  0
     private CluSetManagementRpcServiceAsync cluSetManagementRpcServiceAsync = GWT.create(CluSetManagementRpcService.class);
 57  0
     private CluSetRetriever cluSetRetriever = new CluSetRetrieverImpl();
 58  
     private DataModelDefinition modelDefinition;
 59  
     private DataModelDefinition searchDefinition;
 60  
     private String selectedCluSetId;
 61  
     private CluSetsManagementViews viewEnum;
 62  0
     private SimplePanel cluSetDisplay = new SimplePanel();
 63  
     private CluSetEditorWidget cluSetEditor;
 64  
     private String cluSetType;
 65  
 
 66  0
     public enum CluSetsManagementViews {
 67  0
         MAIN,
 68  0
         CREATE,
 69  0
         EDIT,
 70  0
         VIEW
 71  
     }
 72  
     
 73  
     public ClusetView(CluSetsManagementViews clusetViewEnum, String name, String modelId, final Callback<Boolean> onReady) {
 74  0
         this(clusetViewEnum, name, modelId, false, onReady);
 75  0
     }
 76  
 
 77  
     public ClusetView(final CluSetsManagementViews clusetViewEnum, String name, String modelId, boolean showTitle, final Callback<Boolean> onReady) {
 78  0
         super(clusetViewEnum, name, modelId, showTitle);
 79  0
         cluSetType = "kuali.cluSet.type.CreditCourse";
 80  0
         if (clusetViewEnum == CluSetsManagementViews.CREATE ||
 81  
                 clusetViewEnum == CluSetsManagementViews.EDIT) {
 82  0
             cluSetEditor = new CluSetEditorWidget(
 83  
                     new CluSetRetrieverImpl(),
 84  
                     clusetViewEnum, name, modelId, true, null,
 85  
                     cluSetType, false);
 86  
         }
 87  0
         viewEnum = clusetViewEnum;
 88  0
         cluSetManagementRpcServiceAsync.getMetadata("courseSet", null, new KSAsyncCallback<Metadata>(){
 89  
             @Override
 90  
             public void handleFailure(Throwable caught) {
 91  0
                 Window.alert("Failed to retrieve cluset definition");
 92  0
             }
 93  
             @Override
 94  
             public void onSuccess(Metadata result) {
 95  0
                 DataModelDefinition def = new DataModelDefinition(result);
 96  0
                 setModelDefinition(def);
 97  0
                 cluSetManagementRpcServiceAsync.getMetadata("search", null, new AsyncCallback<Metadata>() {
 98  
                     @Override
 99  
                     public void onFailure(Throwable caught) {
 100  0
                         Window.alert("Failed to retrieve searchDefinition");
 101  0
                     }
 102  
                     @Override
 103  
                     public void onSuccess(Metadata result) {
 104  0
                         setSearchDefinition(new DataModelDefinition(result));
 105  0
                         setupView(clusetViewEnum);
 106  0
                         if (onReady != null) {
 107  0
                             onReady.exec(new Boolean(true));
 108  
                         }
 109  0
                     }
 110  
                 });
 111  0
             }
 112  
         });
 113  0
     }
 114  
     
 115  
     private void setModelDefinition(DataModelDefinition modelDefinition) {
 116  0
         this.modelDefinition = modelDefinition;
 117  0
     }
 118  
     
 119  
     private void setSearchDefinition(DataModelDefinition searchDefinition) {
 120  0
         this.searchDefinition = searchDefinition;
 121  0
     }
 122  
     
 123  
     @Override
 124  
     public void beforeShow(Callback<Boolean> onReadyCallback) {
 125  0
         super.beforeShow(onReadyCallback);
 126  0
         if (viewEnum == CluSetsManagementViews.VIEW) {
 127  0
             refreshCluSetDisplay();
 128  
         }
 129  0
     }
 130  
     
 131  
     private void refreshCluSetDisplay() {
 132  0
         if (this.selectedCluSetId != null) {
 133  0
             CluSetDetailsWidget clusetDetailsWidget = 
 134  
                 new CluSetDetailsWidget(selectedCluSetId, cluSetRetriever);
 135  0
             cluSetDisplay.clear();
 136  0
             cluSetDisplay.setWidget(clusetDetailsWidget);
 137  
         }
 138  0
     }
 139  
     
 140  
     private void setupView(CluSetsManagementViews clusetViewEnum) {
 141  0
         if (clusetViewEnum == CluSetsManagementViews.CREATE ||
 142  
                 clusetViewEnum == CluSetsManagementViews.EDIT) {
 143  0
             setupCreateEditClusetView();
 144  0
         } else if (clusetViewEnum == CluSetsManagementViews.MAIN) {
 145  0
             setupMainView();
 146  0
         } else if (clusetViewEnum == CluSetsManagementViews.VIEW) {
 147  0
             setupViewClusetView();
 148  
         }
 149  0
     }
 150  
     
 151  
     @Override
 152  
     public void onHistoryEvent(String historyStack) {
 153  0
         super.onHistoryEvent(historyStack);
 154  0
         CluSetsManagementController cluSetsManagementController = 
 155  
             (CluSetsManagementController)getController();
 156  0
         selectedCluSetId = HistoryManager.getTokenMap(historyStack).get("docId");
 157  0
         cluSetsManagementController.getMainView().setSelectedCluSetId(selectedCluSetId);
 158  0
         cluSetsManagementController.showView(CluSetsManagementViews.VIEW);
 159  0
     }
 160  
 
 161  
     private void setupViewClusetView() {
 162  0
         Anchor editCluSet = new Anchor("Edit Course Set");
 163  0
         editCluSet.addClickHandler(new ClickHandler() {
 164  
             @Override
 165  
             public void onClick(ClickEvent event) {
 166  0
                 Controller parentController = getController();
 167  0
                 parentController.showView(CluSetsManagementViews.EDIT);
 168  0
             }
 169  
         });
 170  0
         this.addWidget(editCluSet);
 171  0
         Section generalClusInfoSection = new VerticalSection();
 172  0
         KSLabel cluSetTitle = new KSLabel();
 173  0
         cluSetTitle.getElement().getStyle().setProperty("fontWeight", "bold");
 174  0
         cluSetTitle.getElement().getStyle().setProperty("fontSize", "16px");
 175  0
         cluSetTitle.getElement().getStyle().setProperty("borderBotton", "1px solid #D8D8D8");
 176  
         
 177  0
         addField(generalClusInfoSection, 
 178  
                 ToolsConstants.CLU_SET_NAME_FIELD, 
 179  
                 null,
 180  
                 cluSetTitle,
 181  
                 null);
 182  
 //        addField(generalClusInfoSection, 
 183  
 //                ToolsConstants.CLU_SET_DESCRIPTION_FIELD, 
 184  
 //                generateMessageInfo(ToolsConstants.DESCRIPTION),
 185  
 //                new KSLabel(),
 186  
 //                null);
 187  
 //        addField(generalClusInfoSection, 
 188  
 //                ToolsConstants.CLU_SET_EXP_DATE_FIELD, 
 189  
 //                generateMessageInfo(ToolsConstants.EXPIRATION_DATE),
 190  
 //                new KSLabel(),
 191  
 //                null);
 192  0
         this.addSection(setupGeneralClusInfoSection());
 193  
 //        this.addSection(generalClusInfoSection);
 194  0
         this.addWidget(new KSLabel("Items in this Course Set"));
 195  0
         this.addWidget(cluSetDisplay);
 196  0
         this.setStyleName("standard-content-padding");
 197  0
     }
 198  
     
 199  
     private SummaryTableSection setupGeneralClusInfoSection() {
 200  0
         SummaryTableSection result = new SummaryTableSection(getController());
 201  0
         result.setEditable(false);
 202  
 
 203  0
         SummaryTableFieldBlock block = new SummaryTableFieldBlock();
 204  
 //        block.addEditingHandler(new EditHandler(CourseSections.COURSE_INFO));
 205  
 //        block.setTitle(getLabel(LUConstants.INFORMATION_LABEL_KEY));
 206  0
         block.addSummaryTableFieldRow(getFieldRow(ToolsConstants.CLU_SET_DESCRIPTION_FIELD, generateMessageInfo(ToolsConstants.DESCRIPTION)));
 207  0
         SummaryTableFieldRow expDateRow = getFieldRow(ToolsConstants.CLU_SET_EXP_DATE_FIELD,
 208  
                 generateMessageInfo(ToolsConstants.EXPIRATION_DATE), null, null, null, 
 209  0
                 new ModelWidgetBindingSupport<HasText>() {
 210  
                     public String dateToString(Date date) {
 211  0
                         String result = null;
 212  0
                         DateTimeFormat format = DateTimeFormat.getFormat("MM/dd/yyyy");
 213  0
                         result = format.format(date);
 214  
 
 215  0
                         return result;        
 216  
                     }
 217  
                     @Override
 218  
                     public void setModelValue(HasText widget, DataModel model, String path) {
 219  
                         // not implementing here since this value should not be edited through this widget
 220  0
                     }
 221  
 
 222  
                     @Override
 223  
                     public void setWidgetValue(HasText widget, DataModel model, String path) {
 224  
                         try {
 225  0
                             QueryPath qPath = QueryPath.parse(path);
 226  
                             
 227  0
                             Object value = null;
 228  0
                             if(model!=null){
 229  0
                                 value = model.get(qPath);
 230  
                             }
 231  
 
 232  0
                             if (value != null && widget != null) {
 233  0
                                 if (value instanceof Date) {
 234  0
                                     widget.setText(dateToString((Date) value));
 235  
                                 } else {
 236  0
                                     widget.setText(value.toString());
 237  
                                 }
 238  0
                             } else if (value == null && widget != null) {
 239  0
                                 widget.setText("");
 240  
                             }
 241  0
                         } catch (Exception e) {
 242  0
                             GWT.log("Error setting widget value for: " + path, e);
 243  0
                         }
 244  0
                     }
 245  
             
 246  
                 }
 247  
                 , false);
 248  0
         block.addSummaryTableFieldRow(expDateRow);
 249  
 
 250  0
         result.addSummaryTableFieldBlock(block);
 251  0
         return result;
 252  
     }
 253  
     
 254  
     protected SummaryTableFieldRow getFieldRow(String fieldKey, MessageKeyInfo messageKey) {
 255  0
         return getFieldRow(fieldKey, messageKey, null, null, null, null, false);
 256  
     }
 257  
     protected SummaryTableFieldRow getFieldRow(String fieldKey, MessageKeyInfo messageKey, boolean optional) {
 258  0
         return getFieldRow(fieldKey, messageKey, null, null, null, null, optional);
 259  
     }
 260  
 
 261  
     protected SummaryTableFieldRow getFieldRow(String fieldKey, MessageKeyInfo messageKey, Widget widget, Widget widget2, String parentPath, ModelWidgetBinding<?> binding, boolean optional) {
 262  0
         QueryPath path = QueryPath.concat(parentPath, fieldKey);
 263  0
         Metadata meta = modelDefinition.getMetadata(path);
 264  
 
 265  0
         FieldDescriptorReadOnly fd = new FieldDescriptorReadOnly(path.toString(), messageKey, meta);
 266  0
         if (widget != null) {
 267  0
             fd.setFieldWidget(widget);
 268  
         }
 269  0
         if(binding != null){
 270  0
             fd.setWidgetBinding(binding);
 271  
         }
 272  0
         fd.setOptional(optional);
 273  
 
 274  0
         FieldDescriptorReadOnly fd2 = new FieldDescriptorReadOnly(path.toString(), messageKey, meta);
 275  0
         if (widget2 != null) {
 276  0
             fd2.setFieldWidget(widget2);
 277  
         }
 278  0
         if(binding != null){
 279  0
             fd2.setWidgetBinding(binding);
 280  
         }
 281  0
         fd2.setOptional(optional);
 282  
 
 283  0
         SummaryTableFieldRow fieldRow = new SummaryTableFieldRow(fd,fd2);
 284  
 
 285  0
         return fieldRow;
 286  
     }
 287  
 
 288  
     private void setupMainView() {
 289  0
         this.addStyleName("blockLayout");
 290  0
         KSDocumentHeader header = new KSDocumentHeader();
 291  0
         header.setTitle("Course Set Management");
 292  0
         this.addWidget(header);
 293  
         
 294  0
         Anchor createCluSet = new Anchor("<h2 class=\"contentBlock-title\">Create Course Set</h2>", true);
 295  0
         createCluSet.addClickHandler(new ClickHandler() {
 296  
             @Override
 297  
             public void onClick(ClickEvent event) {
 298  0
                 getController().showView(CluSetsManagementViews.CREATE);
 299  0
             }
 300  
         });
 301  0
         this.addWidget(createCluSet);
 302  0
         this.addWidget(new KSLabel("Build a new Course set from courses, Course Sets, " +
 303  
                         "or specific criteria."));
 304  
 
 305  0
         Picker cluSetPicker = configureSearch(ToolsConstants.SEARCH_COURSE_SET);
 306  0
         cluSetPicker.addBasicSelectionCompletedCallback(new Callback<SelectedResults>() {
 307  
             @Override
 308  
             public void exec(SelectedResults result) {
 309  0
                 if (result != null && result.getReturnKey() != null && result.getReturnKey().trim().length() > 0) {
 310  0
                     selectedCluSetId = result.getReturnKey();
 311  0
                     Controller parentController = getController();
 312  0
                     parentController.showView(CluSetsManagementViews.VIEW);
 313  
                 }
 314  0
             }
 315  
         });
 316  0
         SectionTitle modifyCluSetTitle = SectionTitle.generateH2Title("View or Modify Course Sets");
 317  0
         modifyCluSetTitle.addStyleName("contentBlock-title");
 318  0
         modifyCluSetTitle.getElement().getStyle().setPaddingTop(40, Style.Unit.PX);
 319  0
         this.addWidget(modifyCluSetTitle);
 320  0
         this.addWidget(cluSetPicker);
 321  0
     }
 322  
     
 323  
     public String getSelectedCluSetId() {
 324  0
         return selectedCluSetId;
 325  
     }
 326  
 
 327  
     public void setSelectedCluSetId(String selectedCluSetId) {
 328  0
         this.selectedCluSetId = selectedCluSetId;
 329  0
     }
 330  
 
 331  
     private void setupCreateEditClusetView() {
 332  0
         String contextName = (cluSetType != null && cluSetType.equals("kuali.cluSet.type.Program"))?
 333  
                 "Program" : "Course";
 334  0
         VerticalSection defineCluSet = initSection(getH3Title(ToolsConstants.DEFINE_CLUSET + contextName), true);
 335  
 //        FieldDescriptor typeField = getFieldDescriptor(ToolsConstants.CLU_SET_TYPE_FIELD, null, null, null);
 336  
 //        typeField.getFieldWidget().setVisible(false);
 337  
 //        ((HasText)typeField.getFieldWidget()).setText("kuali.cluSet.type.CreditCourse");
 338  
 //        defineCluSet.addField(typeField);
 339  0
         addField(defineCluSet, ToolsConstants.CLU_SET_ORGANIZATION_FIELD, generateMessageInfo(ToolsConstants.ORGANIZATION), null, null);
 340  0
         addField(defineCluSet, ToolsConstants.CLU_SET_NAME_FIELD, generateMessageInfo(ToolsConstants.TITLE + contextName), null, null);
 341  0
         addField(defineCluSet, ToolsConstants.CLU_SET_DESCRIPTION_FIELD, generateMessageInfo(ToolsConstants.DESCRIPTION), new KSTextArea(), null);
 342  0
         addField(defineCluSet, ToolsConstants.CLU_SET_EFF_DATE_FIELD, generateMessageInfo(ToolsConstants.EFFECTIVE_DATE), new KSDatePicker(), null);
 343  0
         addField(defineCluSet, ToolsConstants.CLU_SET_EXP_DATE_FIELD, generateMessageInfo(ToolsConstants.EXPIRATION_DATE), new KSDatePicker(), null);
 344  
         
 345  0
         KSLabel spacer = new KSLabel();
 346  0
         spacer.setHeight("20px");
 347  0
         this.addSection(cluSetEditor);
 348  0
         this.addWidget(spacer);
 349  0
         this.addSection(defineCluSet);
 350  0
         this.setStyleName("standard-content-padding");
 351  0
     }
 352  
     
 353  
     private static VerticalSection initSection(SectionTitle title, boolean withDivider) {
 354  0
         VerticalSection section = new VerticalSection(title);
 355  0
         section.addStyleName(LUUIConstants.STYLE_SECTION);
 356  0
         if (withDivider)
 357  0
             section.addStyleName(LUUIConstants.STYLE_SECTION_DIVIDER);
 358  0
         return section;
 359  
     }
 360  
     
 361  
     private String getLabel(String labelKey) {
 362  0
         return Application.getApplicationContext().getUILabel("clusetmanagement", "clusetmanagement", "draft", labelKey);
 363  
     }
 364  
     
 365  
     private SectionTitle getH3Title(String labelKey) {
 366  0
         return SectionTitle.generateH3Title(getLabel(labelKey));
 367  
     }
 368  
     
 369  
     protected MessageKeyInfo generateMessageInfo(String labelKey) {
 370  0
         return new MessageKeyInfo("clusetmanagement", "clusetmanagement", "draft", labelKey);
 371  
     }
 372  
     
 373  
     private FieldDescriptor getFieldDescriptor( 
 374  
             String fieldKey, 
 375  
             MessageKeyInfo messageKey, 
 376  
             Widget widget, 
 377  
             String parentPath) {
 378  0
         QueryPath path = QueryPath.concat(parentPath, fieldKey);
 379  0
         Metadata meta = modelDefinition.getMetadata(path);
 380  
         FieldDescriptor fd;
 381  0
         if (widget != null) {
 382  0
             fd = new FieldDescriptor(path.toString(), messageKey, meta, widget);
 383  
         }
 384  
         else{
 385  0
             fd = new FieldDescriptor(path.toString(), messageKey, meta);
 386  
         }
 387  0
         return fd;
 388  
     }
 389  
 
 390  
     private FieldDescriptor addField(Section section, 
 391  
             String fieldKey, 
 392  
             MessageKeyInfo messageKey, 
 393  
             Widget widget, 
 394  
             String parentPath) {
 395  0
         FieldDescriptor fd = getFieldDescriptor(fieldKey, messageKey, widget, parentPath);
 396  0
         section.addField(fd);
 397  0
         return fd;
 398  
     }
 399  
 
 400  
     private Picker configureSearch(String fieldKey) {
 401  0
         QueryPath path = QueryPath.concat(null, fieldKey);
 402  0
         Metadata metaData = searchDefinition.getMetadata(path);
 403  0
         Picker picker = new Picker(metaData.getInitialLookup(), metaData.getAdditionalLookups());
 404  0
         return picker;
 405  
     }
 406  
 
 407  
     public static class Picker extends KSPicker {
 408  
 
 409  
         private String name;
 410  
         private LookupMetadata initLookupMetadata;
 411  
         private List<LookupMetadata> additionalLookupMetadata;
 412  
 
 413  
         public Picker(LookupMetadata inLookupMetadata, List<LookupMetadata> additionalLookupMetadata) {
 414  0
             super(inLookupMetadata, additionalLookupMetadata);
 415  0
             this.initLookupMetadata = inLookupMetadata;
 416  0
             this.additionalLookupMetadata = additionalLookupMetadata;
 417  0
         }
 418  
 
 419  
         public String getName() {
 420  0
             return name;
 421  
         }
 422  
 
 423  
         public void setName(String name) {
 424  0
             this.name = name;
 425  0
         }
 426  
 
 427  
         public LookupMetadata getInitLookupMetadata() {
 428  0
             return initLookupMetadata;
 429  
         }
 430  
 
 431  
         public void setInitLookupMetadata(LookupMetadata initLookupMetadata) {
 432  0
             this.initLookupMetadata = initLookupMetadata;
 433  0
         }
 434  
 
 435  
         public List<LookupMetadata> getAdditionalLookupMetadata() {
 436  0
             return additionalLookupMetadata;
 437  
         }
 438  
 
 439  
         public void setAdditionalLookupMetadata(List<LookupMetadata> additionalLookupMetadata) {
 440  0
             this.additionalLookupMetadata = additionalLookupMetadata;
 441  0
         }
 442  
         
 443  
     }
 444  
 
 445  
     @Override
 446  
     public void setController(Controller controller) {
 447  0
         super.setController(controller);
 448  0
         if (cluSetEditor != null) {
 449  0
             cluSetEditor.setController(controller);
 450  
         }
 451  0
     }
 452  
     
 453  
 }