]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/dialog/ComponentSelectionDialog.java
Add checks for invalid numerical values in ComponentSelectionDialog
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / dialog / ComponentSelectionDialog.java
1 package org.simantics.plant3d.dialog;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7
8 import org.eclipse.jface.dialogs.Dialog;
9 import org.eclipse.jface.dialogs.IDialogConstants;
10 import org.eclipse.jface.dialogs.IDialogSettings;
11 import org.eclipse.jface.layout.GridDataFactory;
12 import org.eclipse.jface.layout.GridLayoutFactory;
13 import org.eclipse.jface.resource.JFaceResources;
14 import org.eclipse.jface.resource.LocalResourceManager;
15 import org.eclipse.jface.resource.ResourceLocator;
16 import org.eclipse.jface.resource.ResourceManager;
17 import org.eclipse.jface.viewers.ISelectionChangedListener;
18 import org.eclipse.jface.viewers.IStructuredSelection;
19 import org.eclipse.jface.viewers.ListViewer;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.eclipse.jface.viewers.StructuredSelection;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.events.KeyAdapter;
24 import org.eclipse.swt.events.KeyEvent;
25 import org.eclipse.swt.events.SelectionAdapter;
26 import org.eclipse.swt.events.SelectionEvent;
27 import org.eclipse.swt.layout.GridData;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Button;
30 import org.eclipse.swt.widgets.Composite;
31 import org.eclipse.swt.widgets.Control;
32 import org.eclipse.swt.widgets.ExpandBar;
33 import org.eclipse.swt.widgets.ExpandItem;
34 import org.eclipse.swt.widgets.Label;
35 import org.eclipse.swt.widgets.Shell;
36 import org.eclipse.swt.widgets.Text;
37 import org.simantics.Simantics;
38 import org.simantics.db.Session;
39 import org.simantics.db.exception.DatabaseException;
40 import org.simantics.plant3d.Activator;
41 import org.simantics.plant3d.ontology.Plant3D;
42 import org.simantics.plant3d.scenegraph.EndComponent;
43 import org.simantics.plant3d.scenegraph.InlineComponent;
44 import org.simantics.plant3d.scenegraph.Nozzle;
45 import org.simantics.plant3d.scenegraph.PipelineComponent;
46 import org.simantics.plant3d.scenegraph.TurnComponent;
47 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint.PositionType;
48 import org.simantics.plant3d.utils.Item;
49 import org.simantics.plant3d.utils.Item.Type;
50 import org.simantics.plant3d.utils.P3DUtil;
51 import org.simantics.utils.ui.ExceptionUtils;
52
53 public class ComponentSelectionDialog extends Dialog implements ISelectionChangedListener {
54
55         private static final String DIALOG = "ComponentSelectionDialog"; //$NON-NLS-1$
56
57         private IDialogSettings dialogSettings;
58         
59         private double lengthFactor = 1.0;
60
61         private ResourceManager resourceManager;
62
63         private String libUri;
64
65         private Item selected;
66         private Set<PositionType> allowed;
67         private Set<PositionType> filterAllowed;
68         // private boolean positionAdjustment;
69         private PipelineComponent component;
70         private boolean insertAdjustable;
71         private boolean lenghtAdjustable;
72         private PositionType insertPosition = PositionType.NEXT;
73
74         private Double angle;
75         private Double length;
76         private Double rotationAngle;
77
78         private String name;
79         
80         private Text nameText;
81
82         // In-line component
83         private Text lengthText;
84         // Turn component
85         private Text angleText;
86         // Rotated In-line, or turn component.
87         private Text rotationAngleText;
88
89         // Input for new PipeRun
90         private Double diameter;
91         private Double thickness;
92         private Double turnRadius;
93
94         private Text diameterText;
95         private Text thicknessText;
96         private Text turnRadiusText;
97         
98         // Validation message label
99         private Label validationLabel;
100
101         // Position selection
102         private Button startButton;
103         private Button middleButton;
104         private Button endButton;
105
106         private boolean inlineSplit = false;
107
108         ListViewer inlineViewer;
109         ListViewer turnViewer;
110         ListViewer endViewer;
111
112         private Set<String> usedNames;
113
114         public ComponentSelectionDialog(Shell parentShell, Set<PositionType> allowed, PipelineComponent component) {
115                 this(parentShell, allowed, component, Plant3D.URIs.Builtin);
116         }
117
118         public ComponentSelectionDialog(Shell parentShell, Set<PositionType> allowed, PipelineComponent component,
119                         String libUri) {
120                 super(parentShell);
121                 this.allowed = allowed;
122                 this.component = component;
123                 filterAllowed = new HashSet<PositionType>();
124                 insertAdjustable = component instanceof InlineComponent ? ((InlineComponent) component).isVariableLength()
125                                 : false;
126                 lenghtAdjustable = false;
127                 this.libUri = libUri;
128
129                 usedNames = new HashSet<>();
130
131                 setShellStyle(getShellStyle() | SWT.RESIZE);
132
133                 IDialogSettings settings = Activator.getDefault().getDialogSettings();
134                 dialogSettings = settings.getSection(DIALOG);
135                 if (dialogSettings == null)
136                         dialogSettings = settings.addNewSection(DIALOG);
137         }
138         
139         public void setLengthFactor(double lengthFactor) {
140                 this.lengthFactor = lengthFactor;
141         }
142
143         @Override
144         protected IDialogSettings getDialogBoundsSettings() {
145                 return dialogSettings;
146         }
147
148         @Override
149         protected void configureShell(Shell newShell) {
150                 super.configureShell(newShell);
151                 newShell.setText("Create pipeline component");
152         }
153
154         public void addUsedNames(Collection<String> names) {
155                 usedNames.addAll(names);
156         }
157
158         protected List<Item> getItems(Class<?> c, String libUri) throws DatabaseException {
159                 Session session = Simantics.getSession();
160                 if (InlineComponent.class.equals(c)) {
161                         return P3DUtil.getInlines(session, libUri);
162                 } else if (TurnComponent.class.equals(c)) {
163                         return P3DUtil.getTurns(session, libUri);
164                 } else if (EndComponent.class.equals(c)) {
165                         return P3DUtil.getEnds(session, libUri);
166                 } else {
167                         return null;
168                 }
169         }
170
171         @Override
172         protected Control createDialogArea(Composite parent) {
173                 resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);
174
175                 Composite composite = new Composite(parent, SWT.NONE);
176                 GridLayout layout = new GridLayout(2, false);
177                 layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
178                 layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
179                 layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
180                 layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
181                 composite.setLayout(layout);
182                 composite.setLayoutData(new GridData(GridData.FILL_BOTH));
183                 applyDialogFont(composite);
184
185                 // Grid layout data for fields that grab horizontal space
186                 final GridDataFactory horizFillData = GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP);
187                 
188                 // TODO : we need better classification than inline,turn, and end:
189                 // * fixed length inlines
190                 // * fixed angle turns
191                 // * size changes (requires input for pipe run specs)
192                 // * variable length inlines (input for length)
193                 // * variable angle turns (input for angle)
194                 // * ends
195
196                 List<Item> ends = null;
197                 List<Item> turns = null;
198                 List<Item> inlines = null;
199                 try {
200                         ends = getItems(EndComponent.class, libUri);
201                         turns = getItems(TurnComponent.class, libUri);
202                         inlines = getItems(InlineComponent.class, libUri);
203                 } catch (DatabaseException e) {
204                         Label label = new Label(composite, SWT.NONE);
205                         label.setText("Cannot load pipeline components: " + e.getMessage());
206                         ExceptionUtils.logError(e);
207                         return composite;
208                 }
209                 ends = P3DUtil.filterUserComponents(ends);
210                 turns = P3DUtil.filterUserComponents(turns);
211                 inlines = P3DUtil.filterUserComponents(inlines);
212
213                 ExpandBar expandBar = new ExpandBar(composite, SWT.V_SCROLL);
214
215                 ExpandItem inlineItem = new ExpandItem(expandBar, SWT.NONE);
216                 inlineItem.setText("Inline");
217                 inlineViewer = new ListViewer(expandBar);
218                 inlineViewer.setLabelProvider(new ComponentLabelProvider());
219                 inlineViewer.setContentProvider(new ComponentContentProvider());
220
221                 ExpandItem turnItem = new ExpandItem(expandBar, SWT.NONE);
222                 turnItem.setText("Turn");
223                 turnViewer = new ListViewer(expandBar);
224                 turnViewer.setLabelProvider(new ComponentLabelProvider());
225                 turnViewer.setContentProvider(new ComponentContentProvider());
226
227                 ExpandItem endItem = new ExpandItem(expandBar, SWT.NONE);
228                 endItem.setText("End");
229                 endViewer = new ListViewer(expandBar);
230                 endViewer.setLabelProvider(new ComponentLabelProvider());
231                 endViewer.setContentProvider(new ComponentContentProvider());
232
233                 inlineItem.setControl(inlineViewer.getList());
234                 turnItem.setControl(turnViewer.getList());
235                 endItem.setControl(endViewer.getList());
236
237                 inlineViewer.setInput(inlines);
238                 turnViewer.setInput(turns);
239                 endViewer.setInput(ends);
240
241                 inlineItem.setHeight(inlineViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
242                 turnItem.setHeight(turnViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
243                 endItem.setHeight(endViewer.getList().computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
244
245                 inlineViewer.addSelectionChangedListener(this);
246                 turnViewer.addSelectionChangedListener(this);
247                 endViewer.addSelectionChangedListener(this);
248
249                 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).span(2, 1).applyTo(expandBar);
250                 GridDataFactory.fillDefaults().grab(true, true).minSize(500, 500).hint(500, 500).applyTo(composite);
251
252                 Label label = new Label(composite, SWT.NONE);
253                 label.setText("Position");
254                 Composite buttonComposite = new Composite(composite, SWT.NONE);
255                 startButton = new Button(buttonComposite, SWT.TOGGLE);
256                 middleButton = new Button(buttonComposite, SWT.TOGGLE);
257                 endButton = new Button(buttonComposite, SWT.TOGGLE);
258                 startButton.setImage(resourceManager.createImage(
259                                 ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_start.png").get()));
260                 middleButton.setImage(resourceManager.createImage(
261                                 ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_middle.png").get()));
262                 endButton.setImage(resourceManager.createImage(
263                                 ResourceLocator.imageDescriptorFromBundle(Activator.PLUGIN_ID, "icons/insert_end.png").get()));
264                 startButton.setToolTipText("Overlapping insert");
265                 middleButton.setToolTipText("Cutting insert");
266                 endButton.setToolTipText("Adding insert");
267                 horizFillData.applyTo(buttonComposite);
268                 GridLayoutFactory.fillDefaults().numColumns(3).applyTo(buttonComposite);
269
270                 startButton.setEnabled(false);
271                 middleButton.setEnabled(false);
272                 endButton.setEnabled(false);
273
274                 startButton.addSelectionListener(new SelectionAdapter() {
275                         @Override
276                         public void widgetSelected(SelectionEvent e) {
277                                 updateInsertPosition(PositionType.PREVIOUS);
278                         }
279                 });
280
281                 middleButton.addSelectionListener(new SelectionAdapter() {
282                         @Override
283                         public void widgetSelected(SelectionEvent e) {
284                                 updateInsertPosition(PositionType.SPLIT);
285                         }
286                 });
287                 endButton.addSelectionListener(new SelectionAdapter() {
288                         @Override
289                         public void widgetSelected(SelectionEvent e) {
290                                 updateInsertPosition(PositionType.NEXT);
291                         }
292                 });
293                 endButton.setSelection(true);
294
295                 label = new Label(composite, SWT.NONE);
296                 label.setText("Name");
297                 nameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
298
299                 label = new Label(composite, SWT.NONE);
300                 label.setText("Length");
301                 lengthText = new Text(composite, SWT.SINGLE | SWT.BORDER);
302                 label = new Label(composite, SWT.NONE);
303                 label.setText("Angle");
304                 angleText = new Text(composite, SWT.SINGLE | SWT.BORDER);
305                 label = new Label(composite, SWT.NONE);
306                 label.setText("Rotation angle");
307                 rotationAngleText = new Text(composite, SWT.SINGLE | SWT.BORDER);
308
309                 label = new Label(composite, SWT.NONE);
310                 label.setText("Diameter");
311                 diameterText = new Text(composite, SWT.SINGLE | SWT.BORDER);
312                 label = new Label(composite, SWT.NONE);
313                 label.setText("Wall thickness");
314                 thicknessText = new Text(composite, SWT.SINGLE | SWT.BORDER);
315                 label = new Label(composite, SWT.NONE);
316                 label.setText("Turn radius");
317                 turnRadiusText = new Text(composite, SWT.SINGLE | SWT.BORDER);
318                 
319                 validationLabel = new Label(composite, SWT.NONE);
320                 validationLabel.setText("");
321
322                 lengthText.setEnabled(false);
323                 angleText.setEnabled(false);
324                 rotationAngleText.setEnabled(false);
325                 turnRadiusText.setEnabled(false);
326                 diameterText.setEnabled(false);
327                 thicknessText.setEnabled(false);
328
329                 nameText.addKeyListener(new KeyAdapter() {
330                         @Override
331                         public void keyReleased(KeyEvent e) {
332                                 name = nameText.getText();
333                                 validate();
334                         }
335                 });
336                 
337                 lengthText.addKeyListener(new KeyAdapter() {
338                         @Override
339                         public void keyReleased(KeyEvent e) {
340                                 try {
341                                         length = Double.parseDouble(lengthText.getText()) / lengthFactor;
342                                 } catch (NumberFormatException err) {
343                                         length = null;
344                                 }
345                                 validate();
346                         }
347                 });
348
349                 angleText.addKeyListener(new KeyAdapter() {
350                         @Override
351                         public void keyReleased(KeyEvent e) {
352                                 try {
353                                         angle = Double.parseDouble(angleText.getText());
354                                 } catch (NumberFormatException err) {
355                                         angle = null;
356                                 }
357                                 validate();
358                         }
359                 });
360
361                 rotationAngleText.addKeyListener(new KeyAdapter() {
362                         @Override
363                         public void keyReleased(KeyEvent e) {
364                                 try {
365                                         rotationAngle = Double.parseDouble(rotationAngleText.getText());
366                                 } catch (NumberFormatException err) {
367                                         rotationAngle = null;
368                                 }
369                                 validate();
370                         }
371                 });
372
373                 diameterText.addKeyListener(new KeyAdapter() {
374                         @Override
375                         public void keyReleased(KeyEvent e) {
376                                 try {
377                                         diameter = Double.parseDouble(diameterText.getText()) / lengthFactor;
378                                 } catch (NumberFormatException err) {
379                                         diameter = null;
380                                 }
381                                 validate();
382                         }
383                 });
384                 
385                 thicknessText.addKeyListener(new KeyAdapter() {
386                         @Override
387                         public void keyReleased(KeyEvent e) {
388                                 try {
389                                         thickness = Double.parseDouble(thicknessText.getText()) / lengthFactor;
390                                 } catch (NumberFormatException err) {
391                                         thickness = null;
392                                 }
393                                 validate();
394                         }
395                 });
396
397                 turnRadiusText.addKeyListener(new KeyAdapter() {
398                         @Override
399                         public void keyReleased(KeyEvent e) {
400                                 try {
401                                         turnRadius = Double.parseDouble(turnRadiusText.getText()) / lengthFactor;
402                                 } catch (NumberFormatException err) {
403                                         turnRadius = null;
404                                 }
405                                 validate();
406                         }
407                 });
408
409                 horizFillData.applyTo(nameText);
410                 horizFillData.applyTo(lengthText);
411                 horizFillData.applyTo(angleText);
412                 horizFillData.applyTo(rotationAngleText);
413                 horizFillData.applyTo(diameterText);
414                 horizFillData.applyTo(thicknessText);
415                 horizFillData.applyTo(turnRadiusText);
416                 
417                 GridDataFactory.fillDefaults().span(2, 1).align(SWT.END, SWT.END).grab(true, false).applyTo(validationLabel);
418
419                 if (!allowed.contains(PositionType.NEXT) && !allowed.contains(PositionType.PREVIOUS)) {
420                         turnViewer.getList().setEnabled(false);
421                         endViewer.getList().setEnabled(false);
422                         inlineSplit = true;
423                 }
424
425                 return composite;
426         }
427
428         private void updateInsertPosition(PositionType type) {
429                 if (insertPosition == type)
430                         return;
431                 endButton.setSelection(type == PositionType.NEXT);
432                 middleButton.setSelection(type == PositionType.SPLIT);
433                 startButton.setSelection(type == PositionType.PREVIOUS);
434                 insertPosition = type;
435         }
436
437         @Override
438         public void selectionChanged(SelectionChangedEvent event) {
439                 IStructuredSelection sel = (IStructuredSelection) event.getSelection();
440                 Item i = (Item) sel.getFirstElement();
441                 if (i != null) {
442                         selected = i;
443                         if (event.getSource() == inlineViewer) {
444                                 turnViewer.setSelection(new StructuredSelection());
445                                 endViewer.setSelection(new StructuredSelection());
446                         } else if (event.getSource() == turnViewer) {
447                                 inlineViewer.setSelection(new StructuredSelection());
448                                 endViewer.setSelection(new StructuredSelection());
449                         } else if (event.getSource() == endViewer) {
450                                 inlineViewer.setSelection(new StructuredSelection());
451                                 turnViewer.setSelection(new StructuredSelection());
452                         }
453                         
454                         name = generateUniqueName(selected.getName());
455                         nameText.setText(name);
456                         
457                         validate();
458                 }
459         }
460
461         private void validate() {
462                 filterAllowed.clear();
463                 Set<PositionType> filterAllowed = new HashSet<PositionType>();
464                 boolean ok = true;
465                 String msg = null;
466                 
467                 if (name.isEmpty() || usedNames.contains(name)) {
468                         ok = false;
469                         if (msg == null) {
470                                 if (name.isEmpty())
471                                         msg = "Please provide a valid name";
472                                 else
473                                         msg = "Name \"" + name + "\" is already in use";
474                         }
475                 }
476                 
477                 if (selected == null) {
478                         ok = false;
479                 } else if (selected.isCode()) {// TODO : instead of disabling the button, we should filter the content.
480                         ok = false;
481                 } else {
482                         lenghtAdjustable = ((selected.getType() == Type.INLINE)
483                                         && (selected.isVariable() || selected.isModifiable()));
484                         if (insertAdjustable) {
485                                 switch (selected.getType()) {
486                                 case END:
487                                         startButton.setEnabled(false);
488                                         middleButton.setEnabled(false);
489                                         endButton.setEnabled(true);
490                                         updateInsertPosition(PositionType.NEXT);
491                                         break;
492                                 case INLINE:
493                                         if (!selected.isVariable()) {
494                                                 startButton.setEnabled(true);
495                                                 middleButton.setEnabled(true);
496                                                 endButton.setEnabled(true);
497                                         } else {
498                                                 startButton.setEnabled(false);
499                                                 middleButton.setEnabled(false);
500                                                 endButton.setEnabled(true);
501                                                 updateInsertPosition(PositionType.NEXT);
502                                         }
503                                         break;
504                                 case NOZZLE:
505                                         startButton.setEnabled(false);
506                                         middleButton.setEnabled(false);
507                                         endButton.setEnabled(true);
508                                         updateInsertPosition(PositionType.NEXT);
509                                         break;
510                                 case TURN:
511                                         startButton.setEnabled(false);
512                                         middleButton.setEnabled(true);
513                                         endButton.setEnabled(true);
514                                         if (insertPosition == PositionType.PREVIOUS)
515                                                 updateInsertPosition(PositionType.NEXT);
516                                         break;
517                                 case EQUIPMENT:
518                                         throw new RuntimeException("Expected component, got equipment " + selected);
519                                 }
520                         } else if (lenghtAdjustable) {
521                                 if (component instanceof InlineComponent) {
522                                         startButton.setEnabled(true);
523                                         middleButton.setEnabled(true);
524                                         endButton.setEnabled(true);
525                                 } else if (component instanceof TurnComponent) {
526                                         startButton.setEnabled(false);
527                                         middleButton.setEnabled(true);
528                                         endButton.setEnabled(true);
529                                         if (insertPosition == PositionType.PREVIOUS)
530                                                 updateInsertPosition(PositionType.NEXT);
531                                 } else if (component instanceof EndComponent || component instanceof Nozzle) {
532                                         startButton.setEnabled(false);
533                                         middleButton.setEnabled(false);
534                                         endButton.setEnabled(true);
535                                         updateInsertPosition(PositionType.NEXT);
536                                 }
537                         } else {
538                                 startButton.setEnabled(false);
539                                 middleButton.setEnabled(false);
540                                 endButton.setEnabled(true);
541                         }
542                         if (selected.isVariable() || selected.isModifiable()) {
543                                 if (selected.getType() == Type.INLINE) {
544                                         filterAllowed.add(PositionType.NEXT);
545                                         filterAllowed.add(PositionType.PREVIOUS);
546                                         if (inlineSplit && selected.isVariable()) {
547                                                 lengthText.setEnabled(false);
548                                                 angleText.setEnabled(false);
549                                                 rotationAngleText.setEnabled(selected.isRotated());
550                                                 ok = false;
551                                                 if (msg == null) msg = "Cannot split a straight pipe with a straight pipe";
552                                         } else {
553                                                 lengthText.setEnabled(true);
554                                                 angleText.setEnabled(false);
555                                                 rotationAngleText.setEnabled(selected.isRotated());
556                                                 if (length == null || length <= 0.0) {
557                                                         ok = false;
558                                                         if (msg == null) msg = "Please provide a valid length";
559                                                 }
560                                         }
561                                 } else if (selected.getType() == Type.TURN) {
562                                         filterAllowed.add(PositionType.NEXT);
563                                         filterAllowed.add(PositionType.PREVIOUS);
564                                         lengthText.setEnabled(false);
565                                         angleText.setEnabled(true);
566                                         rotationAngleText.setEnabled(true);
567                                         if (angle == null) {
568                                                 ok = false;
569                                                 if (msg == null) msg = "Please provide a rotation angle";
570                                         }
571                                 } else {
572                                         // this should not happen, since end components should not have variable, or
573                                         // modifiable flag.
574                                         lengthText.setEnabled(false);
575                                         angleText.setEnabled(false);
576                                         rotationAngleText.setEnabled(false);
577
578                                 }
579                         } else {
580                                 lengthText.setEnabled(false);
581                                 angleText.setEnabled(false);
582                                 rotationAngleText.setEnabled(selected.getType() == Type.TURN || selected.isRotated());
583                         }
584
585                         if (selected.isSizeChange()) {
586                                 turnRadiusText.setEnabled(true);
587                                 diameterText.setEnabled(true);
588                                 thicknessText.setEnabled(true);
589                                 if (diameter == null || diameter <= 0.0) {
590                                         ok = false;
591                                         if (msg == null) msg = "Please provide a valid diameter";
592                                 }
593                                 if (turnRadius == null || diameter != null && turnRadius < diameter / 2) {
594                                         ok = false;
595                                         if (msg == null) msg = "Please provide a valid turn radius";
596                                 }
597                                 if (thickness == null || thickness < 0.0 || diameter != null && thickness >= diameter / 2) {
598                                         ok = false;
599                                         if (msg == null) msg = "Please provide a valid wall thickness";
600                                 }
601                         } else {
602                                 turnRadiusText.setEnabled(false);
603                                 diameterText.setEnabled(false);
604                         }
605
606                         if (!selected.isVariable()) {
607                                 switch (selected.getType()) {
608                                 case END:
609                                         filterAllowed.add(PositionType.NEXT);
610                                         filterAllowed.add(PositionType.PREVIOUS);
611                                         break;
612                                 case NOZZLE:
613                                 case EQUIPMENT:
614                                         break;
615                                 case INLINE:
616                                         filterAllowed.add(PositionType.NEXT);
617                                         filterAllowed.add(PositionType.PREVIOUS);
618                                         filterAllowed.add(PositionType.SPLIT);
619                                 case TURN:
620                                         filterAllowed.add(PositionType.NEXT);
621                                         filterAllowed.add(PositionType.PREVIOUS);
622                                 }
623                         }
624                 }
625                 for (PositionType t : filterAllowed) {
626                         if (allowed.contains(t))
627                                 this.filterAllowed.add(t);
628                 }
629
630                 validationLabel.setText(msg != null ? msg : "");
631                 validationLabel.requestLayout();
632                 
633                 getButton(OK).setEnabled(ok);
634         }
635
636         private String generateUniqueName(String name) {
637                 int i = 1;
638                 String newName;
639                 while (usedNames.contains((newName = name + "_" + i)))
640                         i++;
641                 return newName;
642         }
643
644         public Item getSelected() {
645                 return selected;
646         }
647         
648         public String getName() {
649                 return name;
650         }
651
652         public Double getAngle() {
653                 return angle;
654         }
655
656         public Double getLength() {
657                 return length;
658         }
659
660         public Double getRotationAngle() {
661                 return rotationAngle;
662         }
663
664         public Double getDiameter() {
665                 return diameter;
666         }
667
668         public Double getTurnRadius() {
669                 return turnRadius;
670         }
671
672         public Set<PositionType> filterAllowed() {
673                 return filterAllowed;
674         }
675
676         public PositionType getInsertPosition() {
677                 return insertPosition;
678         }
679
680         public boolean isInsertAdjustable() {
681                 return insertAdjustable;
682         }
683
684         public boolean isLenghtAdjustable() {
685                 return lenghtAdjustable;
686         }
687
688         public Double getThickness() {
689                 return thickness;
690         }
691
692 }