]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.team.ui/src/org/simantics/team/ui/SynchroniseView.java
681dda0770ff80fd0edff14bd67fb60f58804dcf
[simantics/platform.git] / bundles / org.simantics.team.ui / src / org / simantics / team / ui / SynchroniseView.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.team.ui;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Iterator;\r
17 import java.util.Map;\r
18 import java.util.Set;\r
19 \r
20 import org.eclipse.jface.action.GroupMarker;\r
21 import org.eclipse.jface.action.IMenuListener;\r
22 import org.eclipse.jface.action.IMenuManager;\r
23 import org.eclipse.jface.action.MenuManager;\r
24 import org.eclipse.jface.layout.GridDataFactory;\r
25 import org.eclipse.jface.layout.TreeColumnLayout;\r
26 import org.eclipse.jface.resource.JFaceResources;\r
27 import org.eclipse.jface.resource.LocalResourceManager;\r
28 import org.eclipse.jface.viewers.ColumnLabelProvider;\r
29 import org.eclipse.jface.viewers.ColumnWeightData;\r
30 import org.eclipse.jface.viewers.ITreeContentProvider;\r
31 import org.eclipse.jface.viewers.LabelProvider;\r
32 import org.eclipse.jface.viewers.TreeViewer;\r
33 import org.eclipse.jface.viewers.TreeViewerColumn;\r
34 import org.eclipse.jface.viewers.Viewer;\r
35 import org.eclipse.jface.viewers.ViewerCell;\r
36 import org.eclipse.swt.SWT;\r
37 import org.eclipse.swt.graphics.Image;\r
38 import org.eclipse.swt.widgets.Composite;\r
39 import org.eclipse.swt.widgets.Control;\r
40 import org.eclipse.swt.widgets.Menu;\r
41 import org.eclipse.swt.widgets.Shell;\r
42 import org.eclipse.ui.IMemento;\r
43 import org.eclipse.ui.IViewSite;\r
44 import org.eclipse.ui.IWorkbenchActionConstants;\r
45 import org.eclipse.ui.IWorkbenchPartSite;\r
46 import org.eclipse.ui.IWorkbenchSite;\r
47 import org.eclipse.ui.PartInitException;\r
48 import org.eclipse.ui.part.IPageSite;\r
49 import org.eclipse.ui.part.ViewPart;\r
50 import org.simantics.browsing.ui.GraphExplorer;\r
51 import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;\r
52 import org.simantics.browsing.ui.swt.DefaultSelectionDataResolver;\r
53 import org.simantics.browsing.ui.swt.GraphExplorerFactory;\r
54 import org.simantics.browsing.ui.swt.ViewArgumentUtils;\r
55 import org.simantics.databoard.Bindings;\r
56 import org.simantics.db.ChangeSetIdentifier;\r
57 import org.simantics.db.ReadGraph;\r
58 import org.simantics.db.Resource;\r
59 import org.simantics.db.Session;\r
60 import org.simantics.db.exception.DatabaseException;\r
61 import org.simantics.db.management.ISessionContext;\r
62 import org.simantics.db.management.ISessionContextChangedListener;\r
63 import org.simantics.db.management.ISessionContextProvider;\r
64 import org.simantics.db.management.SessionContextChangedEvent;\r
65 import org.simantics.db.request.Read;\r
66 import org.simantics.layer0.Layer0;\r
67 import org.simantics.project.ProjectKeys;\r
68 import org.simantics.team.internal.Images;\r
69 import org.simantics.ui.SimanticsUI;\r
70 import org.simantics.utils.datastructures.disposable.DisposeState;\r
71 import org.simantics.utils.datastructures.hints.HintListenerAdapter;\r
72 import org.simantics.utils.datastructures.hints.HintTracker;\r
73 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
74 import org.simantics.utils.datastructures.hints.IHintListener;\r
75 import org.simantics.utils.datastructures.hints.IHintObservable;\r
76 import org.simantics.utils.datastructures.hints.IHintTracker;\r
77 import org.simantics.utils.ui.LayoutUtils;\r
78 \r
79 /**\r
80  * @author Kalle Kondelin\r
81  */\r
82 public class SynchroniseView extends ViewPart {\r
83 \r
84     public SynchroniseView() {\r
85     }\r
86 \r
87     public class SessionContextProjectTracker extends HintTracker {\r
88         public SessionContextProjectTracker() {\r
89             IHintListener activeProjectListener = new HintListenerAdapter() {\r
90                 @Override\r
91                 public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {\r
92                     applySessionContext(getSessionContext());\r
93                 }\r
94             };\r
95             addKeyHintListener(ProjectKeys.KEY_PROJECT, activeProjectListener);\r
96         }\r
97     }\r
98     \r
99     protected LocalResourceManager           resourceManager;\r
100 \r
101     protected Composite                      parent;\r
102 \r
103     protected TreeViewer                     treeViewer;\r
104 \r
105     private Map<String, String>              args;\r
106 \r
107     private ISessionContextProvider          contextProvider;\r
108 \r
109     private ISessionContext                  sessionContext;\r
110 \r
111     protected IMemento                       memento;\r
112 \r
113     private IHintTracker                     sessionContextTracker = new SessionContextProjectTracker();\r
114 \r
115     private DisposeState                     disposeState          = DisposeState.Alive;\r
116 \r
117     protected ISessionContextChangedListener contextChangeListener = new ISessionContextChangedListener() {\r
118         @Override\r
119         public void sessionContextChanged(SessionContextChangedEvent event) {\r
120             sessionContext = event.getNewValue();\r
121             sessionContextTracker.track(sessionContext);\r
122         }\r
123     };\r
124 \r
125     protected void setSessionContextTracker(IHintTracker tracker) {\r
126         this.sessionContextTracker = tracker;\r
127     }\r
128 \r
129     protected Map<String, String> getViewArguments() {\r
130         return args;\r
131     }\r
132 \r
133     protected DisposeState getDisposeState() {\r
134         return disposeState;\r
135     }\r
136 \r
137     public ISessionContext getSessionContext() {\r
138         return sessionContext;\r
139     }\r
140 \r
141     public ISessionContextProvider getSessionContextProvider() {\r
142         return contextProvider;\r
143     }\r
144 \r
145     @Override\r
146     public void createPartControl(Composite parent) {\r
147         this.parent = parent;\r
148         this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);\r
149         this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());\r
150         Images.getInstance(JFaceResources.getResources());\r
151         TreeColumnLayout ad = new TreeColumnLayout();\r
152         parent.setLayout(ad);\r
153         treeViewer.getTree().setHeaderVisible(true);\r
154         //treeViewer.getTree().setLinesVisible(true);\r
155         //treeViewer.setUseHashlookup(true);\r
156         //treeViewer.setAutoExpandLevel(3);\r
157 \r
158         TreeViewerColumn nameColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
159         TreeViewerColumn typeColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
160 //        TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
161 //        TreeViewerColumn lookupIdColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
162 //        TreeViewerColumn zColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
163 \r
164         nameColumn.setLabelProvider(new MyColumnLabelProvider());\r
165         typeColumn.setLabelProvider(new MyColumnLabelProvider());\r
166 //        idColumn.setLabelProvider(new MyColumnLabelProvider());\r
167 //        lookupIdColumn.setLabelProvider(new MyColumnLabelProvider());\r
168 //        zColumn.setLabelProvider(new MyColumnLabelProvider());\r
169 \r
170         nameColumn.getColumn().setText("Name");\r
171         nameColumn.getColumn().setWidth(20);\r
172         ad.setColumnData(nameColumn.getColumn(), new ColumnWeightData(80, 100));\r
173         typeColumn.getColumn().setText("Type");\r
174         typeColumn.getColumn().setWidth(20);\r
175         ad.setColumnData(typeColumn.getColumn(), new ColumnWeightData(20, 120));\r
176 //        idColumn.getColumn().setText("ID");\r
177 //        idColumn.getColumn().setWidth(20);\r
178 //        ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(10, 50));\r
179 //        lookupIdColumn.getColumn().setText("Lookup ID");\r
180 //        lookupIdColumn.getColumn().setWidth(20);\r
181 //        ad.setColumnData(lookupIdColumn.getColumn(), new ColumnWeightData(50, 100));\r
182 //        zColumn.getColumn().setText("Z");\r
183 //        zColumn.getColumn().setWidth(70);\r
184 //        ad.setColumnData(zColumn.getColumn(), new ColumnWeightData(10, 70));\r
185 \r
186         createControls(parent);\r
187         attachToSession();\r
188         \r
189     }\r
190 \r
191     /**\r
192      * Invoked when this viewpart is disposed. Unhooks the view from its\r
193      * ISessionContextProvider. Overriding is allowed but super.dispose() must\r
194      * be called.\r
195      * \r
196      * @see org.eclipse.ui.part.WorkbenchPart#dispose()\r
197      */\r
198     @Override\r
199     public void dispose() {\r
200         disposeState = DisposeState.Disposing;\r
201         try {\r
202             if (contextProvider != null) {\r
203                 contextProvider.removeContextChangedListener(contextChangeListener);\r
204                 contextProvider = null;\r
205             }\r
206             sessionContextTracker.untrack();\r
207             resourceManager.dispose();\r
208             resourceManager = null;\r
209             args = null;\r
210             sessionContext = null;\r
211             parent = null;\r
212             super.dispose();\r
213         } finally {\r
214            disposeState = DisposeState.Disposed;\r
215         }\r
216     }\r
217 \r
218     @Override\r
219     public void setFocus() {\r
220         \r
221     }\r
222 \r
223     @Override\r
224     public void init(IViewSite site) throws PartInitException {\r
225         super.init(site);\r
226         this.args = ViewArgumentUtils.parseViewArguments(this);\r
227     }\r
228 \r
229     @Override\r
230     public void init(IViewSite site, IMemento memento) throws PartInitException {\r
231         super.init(site, memento);\r
232         this.args = ViewArgumentUtils.parseViewArguments(this);\r
233         this.memento = memento;\r
234     }\r
235 \r
236     @Override\r
237     public void saveState(IMemento memento) {\r
238         if (this.memento != null) {\r
239             memento.putMemento(this.memento);\r
240         }\r
241 //        if (explorer != null)\r
242 //            explorer.saveState(memento);\r
243     }\r
244     \r
245     protected final void attachToSession() {\r
246         // Track active ISessionContext changes\r
247         contextProvider = SimanticsUI.getSessionContextProvider(getViewSite().getWorkbenchWindow());\r
248         contextProvider.addContextChangedListener(contextChangeListener);\r
249 \r
250         // Perform first-time initialization of the explorer and its input.\r
251         applySessionContext(contextProvider.getSessionContext());\r
252     }\r
253 \r
254 //    private abstract class NameAndDescriptionToolTip extends ToolTip {\r
255 //        public NameAndDescriptionToolTip(Control control, int style) {\r
256 //            super(control, style, false);\r
257 //        }\r
258 //\r
259 //        protected abstract Object getModelElement(Event event);\r
260 //\r
261 //        /**\r
262 //         * Adds logic to only show a tooltip if a meaningful item is under the\r
263 //         * cursor.\r
264 //         */\r
265 //        protected boolean shouldCreateToolTip(Event event) {\r
266 //            if (!super.shouldCreateToolTip(event))\r
267 //                return false;\r
268 //            Object tableElement = getModelElement(event); \r
269 //            return tableElement != null && tableElement instanceof DisplayElement;\r
270 //        }\r
271 //\r
272 //        protected Composite createToolTipContentArea(Event event,\r
273 //                Composite parent) {\r
274 //            Object modelElement = getModelElement(event);\r
275 //\r
276 //            Image iconImage = null;\r
277 //            String nameString = "no name";\r
278 //\r
279 //            if (modelElement instanceof DisplayElement) {\r
280 //                iconImage = null;\r
281 //                nameString = "name";\r
282 //            }\r
283 //\r
284 //            // Create the content area\r
285 //            Composite composite = new Composite(parent, SWT.NONE);\r
286 //            composite.setBackground(parent.getDisplay().getSystemColor(\r
287 //                    SWT.COLOR_INFO_BACKGROUND));\r
288 //            composite.setLayout(new GridLayout(2, false));\r
289 //\r
290 //            // The title area with the icon (if there is one) and label.\r
291 //            Label title = createEntry(composite, iconImage, nameString);\r
292 ////            title.setFont(tooltipHeading);\r
293 //            GridDataFactory.createFrom((GridData)title.getLayoutData())\r
294 //                .hint(SWT.DEFAULT, SWT.DEFAULT)\r
295 ////                .minSize(MIN_TOOLTIP_WIDTH, 1)\r
296 //                .applyTo(title);\r
297 //\r
298 //            // The description (if there is one)\r
299 ////            String descriptionString = "description";\r
300 ////            if (descriptionString != null)\r
301 ////                createEntry(composite, null, descriptionString);\r
302 //\r
303 //            // Other Content to add\r
304 //            addContent(composite, modelElement);\r
305 //\r
306 //            return composite;\r
307 //        }\r
308 //\r
309 //        /**\r
310 //         * Adds a line of information to <code>parent</code>. If\r
311 //         * <code>icon</code> is not <code>null</code>, an icon is placed on the\r
312 //         * left, and then a label with <code>text</code>.\r
313 //         * \r
314 //         * @param parent\r
315 //         *            the composite to add the entry to\r
316 //         * @param icon\r
317 //         *            the icon to place next to the text. <code>null</code> for\r
318 //         *            none.\r
319 //         * @param text\r
320 //         *            the text to display\r
321 //         * @return the created label\r
322 //         */\r
323 //        protected Label createEntry(Composite parent, Image icon, String text) {\r
324 //            if (icon != null) {\r
325 //                Label iconLabel = new Label(parent, SWT.NONE);\r
326 //                iconLabel.setImage(icon);\r
327 //                iconLabel.setBackground(parent.getDisplay().getSystemColor(\r
328 //                        SWT.COLOR_INFO_BACKGROUND));\r
329 //                iconLabel.setData(new GridData());\r
330 //            }\r
331 //\r
332 //            Label textLabel = new Label(parent, SWT.WRAP);\r
333 //            \r
334 //            if(icon == null) {\r
335 //                GridDataFactory.generate(textLabel, 2, 1);\r
336 //            } else {\r
337 //                GridDataFactory.generate(textLabel, 1, 1);\r
338 //            }\r
339 //            \r
340 //            textLabel.setText(text);\r
341 //            textLabel.setBackground(parent.getDisplay().getSystemColor(\r
342 //                    SWT.COLOR_INFO_BACKGROUND));\r
343 //            return textLabel;\r
344 //        }\r
345 //\r
346 //        /**\r
347 //         * Adds a line of information to <code>parent</code>. If\r
348 //         * <code>icon</code> is not <code>null</code>, an icon is placed on the\r
349 //         * left, and then a label with <code>text</code>, which supports using\r
350 //         * anchor tags to creates links\r
351 //         * \r
352 //         * @param parent\r
353 //         *            the composite to add the entry to\r
354 //         * @param icon\r
355 //         *            the icon to place next to the text. <code>null</code> for\r
356 //         *            none.\r
357 //         * @param text\r
358 //         *            the text to display\r
359 //         * @return the created link\r
360 //         */\r
361 //        protected Text createEntryWithText(Composite parent, Image icon, String text) {\r
362 //            if (icon != null) {\r
363 //                Label iconLabel = new Label(parent, SWT.NONE);\r
364 //                iconLabel.setImage(icon);\r
365 //                iconLabel.setBackground(parent.getDisplay().getSystemColor(\r
366 //                        SWT.COLOR_INFO_BACKGROUND));\r
367 //                iconLabel.setData(new GridData());\r
368 //            }\r
369 //            Text texts = new Text(parent, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL);\r
370 //            if(icon == null) {\r
371 //                GridDataFactory.generate(texts, 2, 1);\r
372 //            }\r
373 //            texts.setText(text);\r
374 //            texts.setBackground(parent.getDisplay().getSystemColor(\r
375 //                    SWT.COLOR_INFO_BACKGROUND));\r
376 //            return texts;\r
377 //        }\r
378 //\r
379 //        protected void addContent(Composite destination, Object modelElement) {\r
380 //        }\r
381 //    }\r
382 /*\r
383     private class ItemDetailToolTip extends NameAndDescriptionToolTip {\r
384         private final boolean DEBUG = false;\r
385         private TreeViewer viewer;\r
386         private Tree tree;\r
387         private ItemDetailToolTip(TreeViewer viewer, Tree tree, ViewerFilter filter) {\r
388             super(tree,NO_RECREATE);\r
389             this.tree = tree;\r
390             this.viewer = viewer;\r
391             this.setHideOnMouseDown(false);\r
392         }\r
393         public Point getLocation(Point tipSize, Event event) {\r
394             // try to position the tooltip at the bottom of the cell\r
395             ViewerCell cell = viewer.getCell(new Point(event.x, event.y));\r
396             if( cell != null )\r
397                 return tree.toDisplay(event.x,cell.getBounds().y+cell.getBounds().height);\r
398             return super.getLocation(tipSize, event);\r
399         }\r
400         protected Object getToolTipArea(Event event) {\r
401             // Ensure that the tooltip is hidden when the cell is left\r
402             return viewer.getCell(new Point(event.x, event.y));\r
403         }\r
404         protected void addContent(Composite destination, Object modelElement) {\r
405             final DisplayElement item = (DisplayElement)modelElement;\r
406             if (DEBUG)\r
407                 System.out.println("add content");\r
408             String text = null;\r
409             if (null != item) {\r
410                 text = modelElement.toString();\r
411                 createEntryWithText(destination, null, text.toString());\r
412             }\r
413         }\r
414         protected Object getModelElement(Event event) {\r
415             org.eclipse.swt.widgets.TreeItem treeItem = tree.getItem(new Point(event.x, event.y));\r
416             if (treeItem == null)\r
417                 return null;\r
418             return treeItem.getData();\r
419         }\r
420     }*/\r
421     class MyColumnLabelProvider extends ColumnLabelProvider {\r
422         @Override\r
423         public void update(ViewerCell cell) {\r
424             //NodeProxy proxy = (NodeProxy) cell.getElement();\r
425             cell.setText("Kraa");\r
426             cell.setImage(Images.getInstance().OTHER_IMAGE);\r
427         }\r
428     }\r
429     protected void createControls(final Composite parent) {\r
430         parent.setLayout(LayoutUtils.createNoBorderGridLayout(1, false));\r
431         GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());\r
432         treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));\r
433         treeViewer.setLabelProvider(new LabelProvider() {\r
434             @Override\r
435             public Image getImage(Object element) {\r
436                 if (element instanceof ChangeSetElement)\r
437                     return Images.getInstance().CHANGE_SET_IMAGE;\r
438                 else if (element instanceof DisplayElement)\r
439                     return Images.getInstance().DISPLAY_IMAGE;\r
440                 else if (element instanceof ResourceElement)\r
441                     return Images.getInstance().RESOURCE_IMAGE;\r
442                 else if (element instanceof StringElement)\r
443                     return Images.getInstance().STRING_IMAGE;\r
444                 else if (element instanceof UndoCombinedElement)\r
445                     return Images.getInstance().COMBINED_IMAGE;\r
446                 else if (element instanceof RedoContextElement)\r
447                     return Images.getInstance().REDO_IMAGE;\r
448                 else if (element instanceof UndoContextElement)\r
449                     return Images.getInstance().UNDO_IMAGE;\r
450                 else\r
451                     return Images.getInstance().OTHER_IMAGE;\r
452             }\r
453             @Override\r
454             public String getText(Object element) {\r
455                 return element.toString();\r
456             }\r
457         });\r
458         //viewer.setSorter(new ViewerSorter());\r
459         treeViewer.setInput(this);\r
460         Control control = treeViewer.getControl();\r
461 //        ISelectionProvider selectionProvider = new ISelectionProvider() {\r
462 //            @Override\r
463 //            public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
464 //            }\r
465 //            @Override\r
466 //            public ISelection getSelection() {\r
467 //                return null;\r
468 //            }\r
469 //            @Override\r
470 //            public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
471 //            }\r
472 //            @Override\r
473 //            public void setSelection(ISelection selection) {\r
474 //            }\r
475 //        };\r
476         createContextMenu(control, getSite());\r
477 \r
478 //        ImageDescriptor desc = BundleUtils.getImageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_undo.png");\r
479 //        getViewSite().getActionBars().getToolBarManager().add(new Action("GetUndoHistory", desc) {\r
480 //            @Override\r
481 //            public void run() {\r
482 //                treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));\r
483 //            }\r
484 //        });\r
485 //        getViewSite().getActionBars().getToolBarManager().add(new Action("DumpSelectedRevision", Activator.BIN_CLOSED_ICON) {\r
486 //            @Override\r
487 //            public void run() {\r
488 //                IStructuredSelection is = (IStructuredSelection)viewer.getSelection();\r
489 //                Object o = is.getFirstElement();\r
490 //                if (o instanceof ChangeSetElement) {\r
491 //                    ChangeSetElement ce = (ChangeSetElement)o;\r
492 //                    long csid = ce.getChangeSetIdentifier().getId();\r
493 //                    ManagementSupport ms = SimanticsUI.getSession().getService(ManagementSupport.class);\r
494 //                    try {\r
495 //                        ms.dumpRevision(csid);\r
496 //                        ShowMessage.showInformation("DumpSelectedRevision", "Operation was successful.");\r
497 //                    } catch (DatabaseException e) {\r
498 //                        ExceptionUtils.logAndShowError(e);\r
499 //                    }\r
500 //                }\r
501 //            }\r
502 //        });\r
503     }\r
504     public IMenuManager createContextMenu(Control control, IWorkbenchSite site) {\r
505         final MenuManager mm = new MenuManager("#TeamViewPopup", "#TeamViewPopup");\r
506         mm.setRemoveAllWhenShown(true);\r
507         mm.addMenuListener(new IMenuListener() {\r
508             @Override\r
509             public void menuAboutToShow(IMenuManager manager) {\r
510                 mm.add(new GroupMarker(IWorkbenchActionConstants.WB_START));\r
511             }\r
512         });\r
513         Menu menu = mm.createContextMenu(control);\r
514         control.setMenu(menu);\r
515         if (site != null) {\r
516             if (site instanceof IWorkbenchPartSite) {\r
517                 ((IWorkbenchPartSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());\r
518             } else if (site instanceof IPageSite) {\r
519                 ((IPageSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());\r
520             }\r
521         }\r
522         return mm;\r
523     }\r
524     /**\r
525      * @param parent\r
526      * @return\r
527      */\r
528     protected GraphExplorer createExplorerControl(Composite parent) {\r
529         return GraphExplorerFactory.getInstance().selectionDataResolver(new DefaultSelectionDataResolver()).create(parent);\r
530     }\r
531 \r
532     // Needed for preventing unnecessary re-initialization of the explorer with the same input.\r
533 //    private Object currentInput;\r
534 \r
535     /**\r
536      * Invoke this to reinitialize the explorer and reset its input. The input\r
537      * will be resolved from the specified ISessionContext based on the\r
538      * {@link SessionContextInputSource} that is currently in use. If the input\r
539      * is identical to the previous input, nothing will be done.\r
540      * \r
541      * @param context\r
542      */\r
543     protected final boolean applySessionContext(ISessionContext context) {\r
544         // If control is not alive anymore, do nothing.\r
545         if (disposeState != DisposeState.Alive)\r
546             return false;\r
547 \r
548         this.sessionContext = context;\r
549 \r
550         // Start tracking the session context.\r
551         // This will cause IHintListeners of the sessionContextTracker to fire.\r
552         // For this we need the above input equality (identity) checking.\r
553         sessionContextTracker.track(sessionContext);\r
554         return true;\r
555     }\r
556 }\r
557 \r
558 class IncomingContentProvider implements ITreeContentProvider {\r
559     class IncomingElement extends ChangeSetElement {\r
560         IncomingElement(Session session, ChangeSetIdentifier cs) {\r
561             super(session, cs);\r
562         }\r
563     }\r
564     IncomingElement[] changeSetIds;\r
565     IncomingContentProvider(Session session, Shell parent) {\r
566         //this.session = session;\r
567 //        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);\r
568 //        try {\r
569             Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();\r
570             /*if (null == cids)\r
571                 changeSetIds = new IncomingElement[0];\r
572             else */{\r
573                 changeSetIds = new IncomingElement[cids.size()];\r
574                 Iterator<ChangeSetIdentifier> it = cids.iterator();\r
575                 int i = 0;\r
576                 while (it.hasNext()) {\r
577                     changeSetIds[i++] = new IncomingElement(session, it.next());\r
578                 }\r
579                 assert(i == cids.size());\r
580             }\r
581 //        } catch (DatabaseException e) {\r
582 //            changeSetIds = new IncomingElement[0];\r
583 //            ExceptionUtils.logAndShowError(e);\r
584 //        }\r
585     }\r
586     \r
587     @Override\r
588     public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
589     }\r
590 \r
591     @Override\r
592     public void dispose() {\r
593     }\r
594 \r
595     @Override\r
596     public Object[] getElements(Object inputElement) {\r
597         return changeSetIds;\r
598     }\r
599 \r
600     @Override\r
601     public boolean hasChildren(Object element) {\r
602         return changeSetIds.length > 0;\r
603     }\r
604 \r
605     @Override\r
606     public Object getParent(Object element) {\r
607         return null;\r
608     }\r
609 \r
610     @Override\r
611     public Object[] getChildren(Object parentElement) {\r
612         return null;\r
613     }\r
614 }\r
615 \r
616 class OutgoingContentProvider implements ITreeContentProvider {\r
617     class OutgoingElement extends ChangeSetElement {\r
618         OutgoingElement(Session session, ChangeSetIdentifier cs) {\r
619             super(session, cs);\r
620         }\r
621     }\r
622     OutgoingElement[] changeSetIds;\r
623     OutgoingContentProvider(Session session) {\r
624 //        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);\r
625 //        try {\r
626             Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();\r
627             /*if (null == cids)\r
628                 changeSetIds = new OutgoingElement[0];\r
629             else */{\r
630                 changeSetIds = new OutgoingElement[cids.size()];\r
631                 Iterator<ChangeSetIdentifier> it = cids.iterator();\r
632                 int i = 0;\r
633                 while (it.hasNext()) {\r
634                     changeSetIds[i++] = new OutgoingElement(session, it.next());\r
635                 }\r
636                 assert(i == cids.size());\r
637             }\r
638 //        } catch (DatabaseException e) {\r
639 //            ExceptionUtils.logAndShowError(e);\r
640 //            changeSetIds = new OutgoingElement[0];\r
641 //        }\r
642     }\r
643     \r
644     @Override\r
645     public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
646     }\r
647 \r
648     @Override\r
649     public void dispose() {\r
650     }\r
651 \r
652     @Override\r
653     public Object[] getElements(Object inputElement) {\r
654         return changeSetIds;\r
655     }\r
656 \r
657     @Override\r
658     public boolean hasChildren(Object element) {\r
659         if (element instanceof  TreeElement)\r
660             return ((TreeElement)element).hasChildren();\r
661         return false;\r
662     }\r
663 \r
664     @Override\r
665     public Object getParent(Object element) {\r
666         return null;\r
667     }\r
668 \r
669     @Override\r
670     public Object[] getChildren(Object parentElement) {\r
671         if (parentElement instanceof  TreeElement)\r
672             return ((TreeElement)parentElement).getChildren();\r
673         else\r
674             return null;\r
675     }\r
676 }\r
677 \r
678 \r
679 \r
680 class ResourceElement extends TreeElement {\r
681     private Session session;\r
682     private String resourceUri;\r
683     private String resourceName;\r
684     private Resource resource;\r
685     ResourceElement(Session session, String resource) {\r
686         this.session = session;\r
687         this.resourceUri = resource;\r
688     }\r
689     ResourceElement(Session session, Resource resource) {\r
690         this.session = session;\r
691         this.resource = resource;\r
692     }\r
693     @Override\r
694     protected Image getIdImage() {\r
695         return Images.getInstance().RESOURCE_IMAGE;\r
696     }\r
697     @Override\r
698     protected String getIdText() {\r
699         String s = resource.toString();\r
700         return s.substring(0, Math.min(10, s.length()));\r
701     }\r
702     private String getNameByUri() {\r
703         try {\r
704             String t = session.syncRequest(new Read<String>() {\r
705                 @Override\r
706                 public String perform(ReadGraph g) throws DatabaseException {\r
707                     resource = g.getResource(resourceUri);\r
708                     Layer0 l0 = Layer0.getInstance(g);\r
709                     resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);\r
710                     if (null == resourceName) {\r
711                         Set<Resource> types = g.getTypes(resource);\r
712                         if (types.size() > 0) {\r
713                             Iterator<Resource> i = types.iterator();\r
714                             Resource r = i.next();\r
715                             resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);\r
716                         }\r
717                     }\r
718                     if (null == resourceName)\r
719                         resourceName = resourceUri;\r
720                     return resourceName;\r
721                 }\r
722             });\r
723             return t;\r
724         } catch (DatabaseException e) {\r
725         }\r
726         return null;\r
727     }\r
728     private String getName() {\r
729         try {\r
730             String t = session.syncRequest(new Read<String>() {\r
731                 @Override\r
732                 public String perform(ReadGraph g) throws DatabaseException {\r
733                     Layer0 l0 = Layer0.getInstance(g);\r
734                     resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);\r
735                     if (null == resourceName) {\r
736                         Set<Resource> types = g.getTypes(resource);\r
737                         if (types.size() > 0) {\r
738                             Iterator<Resource> i = types.iterator();\r
739                             Resource r = i.next();\r
740                             resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);\r
741                         }\r
742                     }\r
743                     if (null == resourceName)\r
744                         resourceName = resourceUri;\r
745                     return resourceName;\r
746                 }\r
747             });\r
748             return t;\r
749         } catch (DatabaseException e) {\r
750         }\r
751         return null;\r
752     }\r
753     private Resource getParent() {\r
754         try {\r
755             Resource parent = session.syncRequest(new Read<Resource>() {\r
756                 @Override\r
757                 public Resource perform(ReadGraph g) throws DatabaseException {\r
758                     Layer0 l0 = Layer0.getInstance(g);\r
759                     return g.getPossibleObject(resource, l0.PartOf);\r
760                 }\r
761                 \r
762             });\r
763             return parent;\r
764         } catch (DatabaseException e) {\r
765         }\r
766         return null;\r
767     }\r
768     public String toString() {\r
769         if (null == resourceName && null != resourceUri)\r
770             return getNameByUri();\r
771         else if (null != resource && null == resourceUri)\r
772             return getName();\r
773         return resourceName;\r
774     }\r
775     @Override\r
776     boolean hasChildren() {\r
777         Resource p = getParent();\r
778         if (null != p)\r
779             return true;\r
780         else\r
781             return false;\r
782     }\r
783     @Override\r
784     Object[] getChildren() {\r
785         Resource p = getParent();\r
786         if (null == p)\r
787             return new Object[0];\r
788         Object[] objects = new Object[1];\r
789         objects[0] = new ResourceElement(session, p);\r
790         return objects;\r
791     }\r
792 }\r