1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.team.ui;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.Iterator;
\r
17 import java.util.Map;
\r
18 import java.util.Set;
\r
20 import org.eclipse.jface.action.GroupMarker;
\r
21 import org.eclipse.jface.action.IMenuListener;
\r
22 import org.eclipse.jface.action.IMenuManager;
\r
23 import org.eclipse.jface.action.MenuManager;
\r
24 import org.eclipse.jface.layout.GridDataFactory;
\r
25 import org.eclipse.jface.layout.TreeColumnLayout;
\r
26 import org.eclipse.jface.resource.JFaceResources;
\r
27 import org.eclipse.jface.resource.LocalResourceManager;
\r
28 import org.eclipse.jface.viewers.ColumnLabelProvider;
\r
29 import org.eclipse.jface.viewers.ColumnWeightData;
\r
30 import org.eclipse.jface.viewers.ITreeContentProvider;
\r
31 import org.eclipse.jface.viewers.LabelProvider;
\r
32 import org.eclipse.jface.viewers.TreeViewer;
\r
33 import org.eclipse.jface.viewers.TreeViewerColumn;
\r
34 import org.eclipse.jface.viewers.Viewer;
\r
35 import org.eclipse.jface.viewers.ViewerCell;
\r
36 import org.eclipse.swt.SWT;
\r
37 import org.eclipse.swt.graphics.Image;
\r
38 import org.eclipse.swt.widgets.Composite;
\r
39 import org.eclipse.swt.widgets.Control;
\r
40 import org.eclipse.swt.widgets.Menu;
\r
41 import org.eclipse.swt.widgets.Shell;
\r
42 import org.eclipse.ui.IMemento;
\r
43 import org.eclipse.ui.IViewSite;
\r
44 import org.eclipse.ui.IWorkbenchActionConstants;
\r
45 import org.eclipse.ui.IWorkbenchPartSite;
\r
46 import org.eclipse.ui.IWorkbenchSite;
\r
47 import org.eclipse.ui.PartInitException;
\r
48 import org.eclipse.ui.part.IPageSite;
\r
49 import org.eclipse.ui.part.ViewPart;
\r
50 import org.simantics.browsing.ui.GraphExplorer;
\r
51 import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;
\r
52 import org.simantics.browsing.ui.swt.DefaultSelectionDataResolver;
\r
53 import org.simantics.browsing.ui.swt.GraphExplorerFactory;
\r
54 import org.simantics.browsing.ui.swt.ViewArgumentUtils;
\r
55 import org.simantics.databoard.Bindings;
\r
56 import org.simantics.db.ChangeSetIdentifier;
\r
57 import org.simantics.db.ReadGraph;
\r
58 import org.simantics.db.Resource;
\r
59 import org.simantics.db.Session;
\r
60 import org.simantics.db.exception.DatabaseException;
\r
61 import org.simantics.db.management.ISessionContext;
\r
62 import org.simantics.db.management.ISessionContextChangedListener;
\r
63 import org.simantics.db.management.ISessionContextProvider;
\r
64 import org.simantics.db.management.SessionContextChangedEvent;
\r
65 import org.simantics.db.request.Read;
\r
66 import org.simantics.layer0.Layer0;
\r
67 import org.simantics.project.ProjectKeys;
\r
68 import org.simantics.team.internal.Images;
\r
69 import org.simantics.ui.SimanticsUI;
\r
70 import org.simantics.utils.datastructures.disposable.DisposeState;
\r
71 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
\r
72 import org.simantics.utils.datastructures.hints.HintTracker;
\r
73 import org.simantics.utils.datastructures.hints.IHintContext.Key;
\r
74 import org.simantics.utils.datastructures.hints.IHintListener;
\r
75 import org.simantics.utils.datastructures.hints.IHintObservable;
\r
76 import org.simantics.utils.datastructures.hints.IHintTracker;
\r
77 import org.simantics.utils.ui.LayoutUtils;
\r
80 * @author Kalle Kondelin
\r
82 public class SynchroniseView extends ViewPart {
\r
84 public SynchroniseView() {
\r
87 public class SessionContextProjectTracker extends HintTracker {
\r
88 public SessionContextProjectTracker() {
\r
89 IHintListener activeProjectListener = new HintListenerAdapter() {
\r
91 public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
\r
92 applySessionContext(getSessionContext());
\r
95 addKeyHintListener(ProjectKeys.KEY_PROJECT, activeProjectListener);
\r
99 protected LocalResourceManager resourceManager;
\r
101 protected Composite parent;
\r
103 protected TreeViewer treeViewer;
\r
105 private Map<String, String> args;
\r
107 private ISessionContextProvider contextProvider;
\r
109 private ISessionContext sessionContext;
\r
111 protected IMemento memento;
\r
113 private IHintTracker sessionContextTracker = new SessionContextProjectTracker();
\r
115 private DisposeState disposeState = DisposeState.Alive;
\r
117 protected ISessionContextChangedListener contextChangeListener = new ISessionContextChangedListener() {
\r
119 public void sessionContextChanged(SessionContextChangedEvent event) {
\r
120 sessionContext = event.getNewValue();
\r
121 sessionContextTracker.track(sessionContext);
\r
125 protected void setSessionContextTracker(IHintTracker tracker) {
\r
126 this.sessionContextTracker = tracker;
\r
129 protected Map<String, String> getViewArguments() {
\r
133 protected DisposeState getDisposeState() {
\r
134 return disposeState;
\r
137 public ISessionContext getSessionContext() {
\r
138 return sessionContext;
\r
141 public ISessionContextProvider getSessionContextProvider() {
\r
142 return contextProvider;
\r
146 public void createPartControl(Composite parent) {
\r
147 this.parent = parent;
\r
148 this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
\r
149 this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());
\r
150 Images.getInstance(JFaceResources.getResources());
\r
151 TreeColumnLayout ad = new TreeColumnLayout();
\r
152 parent.setLayout(ad);
\r
153 treeViewer.getTree().setHeaderVisible(true);
\r
154 //treeViewer.getTree().setLinesVisible(true);
\r
155 //treeViewer.setUseHashlookup(true);
\r
156 //treeViewer.setAutoExpandLevel(3);
\r
158 TreeViewerColumn nameColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
\r
159 TreeViewerColumn typeColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
\r
160 // TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
\r
161 // TreeViewerColumn lookupIdColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
\r
162 // TreeViewerColumn zColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
\r
164 nameColumn.setLabelProvider(new MyColumnLabelProvider());
\r
165 typeColumn.setLabelProvider(new MyColumnLabelProvider());
\r
166 // idColumn.setLabelProvider(new MyColumnLabelProvider());
\r
167 // lookupIdColumn.setLabelProvider(new MyColumnLabelProvider());
\r
168 // zColumn.setLabelProvider(new MyColumnLabelProvider());
\r
170 nameColumn.getColumn().setText("Name");
\r
171 nameColumn.getColumn().setWidth(20);
\r
172 ad.setColumnData(nameColumn.getColumn(), new ColumnWeightData(80, 100));
\r
173 typeColumn.getColumn().setText("Type");
\r
174 typeColumn.getColumn().setWidth(20);
\r
175 ad.setColumnData(typeColumn.getColumn(), new ColumnWeightData(20, 120));
\r
176 // idColumn.getColumn().setText("ID");
\r
177 // idColumn.getColumn().setWidth(20);
\r
178 // ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(10, 50));
\r
179 // lookupIdColumn.getColumn().setText("Lookup ID");
\r
180 // lookupIdColumn.getColumn().setWidth(20);
\r
181 // ad.setColumnData(lookupIdColumn.getColumn(), new ColumnWeightData(50, 100));
\r
182 // zColumn.getColumn().setText("Z");
\r
183 // zColumn.getColumn().setWidth(70);
\r
184 // ad.setColumnData(zColumn.getColumn(), new ColumnWeightData(10, 70));
\r
186 createControls(parent);
\r
192 * Invoked when this viewpart is disposed. Unhooks the view from its
\r
193 * ISessionContextProvider. Overriding is allowed but super.dispose() must
\r
196 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
\r
199 public void dispose() {
\r
200 disposeState = DisposeState.Disposing;
\r
202 if (contextProvider != null) {
\r
203 contextProvider.removeContextChangedListener(contextChangeListener);
\r
204 contextProvider = null;
\r
206 sessionContextTracker.untrack();
\r
207 resourceManager.dispose();
\r
208 resourceManager = null;
\r
210 sessionContext = null;
\r
214 disposeState = DisposeState.Disposed;
\r
219 public void setFocus() {
\r
224 public void init(IViewSite site) throws PartInitException {
\r
226 this.args = ViewArgumentUtils.parseViewArguments(this);
\r
230 public void init(IViewSite site, IMemento memento) throws PartInitException {
\r
231 super.init(site, memento);
\r
232 this.args = ViewArgumentUtils.parseViewArguments(this);
\r
233 this.memento = memento;
\r
237 public void saveState(IMemento memento) {
\r
238 if (this.memento != null) {
\r
239 memento.putMemento(this.memento);
\r
241 // if (explorer != null)
\r
242 // explorer.saveState(memento);
\r
245 protected final void attachToSession() {
\r
246 // Track active ISessionContext changes
\r
247 contextProvider = SimanticsUI.getSessionContextProvider(getViewSite().getWorkbenchWindow());
\r
248 contextProvider.addContextChangedListener(contextChangeListener);
\r
250 // Perform first-time initialization of the explorer and its input.
\r
251 applySessionContext(contextProvider.getSessionContext());
\r
254 // private abstract class NameAndDescriptionToolTip extends ToolTip {
\r
255 // public NameAndDescriptionToolTip(Control control, int style) {
\r
256 // super(control, style, false);
\r
259 // protected abstract Object getModelElement(Event event);
\r
262 // * Adds logic to only show a tooltip if a meaningful item is under the
\r
265 // protected boolean shouldCreateToolTip(Event event) {
\r
266 // if (!super.shouldCreateToolTip(event))
\r
268 // Object tableElement = getModelElement(event);
\r
269 // return tableElement != null && tableElement instanceof DisplayElement;
\r
272 // protected Composite createToolTipContentArea(Event event,
\r
273 // Composite parent) {
\r
274 // Object modelElement = getModelElement(event);
\r
276 // Image iconImage = null;
\r
277 // String nameString = "no name";
\r
279 // if (modelElement instanceof DisplayElement) {
\r
280 // iconImage = null;
\r
281 // nameString = "name";
\r
284 // // Create the content area
\r
285 // Composite composite = new Composite(parent, SWT.NONE);
\r
286 // composite.setBackground(parent.getDisplay().getSystemColor(
\r
287 // SWT.COLOR_INFO_BACKGROUND));
\r
288 // composite.setLayout(new GridLayout(2, false));
\r
290 // // The title area with the icon (if there is one) and label.
\r
291 // Label title = createEntry(composite, iconImage, nameString);
\r
292 //// title.setFont(tooltipHeading);
\r
293 // GridDataFactory.createFrom((GridData)title.getLayoutData())
\r
294 // .hint(SWT.DEFAULT, SWT.DEFAULT)
\r
295 //// .minSize(MIN_TOOLTIP_WIDTH, 1)
\r
296 // .applyTo(title);
\r
298 // // The description (if there is one)
\r
299 //// String descriptionString = "description";
\r
300 //// if (descriptionString != null)
\r
301 //// createEntry(composite, null, descriptionString);
\r
303 // // Other Content to add
\r
304 // addContent(composite, modelElement);
\r
306 // return composite;
\r
310 // * Adds a line of information to <code>parent</code>. If
\r
311 // * <code>icon</code> is not <code>null</code>, an icon is placed on the
\r
312 // * left, and then a label with <code>text</code>.
\r
315 // * the composite to add the entry to
\r
317 // * the icon to place next to the text. <code>null</code> for
\r
320 // * the text to display
\r
321 // * @return the created label
\r
323 // protected Label createEntry(Composite parent, Image icon, String text) {
\r
324 // if (icon != null) {
\r
325 // Label iconLabel = new Label(parent, SWT.NONE);
\r
326 // iconLabel.setImage(icon);
\r
327 // iconLabel.setBackground(parent.getDisplay().getSystemColor(
\r
328 // SWT.COLOR_INFO_BACKGROUND));
\r
329 // iconLabel.setData(new GridData());
\r
332 // Label textLabel = new Label(parent, SWT.WRAP);
\r
334 // if(icon == null) {
\r
335 // GridDataFactory.generate(textLabel, 2, 1);
\r
337 // GridDataFactory.generate(textLabel, 1, 1);
\r
340 // textLabel.setText(text);
\r
341 // textLabel.setBackground(parent.getDisplay().getSystemColor(
\r
342 // SWT.COLOR_INFO_BACKGROUND));
\r
343 // return textLabel;
\r
347 // * Adds a line of information to <code>parent</code>. If
\r
348 // * <code>icon</code> is not <code>null</code>, an icon is placed on the
\r
349 // * left, and then a label with <code>text</code>, which supports using
\r
350 // * anchor tags to creates links
\r
353 // * the composite to add the entry to
\r
355 // * the icon to place next to the text. <code>null</code> for
\r
358 // * the text to display
\r
359 // * @return the created link
\r
361 // protected Text createEntryWithText(Composite parent, Image icon, String text) {
\r
362 // if (icon != null) {
\r
363 // Label iconLabel = new Label(parent, SWT.NONE);
\r
364 // iconLabel.setImage(icon);
\r
365 // iconLabel.setBackground(parent.getDisplay().getSystemColor(
\r
366 // SWT.COLOR_INFO_BACKGROUND));
\r
367 // iconLabel.setData(new GridData());
\r
369 // Text texts = new Text(parent, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL);
\r
370 // if(icon == null) {
\r
371 // GridDataFactory.generate(texts, 2, 1);
\r
373 // texts.setText(text);
\r
374 // texts.setBackground(parent.getDisplay().getSystemColor(
\r
375 // SWT.COLOR_INFO_BACKGROUND));
\r
379 // protected void addContent(Composite destination, Object modelElement) {
\r
383 private class ItemDetailToolTip extends NameAndDescriptionToolTip {
\r
384 private final boolean DEBUG = false;
\r
385 private TreeViewer viewer;
\r
387 private ItemDetailToolTip(TreeViewer viewer, Tree tree, ViewerFilter filter) {
\r
388 super(tree,NO_RECREATE);
\r
390 this.viewer = viewer;
\r
391 this.setHideOnMouseDown(false);
\r
393 public Point getLocation(Point tipSize, Event event) {
\r
394 // try to position the tooltip at the bottom of the cell
\r
395 ViewerCell cell = viewer.getCell(new Point(event.x, event.y));
\r
397 return tree.toDisplay(event.x,cell.getBounds().y+cell.getBounds().height);
\r
398 return super.getLocation(tipSize, event);
\r
400 protected Object getToolTipArea(Event event) {
\r
401 // Ensure that the tooltip is hidden when the cell is left
\r
402 return viewer.getCell(new Point(event.x, event.y));
\r
404 protected void addContent(Composite destination, Object modelElement) {
\r
405 final DisplayElement item = (DisplayElement)modelElement;
\r
407 System.out.println("add content");
\r
408 String text = null;
\r
409 if (null != item) {
\r
410 text = modelElement.toString();
\r
411 createEntryWithText(destination, null, text.toString());
\r
414 protected Object getModelElement(Event event) {
\r
415 org.eclipse.swt.widgets.TreeItem treeItem = tree.getItem(new Point(event.x, event.y));
\r
416 if (treeItem == null)
\r
418 return treeItem.getData();
\r
421 class MyColumnLabelProvider extends ColumnLabelProvider {
\r
423 public void update(ViewerCell cell) {
\r
424 //NodeProxy proxy = (NodeProxy) cell.getElement();
\r
425 cell.setText("Kraa");
\r
426 cell.setImage(Images.getInstance().OTHER_IMAGE);
\r
429 protected void createControls(final Composite parent) {
\r
430 parent.setLayout(LayoutUtils.createNoBorderGridLayout(1, false));
\r
431 GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());
\r
432 treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));
\r
433 treeViewer.setLabelProvider(new LabelProvider() {
\r
435 public Image getImage(Object element) {
\r
436 if (element instanceof ChangeSetElement)
\r
437 return Images.getInstance().CHANGE_SET_IMAGE;
\r
438 else if (element instanceof DisplayElement)
\r
439 return Images.getInstance().DISPLAY_IMAGE;
\r
440 else if (element instanceof ResourceElement)
\r
441 return Images.getInstance().RESOURCE_IMAGE;
\r
442 else if (element instanceof StringElement)
\r
443 return Images.getInstance().STRING_IMAGE;
\r
444 else if (element instanceof UndoCombinedElement)
\r
445 return Images.getInstance().COMBINED_IMAGE;
\r
446 else if (element instanceof RedoContextElement)
\r
447 return Images.getInstance().REDO_IMAGE;
\r
448 else if (element instanceof UndoContextElement)
\r
449 return Images.getInstance().UNDO_IMAGE;
\r
451 return Images.getInstance().OTHER_IMAGE;
\r
454 public String getText(Object element) {
\r
455 return element.toString();
\r
458 //viewer.setSorter(new ViewerSorter());
\r
459 treeViewer.setInput(this);
\r
460 Control control = treeViewer.getControl();
\r
461 // ISelectionProvider selectionProvider = new ISelectionProvider() {
\r
463 // public void addSelectionChangedListener(ISelectionChangedListener listener) {
\r
466 // public ISelection getSelection() {
\r
470 // public void removeSelectionChangedListener(ISelectionChangedListener listener) {
\r
473 // public void setSelection(ISelection selection) {
\r
476 createContextMenu(control, getSite());
\r
478 // ImageDescriptor desc = BundleUtils.getImageDescriptorFromPlugin("com.famfamfam.silk", "icons/arrow_undo.png");
\r
479 // getViewSite().getActionBars().getToolBarManager().add(new Action("GetUndoHistory", desc) {
\r
481 // public void run() {
\r
482 // treeViewer.setContentProvider(new UndoContentProvider(SimanticsUI.getSession()));
\r
485 // getViewSite().getActionBars().getToolBarManager().add(new Action("DumpSelectedRevision", Activator.BIN_CLOSED_ICON) {
\r
487 // public void run() {
\r
488 // IStructuredSelection is = (IStructuredSelection)viewer.getSelection();
\r
489 // Object o = is.getFirstElement();
\r
490 // if (o instanceof ChangeSetElement) {
\r
491 // ChangeSetElement ce = (ChangeSetElement)o;
\r
492 // long csid = ce.getChangeSetIdentifier().getId();
\r
493 // ManagementSupport ms = SimanticsUI.getSession().getService(ManagementSupport.class);
\r
495 // ms.dumpRevision(csid);
\r
496 // ShowMessage.showInformation("DumpSelectedRevision", "Operation was successful.");
\r
497 // } catch (DatabaseException e) {
\r
498 // ExceptionUtils.logAndShowError(e);
\r
504 public IMenuManager createContextMenu(Control control, IWorkbenchSite site) {
\r
505 final MenuManager mm = new MenuManager("#TeamViewPopup", "#TeamViewPopup");
\r
506 mm.setRemoveAllWhenShown(true);
\r
507 mm.addMenuListener(new IMenuListener() {
\r
509 public void menuAboutToShow(IMenuManager manager) {
\r
510 mm.add(new GroupMarker(IWorkbenchActionConstants.WB_START));
\r
513 Menu menu = mm.createContextMenu(control);
\r
514 control.setMenu(menu);
\r
515 if (site != null) {
\r
516 if (site instanceof IWorkbenchPartSite) {
\r
517 ((IWorkbenchPartSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());
\r
518 } else if (site instanceof IPageSite) {
\r
519 ((IPageSite) site).registerContextMenu(mm.getId(), mm, site.getSelectionProvider());
\r
528 protected GraphExplorer createExplorerControl(Composite parent) {
\r
529 return GraphExplorerFactory.getInstance().selectionDataResolver(new DefaultSelectionDataResolver()).create(parent);
\r
532 // Needed for preventing unnecessary re-initialization of the explorer with the same input.
\r
533 // private Object currentInput;
\r
536 * Invoke this to reinitialize the explorer and reset its input. The input
\r
537 * will be resolved from the specified ISessionContext based on the
\r
538 * {@link SessionContextInputSource} that is currently in use. If the input
\r
539 * is identical to the previous input, nothing will be done.
\r
543 protected final boolean applySessionContext(ISessionContext context) {
\r
544 // If control is not alive anymore, do nothing.
\r
545 if (disposeState != DisposeState.Alive)
\r
548 this.sessionContext = context;
\r
550 // Start tracking the session context.
\r
551 // This will cause IHintListeners of the sessionContextTracker to fire.
\r
552 // For this we need the above input equality (identity) checking.
\r
553 sessionContextTracker.track(sessionContext);
\r
558 class IncomingContentProvider implements ITreeContentProvider {
\r
559 class IncomingElement extends ChangeSetElement {
\r
560 IncomingElement(Session session, ChangeSetIdentifier cs) {
\r
561 super(session, cs);
\r
564 IncomingElement[] changeSetIds;
\r
565 IncomingContentProvider(Session session, Shell parent) {
\r
566 //this.session = session;
\r
567 // PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);
\r
569 Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();
\r
570 /*if (null == cids)
\r
571 changeSetIds = new IncomingElement[0];
\r
573 changeSetIds = new IncomingElement[cids.size()];
\r
574 Iterator<ChangeSetIdentifier> it = cids.iterator();
\r
576 while (it.hasNext()) {
\r
577 changeSetIds[i++] = new IncomingElement(session, it.next());
\r
579 assert(i == cids.size());
\r
581 // } catch (DatabaseException e) {
\r
582 // changeSetIds = new IncomingElement[0];
\r
583 // ExceptionUtils.logAndShowError(e);
\r
588 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
592 public void dispose() {
\r
596 public Object[] getElements(Object inputElement) {
\r
597 return changeSetIds;
\r
601 public boolean hasChildren(Object element) {
\r
602 return changeSetIds.length > 0;
\r
606 public Object getParent(Object element) {
\r
611 public Object[] getChildren(Object parentElement) {
\r
616 class OutgoingContentProvider implements ITreeContentProvider {
\r
617 class OutgoingElement extends ChangeSetElement {
\r
618 OutgoingElement(Session session, ChangeSetIdentifier cs) {
\r
619 super(session, cs);
\r
622 OutgoingElement[] changeSetIds;
\r
623 OutgoingContentProvider(Session session) {
\r
624 // PublishSynchroniseSupport ps = session.getService(PublishSynchroniseSupport.class);
\r
626 Collection<ChangeSetIdentifier> cids = new ArrayList<ChangeSetIdentifier>();
\r
627 /*if (null == cids)
\r
628 changeSetIds = new OutgoingElement[0];
\r
630 changeSetIds = new OutgoingElement[cids.size()];
\r
631 Iterator<ChangeSetIdentifier> it = cids.iterator();
\r
633 while (it.hasNext()) {
\r
634 changeSetIds[i++] = new OutgoingElement(session, it.next());
\r
636 assert(i == cids.size());
\r
638 // } catch (DatabaseException e) {
\r
639 // ExceptionUtils.logAndShowError(e);
\r
640 // changeSetIds = new OutgoingElement[0];
\r
645 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
649 public void dispose() {
\r
653 public Object[] getElements(Object inputElement) {
\r
654 return changeSetIds;
\r
658 public boolean hasChildren(Object element) {
\r
659 if (element instanceof TreeElement)
\r
660 return ((TreeElement)element).hasChildren();
\r
665 public Object getParent(Object element) {
\r
670 public Object[] getChildren(Object parentElement) {
\r
671 if (parentElement instanceof TreeElement)
\r
672 return ((TreeElement)parentElement).getChildren();
\r
680 class ResourceElement extends TreeElement {
\r
681 private Session session;
\r
682 private String resourceUri;
\r
683 private String resourceName;
\r
684 private Resource resource;
\r
685 ResourceElement(Session session, String resource) {
\r
686 this.session = session;
\r
687 this.resourceUri = resource;
\r
689 ResourceElement(Session session, Resource resource) {
\r
690 this.session = session;
\r
691 this.resource = resource;
\r
694 protected Image getIdImage() {
\r
695 return Images.getInstance().RESOURCE_IMAGE;
\r
698 protected String getIdText() {
\r
699 String s = resource.toString();
\r
700 return s.substring(0, Math.min(10, s.length()));
\r
702 private String getNameByUri() {
\r
704 String t = session.syncRequest(new Read<String>() {
\r
706 public String perform(ReadGraph g) throws DatabaseException {
\r
707 resource = g.getResource(resourceUri);
\r
708 Layer0 l0 = Layer0.getInstance(g);
\r
709 resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);
\r
710 if (null == resourceName) {
\r
711 Set<Resource> types = g.getTypes(resource);
\r
712 if (types.size() > 0) {
\r
713 Iterator<Resource> i = types.iterator();
\r
714 Resource r = i.next();
\r
715 resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);
\r
718 if (null == resourceName)
\r
719 resourceName = resourceUri;
\r
720 return resourceName;
\r
724 } catch (DatabaseException e) {
\r
728 private String getName() {
\r
730 String t = session.syncRequest(new Read<String>() {
\r
732 public String perform(ReadGraph g) throws DatabaseException {
\r
733 Layer0 l0 = Layer0.getInstance(g);
\r
734 resourceName = g.getPossibleRelatedValue(resource, l0.HasName, Bindings.STRING);
\r
735 if (null == resourceName) {
\r
736 Set<Resource> types = g.getTypes(resource);
\r
737 if (types.size() > 0) {
\r
738 Iterator<Resource> i = types.iterator();
\r
739 Resource r = i.next();
\r
740 resourceName = g.getPossibleRelatedValue(r, l0.HasName, Bindings.STRING);
\r
743 if (null == resourceName)
\r
744 resourceName = resourceUri;
\r
745 return resourceName;
\r
749 } catch (DatabaseException e) {
\r
753 private Resource getParent() {
\r
755 Resource parent = session.syncRequest(new Read<Resource>() {
\r
757 public Resource perform(ReadGraph g) throws DatabaseException {
\r
758 Layer0 l0 = Layer0.getInstance(g);
\r
759 return g.getPossibleObject(resource, l0.PartOf);
\r
764 } catch (DatabaseException e) {
\r
768 public String toString() {
\r
769 if (null == resourceName && null != resourceUri)
\r
770 return getNameByUri();
\r
771 else if (null != resource && null == resourceUri)
\r
773 return resourceName;
\r
776 boolean hasChildren() {
\r
777 Resource p = getParent();
\r
784 Object[] getChildren() {
\r
785 Resource p = getParent();
\r
787 return new Object[0];
\r
788 Object[] objects = new Object[1];
\r
789 objects[0] = new ResourceElement(session, p);
\r