condition.isInverse = isInverse;
return condition;
}
-
- /*
- class ConditionDialog extends Dialog {
- // Resource of the edited condition
- private Resource existingResource;
-
- // Inverse condition button
- private boolean isInverse;
- private Button inverseField;
-
- // Condition type
- private int typeIndex;
- private Combo typeField;
-
- // Type-specific control panels under a stack layout
- private Composite stackPanel;
- private StackLayout stack;
-
- private Composite propertyPanel;
- private Composite regionPanel;
- private Composite routePanel;
- private Composite aggregatePanel;
-
- // Property condition
- private Double lowerLimit;
- private Double upperLimit;
- private String propertyName;
-
- private Text propertyNameField;
- private Text lowerLimitField;
- private Text upperLimitField;
-
- // Region condition
- private Resource region;
- private Combo regionField;
-
- // Route condition
- private Resource route;
- private Combo routeField;
-
- // Aggregate condition
- private List<Condition> subConditions;
- private boolean isConjunction;
-
- private org.eclipse.swt.widgets.List subConditionField;
- private Combo operatorField;
-
- public ConditionDialog(Shell shell, Condition condition) {
- super(shell);
-
- typeIndex = 0;
- isInverse = false;
- propertyName = "";
- upperLimit = null;
- lowerLimit = null;
- subConditions = new ArrayList<>();
-
- existingResource = condition != null ? condition.resource : null;
-
- if (condition != null) {
- if (condition instanceof PropertyCondition) {
- typeIndex = 0;
- PropertyCondition propertyCondition = (PropertyCondition)condition;
- propertyName = propertyCondition.propertyName;
- upperLimit = propertyCondition.upperLimit;
- lowerLimit = propertyCondition.lowerLimit;
- }
- else if (condition instanceof RegionCondition) {
- typeIndex = 1;
- region = ((RegionCondition)condition).regionResource;
- }
- else if (condition instanceof RouteCondition) {
- typeIndex = 2;
- route = ((RouteCondition)condition).routeResource;
- }
- else if (condition instanceof AggregateCondition) {
- typeIndex = 3;
- subConditions = new ArrayList<>(((AggregateCondition)condition).conditions);
- isConjunction = ((AggregateCondition)condition).type == Type.CONJUNCTION;
- isInverse = ((AggregateCondition)condition).type == Type.NEGATION;
- }
- }
- }
-
- @Override
- protected Control createDialogArea(Composite parent) {
- getShell().setText("Edit selector condition");
-
- Composite content = (Composite)super.createDialogArea(parent);
- GridLayoutFactory.swtDefaults().numColumns(1).applyTo(content);
-
- GridDataFactory defaultWidth = GridDataFactory.swtDefaults().hint(200, SWT.DEFAULT);
-
- // Is inverse
- inverseField = new Button(content, SWT.CHECK);
- inverseField.setText("Is inverse");
- inverseField.setSelection(isInverse);
-
- // Condition type
- typeField = new Combo(content, SWT.BORDER | SWT.READ_ONLY);
- typeField.setItems("Property value", "In region", "On route", "Combination");
- typeField.select(typeIndex);
-
- // Type-dependent stacked panels
- stackPanel = new Composite(content, SWT.NONE);
- stack = new StackLayout();
- stackPanel.setLayout(stack);
-
- // Property condition panel
- propertyPanel = new Composite(stackPanel, SWT.NONE);
- GridLayoutFactory.swtDefaults().numColumns(2).applyTo(propertyPanel);
-
- new Label(propertyPanel, SWT.NONE).setText("Property name");
- propertyNameField = new Text(propertyPanel, SWT.BORDER);
- propertyNameField.setText(propertyName);
- defaultWidth.applyTo(propertyNameField);
-
- new Label(propertyPanel, SWT.NONE).setText("Lower limit");
- lowerLimitField = new Text(propertyPanel, SWT.BORDER);
- defaultWidth.applyTo(lowerLimitField);
- if (lowerLimit != null) lowerLimitField.setText(lowerLimit.toString());
-
- new Label(propertyPanel, SWT.NONE).setText("Upper limit");
- upperLimitField = new Text(propertyPanel, SWT.BORDER);
- defaultWidth.applyTo(upperLimitField);
- if (upperLimit != null) upperLimitField.setText(upperLimit.toString());
-
- // Region condition panel
- regionPanel = new Composite(stackPanel, SWT.NONE);
- GridLayoutFactory.swtDefaults().numColumns(2).applyTo(regionPanel);
-
- new Label(regionPanel, SWT.NONE).setText("Region");
- regionField = new Combo(regionPanel, SWT.BORDER | SWT.READ_ONLY);
- regionField.setItems(regionNames);
- defaultWidth.applyTo(regionField);
-
- if (region != null) {
- int regionIndex = Arrays.indexOf(regionResources, region);
- regionField.select(regionIndex);
- }
- else {
- regionField.select(0);
- }
-
- // Route condition panel
- routePanel = new Composite(stackPanel, SWT.NONE);
- GridLayoutFactory.swtDefaults().numColumns(2).applyTo(routePanel);
-
- new Label(routePanel, SWT.NONE).setText("Route");
- routeField = new Combo(routePanel, SWT.BORDER | SWT.READ_ONLY);
- routeField.setItems(routeNames);
- defaultWidth.applyTo(routeField);
-
- if (route != null) {
- int routeIndex = Arrays.indexOf(routeResources, route);
- routeField.select(routeIndex);
- }
- else {
- routeField.select(0);
- }
-
- // Aggregate condition panel
- aggregatePanel = new Composite(stackPanel, SWT.NONE);
- GridLayoutFactory.swtDefaults().numColumns(2).applyTo(aggregatePanel);
-
- new Label(aggregatePanel, SWT.NONE).setText("Operator");
- operatorField = new Combo(aggregatePanel, SWT.READ_ONLY);
- operatorField.setItems("And", "Or");
- operatorField.select(isConjunction ? 0 : 1);
-
- new Label(aggregatePanel, SWT.NONE).setText("Sub-conditions");
- Composite buttons = new Composite(aggregatePanel, SWT.NONE);
- RowLayoutFactory.swtDefaults().justify(true).fill(true).extendedMargins(0, 0, 0, 0).type(SWT.HORIZONTAL).applyTo(buttons);
-
- Button addButton = new Button(buttons, SWT.PUSH);
- addButton.setText("Add");
- Button removeButton = new Button(buttons, SWT.PUSH);
- removeButton.setText("Remove");
- Button editButton = new Button(buttons, SWT.PUSH);
- editButton.setText("Edit");
-
- new Label(aggregatePanel, SWT.NONE);
- subConditionField = new org.eclipse.swt.widgets.List(aggregatePanel, SWT.BORDER);
- GridDataFactory.swtDefaults().hint(200, 150).applyTo(subConditionField);
- if (subConditions != null) {
- Session session = Simantics.getSession();
- List<String> items = new ArrayList<>();
- for (Condition c : subConditions) {
- try {
- items.add(ElementSelector.getExpression(session, c.resource));
- } catch (DatabaseException e1) {
- LOGGER.error("Condition expression read failed", e1);
- items.add("<Unknown expression>");
- }
- }
-
- subConditionField.setItems(items.toArray(new String[items.size()]));
- }
-
- addButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- ConditionDialog conditionDialog = new ConditionDialog(getShell(), null);
- if (conditionDialog.open() == Window.OK) {
- Condition condition;
- try {
- condition = conditionDialog.createCondition();
- subConditions.add(condition);
-
- try {
- subConditionField.add(ElementSelector.getExpression(Simantics.getSession(), condition.resource));
- } catch (DatabaseException e1) {
- LOGGER.error("Condition expression read failed", e1);
- subConditionField.add("<Unknown expression>");
- }
- } catch (DatabaseException e2) {
- LOGGER.error("Create condition failed", e2);
- }
- }
- }
- });
-
- removeButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- int index = subConditionField.getSelectionIndex();
- if (index >= 0) {
- subConditionField.deselectAll();
- subConditionField.remove(index);
- subConditions.remove(index);
-
- if (index < subConditions.size())
- subConditionField.setSelection(index);
- }
-
- boolean selected = subConditionField.getSelectionIndex() >= 0;
- removeButton.setEnabled(selected);
- editButton.setEnabled(selected);
- }
- });
-
- editButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- int index = subConditionField.getSelectionIndex();
- if (index >= 0) {
- Condition condition = subConditions.get(index);
- ConditionDialog conditionDialog = new ConditionDialog(getShell(), condition);
- if (conditionDialog.open() == Window.OK) {
- try {
- condition = conditionDialog.createCondition();
- subConditions.set(index, condition);
-
- try {
- subConditionField.setItem(index, ElementSelector.getExpression(Simantics.getSession(), condition.resource));
- } catch (DatabaseException e1) {
- LOGGER.error("Condition expression read failed", e1);
- subConditionField.setItem(index, "<Unknown expression>");
- }
- } catch (DatabaseException e2) {
- LOGGER.error("Create condition failed", e2);
- }
- }
- }
- }
- });
-
- subConditionField.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- boolean selected = subConditionField.getSelectionIndex() >= 0;
- removeButton.setEnabled(selected);
- editButton.setEnabled(selected);
- }
- });
-
- // Stack layout update
- typeField.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- updateStack();
- }
- });
-
- updateStack();
-
- return content;
- }
-
- @Override
- protected void okPressed() {
- isInverse = inverseField.getSelection();
-
- switch (typeIndex) {
- case 0: // Property condition
- propertyName = propertyNameField.getText();
- try {
- String lowerLimitText = lowerLimitField.getText();
- lowerLimit = lowerLimitText.equals("") ? null : Double.valueOf(lowerLimitText);
- String upperLimitText = upperLimitField.getText();
- upperLimit = upperLimitText.equals("") ? null : Double.valueOf(upperLimitText);
- }
- catch (NumberFormatException e) {
- ErrorDialog.openError(getShell(), "Error", "Invalid numeric value: " + e.getMessage(), new Status(OK, "org.simantics.district.selection.ui", e.getMessage()));
- return;
- }
- break;
- case 1: { // Region condition
- int selectionIndex = regionField.getSelectionIndex();
- if (selectionIndex < 0) {
- ErrorDialog.openError(getShell(), "Error", "Please select a region", new Status(OK, "org.simantics.district.selection.ui", "No region selection"));
- return;
- }
- region = regionResources[selectionIndex];
- break;
- }
- case 2: // Route condition
- route = routeResources[routeField.getSelectionIndex()];
- break;
- case 3: // Aggregate condition
- isConjunction = operatorField.getSelectionIndex() == 0;
- break;
- }
-
- super.okPressed();
- }
-
- protected Condition createCondition() throws DatabaseException {
- if (isInverse && !(typeIndex == 3 && !isConjunction)) {
- Resource resource0 = createCondition0(typeIndex);
-
- // Create a negation
- Resource resource = Simantics.getSession().syncRequest(new WriteResult<Resource>() {
- @Override
- public Resource perform(WriteGraph graph) throws DatabaseException {
- ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
- Layer0 L0 = Layer0.getInstance(graph);
-
- Resource r = graph.newResource();
- graph.claim(r, L0.InstanceOf, ES.Negation);
- graph.claim(r, ES.HasSubcondition, resource0);
- return r;
- }
- });
-
- return ElementSelector.getCondition(Simantics.getSession(), resource);
- }
- else {
- return ElementSelector.getCondition(Simantics.getSession(), createCondition0(typeIndex));
- }
- }
-
- private Resource createCondition0(int index) throws DatabaseException {
- switch (index) {
- case 0: return createPropertyCondition();
- case 1: return createRegionCondition();
- case 2: return createRouteCondition();
- case 3: return createAggregateCondition();
- default: throw new IllegalStateException("Invalid condition type code " + index);
- }
- }
-
- private Resource createPropertyCondition() throws DatabaseException {
- return Simantics.getSession().syncRequest(new WriteResult<Resource>() {
- @Override
- public Resource perform(WriteGraph graph) throws DatabaseException {
- ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
- Layer0 L0 = Layer0.getInstance(graph);
-
- Resource r = graph.newResource();
- graph.claim(r, L0.InstanceOf, ES.PropertyCondition);
- graph.claimLiteral(r, ES.PropertyCondition_HasPropertyName, propertyName);
- if (lowerLimit != null)
- graph.claimLiteral(r, ES.PropertyCondition_HasLowerLimit, L0.Double, lowerLimit);
- if (upperLimit != null)
- graph.claimLiteral(r, ES.PropertyCondition_HasUpperLimit, L0.Double, upperLimit);
-
- return r;
- }
- });
- }
-
- private Resource createAggregateCondition() throws DatabaseException {
- return Simantics.getSession().syncRequest(new WriteResult<Resource>() {
- @Override
- public Resource perform(WriteGraph graph) throws DatabaseException {
- ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
- Layer0 L0 = Layer0.getInstance(graph);
-
- Resource r;
- if (existingResource != null) {
- // Reuse existing resource
- r = existingResource;
- // Clear any previous statements
- graph.deny(existingResource);
- }
- else {
- r = graph.newResource();
- }
-
- Resource type;
- type = isConjunction ? ES.Conjunction : isInverse ? ES.Negation : ES.Disjunction;
-
- graph.claim(r, L0.InstanceOf, type);
- for (Condition c : subConditions) {
- graph.claim(r, ES.HasSubcondition, c.resource);
- }
-
- return r;
- }
- });
- }
-
- private Resource createRouteCondition() throws DatabaseException {
- return Simantics.getSession().syncRequest(new WriteResult<Resource>() {
- @Override
- public Resource perform(WriteGraph graph) throws DatabaseException {
- ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
- Layer0 L0 = Layer0.getInstance(graph);
-
- Resource r = graph.newResource();
- graph.claim(r, L0.InstanceOf, ES.RouteCondition);
- graph.claim(r, ES.RouteCondition_HasRoute, route);
- return r;
- }
- });
- }
-
- private Resource createRegionCondition() throws DatabaseException {
- return Simantics.getSession().syncRequest(new WriteResult<Resource>() {
- @Override
- public Resource perform(WriteGraph graph) throws DatabaseException {
- ElementSelectionResource ES = ElementSelectionResource.getInstance(graph);
- Layer0 L0 = Layer0.getInstance(graph);
-
- Resource r = graph.newResource();
- graph.claim(r, L0.InstanceOf, ES.RegionCondition);
- graph.claim(r, ES.RegionCondition_HasRegion, region);
- return r;
- }
- });
- }
-
- private void updateStack() {
- typeIndex = typeField.getSelectionIndex();
- switch (typeIndex) {
- case 0: stack.topControl = propertyPanel; break;
- case 1: stack.topControl = regionPanel; break;
- case 2: stack.topControl = routePanel; break;
- case 3: stack.topControl = aggregatePanel; break;
- }
-
- stackPanel.layout();
- }
- }
- */
static List<Resource> findComponentTypes(ReadGraph graph) throws DatabaseException {
DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);