-/*******************************************************************************\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;
+ }
+}