import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.simantics.db.Resource;
import org.simantics.diagram.ui.DiagramModelHints;
+import org.simantics.district.network.ui.adapters.DistrictNetworkVertexElement;
import org.simantics.district.network.ui.internal.Activator;
import org.simantics.district.route.Route;
+import org.simantics.district.route.RouteEvent;
import org.simantics.district.route.RouteService;
+import org.simantics.district.route.RouteServiceListener;
import org.simantics.district.route.Waypoint;
import org.simantics.g2d.canvas.ICanvasContext;
import org.simantics.g2d.canvas.IMouseCursorContext;
import org.simantics.g2d.diagram.handler.PickContext;
import org.simantics.g2d.diagram.participant.Selection;
import org.simantics.g2d.diagram.participant.pointertool.AbstractMode;
+import org.simantics.g2d.element.ElementClass;
import org.simantics.g2d.element.ElementUtils;
import org.simantics.g2d.element.IElement;
import org.simantics.g2d.participant.TransformUtil;
import org.simantics.utils.datastructures.hints.IHintContext.Key;
import org.simantics.utils.datastructures.hints.IHintObservable;
import org.simantics.utils.ui.AdaptionUtils;
+import org.simantics.utils.ui.SWTUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*/
protected SingleElementNode node = null;
+ private RouteServiceListener routeServiceListener;
+
public RoutingMode(int mouseId) {
super(mouseId);
}
cursor = mcc == null ? null : mcc.setCursor(mouseId, new Cursor(Cursor.CROSSHAIR_CURSOR));
routeService = Activator.getInstance().getRouteService();
if (routeService != null) {
+
+ routeServiceListener = e -> {
+ switch (e.type) {
+ case RouteEvent.TYPE_ROUTE_PERSISTED:
+ dispose();
+ break;
+ }
+ };
+ routeService.addListener(routeServiceListener);
Resource diagramResource = getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE);
LOGGER.info("Diagram resource: " + diagramResource);
- route = routeService.createRoute("Current", diagramResource);
+ route = routeService.createRoute("[UNPERSISTED] Current", diagramResource);
routeService.registerRoute(route);
}
}
cursor.remove();
cursor = null;
}
- // Discard route if it hasn't been persisted before this
- if (route != null) {
- routeService.discardRoute(route);
- route = null;
- routeService = null;
+ if (routeService != null) {
+ routeService.removeListener(routeServiceListener);
+ // Discard route if it hasn't been persisted before this
+ if (route != null && !route.persisted()) {
+ routeService.discardRoute(route);
+ route = null;
+ }
}
super.removedFromContext(ctx);
}
return;
Object o = ElementUtils.getObject(element);
- if (o instanceof Resource) {
+ if (o instanceof Resource && filterAcceptableElement(element, o)) {
Waypoint wp = route.createWaypoint(o);
route.addWaypoint(wp);
}
}
+ /**
+ * For now, routing can only start from vertices
+ *
+ * @return true if element is a vertex
+ */
+ private boolean filterAcceptableElement(IElement element, Object o) {
+ ElementClass elementClass = element.getElementClass();
+ return elementClass.getId().equals(DistrictNetworkVertexElement.CLASS.getId());
+ }
+
@SGInit
public void initSG(G2DParentNode parent) {
this.parent = parent;
return false;
KeyPressedEvent kpe = (KeyPressedEvent) e;
if (kpe.keyCode == java.awt.event.KeyEvent.VK_ENTER) {
- routeService.persistRoute(route);
+ Route committedRoute = route;
route = null;
+ SWTUtils.asyncExec(Display.getDefault(), () -> {
+ askRouteNameAndPersist(committedRoute);
+ });
dispose();
}
} else if (e instanceof CommandEvent) {
Command cmd = ((CommandEvent) e).command;
if (cmd.equals(Commands.CANCEL)) {
+ // let's ensure if user wants to dispose possibly unpersisted route
+ if (route != null && !route.persisted()) {
+ Route committedRoute = route;
+ SWTUtils.asyncExec(Display.getDefault(), () -> {
+ if (!askDiscardUnpersistedRoute()) {
+ askRouteNameAndPersist(committedRoute);
+ }
+ });
+ }
return dispose();
} else if (cmd.equals(Commands.RENAME)) {
- InputDialog dialog = new InputDialog(
- PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
- "Rename Route",
- "Route name",
- route.getName(),
- s -> s.trim().length() > 0 ? null : "Name must be non-empty");
- if (dialog.open() == Window.OK) {
- route.setName(dialog.getValue());
- }
+ // TODO: still needs key binding contribution for the district diagram editor
+ SWTUtils.asyncExec(Display.getDefault(), () -> {
+ String newName = askRouteName("Rename Route", route.getName());
+ if (newName != null) {
+ route.setName(newName);
+ routeService.refreshRoute(route);
+ }
+ });
}
}
return false;
}
+ private void askRouteNameAndPersist(Route committedRoute) {
+ String newName = askRouteName("Confirm Route", committedRoute.getName());
+ if (newName != null) {
+ committedRoute.setName(newName);
+ routeService.persistRoute(committedRoute);
+ } else {
+ routeService.discardRoute(committedRoute);
+ }
+ }
+
+ private boolean askDiscardUnpersistedRoute() {
+ MessageDialog dialog = new MessageDialog(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Discard route",
+ null,
+ "Discard current unpersisted route?",
+ MessageDialog.INFORMATION,
+ 0,
+ new String[] { "OK", "Cancel" });
+ return dialog.open() == Window.OK;
+ }
+
+ private String askRouteName(String dialogTitle, String initialValue) {
+ InputDialog dialog = new InputDialog(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ dialogTitle,
+ "Route name",
+ initialValue,
+ s -> s.trim().length() > 0 ? null : "Name must be non-empty");
+ if (dialog.open() == Window.OK) {
+ return dialog.getValue();
+ }
+ return null;
+ }
+
protected boolean dispose() {
setDirty();
remove();