X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fdialog%2FComponentSelectionDialog.java;h=adfd98c97278dbc0e9b9df57a15bcf47d9a77032;hb=a7d96d461b5ead5ace673d3f6f9f8ec3d19118eb;hp=33d5882c2f45f57956a75be9b4b88158a96edce5;hpb=a460e609147d064dd3da464bcf1626845e0f93b4;p=simantics%2F3d.git 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 33d5882c..adfd98c9 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java @@ -7,15 +7,23 @@ import java.util.Set; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; 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.ResourceManager; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ExpandBar; @@ -24,6 +32,12 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.simantics.db.exception.DatabaseException; +import org.simantics.plant3d.Activator; +import org.simantics.plant3d.scenegraph.EndComponent; +import org.simantics.plant3d.scenegraph.InlineComponent; +import org.simantics.plant3d.scenegraph.Nozzle; +import org.simantics.plant3d.scenegraph.PipelineComponent; +import org.simantics.plant3d.scenegraph.TurnComponent; import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType; import org.simantics.plant3d.utils.Item; import org.simantics.plant3d.utils.Item.Type; @@ -32,9 +46,17 @@ import org.simantics.utils.ui.ExceptionUtils; public class ComponentSelectionDialog extends Dialog implements ISelectionChangedListener{ + private ResourceManager resourceManager; + private Item selected; private Set allowed; private Set filterAllowed; + //private boolean positionAdjustment; + private PipelineComponent component; + private boolean insertAdjustable; + private boolean lenghtAdjustable; + private PositionType insertPosition = PositionType.NEXT; + private Double angle; private Double length; @@ -47,17 +69,30 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange private Text diameterText; private Text turnRadiusText; + 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) { + + public ComponentSelectionDialog(Shell parentShell, Set allowed, PipelineComponent component){ super(parentShell); this.allowed = allowed; + this.component = component; filterAllowed = new HashSet(); + insertAdjustable = component instanceof InlineComponent ? ((InlineComponent)component).isVariableLength() : false; + lenghtAdjustable = false; } @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); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); @@ -89,25 +124,28 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange ExceptionUtils.logError(e); return composite; } + 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"); - ListViewer inlineViewer = new ListViewer(expandBar); + inlineViewer = new ListViewer(expandBar); inlineViewer.setLabelProvider(new ComponentLabelProvider()); inlineViewer.setContentProvider(new ComponentContentProvider()); ExpandItem turnItem = new ExpandItem(expandBar, SWT.NONE); turnItem.setText("Turn"); - ListViewer turnViewer = new ListViewer(expandBar); + turnViewer = new ListViewer(expandBar); turnViewer.setLabelProvider(new ComponentLabelProvider()); turnViewer.setContentProvider(new ComponentContentProvider()); ExpandItem endItem = new ExpandItem(expandBar, SWT.NONE); endItem.setText("End"); - ListViewer endViewer = new ListViewer(expandBar); + endViewer = new ListViewer(expandBar); endViewer.setLabelProvider(new ComponentLabelProvider()); endViewer.setContentProvider(new ComponentContentProvider()); @@ -131,8 +169,44 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange 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"))); + GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).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) { + updateInsertPosition(PositionType.SPLIT); + } + }); + endButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + updateInsertPosition(PositionType.NEXT); + } + }); + endButton.setSelection(true); + + label = new Label(composite, SWT.NONE); label.setText("Length"); lengthText = new Text(composite, SWT.SINGLE|SWT.BORDER); label = new Label(composite, SWT.NONE); @@ -214,88 +288,173 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange } + private void updateInsertPosition(PositionType type) { + if (insertPosition == type) + return; + endButton.setSelection(type == PositionType.NEXT); + middleButton.setSelection(type == PositionType.SPLIT); + startButton.setSelection(type == PositionType.PREVIOUS); + insertPosition = type; + } + @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); - selected = (Item)sel.getFirstElement(); - validate(); + Item i = (Item)sel.getFirstElement(); + if (i != null) { + selected = i; + if (event.getSource() == inlineViewer) { + turnViewer.setSelection(new StructuredSelection()); + endViewer.setSelection(new StructuredSelection()); + } else if (event.getSource() == turnViewer) { + inlineViewer.setSelection(new StructuredSelection()); + endViewer.setSelection(new StructuredSelection()); + } else if (event.getSource() == endViewer) { + inlineViewer.setSelection(new StructuredSelection()); + turnViewer.setSelection(new StructuredSelection()); + } + validate(); + } } private void validate() { filterAllowed.clear(); Set filterAllowed = new HashSet(); boolean ok = true; - if (selected.isCode())// TODO : instead of disabling the button, we should filter the content. + if (selected == null) { + ok = false; + } 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()); + if (insertAdjustable) { + switch (selected.getType()) { + case END: + startButton.setEnabled(false); + middleButton.setEnabled(false); + endButton.setEnabled(true); + updateInsertPosition(PositionType.NEXT); + break; + case INLINE: + if (!selected.isVariable()) { + startButton.setEnabled(true); + middleButton.setEnabled(true); + endButton.setEnabled(true); + } else { + startButton.setEnabled(false); + middleButton.setEnabled(false); + endButton.setEnabled(true); + updateInsertPosition(PositionType.NEXT); + } + break; + case NOZZLE: + startButton.setEnabled(false); + middleButton.setEnabled(false); + endButton.setEnabled(true); + updateInsertPosition(PositionType.NEXT); + break; + case TURN: + startButton.setEnabled(false); + middleButton.setEnabled(true); + endButton.setEnabled(true); + if (insertPosition == PositionType.PREVIOUS) + updateInsertPosition(PositionType.NEXT); + break; + case EQUIPMENT: + throw new RuntimeException("Expected component, got equipment " + selected); + } + } else if (lenghtAdjustable) { + if (component instanceof InlineComponent) { + startButton.setEnabled(true); + middleButton.setEnabled(true); + endButton.setEnabled(true); + } else if (component instanceof TurnComponent) { + startButton.setEnabled(false); + middleButton.setEnabled(true); + endButton.setEnabled(true); + if (insertPosition == PositionType.PREVIOUS) + updateInsertPosition(PositionType.NEXT); + } else if (component instanceof EndComponent || component instanceof Nozzle) { + startButton.setEnabled(false); + middleButton.setEnabled(false); + endButton.setEnabled(true); + updateInsertPosition(PositionType.NEXT); + } + } else { + startButton.setEnabled(false); + middleButton.setEnabled(false); + endButton.setEnabled(true); + } + if (selected.isVariable()) { + if (selected.getType() == Type.INLINE) { + filterAllowed.add(PositionType.NEXT); + filterAllowed.add(PositionType.PREVIOUS); + if (inlineSplit) { + lengthText.setEnabled(false); + angleText.setEnabled(false); + ok = false; + + } else { + lengthText.setEnabled(true); + angleText.setEnabled(false); + if (length == null) + ok = false; + } + } else if (selected.getType() == Type.TURN) { + filterAllowed.add(PositionType.NEXT); + filterAllowed.add(PositionType.PREVIOUS); + lengthText.setEnabled(false); + angleText.setEnabled(true); + if (angle == null) + ok = false; + } else { + // this should not happen + lengthText.setEnabled(false); + angleText.setEnabled(false); + } + } else { + lengthText.setEnabled(false); + angleText.setEnabled(false); + } - if (selected.isVariable()) { - if (selected.getType() == Type.INLINE) { + if (selected.isSizeChange()) { filterAllowed.add(PositionType.NEXT); filterAllowed.add(PositionType.PREVIOUS); if (inlineSplit) { - lengthText.setEnabled(false); - angleText.setEnabled(false); + turnRadiusText.setEnabled(false); + diameterText.setEnabled(false); ok = false; - } else { - lengthText.setEnabled(true); - angleText.setEnabled(false); - if (length == null) + turnRadiusText.setEnabled(true); + diameterText.setEnabled(true); + if (diameter == null || turnRadius == null) ok = false; } - } else if (selected.getType() == Type.TURN) { - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); - lengthText.setEnabled(false); - angleText.setEnabled(true); - if (angle == null) - ok = false; + } else { - // this should not happen - lengthText.setEnabled(false); - angleText.setEnabled(false); - } - } else { - lengthText.setEnabled(false); - angleText.setEnabled(false); - } - if (selected.isSizeChange()) { - filterAllowed.add(PositionType.NEXT); - filterAllowed.add(PositionType.PREVIOUS); - if (inlineSplit) { turnRadiusText.setEnabled(false); diameterText.setEnabled(false); - ok = false; - } else { - turnRadiusText.setEnabled(true); - diameterText.setEnabled(true); - if (diameter == null || turnRadius == null) - ok = false; } - } else { - turnRadiusText.setEnabled(false); - diameterText.setEnabled(false); - } - if (!selected.isSizeChange() && !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); + if (!selected.isSizeChange() && !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); + } } } - for (PositionType t : filterAllowed) { if (allowed.contains(t)) this.filterAllowed.add(t); @@ -328,5 +487,16 @@ public class ComponentSelectionDialog extends Dialog implements ISelectionChange return filterAllowed; } + public PositionType getInsertPosition() { + return insertPosition; + } + + public boolean isInsertAdjustable() { + return insertAdjustable; + } + + public boolean isLenghtAdjustable() { + return lenghtAdjustable; + } }