]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/widget/Explorer.java
Playground for Antti.
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / widget / Explorer.java
index c3d629cc33d25236feec4c62bd554c07299d4289..e85d08f47f926282e2d70a3d1a4758390a961347 100644 (file)
-package org.simantics.document.swt.core.widget;\r
-\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionProvider;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.swt.widgets.Tree;\r
-import org.eclipse.ui.IWorkbenchSite;\r
-import org.simantics.Simantics;\r
-import org.simantics.browsing.ui.Column;\r
-import org.simantics.browsing.ui.Column.Align;\r
-import org.simantics.browsing.ui.StatePersistor;\r
-import org.simantics.browsing.ui.swt.InputSourceImpl;\r
-import org.simantics.browsing.ui.swt.widgets.DragSourceListenerFactory;\r
-import org.simantics.browsing.ui.swt.widgets.ModelBrowser;\r
-import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl;\r
-import org.simantics.db.layer0.variable.VariableBean;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.document.server.JSONObject;\r
-import org.simantics.document.swt.core.SWTDocument;\r
-import org.simantics.document.swt.core.SWTViews;\r
-import org.simantics.document.swt.core.base.LeafWidgetManager;\r
-import org.simantics.document.swt.core.base.WidgetContainer;\r
-import org.simantics.document.swt.core.bean.ColumnBean;\r
-import org.simantics.document.swt.core.bean.ColumnsBean;\r
-import org.simantics.scl.runtime.function.Function1;\r
-import org.simantics.ui.selection.WorkbenchSelectionUtils;\r
-\r
-public class Explorer extends LeafWidgetManager<ModelBrowser> {\r
-\r
-       @Override\r
-       protected void doUpdateProperties(SWTDocument document, ModelBrowser control, JSONObject object) {\r
-               //                      String text = object.getField("text");\r
-               //                      control.setText(text);\r
-       }\r
-\r
-       protected Column[] getColumns(ColumnsBean bean) {\r
-               Column[] result = new Column[bean.columns.length];\r
-               for(int i=0;i<bean.columns.length;i++) {\r
-                       ColumnBean cb = bean.columns[i];\r
-                       result[i] = new Column(cb.key, cb.label, Align.valueOf(cb.alignment), cb.width, cb.tooltip, cb.grab, cb.weight);\r
-               }\r
-               return result;\r
-       }\r
-       \r
-       @Override\r
-       protected ModelBrowser doCreateControl(SWTDocument document, Composite parent, JSONObject object) {\r
-               \r
-               String browseContext = object.getJSONField("browseContext");\r
-               if(browseContext == null) return null;\r
-\r
-               String contextMenuId = object.getJSONField("contextMenuId");\r
-               \r
-               Boolean displayFilter = object.getJSONField("displayFilter");\r
-               Boolean displayHeader = object.getJSONField("displayHeader");\r
-               Integer style = object.getJSONField("style");\r
-               if(style == null) style = SWT.FULL_SELECTION;\r
-               \r
-        Boolean vscroll = object.getJSONFieldDefault("VScroll", false);\r
-        if(Boolean.TRUE.equals(vscroll))\r
-            style |= SWT.V_SCROLL;\r
-        \r
-        Boolean hscroll = object.getJSONFieldDefault("HScroll", false);\r
-        if(Boolean.TRUE.equals(hscroll))\r
-            style |= SWT.H_SCROLL;\r
-\r
-        Boolean noscroll = object.getJSONFieldDefault("NoScroll", false);\r
-        if(Boolean.TRUE.equals(noscroll))\r
-            style |= SWT.NO_SCROLL;\r
-               \r
-               StatePersistor persistor = object.getJSONField("persistor");\r
-               final Function1<Object, Boolean> selectionListener = object.getJSONField("selectionListener");\r
-\r
-               DragSourceListenerFactory dragSourceListenerFactory = object.getJSONField("dragSourceListenerFactory");\r
-               \r
-               final IWorkbenchSite site = document.getSite();\r
-               final ISelectionProvider selectionProvider = document.getSelectionProvider();\r
-\r
-               Map<String, Object> args = new HashMap<String, Object>();\r
-               args.put("displaySelectors", Boolean.FALSE);\r
-               args.put("displayFilter", displayFilter != null ? displayFilter : Boolean.FALSE);\r
-\r
-//             GridLayoutFactory.fillDefaults().applyTo(parent);\r
-\r
-               ColumnsBean columns = object.getBeanJSONFieldDefault("columns", ColumnsBean.BINDING, null);\r
-               String editingColumn = object.getJSONFieldDefault("editingColumn", null);\r
-               \r
-//             Column[] COLUMNS = new Column[] {\r
-//                             new Column("HasDisplayProperty", "Parameter description", Align.LEFT, 80, "Input parameter name", true),\r
-//                             new Column("HasDisplayValue", "Value", Align.RIGHT, 65, "Value"),\r
-//                             new Column("HasDisplayUnit", "Unit", Align.RIGHT, 100, "Unit") \r
-//             };\r
-               \r
-//             parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));\r
-               \r
-               final ModelBrowser control = new ModelBrowser(Collections.singleton(browseContext), args, site, parent, new WidgetSupportImpl(), style);\r
-\r
-               Tree tree = control.getExplorerControl();\r
-               tree.addListener(SWT.SetData, new Listener() {\r
-                       \r
-                       @Override\r
-                       public void handleEvent(Event event) {\r
-                               SWTViews.notifyScrolledComposite(control);\r
-                       }\r
-                       \r
-               });\r
-               \r
-               if(columns != null)\r
-                       control.setColumns(getColumns(columns));\r
-               if(editingColumn != null)\r
-                       control.setEditingColumn(editingColumn);\r
-               if(contextMenuId != null)\r
-                       control.setContextMenuId(contextMenuId);\r
-               if(dragSourceListenerFactory != null)\r
-                       control.setDragSourceListenerFactory(dragSourceListenerFactory);\r
-               if(displayHeader != null)\r
-                       tree.setHeaderVisible(displayHeader);\r
-               \r
-               control.setStatePersistor(persistor);\r
-\r
-               control.finish();\r
-               \r
-               control.setInputSource(new InputSourceImpl<Object>() {\r
-\r
-                       @Override\r
-                       public Object get(ISessionContext ctx, Object selection) {\r
-                               return selection;\r
-                       }\r
-\r
-               });\r
-               \r
-               // TODO: fixme!\r
-               Object i = object.getJSONField("explorerInput");\r
-               if(i instanceof VariableBean) {\r
-                       control.setInput(Simantics.getSessionContext(), ((VariableBean)i).getVariable());\r
-               } else {\r
-                       control.setInput(Simantics.getSessionContext(), i);\r
-               }\r
-               \r
-               control.addListenerToControl(SWT.Selection, new Listener() {\r
-\r
-                       @Override\r
-                       public void handleEvent(Event event) {\r
-\r
-                               if(selectionListener != null)\r
-                                       selectionListener.apply(event);\r
-                               \r
-                               ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();\r
-                               \r
-                               // TODO: refactor this!\r
-\r
-                               if(selectionProvider != null) {\r
-                                       selectionProvider.setSelection(selection);\r
-                               }\r
-                               \r
-//                             if (site != null) {\r
-//                                     ISelectionProvider sp = site.getSelectionProvider();\r
-//                                     if (sp != null) {\r
-//                                             sp.setSelection(selection);\r
-//                                     }\r
-//                             }\r
-\r
-                       }\r
-\r
-               });     \r
-\r
-               return control;\r
-\r
-       }\r
-       \r
-       @Override\r
-       public String getProperty(SWTDocument document, JSONObject object, WidgetContainer<ModelBrowser> widget, String property) {\r
-           if("selection".equals(property)) {\r
-            ISelection selection = (ISelection)widget.getControl().getExplorer().getWidgetSelection();\r
-            return SWTViews.encode(object, property, WorkbenchSelectionUtils.getWorkbenchSelectionElements(selection));\r
-           }\r
-           return null;\r
-       }\r
-\r
-}\r
+package org.simantics.document.swt.core.widget;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchSite;
+import org.simantics.Simantics;
+import org.simantics.browsing.ui.Column;
+import org.simantics.browsing.ui.Column.Align;
+import org.simantics.browsing.ui.StatePersistor;
+import org.simantics.browsing.ui.swt.InputSourceImpl;
+import org.simantics.browsing.ui.swt.widgets.DragSourceListenerFactory;
+import org.simantics.browsing.ui.swt.widgets.ModelBrowser;
+import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl;
+import org.simantics.db.layer0.variable.VariableBean;
+import org.simantics.db.management.ISessionContext;
+import org.simantics.document.server.IEventCommand;
+import org.simantics.document.server.JSONObject;
+import org.simantics.document.server.bean.Command;
+import org.simantics.document.server.client.CommandManager;
+import org.simantics.document.server.client.WidgetData;
+import org.simantics.document.server.handler.AbstractEventHandler;
+import org.simantics.document.server.io.CommandContext;
+import org.simantics.document.server.io.CommandContextImpl;
+import org.simantics.document.server.io.CommandContextMutable;
+import org.simantics.document.server.io.ICommand;
+import org.simantics.document.server.io.JSONObjectUtils;
+import org.simantics.document.swt.core.SWTDocument;
+import org.simantics.document.swt.core.SWTViews;
+import org.simantics.document.swt.core.base.LeafWidgetManager;
+import org.simantics.document.swt.core.base.PostEventCommand;
+import org.simantics.document.swt.core.base.WidgetContainer;
+import org.simantics.document.swt.core.bean.ColumnBean;
+import org.simantics.document.swt.core.bean.ColumnsBean;
+import org.simantics.scl.runtime.function.Function1;
+import org.simantics.scl.runtime.function.Function2;
+import org.simantics.ui.selection.WorkbenchSelectionUtils;
+import org.simantics.utils.datastructures.Pair;
+
+public class Explorer extends LeafWidgetManager<ModelBrowser> {
+
+       @Override
+       protected void doUpdateProperties(SWTDocument document, ModelBrowser control, JSONObject object) {
+               //                      String text = object.getField("text");
+               //                      control.setText(text);
+       }
+
+       protected Column[] getColumns(ColumnsBean bean) {
+               Column[] result = new Column[bean.columns.length];
+               for(int i=0;i<bean.columns.length;i++) {
+                       ColumnBean cb = bean.columns[i];
+                       result[i] = new Column(cb.key, cb.label, Align.valueOf(cb.alignment), cb.width, cb.tooltip, cb.grab, cb.weight);
+               }
+               return result;
+       }
+       
+       @Override
+       protected ModelBrowser doCreateControl(SWTDocument document, Composite parent, JSONObject object) {
+               
+               String browseContext = object.getJSONField("browseContext");
+               if(browseContext == null) return null;
+
+               String contextMenuId = object.getJSONField("contextMenuId");
+               
+               Boolean displayFilter = object.getJSONField("displayFilter");
+               Boolean displayHeader = object.getJSONField("displayHeader");
+               Integer style = object.getJSONField("style");
+               if(style == null) style = SWT.FULL_SELECTION;
+               
+        Boolean vscroll = object.getJSONFieldDefault("VScroll", false);
+        if(Boolean.TRUE.equals(vscroll))
+            style |= SWT.V_SCROLL;
+        
+        Boolean hscroll = object.getJSONFieldDefault("HScroll", false);
+        if(Boolean.TRUE.equals(hscroll))
+            style |= SWT.H_SCROLL;
+
+        Boolean noscroll = object.getJSONFieldDefault("NoScroll", false);
+        if(Boolean.TRUE.equals(noscroll))
+            style |= SWT.NO_SCROLL;
+               
+        Boolean check = object.getJSONFieldDefault("Check", false);
+        if(Boolean.TRUE.equals(check))
+            style |= SWT.CHECK;
+
+        StatePersistor persistor = object.getJSONField("persistor");
+               final Function1<Object, Boolean> selectionListener = object.getJSONField("selectionListener");
+
+               final Function2<Object, Boolean, Boolean> checkStateListener = object.getJSONField("checkStateListener");
+
+               DragSourceListenerFactory dragSourceListenerFactory = object.getJSONField("dragSourceListenerFactory");
+               
+               final IWorkbenchSite site = document.getSite();
+               final ISelectionProvider selectionProvider = document.getSelectionProvider();
+
+               Map<String, Object> args = new HashMap<String, Object>();
+               args.put("displaySelectors", Boolean.FALSE);
+               args.put("displayFilter", displayFilter != null ? displayFilter : Boolean.FALSE);
+
+//             GridLayoutFactory.fillDefaults().applyTo(parent);
+
+               ColumnsBean columns = object.getBeanJSONFieldDefault("columns", ColumnsBean.BINDING, null);
+               String editingColumn = object.getJSONFieldDefault("editingColumn", null);
+               
+//             Column[] COLUMNS = new Column[] {
+//                             new Column("HasDisplayProperty", "Parameter description", Align.LEFT, 80, "Input parameter name", true),
+//                             new Column("HasDisplayValue", "Value", Align.RIGHT, 65, "Value"),
+//                             new Column("HasDisplayUnit", "Unit", Align.RIGHT, 100, "Unit") 
+//             };
+               
+//             parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
+               
+               final ModelBrowser control = new ModelBrowser(Collections.singleton(browseContext), args, site, parent, new WidgetSupportImpl(), style);
+
+               Tree tree = control.getExplorerControl();
+               tree.addListener(SWT.SetData, new Listener() {
+                       
+                       @Override
+                       public void handleEvent(Event event) {
+                               SWTViews.notifyScrolledComposite(control);
+                       }
+                       
+               });
+               
+               if(columns != null)
+                       control.setColumns(getColumns(columns));
+               if(editingColumn != null)
+                       control.setEditingColumn(editingColumn);
+               if(contextMenuId != null)
+                       control.setContextMenuId(contextMenuId);
+               if(dragSourceListenerFactory != null)
+                       control.setDragSourceListenerFactory(dragSourceListenerFactory);
+               if(displayHeader != null)
+                       tree.setHeaderVisible(displayHeader);
+               
+               control.setStatePersistor(persistor);
+
+               control.finish();
+               
+               control.setInputSource(new InputSourceImpl<Object>() {
+
+                       @Override
+                       public Object get(ISessionContext ctx, Object selection) {
+                               return selection;
+                       }
+
+               });
+               
+               // TODO: fixme!
+               Object i = object.getJSONField("explorerInput");
+               if(i instanceof VariableBean) {
+                       control.setInput(Simantics.getSessionContext(), ((VariableBean)i).getVariable());
+               } else {
+                       control.setInput(Simantics.getSessionContext(), i);
+               }
+               
+               control.addListenerToControl(SWT.Selection, new Listener() {
+
+                       @Override
+                       public void handleEvent(Event event) {
+                           
+                           switch (event.type) {
+                           case SWT.Selection:
+                               if (event.detail == SWT.CHECK && event.item != null) {
+                                   TreeItem item = (TreeItem) event.item;
+                                   boolean checked = item.getChecked();
+                               if(checkStateListener != null)
+                                   selectionListener.apply(event);
+                               }
+                               break;
+                           }
+
+                               if(selectionListener != null)
+                                       selectionListener.apply(event);
+                               
+                               ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();
+                               
+                               // TODO: refactor this!
+
+                               if(selectionProvider != null) {
+                                       selectionProvider.setSelection(selection);
+                               }
+                               
+//                             if (site != null) {
+//                                     ISelectionProvider sp = site.getSelectionProvider();
+//                                     if (sp != null) {
+//                                             sp.setSelection(selection);
+//                                     }
+//                             }
+
+                       }
+
+               });     
+
+               return control;
+
+       }
+       
+       @Override
+       public String getProperty(SWTDocument document, JSONObject object, WidgetContainer<ModelBrowser> widget, String property) {
+           if("selection".equals(property)) {
+            ISelection selection = (ISelection)widget.getControl().getExplorer().getWidgetSelection();
+            return SWTViews.encode(object, property, WorkbenchSelectionUtils.getWorkbenchSelectionElements(selection));
+           }
+           return null;
+       }
+
+    public static class ExplorerCommandManager implements CommandManager<SWTDocument, WidgetContainer<ModelBrowser>> {
+
+        @Override
+        public Collection<Object> updateCommandListeners(final SWTDocument document, final JSONObject object,
+                WidgetContainer<ModelBrowser> container) {
+            
+            WidgetData wd = document.getWidget(JSONObjectUtils.getId(object));
+            List<ICommand> commands = object.getJSONField("commands");
+            HashSet<Object> listeners = new HashSet<Object>();
+            List<Pair<WidgetData, ICommand>> data = new ArrayList<>();
+            data.addAll(SWTViews.getTriggeredCommands(document, commands, "eventOut"));
+            data.add(new Pair<WidgetData, ICommand>(wd, new Command("onCheck")));
+            Listener listener = new ExplorerListener(wd, data);
+            ModelBrowser browser = container.getControl();
+            if(!browser.isDisposed()) {
+                browser.addListenerToControl(SWT.Selection, listener); 
+                listeners.add(listener);
+            }
+            
+            return listeners;
+            
+        }
+
+        @Override
+        public void removeListener(WidgetContainer<ModelBrowser> container, Object listener) {
+            if(container.getControl().isDisposed()) return;
+            if(listener instanceof ExplorerListener)
+                container.getControl().removeListenerFromControl(SWT.Selection, (Listener)listener);
+        }
+
+    }
+
+    @Override
+    public IEventCommand eventCommand(SWTDocument document, JSONObject object, WidgetContainer widget, ICommand command, CommandContext p) {
+        if("onCheck".equals(command.getCommand())) {
+            CommandContextMutable context = new CommandContextImpl().merge(p);
+            AbstractEventHandler onCheck = object.getJSONField("onCheck");
+            return new PostEventCommand(document, onCheck, context);
+        }
+        return null;
+    }   
+       
+}