From 71637e54f4df136cd53d5ba956285f5be108b798 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Thu, 6 Feb 2020 16:48:03 +0200 Subject: [PATCH] Allow user to specify component name in ComponentSelectionDialog gitlab #74 Change-Id: I3a9ea061ceadeb48a92ecee1644015de51457abd --- .../plant3d/actions/AddComponentAction.java | 11 +- .../dialog/ComponentSelectionDialog.java | 319 +++++++++++------- .../plant3d/utils/ComponentUtils.java | 26 ++ 3 files changed, 224 insertions(+), 132 deletions(-) diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java b/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java index ea25230a..d9ee9d70 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/actions/AddComponentAction.java @@ -6,6 +6,7 @@ import java.awt.event.MouseWheelEvent; import java.util.HashSet; import java.util.Set; +import org.eclipse.jface.resource.ResourceLocator; import org.eclipse.swt.widgets.Display; import org.simantics.db.Resource; import org.simantics.g3d.math.MathTools; @@ -53,7 +54,7 @@ public class AddComponentAction extends vtkSwtAction { super(panel); this.root = root; setText("Add Component"); - setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png")); + setImageDescriptor(ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/Component.png").get()); nodeMap = root.getNodeMap(); gizmo = new TerminalSelectionGizmo(panel); this.libUri = libUri; @@ -81,6 +82,8 @@ public class AddComponentAction extends vtkSwtAction { setEnabled(allowed.size() > 0); } + private String name; + private Double length; private Double angle; private Double rotationAngle; @@ -91,11 +94,16 @@ public class AddComponentAction extends vtkSwtAction { public void run() { ComponentSelectionDialog dialog = new ComponentSelectionDialog(Display.getCurrent().getActiveShell(), allowed, component, libUri); + + // Set list of already reserved component names + dialog.addUsedNames(ComponentUtils.getPipelineComponentNames(root)); + if (dialog.open() == ComponentSelectionDialog.CANCEL) return; toAdd = dialog.getSelected(); if (toAdd == null) return; + this.name = dialog.getName(); this.insertPosition = dialog.getInsertPosition(); this.insertAdjustable = dialog.isInsertAdjustable(); this.lengthAdjustable = dialog.isLenghtAdjustable(); @@ -174,6 +182,7 @@ public class AddComponentAction extends vtkSwtAction { try { InsertInstruction inst = new InsertInstruction(); inst.typeUri = toAdd.getUri(); + inst.name = name; inst.angle = angle != null ? MathTools.degToRad(angle) : null; inst.diameter = diameter; inst.length = length; diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java b/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java index 0c292bc8..95b22512 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java @@ -1,5 +1,6 @@ package org.simantics.plant3d.dialog; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -10,6 +11,7 @@ import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; +import org.eclipse.jface.resource.ResourceLocator; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; @@ -45,83 +47,102 @@ import org.simantics.plant3d.utils.Item.Type; import org.simantics.plant3d.utils.P3DUtil; import org.simantics.utils.ui.ExceptionUtils; -public class ComponentSelectionDialog extends Dialog implements ISelectionChangedListener{ +public class ComponentSelectionDialog extends Dialog implements ISelectionChangedListener { private ResourceManager resourceManager; - + private String libUri; - + private Item selected; private Set allowed; private Set filterAllowed; - //private boolean positionAdjustment; + // private boolean positionAdjustment; private PipelineComponent component; private boolean insertAdjustable; private boolean lenghtAdjustable; - private PositionType insertPosition = PositionType.NEXT; - + private PositionType insertPosition = PositionType.NEXT; + private Double angle; private Double length; private Double rotationAngle; + + private String name; + private Text nameText; + // In-line component private Text lengthText; // Turn component private Text angleText; // Rotated In-line, or turn conponent. private Text rotationAngleText; - + // Input for new PipeRun private Double diameter; private Double turnRadius; - + private Text diameterText; private Text turnRadiusText; - + // Position selection private Button startButton; private Button middleButton; private Button endButton; - + private boolean inlineSplit = false; - + ListViewer inlineViewer; ListViewer turnViewer; ListViewer endViewer; - - - public ComponentSelectionDialog(Shell parentShell, Set allowed, PipelineComponent component){ + + private Set usedNames; + + public ComponentSelectionDialog(Shell parentShell, Set allowed, PipelineComponent component) { this(parentShell, allowed, component, Plant3D.URIs.Builtin); } + + public ComponentSelectionDialog(Shell parentShell, Set allowed, PipelineComponent component, + String libUri) { + super(parentShell); + this.allowed = allowed; + this.component = component; + filterAllowed = new HashSet(); + insertAdjustable = component instanceof InlineComponent ? ((InlineComponent) component).isVariableLength() + : false; + lenghtAdjustable = false; + this.libUri = libUri; + + usedNames = new HashSet<>(); + } - public ComponentSelectionDialog(Shell parentShell, Set allowed, PipelineComponent component, String libUri){ - super(parentShell); - this.allowed = allowed; - this.component = component; - filterAllowed = new HashSet(); - insertAdjustable = component instanceof InlineComponent ? ((InlineComponent)component).isVariableLength() : false; - lenghtAdjustable = false; - this.libUri = libUri; - } - - protected List getItems(Class c, String libUri) throws DatabaseException{ - if (InlineComponent.class.equals(c)) { - return P3DUtil.getInlines(libUri); - } else if (TurnComponent.class.equals(c)) { - return P3DUtil.getTurns(libUri); - } else if (EndComponent.class.equals(c)) { - return P3DUtil.getEnds(libUri); - } else { - return null; - } - } - + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText("Create pipeline component"); + } + + public void addUsedNames(Collection names) { + usedNames.addAll(names); + } + + protected List getItems(Class c, String libUri) throws DatabaseException { + if (InlineComponent.class.equals(c)) { + return P3DUtil.getInlines(libUri); + } else if (TurnComponent.class.equals(c)) { + return P3DUtil.getTurns(libUri); + } else if (EndComponent.class.equals(c)) { + return P3DUtil.getEnds(libUri); + } else { + return null; + } + } + @Override protected Control createDialogArea(Composite parent) { resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent); - + Composite composite = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2,false); + GridLayout layout = new GridLayout(2, false); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); @@ -129,6 +150,9 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); applyDialogFont(composite); + + // Grid layout data for fields that grab horizontal space + final GridDataFactory horizFillData = GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP); // TODO : we need better classification than inline,turn, and end: // * fixed length inlines @@ -137,13 +161,13 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange // * variable length inlines (input for length) // * variable angle turns (input for angle) // * ends - + List ends = null; List turns = null; List inlines = null; try { ends = getItems(EndComponent.class, libUri); - turns= getItems(TurnComponent.class, libUri); + turns = getItems(TurnComponent.class, libUri); inlines = getItems(InlineComponent.class, libUri); } catch (DatabaseException e) { Label label = new Label(composite, SWT.NONE); @@ -154,74 +178,75 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange ends = P3DUtil.filterUserComponents(ends); turns = P3DUtil.filterUserComponents(turns); inlines = P3DUtil.filterUserComponents(inlines); - + ExpandBar expandBar = new ExpandBar(composite, SWT.NONE); - - + ExpandItem inlineItem = new ExpandItem(expandBar, SWT.NONE); inlineItem.setText("Inline"); inlineViewer = new ListViewer(expandBar); inlineViewer.setLabelProvider(new ComponentLabelProvider()); inlineViewer.setContentProvider(new ComponentContentProvider()); - + ExpandItem turnItem = new ExpandItem(expandBar, SWT.NONE); turnItem.setText("Turn"); turnViewer = new ListViewer(expandBar); turnViewer.setLabelProvider(new ComponentLabelProvider()); turnViewer.setContentProvider(new ComponentContentProvider()); - + ExpandItem endItem = new ExpandItem(expandBar, SWT.NONE); endItem.setText("End"); endViewer = new ListViewer(expandBar); endViewer.setLabelProvider(new ComponentLabelProvider()); endViewer.setContentProvider(new ComponentContentProvider()); - - + inlineItem.setControl(inlineViewer.getList()); turnItem.setControl(turnViewer.getList()); endItem.setControl(endViewer.getList()); - + inlineViewer.setInput(inlines); turnViewer.setInput(turns); endViewer.setInput(ends); - + inlineItem.setHeight(inlineViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); turnItem.setHeight(turnViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); endItem.setHeight(endViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); - + inlineViewer.addSelectionChangedListener(this); turnViewer.addSelectionChangedListener(this); endViewer.addSelectionChangedListener(this); - + GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).span(2, 1).applyTo(expandBar); GridDataFactory.fillDefaults().minSize(500, 500).hint(500, 500).applyTo(composite); - + Label label = new Label(composite, SWT.NONE); label.setText("Position"); Composite buttonComposite = new Composite(composite, SWT.NONE); startButton = new Button(buttonComposite, SWT.TOGGLE); middleButton = new Button(buttonComposite, SWT.TOGGLE); endButton = new Button(buttonComposite, SWT.TOGGLE); - startButton.setImage(resourceManager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/insert_start.png"))); - middleButton.setImage(resourceManager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/insert_middle.png"))); - endButton.setImage(resourceManager.createImage(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/insert_end.png"))); + startButton.setImage(resourceManager.createImage( + ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_start.png").get())); + middleButton.setImage(resourceManager.createImage( + ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_middle.png").get())); + endButton.setImage(resourceManager.createImage( + ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_end.png").get())); startButton.setToolTipText("Overlapping insert"); middleButton.setToolTipText("Cutting insert"); endButton.setToolTipText("Adding insert"); - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(buttonComposite); + horizFillData.applyTo(buttonComposite); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(buttonComposite); - + startButton.setEnabled(false); middleButton.setEnabled(false); endButton.setEnabled(false); - + startButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateInsertPosition(PositionType.PREVIOUS); } }); - + middleButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -235,30 +260,41 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange } }); endButton.setSelection(true); - + + label = new Label(composite, SWT.NONE); + label.setText("Name"); + nameText = new Text(composite, SWT.SINGLE | SWT.BORDER); + label = new Label(composite, SWT.NONE); label.setText("Length"); - lengthText = new Text(composite, SWT.SINGLE|SWT.BORDER); + lengthText = new Text(composite, SWT.SINGLE | SWT.BORDER); label = new Label(composite, SWT.NONE); label.setText("Angle"); - angleText = new Text(composite, SWT.SINGLE|SWT.BORDER); + angleText = new Text(composite, SWT.SINGLE | SWT.BORDER); label = new Label(composite, SWT.NONE); - label.setText("Rotation angle"); - rotationAngleText = new Text(composite, SWT.SINGLE|SWT.BORDER); - + label.setText("Rotation angle"); + rotationAngleText = new Text(composite, SWT.SINGLE | SWT.BORDER); + label = new Label(composite, SWT.NONE); label.setText("Diameter"); - diameterText = new Text(composite, SWT.SINGLE|SWT.BORDER); + diameterText = new Text(composite, SWT.SINGLE | SWT.BORDER); label = new Label(composite, SWT.NONE); label.setText("Turn Radius"); - turnRadiusText = new Text(composite, SWT.SINGLE|SWT.BORDER); - + turnRadiusText = new Text(composite, SWT.SINGLE | SWT.BORDER); + lengthText.setEnabled(false); angleText.setEnabled(false); rotationAngleText.setEnabled(false); turnRadiusText.setEnabled(false); diameterText.setEnabled(false); - + + nameText.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + name = nameText.getText(); + validate(); + } + }); lengthText.addKeyListener(new KeyAdapter() { @Override @@ -271,7 +307,7 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange validate(); } }); - + angleText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { @@ -283,19 +319,19 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange validate(); } }); - + rotationAngleText.addKeyListener(new KeyAdapter() { - @Override - public void keyReleased(KeyEvent e) { - try { - rotationAngle = Double.parseDouble(rotationAngleText.getText()); - } catch (NumberFormatException err) { - rotationAngle = null; - } - validate(); - } - }); - + @Override + public void keyReleased(KeyEvent e) { + try { + rotationAngle = Double.parseDouble(rotationAngleText.getText()); + } catch (NumberFormatException err) { + rotationAngle = null; + } + validate(); + } + }); + diameterText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { @@ -307,7 +343,7 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange validate(); } }); - + turnRadiusText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { @@ -319,23 +355,23 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange validate(); } }); - - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(lengthText); - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(angleText); - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(rotationAngleText); - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(diameterText); - GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(turnRadiusText); - + + horizFillData.applyTo(nameText); + horizFillData.applyTo(lengthText); + horizFillData.applyTo(angleText); + horizFillData.applyTo(rotationAngleText); + horizFillData.applyTo(diameterText); + horizFillData.applyTo(turnRadiusText); + if (!allowed.contains(PositionType.NEXT) && !allowed.contains(PositionType.PREVIOUS)) { turnViewer.getList().setEnabled(false); endViewer.getList().setEnabled(false); inlineSplit = true; } - + return composite; } - - + private void updateInsertPosition(PositionType type) { if (insertPosition == type) return; @@ -344,11 +380,11 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange startButton.setSelection(type == PositionType.PREVIOUS); insertPosition = type; } - + @Override public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection sel = (IStructuredSelection)event.getSelection(); - Item i = (Item)sel.getFirstElement(); + IStructuredSelection sel = (IStructuredSelection) event.getSelection(); + Item i = (Item) sel.getFirstElement(); if (i != null) { selected = i; if (event.getSource() == inlineViewer) { @@ -361,10 +397,14 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange inlineViewer.setSelection(new StructuredSelection()); turnViewer.setSelection(new StructuredSelection()); } - validate(); + + name = generateUniqueName(selected.getName()); + nameText.setText(name); + + validate(); } } - + private void validate() { filterAllowed.clear(); Set filterAllowed = new HashSet(); @@ -374,7 +414,8 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange } else if (selected.isCode()) {// TODO : instead of disabling the button, we should filter the content. ok = false; } else { - lenghtAdjustable = ((selected.getType() == Type.INLINE) && (selected.isVariable() || selected.isModifiable())); + lenghtAdjustable = ((selected.getType() == Type.INLINE) + && (selected.isVariable() || selected.isModifiable())); if (insertAdjustable) { switch (selected.getType()) { case END: @@ -442,7 +483,7 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange angleText.setEnabled(false); rotationAngleText.setEnabled(selected.isRotated()); ok = false; - + } else { lengthText.setEnabled(true); angleText.setEnabled(false); @@ -459,18 +500,19 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange if (angle == null) ok = false; } else { - // this should not happen, since end components should not have variable, or modifiable flag. + // this should not happen, since end components should not have variable, or + // modifiable flag. lengthText.setEnabled(false); angleText.setEnabled(false); rotationAngleText.setEnabled(false); - + } } else { lengthText.setEnabled(false); angleText.setEnabled(false); rotationAngleText.setEnabled(selected.getType() == Type.TURN || selected.isRotated()); } - + if (selected.isSizeChange()) { turnRadiusText.setEnabled(true); diameterText.setEnabled(true); @@ -480,23 +522,23 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange turnRadiusText.setEnabled(false); diameterText.setEnabled(false); } - + if (!selected.isVariable()) { switch (selected.getType()) { - case END: - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); - break; - case NOZZLE: - case EQUIPMENT: - break; - case INLINE: - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); - filterAllowed.add(PositionType.SPLIT); - case TURN: - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); + case END: + filterAllowed.add(PositionType.NEXT); + filterAllowed.add(PositionType.PREVIOUS); + break; + case NOZZLE: + case EQUIPMENT: + break; + case INLINE: + filterAllowed.add(PositionType.NEXT); + filterAllowed.add(PositionType.PREVIOUS); + filterAllowed.add(PositionType.SPLIT); + case TURN: + filterAllowed.add(PositionType.NEXT); + filterAllowed.add(PositionType.PREVIOUS); } } } @@ -504,46 +546,61 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange if (allowed.contains(t)) this.filterAllowed.add(t); } - - getButton(OK).setEnabled(ok); + + if (name.isEmpty() || usedNames.contains(name)) + ok = false; + + getButton(OK).setEnabled(ok); } - + + private String generateUniqueName(String name) { + int i = 1; + String newName; + while (usedNames.contains((newName = name + "_" + i))) + i++; + return newName; + } + public Item getSelected() { return selected; } + public String getName() { + return name; + } + public Double getAngle() { return angle; } - + public Double getLength() { return length; } - + public Double getRotationAngle() { - return rotationAngle; - } - + return rotationAngle; + } + public Double getDiameter() { return diameter; } - + public Double getTurnRadius() { return turnRadius; } - + public Set filterAllowed() { return filterAllowed; } - + public PositionType getInsertPosition() { return insertPosition; } - + public boolean isInsertAdjustable() { return insertAdjustable; } - + public boolean isLenghtAdjustable() { return lenghtAdjustable; } diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java index 5a84a524..c20cf921 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/utils/ComponentUtils.java @@ -1,9 +1,11 @@ package org.simantics.plant3d.utils; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.vecmath.Vector3d; @@ -265,6 +267,9 @@ public class ComponentUtils { public PositionType position = PositionType.NEXT; public PositionType insertPosition = PositionType.NEXT; + + // Component name + public String name; // Reducer requires pipe specs public Double diameter; @@ -303,6 +308,14 @@ public class ComponentUtils { this.insertPosition = insertPosition; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public Double getDiameter() { return diameter; } @@ -348,6 +361,9 @@ public class ComponentUtils { public static PipelineComponent addComponent(P3DRootNode root, PipelineComponent component, InsertInstruction inst) throws Exception { PipelineComponent newComponent = ComponentUtils.createComponent(root, inst.typeUri); + if (inst.name != null) + newComponent.setName(inst.name); + PipeControlPoint newPcp = newComponent.getControlPoint(); PipeControlPoint toPcp = component.getControlPoint(); @@ -692,4 +708,14 @@ public class ComponentUtils { PipingRules.splitVariableLengthComponent(branchSplit, component, false); return branchSplit; } + + public static Collection getPipelineComponentNames(P3DRootNode root) { + Collection usedNames = root.getChild().stream() + .filter(n -> n instanceof PipeRun) + .flatMap(n -> ((PipeRun)n).getChild().stream()) + .filter(n -> n instanceof PipelineComponent) + .map(n -> ((PipelineComponent)n).getName()) + .collect(Collectors.toSet()); + return usedNames; + } } -- 2.47.1