]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.team.ui/src/org/simantics/team/ui/SynchroniseView.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.team.ui / src / org / simantics / team / ui / SynchroniseView.java
index 681dda0770ff80fd0edff14bd67fb60f58804dcf..bae349680a4cb27c74481849d290b6fdcdab5747 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.team.ui;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.eclipse.jface.action.GroupMarker;\r
-import org.eclipse.jface.action.IMenuListener;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.MenuManager;\r
-import org.eclipse.jface.layout.GridDataFactory;\r
-import org.eclipse.jface.layout.TreeColumnLayout;\r
-import org.eclipse.jface.resource.JFaceResources;\r
-import org.eclipse.jface.resource.LocalResourceManager;\r
-import org.eclipse.jface.viewers.ColumnLabelProvider;\r
-import org.eclipse.jface.viewers.ColumnWeightData;\r
-import org.eclipse.jface.viewers.ITreeContentProvider;\r
-import org.eclipse.jface.viewers.LabelProvider;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
-import org.eclipse.jface.viewers.TreeViewerColumn;\r
-import org.eclipse.jface.viewers.Viewer;\r
-import org.eclipse.jface.viewers.ViewerCell;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.ui.IMemento;\r
-import org.eclipse.ui.IViewSite;\r
-import org.eclipse.ui.IWorkbenchActionConstants;\r
-import org.eclipse.ui.IWorkbenchPartSite;\r
-import org.eclipse.ui.IWorkbenchSite;\r
-import org.eclipse.ui.PartInitException;\r
-import org.eclipse.ui.part.IPageSite;\r
-import org.eclipse.ui.part.ViewPart;\r
-import org.simantics.browsing.ui.GraphExplorer;\r
-import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;\r
-import org.simantics.browsing.ui.swt.DefaultSelectionDataResolver;\r
-import org.simantics.browsing.ui.swt.GraphExplorerFactory;\r
-import org.simantics.browsing.ui.swt.ViewArgumentUtils;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ChangeSetIdentifier;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.db.management.ISessionContextChangedListener;\r
-import org.simantics.db.management.ISessionContextProvider;\r
-import org.simantics.db.management.SessionContextChangedEvent;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.project.ProjectKeys;\r
-import org.simantics.team.internal.Images;\r
-import org.simantics.ui.SimanticsUI;\r
-import org.simantics.utils.datastructures.disposable.DisposeState;\r
-import org.simantics.utils.datastructures.hints.HintListenerAdapter;\r
-import org.simantics.utils.datastructures.hints.HintTracker;\r
-import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
-import org.simantics.utils.datastructures.hints.IHintListener;\r
-import org.simantics.utils.datastructures.hints.IHintObservable;\r
-import org.simantics.utils.datastructures.hints.IHintTracker;\r
-import org.simantics.utils.ui.LayoutUtils;\r
-\r
-/**\r
- * @author Kalle Kondelin\r
- */\r
-public class SynchroniseView extends ViewPart {\r
-\r
-    public SynchroniseView() {\r
-    }\r
-\r
-    public class SessionContextProjectTracker extends HintTracker {\r
-        public SessionContextProjectTracker() {\r
-            IHintListener activeProjectListener = new HintListenerAdapter() {\r
-                @Override\r
-                public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {\r
-                    applySessionContext(getSessionContext());\r
-                }\r
-            };\r
-            addKeyHintListener(ProjectKeys.KEY_PROJECT, activeProjectListener);\r
-        }\r
-    }\r
-    \r
-    protected LocalResourceManager           resourceManager;\r
-\r
-    protected Composite                      parent;\r
-\r
-    protected TreeViewer                     treeViewer;\r
-\r
-    private Map<String, String>              args;\r
-\r
-    private ISessionContextProvider          contextProvider;\r
-\r
-    private ISessionContext                  sessionContext;\r
-\r
-    protected IMemento                       memento;\r
-\r
-    private IHintTracker                     sessionContextTracker = new SessionContextProjectTracker();\r
-\r
-    private DisposeState                     disposeState          = DisposeState.Alive;\r
-\r
-    protected ISessionContextChangedListener contextChangeListener = new ISessionContextChangedListener() {\r
-        @Override\r
-        public void sessionContextChanged(SessionContextChangedEvent event) {\r
-            sessionContext = event.getNewValue();\r
-            sessionContextTracker.track(sessionContext);\r
-        }\r
-    };\r
-\r
-    protected void setSessionContextTracker(IHintTracker tracker) {\r
-        this.sessionContextTracker = tracker;\r
-    }\r
-\r
-    protected Map<String, String> getViewArguments() {\r
-        return args;\r
-    }\r
-\r
-    protected DisposeState getDisposeState() {\r
-        return disposeState;\r
-    }\r
-\r
-    public ISessionContext getSessionContext() {\r
-        return sessionContext;\r
-    }\r
-\r
-    public ISessionContextProvider getSessionContextProvider() {\r
-        return contextProvider;\r
-    }\r
-\r
-    @Override\r
-    public void createPartControl(Composite parent) {\r
-        this.parent = parent;\r
-        this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);\r
-        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());\r
-        Images.getInstance(JFaceResources.getResources());\r
-        TreeColumnLayout ad = new TreeColumnLayout();\r
-        parent.setLayout(ad);\r
-        treeViewer.getTree().setHeaderVisible(true);\r
-        //treeViewer.getTree().setLinesVisible(true);\r
-        //treeViewer.setUseHashlookup(true);\r
-        //treeViewer.setAutoExpandLevel(3);\r
-\r
-        TreeViewerColumn nameColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-        TreeViewerColumn typeColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-//        TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-//        TreeViewerColumn lookupIdColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-//        TreeViewerColumn zColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-\r
-        nameColumn.setLabelProvider(new MyColumnLabelProvider());\r
-        typeColumn.setLabelProvider(new MyColumnLabelProvider());\r
-//        idColumn.setLabelProvider(new MyColumnLabelProvider());\r
-//        lookupIdColumn.setLabelProvider(new MyColumnLabelProvider());\r
-//        zColumn.setLabelProvider(new MyColumnLabelProvider());\r
-\r
-        nameColumn.getColumn().setText("Name");\r
-        nameColumn.getColumn().setWidth(20);\r
-        ad.setColumnData(nameColumn.getColumn(), new ColumnWeightData(80, 100));\r
-        typeColumn.getColumn().setText("Type");\r
-        typeColumn.getColumn().setWidth(20);\r
-        ad.setColumnData(typeColumn.getColumn(), new ColumnWeightData(20, 120));\r
-//        idColumn.getColumn().setText("ID");\r
-//        idColumn.getColumn().setWidth(20);\r
-//        ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(10, 50));\r
-//        lookupIdColumn.getColumn().setText("Lookup ID");\r
-//        lookupIdColumn.getColumn().setWidth(20);\r
-//        ad.setColumnData(lookupIdColumn.getColumn(), new ColumnWeightData(50, 100));\r
-//        zColumn.getColumn().setText("Z");\r
-//        zColumn.getColumn().setWidth(70);\r
-//        ad.setColumnData(zColumn.getColumn(), new ColumnWeightData(10, 70));\r
-\r
-        createControls(parent);\r
-        attachToSession();\r
-        \r
-    }\r
-\r
-    /**\r
-     * Invoked when this viewpart is disposed. Unhooks the view from its\r
-     * ISessionContextProvider. Overriding is allowed but super.dispose() must\r
-     * be called.\r
-     * \r
-     * @see org.eclipse.ui.part.WorkbenchPart#dispose()\r
-     */\r
-    @Override\r
-    public void dispose() {\r
-        disposeState = DisposeState.Disposing;\r
-        try {\r
-            if (contextProvider != null) {\r
-                contextProvider.removeContextChangedListener(contextChangeListener);\r
-                contextProvider = null;\r
-            }\r
-            sessionContextTracker.untrack();\r
-            resourceManager.dispose();\r
-            resourceManager = null;\r
-            args = null;\r
-            sessionContext = null;\r
-            parent = null;\r
-            super.dispose();\r
-        } finally {\r
-           disposeState = DisposeState.Disposed;\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void setFocus() {\r
-        \r
-    }\r
-\r
-    @Override\r
-    public void init(IViewSite site) throws PartInitException {\r
-        super.init(site);\r
-        this.args = ViewArgumentUtils.parseViewArguments(this);\r
-    }\r
-\r
-    @Override\r
-    public void init(IViewSite site, IMemento memento) throws PartInitException {\r
-        super.init(site, memento);\r
-        this.args = ViewArgumentUtils.parseViewArguments(this);\r
-        this.memento = memento;\r
-    }\r
-\r
-    @Override\r
-    public void saveState(IMemento memento) {\r
-        if (this.memento != null) {\r
-            memento.putMemento(this.memento);\r
-        }\r
-//        if (explorer != null)\r
-//            explorer.saveState(memento);\r
-    }\r
-    \r
-    protected final void attachToSession() {\r
-        // Track active ISessionContext changes\r
-        contextProvider = SimanticsUI.getSessionContextProvider(getViewSite().getWorkbenchWindow());\r
-        contextProvider.addContextChangedListener(contextChangeListener);\r
-\r
-        // Perform first-time initialization of the explorer and its input.\r
-        applySessionContext(contextProvider.getSessionContext());\r
-    }\r
-\r
-//    private abstract class NameAndDescriptionToolTip extends ToolTip {\r
-//        public NameAndDescriptionToolTip(Control control, int style) {\r
-//            super(control, style, false);\r
-//        }\r
-//\r
-//        protected abstract Object getModelElement(Event event);\r
-//\r
-//        /**\r
-//         * Adds logic to only show a tooltip if a meaningful item is under the\r
-//         * cursor.\r
-//         */\r
-//        protected boolean shouldCreateToolTip(Event event) {\r
-//            if (!super.shouldCreateToolTip(event))\r
-//                return false;\r
-//            Object tableElement = getModelElement(event); \r
-//            return tableElement != null && tableElement instanceof DisplayElement;\r
-//        }\r
-//\r
-//        protected Composite createToolTipContentArea(Event event,\r
-//                Composite parent) {\r
-//            Object modelElement = getModelElement(event);\r
-//\r
-//            Image iconImage = null;\r
-//            String nameString = "no name";\r
-//\r
-//            if (modelElement instanceof DisplayElement) {\r
-//                iconImage = null;\r
-//                nameString = "name";\r
-//            }\r
-//\r
-//            // Create the content area\r
-//            Composite composite = new Composite(parent, SWT.NONE);\r
-//            composite.setBackground(parent.getDisplay().getSystemColor(\r
-//                    SWT.COLOR_INFO_BACKGROUND));\r
-//            composite.setLayout(new GridLayout(2, false));\r
-//\r
-//            // The title area with the icon (if there is one) and label.\r
-//            Label title = createEntry(composite, iconImage, nameString);\r
-////            title.setFont(tooltipHeading);\r
-//            GridDataFactory.createFrom((GridData)title.getLayoutData())\r
-//                .hint(SWT.DEFAULT, SWT.DEFAULT)\r
-////                .minSize(MIN_TOOLTIP_WIDTH, 1)\r
-//                .applyTo(title);\r
-//\r
-//            // The description (if there is one)\r
-////            String descriptionString = "description";\r
-////            if (descriptionString != null)\r
-////                createEntry(composite, null, descriptionString);\r
-//\r
-//            // Other Content to add\r
-//            addContent(composite, modelElement);\r
-//\r
-//            return composite;\r
-//        }\r
-//\r
-//        /**\r
-//         * Adds a line of information to <code>parent</code>. If\r
-//         * <code>icon</code> is not <code>null</code>, an icon is placed on the\r
-//         * left, and then a label with <code>text</code>.\r
-//         * \r
-//         * @param parent\r
-//         *            the composite to add the entry to\r
-//         * @param icon\r
-//         *            the icon to place next to the text. <code>null</code> for\r
-//         *            none.\r
-//         * @param text\r
-//         *            the text to display\r
-//         * @return the created label\r
-//         */\r
-//        protected Label createEntry(Composite parent, Image icon, String text) {\r
-//            if (icon != null) {\r
-//                Label iconLabel = new Label(parent, SWT.NONE);\r
-//                iconLabel.setImage(icon);\r
-//                iconLabel.setBackground(parent.getDisplay().getSystemColor(\r
-//                        SWT.COLOR_INFO_BACKGROUND));\r
-//                iconLabel.setData(new GridData());\r
-//            }\r
-//\r
-//            Label textLabel = new Label(parent, SWT.WRAP);\r
-//            \r
-//            if(icon == null) {\r
-//                GridDataFactory.generate(textLabel, 2, 1);\r
-//            } else {\r
-//                GridDataFactory.generate(textLabel, 1, 1);\r
-//            }\r
-//            \r
-//            textLabel.setText(text);\r
-//            textLabel.setBackground(parent.getDisplay().getSystemColor(\r
-//                    SWT.COLOR_INFO_BACKGROUND));\r
-//            return textLabel;\r
-//        }\r
-//\r
-//        /**\r
-//         * Adds a line of information to <code>parent</code>. If\r
-//         * <code>icon</code> is not <code>null</code>, an icon is placed on the\r
-//         * left, and then a label with <code>text</code>, which supports using\r
-//         * anchor tags to creates links\r
-//         * \r
-//         * @param parent\r
-//         *            the composite to add the entry to\r
-//         * @param icon\r
-//         *            the icon to place next to the text. <code>null</code> for\r
-//         *            none.\r
-//         * @param text\r
-//         *            the text to display\r
-//         * @return the created link\r
-//         */\r
-//        protected Text createEntryWithText(Composite parent, Image icon, String text) {\r
-//            if (icon != null) {\r
-//                Label iconLabel = new Label(parent, SWT.NONE);\r
-//                iconLabel.setImage(icon);\r
-//                iconLabel.setBackground(parent.getDisplay().getSystemColor(\r
-//                        SWT.COLOR_INFO_BACKGROUND));\r
-//                iconLabel.setData(new GridData());\r
-//            }\r
-//            Text texts = new Text(parent, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL);\r
-//            if(icon == null) {\r
-//                GridDataFactory.generate(texts, 2, 1);\r
-//            }\r
-//            texts.setText(text);\r
-//            texts.setBackground(parent.getDisplay().getSystemColor(\r
-//                    SWT.COLOR_INFO_BACKGROUND));\r
-//            return texts;\r
-//        }\r
-//\r
-//        protected void addContent(Composite destination, Object modelElement) {\r
-//        }\r
-//    }\r
-/*\r
-    private class ItemDetailToolTip extends NameAndDescriptionToolTip {\r
-        private final boolean DEBUG = false;\r
-        private TreeViewer viewer;\r
-        private Tree tree;\r
-        private ItemDetailToolTip(TreeViewer viewer, Tree tree, ViewerFilter filter) {\r
-            super(tree,NO_RECREATE);\r
-            this.tree = tree;\r
-            this.viewer = viewer;\r
-            this.setHideOnMouseDown(false);\r
-        }\r
-        public Point getLocation(Point tipSize, Event event) {\r
-            // try to position the tooltip at the bottom of the cell\r
-            ViewerCell cell = viewer.getCell(new Point(event.x, event.y));\r
-            if( cell != null )\r
-                return tree.toDisplay(event.x,cell.getBounds().y+cell.getBounds().height);\r
-            return super.getLocation(tipSize, event);\r
-        }\r
-        protected Object getToolTipArea(Event event) {\r
-            // Ensure that the tooltip is hidden when the cell is left\r
-            return viewer.getCell(new Point(event.x, event.y));\r
-        }\r
-        protected void addContent(Composite destination, Object modelElement) {\r
-            final DisplayElement item = (DisplayElement)modelElement;\r
-            if (DEBUG)\r
-                System.out.println("add content");\r
-            String text = null;\r
-            if (null != item) {\r
-                text = modelElement.toString();\r
-                createEntryWithText(destination, null, text.toString());\r
-            }\r
-        }\r
-        protected Object getModelElement(Event event) {\r
-            org.eclipse.swt.widgets.TreeItem treeItem = tree.getItem(new Point(event.x, event.y));\r
-            if (treeItem == null)\r
-                return null;\r
-            return treeItem.getData();\r
-        }\r
-    }*/\r
-    class MyColumnLabelProvider extends ColumnLabelProvider {\r
-        @Override\r
-        public void update(ViewerCell cell) {\r
-            //NodeProxy proxy = (NodeProxy) cell.getElement();\r
-            cell.setText("Kraa");\r
-            cell.setImage(Images.getInstance().OTHER_IMAGE);\r
-        }\r
-    }\r
-    protected void createControls(final Composite parent) {\r
-        parent.setLayout(LayoutUtils.createNoBorderGridLayout(1, false));\r
-        GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());\r
-        treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));\r
-        treeViewer.setLabelProvider(new LabelProvider() {\r
-            @Override\r
-            public Image getImage(Object element) {\r
-                if (element instanceof ChangeSetElement)\r
-                    return Images.getInstance().CHANGE_SET_IMAGE;\r
-                else if (element instanceof DisplayElement)\r
-                    return Images.getInstance().DISPLAY_IMAGE;\r
-                else if (element instanceof ResourceElement)\r
-                    return Images.getInstance().RESOURCE_IMAGE;\r
-                else if (element instanceof StringElement)\r
-                    return Images.getInstance().STRING_IMAGE;\r
-                else if (element instanceof UndoCombinedElement)\r
-                    return Images.getInstance().COMBINED_IMAGE;\r
-                else if (element instanceof RedoContextElement)\r
-                    return Images.getInstance().REDO_IMAGE;\r
-                else if (element instanceof UndoContextElement)\r
-                    return Images.getInstance().UNDO_IMAGE;\r
-                else\r
-                    return Images.getInstance().OTHER_IMAGE;\r
-            }\r
-            @Override\r
-            public String getText(Object element) {\r
-                return element.toString();\r
-            }\r
-        });\r
-        //viewer.setSorter(new ViewerSorter());\r
-        treeViewer.setInput(this);\r
-        Control control = treeViewer.getControl();\r
-//        ISelectionProvider selectionProvider = new ISelectionProvider() {\r
-//            @Override\r
-//            public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
-//            }\r
-//            @Override\r
-//            public ISelection getSelection() {\r
-//                return null;\r
-//            }\r
-//            @Override\r
-//            public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
-//            }\r
-//            @Override\r
-//            public void setSelection(ISelection selection) {\r
-//            }\r
-//        };\r
-        createContextMenu(control, getSite());\r
-\r
-//        ImageDescriptor desc = BundleUtils.getImageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_undo.png");\r
-//        getViewSite().getActionBars().getToolBarManager().add(new Action("GetUndoHistory", desc) {\r
-//            @Override\r
-//            public void run() {\r
-//                treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));\r
-//            }\r
-//        });\r
-//        getViewSite().getActionBars().getToolBarManager().add(new Action("DumpSelectedRevision", Activator.BIN_CLOSED_ICON) {\r
-//            @Override\r
-//            public void run() {\r
-//                IStructuredSelection is = (IStructuredSelection)viewer.getSelection();\r
-//                Object o = is.getFirstElement();\r
-//                if (o instanceof ChangeSetElement) {\r
-//                    ChangeSetElement ce = (ChangeSetElement)o;\r
-//                    long csid = ce.getChangeSetIdentifier().getId();\r
-//                    ManagementSupport ms = SimanticsUI.getSession().getService(ManagementSupport.class);\r
-//                    try {\r
-//                        ms.dumpRevision(csid);\r
-//                        ShowMessage.showInformation("DumpSelectedRevision", "Operation was successful.");\r
-//                    } catch (DatabaseException e) {\r
-//                        ExceptionUtils.logAndShowError(e);\r
-//                    }\r
-//                }\r
-//            }\r
-//        });\r
-    }\r
-    public IMenuManager createContextMenu(Control control, IWorkbenchSite site) {\r
-        final MenuManager mm = new MenuManager("#TeamViewPopup", "#TeamViewPopup");\r
-        mm.setRemoveAllWhenShown(true);\r
-        mm.addMenuListener(new IMenuListener() {\r
-            @Override\r
-            public void menuAboutToShow(IMenuManager manager) {\r
-                mm.add(new GroupMarker(IWorkbenchActionConstants.WB_START));\r
-            }\r
-        });\r
-        Menu menu = mm.createContextMenu(control);\r
-        control.setMenu(menu);\r
-        if (site != null) {\r
-            if (site instanceof IWorkbenchPartSite) {\r
-                ((IWorkbenchPartSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());\r
-            } else if (site instanceof IPageSite) {\r
-                ((IPageSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());\r
-            }\r
-        }\r
-        return mm;\r
-    }\r
-    /**\r
-     * @param parent\r
-     * @return\r
-     */\r
-    protected GraphExplorer createExplorerControl(Composite parent) {\r
-        return GraphExplorerFactory.getInstance().selectionDataResolver(new DefaultSelectionDataResolver()).create(parent);\r
-    }\r
-\r
-    // Needed for preventing unnecessary re-initialization of the explorer with the same input.\r
-//    private Object currentInput;\r
-\r
-    /**\r
-     * Invoke this to reinitialize the explorer and reset its input. The input\r
-     * will be resolved from the specified ISessionContext based on the\r
-     * {@link SessionContextInputSource} that is currently in use. If the input\r
-     * is identical to the previous input, nothing will be done.\r
-     * \r
-     * @param context\r
-     */\r
-    protected final boolean applySessionContext(ISessionContext context) {\r
-        // If control is not alive anymore, do nothing.\r
-        if (disposeState != DisposeState.Alive)\r
-            return false;\r
-\r
-        this.sessionContext = context;\r
-\r
-        // Start tracking the session context.\r
-        // This will cause IHintListeners of the sessionContextTracker to fire.\r
-        // For this we need the above input equality (identity) checking.\r
-        sessionContextTracker.track(sessionContext);\r
-        return true;\r
-    }\r
-}\r
-\r
-class IncomingContentProvider implements ITreeContentProvider {\r
-    class IncomingElement extends ChangeSetElement {\r
-        IncomingElement(Session session, ChangeSetIdentifier cs) {\r
-            super(session, cs);\r
-        }\r
-    }\r
-    IncomingElement[] changeSetIds;\r
-    IncomingContentProvider(Session session, Shell parent) {\r
-        //this.session = session;\r
-//        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);\r
-//        try {\r
-            Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();\r
-            /*if (null == cids)\r
-                changeSetIds = new IncomingElement[0];\r
-            else */{\r
-                changeSetIds = new IncomingElement[cids.size()];\r
-                Iterator<ChangeSetIdentifier> it = cids.iterator();\r
-                int i = 0;\r
-                while (it.hasNext()) {\r
-                    changeSetIds[i++] = new IncomingElement(session, it.next());\r
-                }\r
-                assert(i == cids.size());\r
-            }\r
-//        } catch (DatabaseException e) {\r
-//            changeSetIds = new IncomingElement[0];\r
-//            ExceptionUtils.logAndShowError(e);\r
-//        }\r
-    }\r
-    \r
-    @Override\r
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
-    }\r
-\r
-    @Override\r
-    public void dispose() {\r
-    }\r
-\r
-    @Override\r
-    public Object[] getElements(Object inputElement) {\r
-        return changeSetIds;\r
-    }\r
-\r
-    @Override\r
-    public boolean hasChildren(Object element) {\r
-        return changeSetIds.length > 0;\r
-    }\r
-\r
-    @Override\r
-    public Object getParent(Object element) {\r
-        return null;\r
-    }\r
-\r
-    @Override\r
-    public Object[] getChildren(Object parentElement) {\r
-        return null;\r
-    }\r
-}\r
-\r
-class OutgoingContentProvider implements ITreeContentProvider {\r
-    class OutgoingElement extends ChangeSetElement {\r
-        OutgoingElement(Session session, ChangeSetIdentifier cs) {\r
-            super(session, cs);\r
-        }\r
-    }\r
-    OutgoingElement[] changeSetIds;\r
-    OutgoingContentProvider(Session session) {\r
-//        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);\r
-//        try {\r
-            Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();\r
-            /*if (null == cids)\r
-                changeSetIds = new OutgoingElement[0];\r
-            else */{\r
-                changeSetIds = new OutgoingElement[cids.size()];\r
-                Iterator<ChangeSetIdentifier> it = cids.iterator();\r
-                int i = 0;\r
-                while (it.hasNext()) {\r
-                    changeSetIds[i++] = new OutgoingElement(session, it.next());\r
-                }\r
-                assert(i == cids.size());\r
-            }\r
-//        } catch (DatabaseException e) {\r
-//            ExceptionUtils.logAndShowError(e);\r
-//            changeSetIds = new OutgoingElement[0];\r
-//        }\r
-    }\r
-    \r
-    @Override\r
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
-    }\r
-\r
-    @Override\r
-    public void dispose() {\r
-    }\r
-\r
-    @Override\r
-    public Object[] getElements(Object inputElement) {\r
-        return changeSetIds;\r
-    }\r
-\r
-    @Override\r
-    public boolean hasChildren(Object element) {\r
-        if (element instanceof  TreeElement)\r
-            return ((TreeElement)element).hasChildren();\r
-        return false;\r
-    }\r
-\r
-    @Override\r
-    public Object getParent(Object element) {\r
-        return null;\r
-    }\r
-\r
-    @Override\r
-    public Object[] getChildren(Object parentElement) {\r
-        if (parentElement instanceof  TreeElement)\r
-            return ((TreeElement)parentElement).getChildren();\r
-        else\r
-            return null;\r
-    }\r
-}\r
-\r
-\r
-\r
-class ResourceElement extends TreeElement {\r
-    private Session session;\r
-    private String resourceUri;\r
-    private String resourceName;\r
-    private Resource resource;\r
-    ResourceElement(Session session, String resource) {\r
-        this.session = session;\r
-        this.resourceUri = resource;\r
-    }\r
-    ResourceElement(Session session, Resource resource) {\r
-        this.session = session;\r
-        this.resource = resource;\r
-    }\r
-    @Override\r
-    protected Image getIdImage() {\r
-        return Images.getInstance().RESOURCE_IMAGE;\r
-    }\r
-    @Override\r
-    protected String getIdText() {\r
-        String s = resource.toString();\r
-        return s.substring(0, Math.min(10, s.length()));\r
-    }\r
-    private String getNameByUri() {\r
-        try {\r
-            String t = session.syncRequest(new Read<String>() {\r
-                @Override\r
-                public String perform(ReadGraph g) throws DatabaseException {\r
-                    resource = g.getResource(resourceUri);\r
-                    Layer0 l0 = Layer0.getInstance(g);\r
-                    resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);\r
-                    if (null == resourceName) {\r
-                        Set<Resource> types = g.getTypes(resource);\r
-                        if (types.size() > 0) {\r
-                            Iterator<Resource> i = types.iterator();\r
-                            Resource r = i.next();\r
-                            resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);\r
-                        }\r
-                    }\r
-                    if (null == resourceName)\r
-                        resourceName = resourceUri;\r
-                    return resourceName;\r
-                }\r
-            });\r
-            return t;\r
-        } catch (DatabaseException e) {\r
-        }\r
-        return null;\r
-    }\r
-    private String getName() {\r
-        try {\r
-            String t = session.syncRequest(new Read<String>() {\r
-                @Override\r
-                public String perform(ReadGraph g) throws DatabaseException {\r
-                    Layer0 l0 = Layer0.getInstance(g);\r
-                    resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);\r
-                    if (null == resourceName) {\r
-                        Set<Resource> types = g.getTypes(resource);\r
-                        if (types.size() > 0) {\r
-                            Iterator<Resource> i = types.iterator();\r
-                            Resource r = i.next();\r
-                            resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);\r
-                        }\r
-                    }\r
-                    if (null == resourceName)\r
-                        resourceName = resourceUri;\r
-                    return resourceName;\r
-                }\r
-            });\r
-            return t;\r
-        } catch (DatabaseException e) {\r
-        }\r
-        return null;\r
-    }\r
-    private Resource getParent() {\r
-        try {\r
-            Resource parent = session.syncRequest(new Read<Resource>() {\r
-                @Override\r
-                public Resource perform(ReadGraph g) throws DatabaseException {\r
-                    Layer0 l0 = Layer0.getInstance(g);\r
-                    return g.getPossibleObject(resource, l0.PartOf);\r
-                }\r
-                \r
-            });\r
-            return parent;\r
-        } catch (DatabaseException e) {\r
-        }\r
-        return null;\r
-    }\r
-    public String toString() {\r
-        if (null == resourceName && null != resourceUri)\r
-            return getNameByUri();\r
-        else if (null != resource && null == resourceUri)\r
-            return getName();\r
-        return resourceName;\r
-    }\r
-    @Override\r
-    boolean hasChildren() {\r
-        Resource p = getParent();\r
-        if (null != p)\r
-            return true;\r
-        else\r
-            return false;\r
-    }\r
-    @Override\r
-    Object[] getChildren() {\r
-        Resource p = getParent();\r
-        if (null == p)\r
-            return new Object[0];\r
-        Object[] objects = new Object[1];\r
-        objects[0] = new ResourceElement(session, p);\r
-        return objects;\r
-    }\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.team.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.TreeColumnLayout;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.ViewPart;
+import org.simantics.browsing.ui.GraphExplorer;
+import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;
+import org.simantics.browsing.ui.swt.DefaultSelectionDataResolver;
+import org.simantics.browsing.ui.swt.GraphExplorerFactory;
+import org.simantics.browsing.ui.swt.ViewArgumentUtils;
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ChangeSetIdentifier;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.management.ISessionContext;
+import org.simantics.db.management.ISessionContextChangedListener;
+import org.simantics.db.management.ISessionContextProvider;
+import org.simantics.db.management.SessionContextChangedEvent;
+import org.simantics.db.request.Read;
+import org.simantics.layer0.Layer0;
+import org.simantics.project.ProjectKeys;
+import org.simantics.team.internal.Images;
+import org.simantics.ui.SimanticsUI;
+import org.simantics.utils.datastructures.disposable.DisposeState;
+import org.simantics.utils.datastructures.hints.HintListenerAdapter;
+import org.simantics.utils.datastructures.hints.HintTracker;
+import org.simantics.utils.datastructures.hints.IHintContext.Key;
+import org.simantics.utils.datastructures.hints.IHintListener;
+import org.simantics.utils.datastructures.hints.IHintObservable;
+import org.simantics.utils.datastructures.hints.IHintTracker;
+import org.simantics.utils.ui.LayoutUtils;
+
+/**
+ * @author Kalle Kondelin
+ */
+public class SynchroniseView extends ViewPart {
+
+    public SynchroniseView() {
+    }
+
+    public class SessionContextProjectTracker extends HintTracker {
+        public SessionContextProjectTracker() {
+            IHintListener activeProjectListener = new HintListenerAdapter() {
+                @Override
+                public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
+                    applySessionContext(getSessionContext());
+                }
+            };
+            addKeyHintListener(ProjectKeys.KEY_PROJECT, activeProjectListener);
+        }
+    }
+    
+    protected LocalResourceManager           resourceManager;
+
+    protected Composite                      parent;
+
+    protected TreeViewer                     treeViewer;
+
+    private Map<String, String>              args;
+
+    private ISessionContextProvider          contextProvider;
+
+    private ISessionContext                  sessionContext;
+
+    protected IMemento                       memento;
+
+    private IHintTracker                     sessionContextTracker = new SessionContextProjectTracker();
+
+    private DisposeState                     disposeState          = DisposeState.Alive;
+
+    protected ISessionContextChangedListener contextChangeListener = new ISessionContextChangedListener() {
+        @Override
+        public void sessionContextChanged(SessionContextChangedEvent event) {
+            sessionContext = event.getNewValue();
+            sessionContextTracker.track(sessionContext);
+        }
+    };
+
+    protected void setSessionContextTracker(IHintTracker tracker) {
+        this.sessionContextTracker = tracker;
+    }
+
+    protected Map<String, String> getViewArguments() {
+        return args;
+    }
+
+    protected DisposeState getDisposeState() {
+        return disposeState;
+    }
+
+    public ISessionContext getSessionContext() {
+        return sessionContext;
+    }
+
+    public ISessionContextProvider getSessionContextProvider() {
+        return contextProvider;
+    }
+
+    @Override
+    public void createPartControl(Composite parent) {
+        this.parent = parent;
+        this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
+        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());
+        Images.getInstance(JFaceResources.getResources());
+        TreeColumnLayout ad = new TreeColumnLayout();
+        parent.setLayout(ad);
+        treeViewer.getTree().setHeaderVisible(true);
+        //treeViewer.getTree().setLinesVisible(true);
+        //treeViewer.setUseHashlookup(true);
+        //treeViewer.setAutoExpandLevel(3);
+
+        TreeViewerColumn nameColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+        TreeViewerColumn typeColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+//        TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+//        TreeViewerColumn lookupIdColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+//        TreeViewerColumn zColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+
+        nameColumn.setLabelProvider(new MyColumnLabelProvider());
+        typeColumn.setLabelProvider(new MyColumnLabelProvider());
+//        idColumn.setLabelProvider(new MyColumnLabelProvider());
+//        lookupIdColumn.setLabelProvider(new MyColumnLabelProvider());
+//        zColumn.setLabelProvider(new MyColumnLabelProvider());
+
+        nameColumn.getColumn().setText("Name");
+        nameColumn.getColumn().setWidth(20);
+        ad.setColumnData(nameColumn.getColumn(), new ColumnWeightData(80, 100));
+        typeColumn.getColumn().setText("Type");
+        typeColumn.getColumn().setWidth(20);
+        ad.setColumnData(typeColumn.getColumn(), new ColumnWeightData(20, 120));
+//        idColumn.getColumn().setText("ID");
+//        idColumn.getColumn().setWidth(20);
+//        ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(10, 50));
+//        lookupIdColumn.getColumn().setText("Lookup ID");
+//        lookupIdColumn.getColumn().setWidth(20);
+//        ad.setColumnData(lookupIdColumn.getColumn(), new ColumnWeightData(50, 100));
+//        zColumn.getColumn().setText("Z");
+//        zColumn.getColumn().setWidth(70);
+//        ad.setColumnData(zColumn.getColumn(), new ColumnWeightData(10, 70));
+
+        createControls(parent);
+        attachToSession();
+        
+    }
+
+    /**
+     * Invoked when this viewpart is disposed. Unhooks the view from its
+     * ISessionContextProvider. Overriding is allowed but super.dispose() must
+     * be called.
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+     */
+    @Override
+    public void dispose() {
+        disposeState = DisposeState.Disposing;
+        try {
+            if (contextProvider != null) {
+                contextProvider.removeContextChangedListener(contextChangeListener);
+                contextProvider = null;
+            }
+            sessionContextTracker.untrack();
+            resourceManager.dispose();
+            resourceManager = null;
+            args = null;
+            sessionContext = null;
+            parent = null;
+            super.dispose();
+        } finally {
+           disposeState = DisposeState.Disposed;
+        }
+    }
+
+    @Override
+    public void setFocus() {
+        
+    }
+
+    @Override
+    public void init(IViewSite site) throws PartInitException {
+        super.init(site);
+        this.args = ViewArgumentUtils.parseViewArguments(this);
+    }
+
+    @Override
+    public void init(IViewSite site, IMemento memento) throws PartInitException {
+        super.init(site, memento);
+        this.args = ViewArgumentUtils.parseViewArguments(this);
+        this.memento = memento;
+    }
+
+    @Override
+    public void saveState(IMemento memento) {
+        if (this.memento != null) {
+            memento.putMemento(this.memento);
+        }
+//        if (explorer != null)
+//            explorer.saveState(memento);
+    }
+    
+    protected final void attachToSession() {
+        // Track active ISessionContext changes
+        contextProvider = SimanticsUI.getSessionContextProvider(getViewSite().getWorkbenchWindow());
+        contextProvider.addContextChangedListener(contextChangeListener);
+
+        // Perform first-time initialization of the explorer and its input.
+        applySessionContext(contextProvider.getSessionContext());
+    }
+
+//    private abstract class NameAndDescriptionToolTip extends ToolTip {
+//        public NameAndDescriptionToolTip(Control control, int style) {
+//            super(control, style, false);
+//        }
+//
+//        protected abstract Object getModelElement(Event event);
+//
+//        /**
+//         * Adds logic to only show a tooltip if a meaningful item is under the
+//         * cursor.
+//         */
+//        protected boolean shouldCreateToolTip(Event event) {
+//            if (!super.shouldCreateToolTip(event))
+//                return false;
+//            Object tableElement = getModelElement(event); 
+//            return tableElement != null && tableElement instanceof DisplayElement;
+//        }
+//
+//        protected Composite createToolTipContentArea(Event event,
+//                Composite parent) {
+//            Object modelElement = getModelElement(event);
+//
+//            Image iconImage = null;
+//            String nameString = "no name";
+//
+//            if (modelElement instanceof DisplayElement) {
+//                iconImage = null;
+//                nameString = "name";
+//            }
+//
+//            // Create the content area
+//            Composite composite = new Composite(parent, SWT.NONE);
+//            composite.setBackground(parent.getDisplay().getSystemColor(
+//                    SWT.COLOR_INFO_BACKGROUND));
+//            composite.setLayout(new GridLayout(2, false));
+//
+//            // The title area with the icon (if there is one) and label.
+//            Label title = createEntry(composite, iconImage, nameString);
+////            title.setFont(tooltipHeading);
+//            GridDataFactory.createFrom((GridData)title.getLayoutData())
+//                .hint(SWT.DEFAULT, SWT.DEFAULT)
+////                .minSize(MIN_TOOLTIP_WIDTH, 1)
+//                .applyTo(title);
+//
+//            // The description (if there is one)
+////            String descriptionString = "description";
+////            if (descriptionString != null)
+////                createEntry(composite, null, descriptionString);
+//
+//            // Other Content to add
+//            addContent(composite, modelElement);
+//
+//            return composite;
+//        }
+//
+//        /**
+//         * Adds a line of information to <code>parent</code>. If
+//         * <code>icon</code> is not <code>null</code>, an icon is placed on the
+//         * left, and then a label with <code>text</code>.
+//         * 
+//         * @param parent
+//         *            the composite to add the entry to
+//         * @param icon
+//         *            the icon to place next to the text. <code>null</code> for
+//         *            none.
+//         * @param text
+//         *            the text to display
+//         * @return the created label
+//         */
+//        protected Label createEntry(Composite parent, Image icon, String text) {
+//            if (icon != null) {
+//                Label iconLabel = new Label(parent, SWT.NONE);
+//                iconLabel.setImage(icon);
+//                iconLabel.setBackground(parent.getDisplay().getSystemColor(
+//                        SWT.COLOR_INFO_BACKGROUND));
+//                iconLabel.setData(new GridData());
+//            }
+//
+//            Label textLabel = new Label(parent, SWT.WRAP);
+//            
+//            if(icon == null) {
+//                GridDataFactory.generate(textLabel, 2, 1);
+//            } else {
+//                GridDataFactory.generate(textLabel, 1, 1);
+//            }
+//            
+//            textLabel.setText(text);
+//            textLabel.setBackground(parent.getDisplay().getSystemColor(
+//                    SWT.COLOR_INFO_BACKGROUND));
+//            return textLabel;
+//        }
+//
+//        /**
+//         * Adds a line of information to <code>parent</code>. If
+//         * <code>icon</code> is not <code>null</code>, an icon is placed on the
+//         * left, and then a label with <code>text</code>, which supports using
+//         * anchor tags to creates links
+//         * 
+//         * @param parent
+//         *            the composite to add the entry to
+//         * @param icon
+//         *            the icon to place next to the text. <code>null</code> for
+//         *            none.
+//         * @param text
+//         *            the text to display
+//         * @return the created link
+//         */
+//        protected Text createEntryWithText(Composite parent, Image icon, String text) {
+//            if (icon != null) {
+//                Label iconLabel = new Label(parent, SWT.NONE);
+//                iconLabel.setImage(icon);
+//                iconLabel.setBackground(parent.getDisplay().getSystemColor(
+//                        SWT.COLOR_INFO_BACKGROUND));
+//                iconLabel.setData(new GridData());
+//            }
+//            Text texts = new Text(parent, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL);
+//            if(icon == null) {
+//                GridDataFactory.generate(texts, 2, 1);
+//            }
+//            texts.setText(text);
+//            texts.setBackground(parent.getDisplay().getSystemColor(
+//                    SWT.COLOR_INFO_BACKGROUND));
+//            return texts;
+//        }
+//
+//        protected void addContent(Composite destination, Object modelElement) {
+//        }
+//    }
+/*
+    private class ItemDetailToolTip extends NameAndDescriptionToolTip {
+        private final boolean DEBUG = false;
+        private TreeViewer viewer;
+        private Tree tree;
+        private ItemDetailToolTip(TreeViewer viewer, Tree tree, ViewerFilter filter) {
+            super(tree,NO_RECREATE);
+            this.tree = tree;
+            this.viewer = viewer;
+            this.setHideOnMouseDown(false);
+        }
+        public Point getLocation(Point tipSize, Event event) {
+            // try to position the tooltip at the bottom of the cell
+            ViewerCell cell = viewer.getCell(new Point(event.x, event.y));
+            if( cell != null )
+                return tree.toDisplay(event.x,cell.getBounds().y+cell.getBounds().height);
+            return super.getLocation(tipSize, event);
+        }
+        protected Object getToolTipArea(Event event) {
+            // Ensure that the tooltip is hidden when the cell is left
+            return viewer.getCell(new Point(event.x, event.y));
+        }
+        protected void addContent(Composite destination, Object modelElement) {
+            final DisplayElement item = (DisplayElement)modelElement;
+            if (DEBUG)
+                System.out.println("add content");
+            String text = null;
+            if (null != item) {
+                text = modelElement.toString();
+                createEntryWithText(destination, null, text.toString());
+            }
+        }
+        protected Object getModelElement(Event event) {
+            org.eclipse.swt.widgets.TreeItem treeItem = tree.getItem(new Point(event.x, event.y));
+            if (treeItem == null)
+                return null;
+            return treeItem.getData();
+        }
+    }*/
+    class MyColumnLabelProvider extends ColumnLabelProvider {
+        @Override
+        public void update(ViewerCell cell) {
+            //NodeProxy proxy = (NodeProxy) cell.getElement();
+            cell.setText("Kraa");
+            cell.setImage(Images.getInstance().OTHER_IMAGE);
+        }
+    }
+    protected void createControls(final Composite parent) {
+        parent.setLayout(LayoutUtils.createNoBorderGridLayout(1, false));
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());
+        treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));
+        treeViewer.setLabelProvider(new LabelProvider() {
+            @Override
+            public Image getImage(Object element) {
+                if (element instanceof ChangeSetElement)
+                    return Images.getInstance().CHANGE_SET_IMAGE;
+                else if (element instanceof DisplayElement)
+                    return Images.getInstance().DISPLAY_IMAGE;
+                else if (element instanceof ResourceElement)
+                    return Images.getInstance().RESOURCE_IMAGE;
+                else if (element instanceof StringElement)
+                    return Images.getInstance().STRING_IMAGE;
+                else if (element instanceof UndoCombinedElement)
+                    return Images.getInstance().COMBINED_IMAGE;
+                else if (element instanceof RedoContextElement)
+                    return Images.getInstance().REDO_IMAGE;
+                else if (element instanceof UndoContextElement)
+                    return Images.getInstance().UNDO_IMAGE;
+                else
+                    return Images.getInstance().OTHER_IMAGE;
+            }
+            @Override
+            public String getText(Object element) {
+                return element.toString();
+            }
+        });
+        //viewer.setSorter(new ViewerSorter());
+        treeViewer.setInput(this);
+        Control control = treeViewer.getControl();
+//        ISelectionProvider selectionProvider = new ISelectionProvider() {
+//            @Override
+//            public void addSelectionChangedListener(ISelectionChangedListener listener) {
+//            }
+//            @Override
+//            public ISelection getSelection() {
+//                return null;
+//            }
+//            @Override
+//            public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+//            }
+//            @Override
+//            public void setSelection(ISelection selection) {
+//            }
+//        };
+        createContextMenu(control, getSite());
+
+//        ImageDescriptor desc = BundleUtils.getImageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_undo.png");
+//        getViewSite().getActionBars().getToolBarManager().add(new Action("GetUndoHistory", desc) {
+//            @Override
+//            public void run() {
+//                treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));
+//            }
+//        });
+//        getViewSite().getActionBars().getToolBarManager().add(new Action("DumpSelectedRevision", Activator.BIN_CLOSED_ICON) {
+//            @Override
+//            public void run() {
+//                IStructuredSelection is = (IStructuredSelection)viewer.getSelection();
+//                Object o = is.getFirstElement();
+//                if (o instanceof ChangeSetElement) {
+//                    ChangeSetElement ce = (ChangeSetElement)o;
+//                    long csid = ce.getChangeSetIdentifier().getId();
+//                    ManagementSupport ms = SimanticsUI.getSession().getService(ManagementSupport.class);
+//                    try {
+//                        ms.dumpRevision(csid);
+//                        ShowMessage.showInformation("DumpSelectedRevision", "Operation was successful.");
+//                    } catch (DatabaseException e) {
+//                        ExceptionUtils.logAndShowError(e);
+//                    }
+//                }
+//            }
+//        });
+    }
+    public IMenuManager createContextMenu(Control control, IWorkbenchSite site) {
+        final MenuManager mm = new MenuManager("#TeamViewPopup", "#TeamViewPopup");
+        mm.setRemoveAllWhenShown(true);
+        mm.addMenuListener(new IMenuListener() {
+            @Override
+            public void menuAboutToShow(IMenuManager manager) {
+                mm.add(new GroupMarker(IWorkbenchActionConstants.WB_START));
+            }
+        });
+        Menu menu = mm.createContextMenu(control);
+        control.setMenu(menu);
+        if (site != null) {
+            if (site instanceof IWorkbenchPartSite) {
+                ((IWorkbenchPartSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());
+            } else if (site instanceof IPageSite) {
+                ((IPageSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());
+            }
+        }
+        return mm;
+    }
+    /**
+     * @param parent
+     * @return
+     */
+    protected GraphExplorer createExplorerControl(Composite parent) {
+        return GraphExplorerFactory.getInstance().selectionDataResolver(new DefaultSelectionDataResolver()).create(parent);
+    }
+
+    // Needed for preventing unnecessary re-initialization of the explorer with the same input.
+//    private Object currentInput;
+
+    /**
+     * Invoke this to reinitialize the explorer and reset its input. The input
+     * will be resolved from the specified ISessionContext based on the
+     * {@link SessionContextInputSource} that is currently in use. If the input
+     * is identical to the previous input, nothing will be done.
+     * 
+     * @param context
+     */
+    protected final boolean applySessionContext(ISessionContext context) {
+        // If control is not alive anymore, do nothing.
+        if (disposeState != DisposeState.Alive)
+            return false;
+
+        this.sessionContext = context;
+
+        // Start tracking the session context.
+        // This will cause IHintListeners of the sessionContextTracker to fire.
+        // For this we need the above input equality (identity) checking.
+        sessionContextTracker.track(sessionContext);
+        return true;
+    }
+}
+
+class IncomingContentProvider implements ITreeContentProvider {
+    class IncomingElement extends ChangeSetElement {
+        IncomingElement(Session session, ChangeSetIdentifier cs) {
+            super(session, cs);
+        }
+    }
+    IncomingElement[] changeSetIds;
+    IncomingContentProvider(Session session, Shell parent) {
+        //this.session = session;
+//        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);
+//        try {
+            Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();
+            /*if (null == cids)
+                changeSetIds = new IncomingElement[0];
+            else */{
+                changeSetIds = new IncomingElement[cids.size()];
+                Iterator<ChangeSetIdentifier> it = cids.iterator();
+                int i = 0;
+                while (it.hasNext()) {
+                    changeSetIds[i++] = new IncomingElement(session, it.next());
+                }
+                assert(i == cids.size());
+            }
+//        } catch (DatabaseException e) {
+//            changeSetIds = new IncomingElement[0];
+//            ExceptionUtils.logAndShowError(e);
+//        }
+    }
+    
+    @Override
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+    }
+
+    @Override
+    public void dispose() {
+    }
+
+    @Override
+    public Object[] getElements(Object inputElement) {
+        return changeSetIds;
+    }
+
+    @Override
+    public boolean hasChildren(Object element) {
+        return changeSetIds.length > 0;
+    }
+
+    @Override
+    public Object getParent(Object element) {
+        return null;
+    }
+
+    @Override
+    public Object[] getChildren(Object parentElement) {
+        return null;
+    }
+}
+
+class OutgoingContentProvider implements ITreeContentProvider {
+    class OutgoingElement extends ChangeSetElement {
+        OutgoingElement(Session session, ChangeSetIdentifier cs) {
+            super(session, cs);
+        }
+    }
+    OutgoingElement[] changeSetIds;
+    OutgoingContentProvider(Session session) {
+//        PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);
+//        try {
+            Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();
+            /*if (null == cids)
+                changeSetIds = new OutgoingElement[0];
+            else */{
+                changeSetIds = new OutgoingElement[cids.size()];
+                Iterator<ChangeSetIdentifier> it = cids.iterator();
+                int i = 0;
+                while (it.hasNext()) {
+                    changeSetIds[i++] = new OutgoingElement(session, it.next());
+                }
+                assert(i == cids.size());
+            }
+//        } catch (DatabaseException e) {
+//            ExceptionUtils.logAndShowError(e);
+//            changeSetIds = new OutgoingElement[0];
+//        }
+    }
+    
+    @Override
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+    }
+
+    @Override
+    public void dispose() {
+    }
+
+    @Override
+    public Object[] getElements(Object inputElement) {
+        return changeSetIds;
+    }
+
+    @Override
+    public boolean hasChildren(Object element) {
+        if (element instanceof  TreeElement)
+            return ((TreeElement)element).hasChildren();
+        return false;
+    }
+
+    @Override
+    public Object getParent(Object element) {
+        return null;
+    }
+
+    @Override
+    public Object[] getChildren(Object parentElement) {
+        if (parentElement instanceof  TreeElement)
+            return ((TreeElement)parentElement).getChildren();
+        else
+            return null;
+    }
+}
+
+
+
+class ResourceElement extends TreeElement {
+    private Session session;
+    private String resourceUri;
+    private String resourceName;
+    private Resource resource;
+    ResourceElement(Session session, String resource) {
+        this.session = session;
+        this.resourceUri = resource;
+    }
+    ResourceElement(Session session, Resource resource) {
+        this.session = session;
+        this.resource = resource;
+    }
+    @Override
+    protected Image getIdImage() {
+        return Images.getInstance().RESOURCE_IMAGE;
+    }
+    @Override
+    protected String getIdText() {
+        String s = resource.toString();
+        return s.substring(0, Math.min(10, s.length()));
+    }
+    private String getNameByUri() {
+        try {
+            String t = session.syncRequest(new Read<String>() {
+                @Override
+                public String perform(ReadGraph g) throws DatabaseException {
+                    resource = g.getResource(resourceUri);
+                    Layer0 l0 = Layer0.getInstance(g);
+                    resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);
+                    if (null == resourceName) {
+                        Set<Resource> types = g.getTypes(resource);
+                        if (types.size() > 0) {
+                            Iterator<Resource> i = types.iterator();
+                            Resource r = i.next();
+                            resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);
+                        }
+                    }
+                    if (null == resourceName)
+                        resourceName = resourceUri;
+                    return resourceName;
+                }
+            });
+            return t;
+        } catch (DatabaseException e) {
+        }
+        return null;
+    }
+    private String getName() {
+        try {
+            String t = session.syncRequest(new Read<String>() {
+                @Override
+                public String perform(ReadGraph g) throws DatabaseException {
+                    Layer0 l0 = Layer0.getInstance(g);
+                    resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);
+                    if (null == resourceName) {
+                        Set<Resource> types = g.getTypes(resource);
+                        if (types.size() > 0) {
+                            Iterator<Resource> i = types.iterator();
+                            Resource r = i.next();
+                            resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);
+                        }
+                    }
+                    if (null == resourceName)
+                        resourceName = resourceUri;
+                    return resourceName;
+                }
+            });
+            return t;
+        } catch (DatabaseException e) {
+        }
+        return null;
+    }
+    private Resource getParent() {
+        try {
+            Resource parent = session.syncRequest(new Read<Resource>() {
+                @Override
+                public Resource perform(ReadGraph g) throws DatabaseException {
+                    Layer0 l0 = Layer0.getInstance(g);
+                    return g.getPossibleObject(resource, l0.PartOf);
+                }
+                
+            });
+            return parent;
+        } catch (DatabaseException e) {
+        }
+        return null;
+    }
+    public String toString() {
+        if (null == resourceName && null != resourceUri)
+            return getNameByUri();
+        else if (null != resource && null == resourceUri)
+            return getName();
+        return resourceName;
+    }
+    @Override
+    boolean hasChildren() {
+        Resource p = getParent();
+        if (null != p)
+            return true;
+        else
+            return false;
+    }
+    @Override
+    Object[] getChildren() {
+        Resource p = getParent();
+        if (null == p)
+            return new Object[0];
+        Object[] objects = new Object[1];
+        objects[0] = new ResourceElement(session, p);
+        return objects;
+    }
+}