package gov.nasa.jpl.mbee.mdk.actions; import com.nomagic.magicdraw.actions.MDAction; import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.openapi.uml.SessionManager; import com.nomagic.magicdraw.ui.dialogs.MDDialogParentProvider; import com.nomagic.magicdraw.ui.dialogs.SelectElementInfo; import com.nomagic.magicdraw.ui.dialogs.SelectElementTypes; import com.nomagic.magicdraw.ui.dialogs.selection.*; import com.nomagic.magicdraw.uml.BaseElement; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*; import com.nomagic.uml2.impl.ElementsFactory; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.lang.Class; import java.util.ArrayList; import java.util.List; public class CreateRestrictedValueAction extends MDAction { private static final long serialVersionUID = 1L; private ArrayList<Property> props; public static final String DEFAULT_ID = "CreateRestrictedValue"; public static final int[] TABBED_PANE_INDICES = {1, 0, 0, 0, 1, 0, 0, 1, 1}; // final JTabbedPane jtp = ((JTabbedPane) ((Container) ((Container) ((Container) ((Container) ((Container) ((Container) ((Container) ((Container) dlg2.getContentPane().getComponents()[1]).getComponents()[0]).getComponents()[0]).getComponents()[0]).getComponents()[1]).getComponents()[0]).getComponents()[0]).getComponents()[1]).getComponents()[1]); public CreateRestrictedValueAction(ArrayList<Property> ps) { super(null, "Create Restricted Value", null, null); this.props = ps; } @Override public void actionPerformed(ActionEvent event) { // vars final Frame dialogParent = MDDialogParentProvider.getProvider().getDialogParent(); final ElementsFactory elementsFact = Application.getInstance().getProject().getElementsFactory(); // build first window final ElementSelectionDlg dlg = ElementSelectionDlgFactory.create(dialogParent); final List<Class<?>> types = new ArrayList<Class<?>>(); // ?? final SelectElementTypes set = new SelectElementTypes(null, types, null, null); final SelectElementInfo sei = new SelectElementInfo(true, false, Application.getInstance().getProject().getModel().getOwner(), true); ElementSelectionDlgFactory.initMultiple(dlg, set, sei, new ArrayList<Object>()); dlg.setSelectionMode(SelectionMode.MULTIPLE_MODE); // get selections final ArrayList<BaseElement> baseElems = new ArrayList<BaseElement>(); if (dlg != null) { dlg.setVisible(true); if (dlg.isOkClicked() && dlg.getSelectedElements() != null) { for (final BaseElement be : dlg.getSelectedElements()) { baseElems.add(be); //System.out.println("base element"); } } else { return; } } if (baseElems.isEmpty()) { Application.getInstance().getGUILog().log("No elements selected for restricted value."); return; } // build second window final ElementSelectionDlg dlg2 = ElementSelectionDlgFactory.create(dialogParent); final List<Class<?>> types2 = new ArrayList<Class<?>>(); final TypeFilter tf = new TypeFilterImpl(types2) { @Override public boolean accept(BaseElement baseElement, boolean checkType) { return baseElement != null && super.accept(baseElement, checkType) && baseElems != null && baseElems.contains(baseElement); } }; final SelectElementInfo sei2 = new SelectElementInfo(true, false, Application.getInstance().getProject().getModel().getOwner(), true); ElementSelectionDlgFactory.initSingle(dlg2, sei2, new TypeFilterImpl(), tf, new ArrayList<Class<?>>(), null); // Used to disable the tree view in the single selection window as it does not work... at all Container c = dlg2.getContentPane(); for (final int i : TABBED_PANE_INDICES) { if (c.getComponents().length <= i || !(c.getComponents()[i] instanceof Container)) { break; } c = (Container) c.getComponents()[i]; } if (c instanceof JTabbedPane) { final JTabbedPane jtp = (JTabbedPane) c; if (jtp.getTabCount() >= 2) { jtp.setSelectedIndex(1); jtp.setEnabledAt(0, false); } } Element selectedElement = null; if (dlg2 != null) { dlg2.setVisible(true); if (dlg2.isOkClicked() && dlg2.getSelectedElement() instanceof Element) { selectedElement = (Element) dlg2.getSelectedElement(); } } SessionManager.getInstance().createSession("instance restricted value"); for (Property prop : props) { if (!prop.isEditable()) { Application.getInstance().getGUILog().log(prop.getQualifiedName() + " is not editable. Skipped creating restricted value."); continue; } // vars final Expression expression = elementsFact.createExpressionInstance(); final LiteralString ls = elementsFact.createLiteralStringInstance(); final Expression ex = elementsFact.createExpressionInstance(); final ElementValue ev = elementsFact.createElementValueInstance(); // set literalString ls.setValue("RestrictedValue"); // add base elements to ex for (final BaseElement be : baseElems) { if (be instanceof Element) { final ElementValue subEv = elementsFact.createElementValueInstance(); subEv.setElement((Element) be); ex.getOperand().add(subEv); } } //System.out.println(selectedElemVal); // if any default is selected, set ev to that element if (selectedElement != null) { ev.setElement(selectedElement); } // add attribs to the main expression expression.getOperand().add(ls); expression.getOperand().add(ev); expression.getOperand().add(ex); prop.setDefaultValue(expression); } // close session SessionManager.getInstance().closeSession(); } }