+\r
+ private static class ResolveURI extends UnaryRead<String, Object> {\r
+ public ResolveURI(String uri) {\r
+ super(uri);\r
+ }\r
+ @Override\r
+ public Object perform(ReadGraph graph) throws DatabaseException {\r
+ Object result = graph.syncRequest(new PossibleResource(parameter));\r
+ if (result == null)\r
+ result = Variables.getPossibleVariable(graph, parameter);\r
+ return result;\r
+ }\r
+ }\r
+\r
+ private static final Function1<Object, Boolean> PERFORM_DEFAULT_ACTION_FOR_URI_RESOURCE = new Function1<Object, Boolean>() {\r
+ @Override\r
+ public Boolean apply(Object p0) {\r
+ LocationEvent le = (LocationEvent) p0;\r
+ if (le.location.startsWith(DocumentDialect.SIMANTICS_INTERNAL_URI_PREFIX)) {\r
+ // This is not a valid URL anyway so deny relocation.\r
+ le.doit = false;\r
+\r
+ // Try to execute default action for the resource or variable\r
+ // that the URI represents.\r
+ String uri = le.location.substring(DocumentDialect.SIMANTICS_INTERNAL_URI_PREFIX.length());\r
+ try {\r
+ Session s = Simantics.getSession();\r
+ Object input = RequestUtil.trySyncRequest(s,\r
+ SimanticsUI.UI_THREAD_REQUEST_START_TIMEOUT,\r
+ SimanticsUI.UI_THREAD_REQUEST_EXECUTION_TIMEOUT,\r
+ new ResolveURI(uri));\r
+ if (input != null) {\r
+ DefaultActions.asyncPerformDefaultAction(s, input, false, false, false);\r
+ }\r
+ } catch (DatabaseException | InterruptedException e) {\r
+ Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to resolve URI to a database resource or variable: " + uri, e));\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ };\r
+\r
+ @SCLValue(type = "ReadGraph -> Resource -> Variable -> b")\r
+ public static Function1<Object, Boolean> locationChanging(ReadGraph graph, Resource variable, Variable context) throws DatabaseException {\r
+ return PERFORM_DEFAULT_ACTION_FOR_URI_RESOURCE;\r
+ }\r
+\r