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