1 package org.simantics.plant3d.dialog;
3 import java.util.HashSet;
7 import org.eclipse.jface.dialogs.Dialog;
8 import org.eclipse.jface.dialogs.IDialogConstants;
9 import org.eclipse.jface.layout.GridDataFactory;
10 import org.eclipse.jface.viewers.ISelectionChangedListener;
11 import org.eclipse.jface.viewers.IStructuredSelection;
12 import org.eclipse.jface.viewers.ListViewer;
13 import org.eclipse.jface.viewers.SelectionChangedEvent;
14 import org.eclipse.swt.SWT;
15 import org.eclipse.swt.events.KeyAdapter;
16 import org.eclipse.swt.events.KeyEvent;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Control;
21 import org.eclipse.swt.widgets.ExpandBar;
22 import org.eclipse.swt.widgets.ExpandItem;
23 import org.eclipse.swt.widgets.Label;
24 import org.eclipse.swt.widgets.Shell;
25 import org.eclipse.swt.widgets.Text;
26 import org.simantics.db.exception.DatabaseException;
27 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
28 import org.simantics.plant3d.utils.Item;
29 import org.simantics.plant3d.utils.Item.Type;
30 import org.simantics.plant3d.utils.P3DUtil;
31 import org.simantics.utils.ui.ExceptionUtils;
33 public class ComponentSelectionDialog extends Dialog implements ISelectionChangedListener{
35 private Item selected;
36 private Set<PositionType> allowed;
37 private Set<PositionType> filterAllowed;
39 private Double length;
41 private Text lengthText;
42 private Text angleText;
44 private Double diameter;
45 private Double turnRadius;
47 private Text diameterText;
48 private Text turnRadiusText;
50 private boolean inlineSplit = false;
53 public ComponentSelectionDialog(Shell parentShell, Set<PositionType> allowed) {
55 this.allowed = allowed;
56 filterAllowed = new HashSet<PositionType>();
60 protected Control createDialogArea(Composite parent) {
61 Composite composite = new Composite(parent, SWT.NONE);
62 GridLayout layout = new GridLayout(2,false);
63 layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
64 layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
65 layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
66 layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
67 composite.setLayout(layout);
68 composite.setLayoutData(new GridData(GridData.FILL_BOTH));
69 applyDialogFont(composite);
71 // TODO : we need better classification than inline,turn, and end:
72 // * fixed length inlines
73 // * fixed angle turns
74 // * size changes (requires input for pipe run specs)
75 // * variable length inlines (input for length)
76 // * variable angle turns (input for angle)
79 List<Item> ends = null;
80 List<Item> turns = null;
81 List<Item> inlines = null;
83 ends = P3DUtil.getEnds();
84 turns= P3DUtil.getTurns();
85 inlines = P3DUtil.getInlines();
86 } catch (DatabaseException e) {
87 Label label = new Label(composite, SWT.NONE);
88 label.setText("Cannot load pipeline components: " + e.getMessage());
89 ExceptionUtils.logError(e);
93 ExpandBar expandBar = new ExpandBar(composite, SWT.NONE);
96 ExpandItem inlineItem = new ExpandItem(expandBar, SWT.NONE);
97 inlineItem.setText("Inline");
98 ListViewer inlineViewer = new ListViewer(expandBar);
99 inlineViewer.setLabelProvider(new ComponentLabelProvider());
100 inlineViewer.setContentProvider(new ComponentContentProvider());
102 ExpandItem turnItem = new ExpandItem(expandBar, SWT.NONE);
103 turnItem.setText("Turn");
104 ListViewer turnViewer = new ListViewer(expandBar);
105 turnViewer.setLabelProvider(new ComponentLabelProvider());
106 turnViewer.setContentProvider(new ComponentContentProvider());
108 ExpandItem endItem = new ExpandItem(expandBar, SWT.NONE);
109 endItem.setText("End");
110 ListViewer endViewer = new ListViewer(expandBar);
111 endViewer.setLabelProvider(new ComponentLabelProvider());
112 endViewer.setContentProvider(new ComponentContentProvider());
115 inlineItem.setControl(inlineViewer.getList());
116 turnItem.setControl(turnViewer.getList());
117 endItem.setControl(endViewer.getList());
119 inlineViewer.setInput(inlines);
120 turnViewer.setInput(turns);
121 endViewer.setInput(ends);
123 inlineItem.setHeight(inlineViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
124 turnItem.setHeight(turnViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
125 endItem.setHeight(endViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
127 inlineViewer.addSelectionChangedListener(this);
128 turnViewer.addSelectionChangedListener(this);
129 endViewer.addSelectionChangedListener(this);
131 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).span(2, 1).applyTo(expandBar);
132 GridDataFactory.fillDefaults().minSize(500, 500).hint(500, 500).applyTo(composite);
135 Label label = new Label(composite, SWT.NONE);
136 label.setText("Length");
137 lengthText = new Text(composite, SWT.SINGLE|SWT.BORDER);
138 label = new Label(composite, SWT.NONE);
139 label.setText("Angle");
140 angleText = new Text(composite, SWT.SINGLE|SWT.BORDER);
142 label = new Label(composite, SWT.NONE);
143 label.setText("Diameter");
144 diameterText = new Text(composite, SWT.SINGLE|SWT.BORDER);
145 label = new Label(composite, SWT.NONE);
146 label.setText("Turn Radius");
147 turnRadiusText = new Text(composite, SWT.SINGLE|SWT.BORDER);
149 lengthText.setEnabled(false);
150 angleText.setEnabled(false);
151 turnRadiusText.setEnabled(false);
152 diameterText.setEnabled(false);
154 lengthText.addKeyListener(new KeyAdapter() {
156 public void keyReleased(KeyEvent e) {
158 length = Double.parseDouble(lengthText.getText());
159 } catch (NumberFormatException err) {
166 angleText.addKeyListener(new KeyAdapter() {
168 public void keyReleased(KeyEvent e) {
170 angle = Double.parseDouble(angleText.getText());
171 } catch (NumberFormatException err) {
178 diameterText.addKeyListener(new KeyAdapter() {
180 public void keyReleased(KeyEvent e) {
182 diameter = Double.parseDouble(diameterText.getText());
183 } catch (NumberFormatException err) {
190 turnRadiusText.addKeyListener(new KeyAdapter() {
192 public void keyReleased(KeyEvent e) {
194 turnRadius = Double.parseDouble(turnRadiusText.getText());
195 } catch (NumberFormatException err) {
202 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(lengthText);
203 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(angleText);
204 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(diameterText);
205 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(turnRadiusText);
207 if (!allowed.contains(PositionType.NEXT) && !allowed.contains(PositionType.PREVIOUS)) {
208 turnViewer.getList().setEnabled(false);
209 endViewer.getList().setEnabled(false);
218 public void selectionChanged(SelectionChangedEvent event) {
219 IStructuredSelection sel = (IStructuredSelection)event.getSelection();
220 selected = (Item)sel.getFirstElement();
224 private void validate() {
225 filterAllowed.clear();
226 Set<PositionType> filterAllowed = new HashSet<PositionType>();
228 if (selected.isCode())// TODO : instead of disabling the button, we should filter the content.
231 if (selected.isVariable()) {
232 if (selected.getType() == Type.INLINE) {
233 filterAllowed.add(PositionType.NEXT);
234 filterAllowed.add(PositionType.PREVIOUS);
236 lengthText.setEnabled(false);
237 angleText.setEnabled(false);
241 lengthText.setEnabled(true);
242 angleText.setEnabled(false);
246 } else if (selected.getType() == Type.TURN) {
247 filterAllowed.add(PositionType.NEXT);
248 filterAllowed.add(PositionType.PREVIOUS);
249 lengthText.setEnabled(false);
250 angleText.setEnabled(true);
254 // this should not happen
255 lengthText.setEnabled(false);
256 angleText.setEnabled(false);
259 lengthText.setEnabled(false);
260 angleText.setEnabled(false);
262 if (selected.isSizeChange()) {
263 filterAllowed.add(PositionType.NEXT);
264 filterAllowed.add(PositionType.PREVIOUS);
266 turnRadiusText.setEnabled(false);
267 diameterText.setEnabled(false);
270 turnRadiusText.setEnabled(true);
271 diameterText.setEnabled(true);
272 if (diameter == null || turnRadius == null)
277 turnRadiusText.setEnabled(false);
278 diameterText.setEnabled(false);
280 if (!selected.isSizeChange() && !selected.isVariable()) {
281 switch (selected.getType()) {
283 filterAllowed.add(PositionType.NEXT);
284 filterAllowed.add(PositionType.PREVIOUS);
290 filterAllowed.add(PositionType.NEXT);
291 filterAllowed.add(PositionType.PREVIOUS);
292 filterAllowed.add(PositionType.SPLIT);
294 filterAllowed.add(PositionType.NEXT);
295 filterAllowed.add(PositionType.PREVIOUS);
299 for (PositionType t : filterAllowed) {
300 if (allowed.contains(t))
301 this.filterAllowed.add(t);
304 getButton(OK).setEnabled(ok);
307 public Item getSelected() {
311 public Double getAngle() {
315 public Double getLength() {
319 public Double getDiameter() {
323 public Double getTurnRadius() {
327 public Set<PositionType> filterAllowed() {
328 return filterAllowed;