| /* |
| * Copyright (c) 2007-2013, 2015 Eike Stepper (Berlin, Germany) and others. |
| * 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: |
| * Eike Stepper - initial API and implementation |
| * Victor Roldan Betancort - maintenance |
| * Christian W. Damus (CEA LIST) - bug 419805, bug 399306 |
| */ |
| package org.eclipse.emf.cdo.ui; |
| |
| import org.eclipse.emf.cdo.CDOObject; |
| import org.eclipse.emf.cdo.CDOState; |
| import org.eclipse.emf.cdo.common.CDOCommonRepository.State; |
| import org.eclipse.emf.cdo.common.CDOCommonView; |
| import org.eclipse.emf.cdo.common.branch.CDOBranch; |
| import org.eclipse.emf.cdo.common.branch.CDOBranchManager; |
| import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; |
| import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; |
| import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; |
| import org.eclipse.emf.cdo.common.model.CDOPackageTypeRegistry; |
| import org.eclipse.emf.cdo.common.model.CDOPackageUnit.Type; |
| import org.eclipse.emf.cdo.common.security.CDOPermission; |
| import org.eclipse.emf.cdo.common.util.CDOCommonUtil; |
| import org.eclipse.emf.cdo.eresource.CDOBinaryResource; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.eresource.CDOResourceFolder; |
| import org.eclipse.emf.cdo.eresource.CDOResourceLeaf; |
| import org.eclipse.emf.cdo.eresource.CDOResourceNode; |
| import org.eclipse.emf.cdo.eresource.CDOTextResource; |
| import org.eclipse.emf.cdo.internal.ui.actions.ChangePasswordAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.CloseSessionAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.CloseViewAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.CommitTransactionAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.CreateBranchAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.DisableViewDurabilityAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.EnableViewDurabilityAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.ExportResourceAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.ImportResourceAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.LoadResourceAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.ManagePackagesAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.MergeBranchPointAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.MergeConflictsAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.NewResourceNodeAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.NewTopLevelResourceNodeAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.OpenAuditAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.OpenDurableViewAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.OpenResourceEditorAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.OpenTransactionAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.OpenViewAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.RegisterSinglePackageAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.RollbackTransactionAction; |
| import org.eclipse.emf.cdo.internal.ui.actions.SwitchTargetAction; |
| import org.eclipse.emf.cdo.internal.ui.messages.Messages; |
| import org.eclipse.emf.cdo.session.CDORepositoryInfo; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.session.CDOSessionInvalidationEvent; |
| import org.eclipse.emf.cdo.transaction.CDOTransaction; |
| import org.eclipse.emf.cdo.transfer.CDOTransferElement; |
| import org.eclipse.emf.cdo.ui.shared.SharedIcons; |
| import org.eclipse.emf.cdo.util.CDOUtil; |
| import org.eclipse.emf.cdo.view.CDOObjectHandler; |
| import org.eclipse.emf.cdo.view.CDOView; |
| import org.eclipse.emf.cdo.view.CDOViewLocksChangedEvent; |
| import org.eclipse.emf.cdo.view.CDOViewTargetChangedEvent; |
| |
| import org.eclipse.net4j.util.StringUtil; |
| import org.eclipse.net4j.util.container.IContainer; |
| import org.eclipse.net4j.util.container.IContainerDelta; |
| import org.eclipse.net4j.util.container.IContainerEvent; |
| import org.eclipse.net4j.util.event.IEvent; |
| import org.eclipse.net4j.util.event.IListener; |
| import org.eclipse.net4j.util.event.INotifier; |
| import org.eclipse.net4j.util.lifecycle.ILifecycle; |
| import org.eclipse.net4j.util.lifecycle.ILifecycleEvent; |
| import org.eclipse.net4j.util.ui.views.ContainerItemProvider; |
| import org.eclipse.net4j.util.ui.views.IElementFilter; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EPackage; |
| |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.resource.LocalResourceManager; |
| import org.eclipse.jface.resource.ResourceManager; |
| import org.eclipse.jface.viewers.ITreeSelection; |
| import org.eclipse.jface.viewers.LabelProviderChangedEvent; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.ui.IEditorDescriptor; |
| import org.eclipse.ui.IEditorRegistry; |
| import org.eclipse.ui.IPropertyListener; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.PlatformUI; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| /** |
| * Implements multiple functionality related with UI representation of basic CDO concepts on |
| * {@link org.eclipse.jface.viewers.TreeViewer TreeViewer}-based editors and views. |
| * <p> |
| * For instance, behaves as {@link org.eclipse.jface.viewers.IContentProvider content} and |
| * {@link org.eclipse.jface.viewers.ILabelProvider label} provider for concepts such as {@link CDOSession}, |
| * {@link CDOView}, {@link CDOResource} and {@link CDOResourceFolder}. It also providers common context menu action over |
| * those elements. |
| * |
| * @author Eike Stepper |
| * @see org.eclipse.jface.viewers.IContentProvider |
| * @see org.eclipse.jface.viewers.ILabelProvider |
| */ |
| public class CDOItemProvider extends ContainerItemProvider<IContainer<Object>> |
| { |
| private static final IEditorRegistry EDITOR_REGISTRY = PlatformUI.getWorkbench().getEditorRegistry(); |
| |
| private IPropertyListener editorRegistryListener; |
| |
| private final ElementListener elementListener = new ElementListener(); |
| |
| private ResourceManager resourceManager; |
| |
| private IWorkbenchPage page; |
| |
| private boolean mergeMainBranchWithSession; |
| |
| public CDOItemProvider(IWorkbenchPage page, IElementFilter rootElementFilter) |
| { |
| super(rootElementFilter); |
| this.page = page; |
| } |
| |
| public CDOItemProvider(IWorkbenchPage page) |
| { |
| this(page, null); |
| } |
| |
| @Override |
| public void dispose() |
| { |
| elementListener.dispose(); |
| |
| if (editorRegistryListener != null) |
| { |
| EDITOR_REGISTRY.removePropertyListener(editorRegistryListener); |
| resourceManager = null; |
| } |
| |
| if (resourceManager != null) |
| { |
| resourceManager.dispose(); |
| resourceManager = null; |
| } |
| |
| super.dispose(); |
| } |
| |
| /** |
| * @since 4.4 |
| */ |
| public boolean useFullPath(Object object) |
| { |
| return false; |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public boolean isMergeMainBranchWithSession() |
| { |
| return mergeMainBranchWithSession; |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void setMergeMainBranchWithSession(boolean mergeMainBranchWithSession) |
| { |
| if (this.mergeMainBranchWithSession != mergeMainBranchWithSession) |
| { |
| this.mergeMainBranchWithSession = mergeMainBranchWithSession; |
| refreshViewer(true); |
| } |
| } |
| |
| @Override |
| public Object[] getChildren(Object element) |
| { |
| if (element instanceof CDOBranchManager) |
| { |
| return new Object[] { ((CDOBranchManager)element).getMainBranch() }; |
| } |
| |
| if (element instanceof CDOBranch) |
| { |
| return getChildren((CDOBranch)element); |
| } |
| |
| if (mergeMainBranchWithSession && element instanceof CDOSession) |
| { |
| return getChildren(((CDOSession)element).getBranchManager().getMainBranch()); |
| } |
| |
| if (element instanceof CDOResourceFolder) |
| { |
| CDOResourceFolder folder = (CDOResourceFolder)element; |
| if (folder.cdoPermission() == CDOPermission.NONE) |
| { |
| return NO_ELEMENTS; |
| } |
| |
| return folder.getNodes().toArray(); |
| } |
| |
| return super.getChildren(element); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| protected Object[] getChildren(CDOBranch branch) |
| { |
| CDOBranch[] branches = branch.getBranches(); |
| if (!mergeMainBranchWithSession) |
| { |
| return branch.getBranches(); |
| } |
| |
| Object[] views = getViews(branch); |
| |
| if (views.length == 0) |
| { |
| return branches; |
| } |
| |
| if (branches.length == 0) |
| { |
| return views; |
| } |
| |
| Object[] children = new Object[branches.length + views.length]; |
| System.arraycopy(branches, 0, children, 0, branches.length); |
| System.arraycopy(views, 0, children, branches.length, views.length); |
| return children; |
| } |
| |
| private Object[] getViews(CDOBranch branch) |
| { |
| CDOSession session = CDOUtil.getSession(branch); |
| if (session != null) |
| { |
| return session.getViews(branch); |
| } |
| |
| return NO_ELEMENTS; |
| } |
| |
| @Override |
| public boolean hasChildren(Object element) |
| { |
| if (element instanceof CDOBranchManager) |
| { |
| return true; // Main branch always exists |
| } |
| |
| if (element instanceof CDOBranch) |
| { |
| return hasChildren((CDOBranch)element); |
| } |
| |
| if (element instanceof CDOSession) |
| { |
| if (mergeMainBranchWithSession) |
| { |
| return hasChildren(((CDOSession)element).getBranchManager().getMainBranch()); |
| } |
| } |
| |
| if (element instanceof CDOResourceFolder) |
| { |
| CDOResourceFolder folder = (CDOResourceFolder)element; |
| if (folder.cdoPermission() == CDOPermission.NONE) |
| { |
| return false; |
| } |
| |
| return !folder.getNodes().isEmpty(); |
| } |
| |
| return super.hasChildren(element); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| protected boolean hasChildren(CDOBranch branch) |
| { |
| if (!branch.isEmpty()) |
| { |
| return true; |
| } |
| |
| Object[] views = getViews(branch); |
| return views.length != 0; |
| } |
| |
| @Override |
| public Object getParent(Object element) |
| { |
| if (element instanceof CDOBranch) |
| { |
| CDOBranch branch = (CDOBranch)element; |
| if (branch.isMainBranch()) |
| { |
| if (mergeMainBranchWithSession) |
| { |
| return CDOUtil.getSession(branch); |
| } |
| |
| return branch.getBranchManager(); |
| } |
| |
| return branch.getBase().getBranch(); |
| } |
| |
| if (element instanceof CDOResourceNode) |
| { |
| CDOResourceNode node = (CDOResourceNode)element; |
| CDOResourceNode parent = (CDOResourceNode)node.eContainer(); |
| if (parent == null || parent.isRoot()) |
| { |
| return node.cdoView(); |
| } |
| |
| return parent; |
| } |
| |
| if (element instanceof CDOView) |
| { |
| CDOView view = (CDOView)element; |
| CDOBranch branch = view.getBranch(); |
| if (branch.isMainBranch() || !mergeMainBranchWithSession) |
| { |
| return view.getSession(); |
| } |
| |
| return branch; |
| } |
| |
| return super.getParent(element); |
| } |
| |
| @Override |
| public String getText(Object obj) |
| { |
| if (obj instanceof CDOCommonView) |
| { |
| // Don't treat views as branch points (see below). |
| return super.getText(obj); |
| } |
| |
| if (obj instanceof CDOBranch) |
| { |
| if (useFullPath(obj)) |
| { |
| return ((CDOBranch)obj).getPathName(); |
| } |
| |
| return ((CDOBranch)obj).getName(); |
| } |
| |
| if (obj instanceof CDOBranchPoint) |
| { |
| CDOBranchPoint branchPoint = (CDOBranchPoint)obj; |
| String result = getText(branchPoint.getBranch()); |
| |
| long timeStamp = branchPoint.getTimeStamp(); |
| if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE) |
| { |
| result += " [" + CDOCommonUtil.formatTimeStamp(timeStamp) + "]"; |
| } |
| |
| return result; |
| } |
| |
| if (obj instanceof CDOResourceNode) |
| { |
| if (useFullPath(obj)) |
| { |
| return ((CDOResourceNode)obj).getPath(); |
| } |
| |
| return ((CDOResourceNode)obj).getName(); |
| } |
| |
| return super.getText(obj); |
| } |
| |
| @Override |
| public Image getImage(Object obj) |
| { |
| if (obj instanceof CDOSession) |
| { |
| CDOSession session = (CDOSession)obj; |
| State state = session.getRepositoryInfo().getState(); |
| switch (state) |
| { |
| case ONLINE: |
| return SharedIcons.getImage(SharedIcons.OBJ_SESSION); |
| case SYNCING: |
| return SharedIcons.getImage(SharedIcons.OBJ_SESSION_SYNCING); |
| case OFFLINE: |
| return SharedIcons.getImage(SharedIcons.OBJ_SESSION_OFFLINE); |
| } |
| } |
| |
| if (obj instanceof CDOView) |
| { |
| CDOView view = (CDOView)obj; |
| return getViewImage(view); |
| } |
| |
| if (obj instanceof CDOCommitInfo) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_COMMIT); |
| } |
| |
| if (obj instanceof CDOBranch) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_BRANCH); |
| } |
| |
| if (obj instanceof CDOBranchPoint) |
| { |
| CDOBranchPoint branchPoint = (CDOBranchPoint)obj; |
| if (branchPoint.getTimeStamp() == CDOBranchPoint.UNSPECIFIED_DATE) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_BRANCH); |
| } |
| |
| return SharedIcons.getImage(SharedIcons.OBJ_BRANCH_POINT); |
| } |
| |
| if (obj instanceof CDOResourceFolder) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_RESOURCE_FOLDER); |
| } |
| |
| if (obj instanceof CDOResourceLeaf) |
| { |
| String name = ((CDOResourceLeaf)obj).getName(); |
| IEditorDescriptor editorDescriptor = EDITOR_REGISTRY.getDefaultEditor(name); |
| if (editorDescriptor != null && !CDOEditorUtil.TEXT_EDITOR_ID.equals(editorDescriptor.getId())) |
| { |
| Image image = getWorkbenchImage(name); |
| if (image != null) |
| { |
| return image; |
| } |
| } |
| |
| if (obj instanceof CDOResource) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_RESOURCE); |
| } |
| |
| if (obj instanceof CDOTextResource) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_TEXT_RESOURCE); |
| } |
| |
| if (obj instanceof CDOBinaryResource) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_BINARY_RESOURCE); |
| } |
| } |
| |
| return super.getImage(obj); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| protected Image getWorkbenchImage(String name) |
| { |
| ImageDescriptor imageDescriptor = EDITOR_REGISTRY.getImageDescriptor(name); |
| if (imageDescriptor != null) |
| { |
| if (editorRegistryListener == null) |
| { |
| editorRegistryListener = new EditorRegistryListener(this); |
| EDITOR_REGISTRY.addPropertyListener(editorRegistryListener); |
| } |
| |
| ResourceManager resourceManager = getResourceManager(); |
| return (Image)resourceManager.get(imageDescriptor); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| protected ResourceManager getResourceManager() |
| { |
| if (resourceManager == null) |
| { |
| resourceManager = new LocalResourceManager(JFaceResources.getResources()); |
| } |
| |
| return resourceManager; |
| } |
| |
| @Override |
| public Color getForeground(Object obj) |
| { |
| if (obj instanceof CDOObject) |
| { |
| return CDOLabelProvider.getColor((CDOObject)obj); |
| |
| } |
| return super.getForeground(obj); |
| } |
| |
| @Override |
| public Font getFont(Object obj) |
| { |
| if (obj instanceof CDOTransaction) |
| { |
| CDOTransaction transaction = (CDOTransaction)obj; |
| if (transaction.isDirty()) |
| { |
| return getBoldFont(); |
| } |
| } |
| |
| return super.getFont(obj); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| @Override |
| public void fillContextMenu(IMenuManager manager, ITreeSelection selection) |
| { |
| if (selection.size() == 1) |
| { |
| Object object = selection.getFirstElement(); |
| if (object instanceof CDOSession) |
| { |
| fillSession(manager, (CDOSession)object); |
| } |
| else if (object instanceof CDOView) |
| { |
| fillView(manager, (CDOView)object); |
| } |
| else if (object instanceof CDOBranch) |
| { |
| fillBranch(manager, (CDOBranch)object); |
| } |
| else if (object instanceof CDOResourceNode) |
| { |
| fillResourceNode(manager, (CDOResourceNode)object); |
| } |
| } |
| |
| manager.add(new Separator()); |
| super.fillContextMenu(manager, selection); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillSession(IMenuManager manager, CDOSession session) |
| { |
| manager.add(new OpenTransactionAction(page, session)); |
| manager.add(new OpenViewAction(page, session)); |
| manager.add(new OpenAuditAction(page, session)); |
| manager.add(new OpenDurableViewAction(page, session)); |
| manager.add(new Separator()); |
| manager.add(new ManagePackagesAction(page, session)); |
| |
| MenuManager generatedManager = new MenuManager(Messages.getString("CDOItemProvider.8")); //$NON-NLS-1$ |
| if (fillGenerated(generatedManager, session)) |
| { |
| manager.add(generatedManager); |
| } |
| |
| if (session.getRepositoryInfo().isSupportingBranches()) |
| { |
| manager.add(new Separator()); |
| fillBranch(manager, session.getBranchManager().getMainBranch()); |
| } |
| |
| manager.add(new Separator()); |
| |
| if (!StringUtil.isEmpty(session.getUserID())) |
| { |
| manager.add(new ChangePasswordAction(page, session)); |
| } |
| |
| manager.add(new CloseSessionAction(page, session)); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public boolean fillGenerated(MenuManager manager, CDOSession session) |
| { |
| List<String> registeredURIs = new ArrayList<String>(EPackage.Registry.INSTANCE.keySet()); |
| Collections.sort(registeredURIs, new Comparator<String>() |
| { |
| public int compare(String o1, String o2) |
| { |
| return o1.compareTo(o2); |
| } |
| }); |
| |
| boolean added = false; |
| CDOPackageRegistry packageRegistry = session.getPackageRegistry(); |
| for (String packageURI : registeredURIs) |
| { |
| if (!packageRegistry.containsKey(packageURI)) |
| { |
| Type type = CDOPackageTypeRegistry.INSTANCE.lookup(packageURI); |
| if (type == Type.NATIVE) |
| { |
| EPackage ePackage = packageRegistry.getEPackage(packageURI); |
| if (ePackage == null) |
| { |
| ePackage = EPackage.Registry.INSTANCE.getEPackage(packageURI); |
| } |
| |
| if (ePackage != null) |
| { |
| manager.add(new RegisterSinglePackageAction(page, session, packageURI)); |
| added = true; |
| } |
| } |
| } |
| } |
| |
| return added; |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillView(IMenuManager manager, CDOView view) |
| { |
| if (!view.isReadOnly()) |
| { |
| CDOResource rootResource = view.getRootResource(); |
| if (rootResource.cdoPermission() == CDOPermission.WRITE) |
| { |
| manager.add(new NewTopLevelResourceNodeAction(this, page, view, rootResource, |
| NewTopLevelResourceNodeAction.Type.FOLDER)); |
| manager.add(new NewTopLevelResourceNodeAction(this, page, view, rootResource, |
| NewTopLevelResourceNodeAction.Type.MODEL)); |
| manager.add( |
| new NewTopLevelResourceNodeAction(this, page, view, rootResource, NewTopLevelResourceNodeAction.Type.TEXT)); |
| manager.add(new NewTopLevelResourceNodeAction(this, page, view, rootResource, |
| NewTopLevelResourceNodeAction.Type.BINARY)); |
| } |
| } |
| |
| manager.add(new Separator()); |
| manager.add(new LoadResourceAction(page, view)); |
| manager.add(new ExportResourceAction(page, view)); |
| |
| if (!view.isReadOnly()) |
| { |
| manager.add(new ImportResourceAction(page, view)); |
| manager.add(new Separator()); |
| manager.add(new MergeConflictsAction((CDOTransaction)view)); |
| manager.add(new MergeBranchPointAction(page, view)); |
| manager.add(new CommitTransactionAction(page, view)); |
| manager.add(new RollbackTransactionAction(page, view)); |
| } |
| |
| manager.add(new Separator()); |
| |
| CDORepositoryInfo repositoryInfo = view.getSession().getRepositoryInfo(); |
| if (view.isReadOnly() && repositoryInfo.isSupportingAudits() || repositoryInfo.isSupportingBranches()) |
| { |
| manager.add(new SwitchTargetAction(page, view)); |
| } |
| |
| if (view.getDurableLockingID() == null) |
| { |
| manager.add(new EnableViewDurabilityAction(page, view)); |
| } |
| else |
| { |
| manager.add(new DisableViewDurabilityAction(page, view)); |
| } |
| |
| manager.add(new Separator()); |
| manager.add(new CloseViewAction(page, view)); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillBranch(IMenuManager manager, CDOBranch branch) |
| { |
| manager.add(new CreateBranchAction(page, branch.getHead())); |
| } |
| |
| /** |
| * @since 4.4 |
| */ |
| public void fillResourceNode(IMenuManager manager, CDOResourceNode node) |
| { |
| if (node instanceof CDOResourceFolder) |
| { |
| fillResourceFolder(manager, (CDOResourceFolder)node); |
| } |
| else if (node instanceof CDOResourceLeaf) |
| { |
| fillResourceLeaf(manager, node); |
| } |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillResourceFolder(IMenuManager manager, CDOResourceFolder folder) |
| { |
| if (!folder.cdoView().isReadOnly() && folder.cdoPermission() == CDOPermission.WRITE) |
| { |
| manager.add(new NewResourceNodeAction.Folder(page, folder)); |
| manager.add(new NewResourceNodeAction.Model(page, folder)); |
| manager.add(new NewResourceNodeAction.Binary(page, folder)); |
| manager.add(new NewResourceNodeAction.Text(page, folder)); |
| } |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillResourceLeaf(IMenuManager manager, Object object) |
| { |
| CDOEditorUtil.populateMenu(manager, (CDOResourceLeaf)object, page); |
| |
| if (object instanceof CDOResource) |
| { |
| fillResource(manager, (CDOResource)object); |
| } |
| else if (object instanceof CDOTextResource) |
| { |
| fillTextResource(manager, (CDOTextResource)object); |
| } |
| else if (object instanceof CDOBinaryResource) |
| { |
| fillBinaryResource(manager, (CDOBinaryResource)object); |
| } |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillResource(IMenuManager manager, CDOResource resource) |
| { |
| manager.add(new OpenResourceEditorAction(page, resource)); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillTextResource(IMenuManager manager, CDOTextResource resource) |
| { |
| manager.add(new OpenResourceEditorAction(page, resource)); |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| public void fillBinaryResource(IMenuManager manager, CDOBinaryResource resource) |
| { |
| manager.add(new OpenResourceEditorAction(page, resource)); |
| } |
| |
| @Override |
| protected void elementAdded(Object element, Object parent) |
| { |
| super.elementAdded(element, parent); |
| |
| if (element instanceof CDOSession) |
| { |
| elementListener.attach((CDOSession)element); |
| } |
| } |
| |
| /** |
| * @since 4.2 |
| */ |
| @Override |
| public int compare(Viewer viewer, Object e1, Object e2) |
| { |
| if (e1 instanceof CDOResourceFolder) |
| { |
| if (e2 instanceof CDOResourceLeaf) |
| { |
| return -1; |
| } |
| } |
| |
| if (e1 instanceof CDOResourceLeaf) |
| { |
| if (e2 instanceof CDOResourceFolder) |
| { |
| return 1; |
| } |
| } |
| |
| return super.compare(viewer, e1, e2); |
| } |
| |
| /** |
| * @since 3.0 |
| */ |
| public static ImageDescriptor getViewImageDescriptor(CDOView view) |
| { |
| if (view.isReadOnly()) |
| { |
| if (view.getTimeStamp() != CDOView.UNSPECIFIED_DATE) |
| { |
| return SharedIcons.getDescriptor(SharedIcons.OBJ_EDITOR_HISTORICAL); |
| } |
| |
| return SharedIcons.getDescriptor(SharedIcons.OBJ_EDITOR_READONLY); |
| } |
| |
| return SharedIcons.getDescriptor(SharedIcons.OBJ_EDITOR); |
| } |
| |
| /** |
| * @since 3.0 |
| */ |
| public static Image getViewImage(CDOView view) |
| { |
| if (view.isReadOnly()) |
| { |
| if (view.getTimeStamp() != CDOView.UNSPECIFIED_DATE) |
| { |
| return SharedIcons.getImage(SharedIcons.OBJ_EDITOR_HISTORICAL); |
| } |
| |
| return SharedIcons.getImage(SharedIcons.OBJ_EDITOR_READONLY); |
| } |
| |
| return SharedIcons.getImage(SharedIcons.OBJ_EDITOR); |
| } |
| |
| /** |
| * A {@link IPropertyListener listener} on the platform's {@link IEditorRegistry editor registry} that fires {@link LabelProviderChangedEvent label events} |
| * from the associated {@link #getItemProvider() item provider} when {@link CDOTransferElement element} labels need to be updated. |
| * |
| * @author Eike Stepper |
| * @since 4.2 |
| */ |
| protected static class EditorRegistryListener implements IPropertyListener |
| { |
| private final CDOItemProvider itemProvider; |
| |
| public EditorRegistryListener(CDOItemProvider itemProvider) |
| { |
| this.itemProvider = itemProvider; |
| } |
| |
| public CDOItemProvider getItemProvider() |
| { |
| return itemProvider; |
| } |
| |
| public void propertyChanged(Object source, int propId) |
| { |
| if (propId == IEditorRegistry.PROP_CONTENTS) |
| { |
| itemProvider.fireLabelProviderChanged(); |
| } |
| } |
| } |
| |
| /** |
| * @author Eike Stepper |
| */ |
| private final class ElementListener implements IListener, CDOObjectHandler |
| { |
| private final Set<INotifier> notifiers = new HashSet<INotifier>(); |
| |
| private boolean disposed; |
| |
| public void attach(INotifier notifier) |
| { |
| synchronized (notifiers) |
| { |
| if (!disposed) |
| { |
| if (notifiers.add(notifier)) |
| { |
| if (notifier instanceof CDOSession) |
| { |
| CDOSession session = (CDOSession)notifier; |
| for (CDOView view : session.getViews()) |
| { |
| attachView(view); |
| } |
| |
| for (CDOView view : session.getTransactions()) |
| { |
| attachView(view); |
| } |
| |
| notifier.addListener(this); |
| } |
| else if (notifier instanceof CDOView) |
| { |
| CDOView view = (CDOView)notifier; |
| attachView(view); |
| } |
| } |
| } |
| } |
| } |
| |
| private void attachView(CDOView view) |
| { |
| view.addListener(this); |
| view.addObjectHandler(this); |
| } |
| |
| private void detach(INotifier notifier) |
| { |
| notifier.removeListener(this); |
| if (notifier instanceof CDOView) |
| { |
| CDOView view = (CDOView)notifier; |
| view.removeObjectHandler(this); |
| } |
| } |
| |
| public void dispose() |
| { |
| synchronized (notifiers) |
| { |
| disposed = true; |
| for (INotifier notifier : notifiers) |
| { |
| detach(notifier); |
| } |
| |
| notifiers.clear(); |
| } |
| } |
| |
| public void notifyEvent(IEvent event) |
| { |
| if (event instanceof ILifecycleEvent) |
| { |
| ILifecycleEvent e = (ILifecycleEvent)event; |
| if (e.getKind() == ILifecycleEvent.Kind.DEACTIVATED) |
| { |
| ILifecycle notifier = e.getSource(); |
| |
| synchronized (notifiers) |
| { |
| if (notifiers.remove(notifier)) |
| { |
| notifier.removeListener(this); |
| } |
| } |
| } |
| } |
| else if (event instanceof IContainerEvent<?>) |
| { |
| IContainerEvent<?> e = (IContainerEvent<?>)event; |
| for (IContainerDelta<?> delta : e.getDeltas()) |
| { |
| if (delta.getKind() == IContainerDelta.Kind.ADDED) |
| { |
| Object element = delta.getElement(); |
| if (element instanceof CDOView) |
| { |
| attach((CDOView)element); |
| } |
| } |
| } |
| } |
| else if (event instanceof CDOSessionInvalidationEvent) |
| { |
| refreshViewer(true); |
| } |
| else if (event instanceof CDOViewTargetChangedEvent) |
| { |
| refreshViewer(true); |
| } |
| else if (event instanceof CDOViewLocksChangedEvent) |
| { |
| CDOViewLocksChangedEvent e = (CDOViewLocksChangedEvent)event; |
| EObject[] objects = e.getAffectedObjects(); |
| if (objects.length != 0) |
| { |
| updateLabels(objects); |
| } |
| } |
| } |
| |
| public void objectStateChanged(CDOView view, CDOObject object, CDOState oldState, CDOState newState) |
| { |
| updateLabels(object); |
| } |
| } |
| } |