private static FormElementContainer getElementContainerImpl(FormElementContainer container, final ResourceId elementId) { if (container.getId().equals(elementId)) { return container; } for (FormElement elem : container.getElements()) { if (elem instanceof FormElementContainer) { FormElementContainer result = getElementContainerImpl((FormElementContainer) elem, elementId); if (result != null) { return result; } } } return null; }
@Override public Void apply(FormClass subform) { formDesigner.getModel().registerSubform(formField.getId(), subform); containerMap.put(formField.getId(), FieldsHolderWidgetContainer.subform(formDesigner, formField, subform, container.getId())); buildWidgetContainers(formDesigner, subform, subform, depth + 1, promises); return null; } });
protected FieldsHolderWidgetContainer(final FormDesigner formDesigner, final FormElementContainer elementContainer, ResourceId parentId) { this.formDesigner = formDesigner; this.elementContainer = elementContainer; this.parentId = parentId; panel = new FieldsHolderPanel(formDesigner, parentId); panel.getPanel().setClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (FieldsHolderWidgetContainer.this.equals(formDesigner.getModel().getSelectedWidgetContainer())) { return; // skip, container is already selected } formDesigner.getContainerPresenter().show(FieldsHolderWidgetContainer.this); formDesigner.getEventBus().fireEvent(new WidgetContainerSelectionEvent(FieldsHolderWidgetContainer.this)); } }); formDesigner.getEventBus().addHandler(WidgetContainerSelectionEvent.TYPE, new WidgetContainerSelectionEvent.Handler() { @Override public void handle(WidgetContainerSelectionEvent event) { WidgetContainer selectedItem = event.getSelectedItem(); panel.getPanel().setSelected(selectedItem.asWidget().equals(panel.asWidget())); } }); FlowPanel dropPanel = createDropPanel(); panel.getPanel().getSubformContainer().add(dropPanel); dropController = formDesigner.getDropControllerRegistry().register(elementContainer.getId(), dropPanel, formDesigner); dropController.getContainerMap().put(elementContainer.getId(), this); // register yourself syncWithModel(); }
if (element instanceof FormSection) { FormSection formSection = (FormSection) element; containerMap.put(formSection.getId(), FieldsHolderWidgetContainer.section(formDesigner, formSection, container.getId())); buildWidgetContainers(formDesigner, formSection, owner, depth + 1, promises); } else if (element instanceof FormLabel) { FormLabel label = (FormLabel) element; containerMap.put(label.getId(), new LabelWidgetContainer(formDesigner, label, container.getId())); } else if (element instanceof FormField && !isSubFormKey(owner, (FormField)element)) {
private void vetoDropIfNeeded(DragContext context) throws VetoDragException { // DnDLabel then drop is always allowed if (context.draggable instanceof DnDLabel && ((DnDLabel) context.draggable).getTemplate() instanceof FieldTemplate) { return; } if (isField(context.selectedWidgets.get(0))) { // field is moved // Once placed, fields can only be moved within the same form/subform ResourceId targetFormId = getId(dropTarget, FormDesignerConstants.OWNER_ID); ResourceId dataFieldId = getId(context.draggable, FormDesignerConstants.DATA_FIELD_ID); FormClass targetForm = formDesigner.getModel().getFormClass(targetFormId); if (hasField(targetForm, dataFieldId)) { return; } else { throw new VetoDragException(); } } if (formDesigner.getModel().getElementContainer(resourceId) instanceof FormSection || formDesigner.getModel().isSubform(formDesigner.getModel().getElementContainer(resourceId).getId())) { // we are not going to handle nested FormSection or nested SubForms in FormDesigner // It should be enough to handle one level of FormSections and SubForms: // 1. on selection FormSection/SubForm container is selected by blue color // 2. on formField selection highlight it with green color // nested FormSection/SubForm brings higher complexity without comparative value. throw new VetoDragException(); } }