| /* |
| * Copyright (c) 2015, 2016, 2019, 2020 Eike Stepper (Loehne, 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 |
| */ |
| package org.eclipse.emf.cdo.explorer.ui.checkouts.wizards; |
| |
| import org.eclipse.emf.cdo.CDOObject; |
| import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; |
| import org.eclipse.emf.cdo.common.id.CDOID; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; |
| import org.eclipse.emf.cdo.explorer.repositories.CDORepository; |
| import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutViewerSorter; |
| import org.eclipse.emf.cdo.explorer.ui.repositories.CDORepositoryItemProvider; |
| import org.eclipse.emf.cdo.internal.explorer.AbstractElement; |
| import org.eclipse.emf.cdo.internal.explorer.checkouts.CDOCheckoutImpl; |
| import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.ui.CDOItemProvider; |
| import org.eclipse.emf.cdo.util.CDOUtil; |
| import org.eclipse.emf.cdo.view.CDOView; |
| |
| import org.eclipse.net4j.util.container.IContainer; |
| import org.eclipse.net4j.util.ui.views.ContainerItemProvider; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.edit.provider.ComposedAdapterFactory; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.IDoubleClickListener; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.ITreeSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| |
| import java.util.Properties; |
| |
| /** |
| * @author Eike Stepper |
| */ |
| public class CheckoutRootObjectPage extends CheckoutWizardPage |
| { |
| private static final IContainer<Object> LOADING_INPUT = ContainerItemProvider.createSlowInput("Loading..."); |
| |
| private CDOID rootID; |
| |
| private String rootObjectText; |
| |
| private TreeViewer treeViewer; |
| |
| private CDOView view; |
| |
| private CDORepository repository; |
| |
| public CheckoutRootObjectPage() |
| { |
| super("Root Object", "Select the root object of the new checkout."); |
| } |
| |
| public final CDOID getRootID() |
| { |
| return rootID; |
| } |
| |
| public final void setRootID(CDOID rootID) |
| { |
| if (this.rootID != rootID) |
| { |
| log("Setting root id to " + rootID); |
| this.rootID = rootID; |
| rootObjectChanged(rootID); |
| } |
| } |
| |
| public String getRootObjectText() |
| { |
| if (rootObjectText == null) |
| { |
| return repository.getLabel(); |
| } |
| |
| return rootObjectText; |
| } |
| |
| @Override |
| public void dispose() |
| { |
| closeView(); |
| super.dispose(); |
| } |
| |
| @Override |
| protected void createUI(Composite parent) |
| { |
| final CDOItemProvider itemProvider = new CDOItemProvider(null) |
| { |
| private final ComposedAdapterFactory adapterFactory = CDOEditor.createAdapterFactory(true); |
| |
| private final ITreeContentProvider contentProvider = new AdapterFactoryContentProvider(adapterFactory); |
| |
| private final ILabelProvider labelProvider = new AdapterFactoryLabelProvider(adapterFactory); |
| |
| @Override |
| public void dispose() |
| { |
| labelProvider.dispose(); |
| contentProvider.dispose(); |
| adapterFactory.dispose(); |
| super.dispose(); |
| } |
| |
| @Override |
| public boolean hasChildren(Object element) |
| { |
| if (view != null) |
| { |
| CDOResource rootResource = view.getRootResource(); |
| if (element == repository) |
| { |
| return true; |
| } |
| |
| if (element == rootResource) |
| { |
| return !rootResource.getContents().isEmpty(); |
| } |
| } |
| |
| if (element instanceof EObject) |
| { |
| return contentProvider.hasChildren(element); |
| } |
| |
| return super.hasChildren(element); |
| } |
| |
| @Override |
| public Object[] getChildren(Object element) |
| { |
| if (view != null) |
| { |
| CDOResource rootResource = view.getRootResource(); |
| if (element == repository) |
| { |
| return new Object[] { rootResource }; |
| } |
| |
| if (element == rootResource) |
| { |
| return rootResource.getContents().toArray(); |
| } |
| } |
| |
| if (element instanceof EObject) |
| { |
| return contentProvider.getChildren(element); |
| } |
| |
| return super.getChildren(element); |
| } |
| |
| @Override |
| public Object getParent(Object element) |
| { |
| if (view != null) |
| { |
| CDOResource rootResource = view.getRootResource(); |
| if (element == rootResource) |
| { |
| return repository; |
| } |
| } |
| |
| if (element instanceof EObject) |
| { |
| return contentProvider.getParent(element); |
| } |
| |
| return super.getParent(element); |
| } |
| |
| @Override |
| public Image getImage(Object element) |
| { |
| if (view != null) |
| { |
| if (element == view.getRootResource()) |
| { |
| return CDORepositoryItemProvider.REPOSITORY_IMAGE; |
| } |
| } |
| |
| if (element instanceof EObject) |
| { |
| return labelProvider.getImage(element); |
| } |
| |
| return super.getImage(element); |
| } |
| |
| @Override |
| public String getText(Object element) |
| { |
| if (view != null) |
| { |
| if (element == view.getRootResource()) |
| { |
| return repository.getLabel(); |
| } |
| } |
| |
| if (element instanceof EObject) |
| { |
| return labelProvider.getText(element); |
| } |
| |
| return super.getText(element); |
| } |
| |
| @Override |
| public void fillContextMenu(IMenuManager manager, ITreeSelection selection) |
| { |
| // Do nothing. |
| } |
| }; |
| |
| treeViewer = new TreeViewer(parent, SWT.BORDER); |
| treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); |
| treeViewer.setContentProvider(itemProvider); |
| treeViewer.setLabelProvider(itemProvider); |
| treeViewer.setComparator(new CDOCheckoutViewerSorter()); |
| treeViewer.addSelectionChangedListener(new ISelectionChangedListener() |
| { |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) |
| { |
| IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection(); |
| Object element = selection.getFirstElement(); |
| if (element instanceof EObject) |
| { |
| EObject eObject = (EObject)element; |
| CDOObject cdoObject = CDOUtil.getCDOObject(eObject); |
| rootID = cdoObject.cdoID(); |
| |
| if (cdoObject != view.getRootResource()) |
| { |
| rootObjectText = getRootObjectText(itemProvider, cdoObject); |
| } |
| } |
| |
| validate(); |
| } |
| }); |
| |
| treeViewer.addDoubleClickListener(new IDoubleClickListener() |
| { |
| @Override |
| public void doubleClick(DoubleClickEvent event) |
| { |
| showNextPage(); |
| } |
| }); |
| |
| treeViewer.setInput(LOADING_INPUT); |
| } |
| |
| @Override |
| protected boolean doValidate() throws ValidationProblem |
| { |
| return true; |
| } |
| |
| @Override |
| protected void repositoryChanged(CDORepository repository) |
| { |
| this.repository = repository; |
| closeView(); |
| super.repositoryChanged(repository); |
| } |
| |
| @Override |
| protected void branchPointChanged(int branchID, long timeStamp) |
| { |
| closeView(); |
| super.branchPointChanged(branchID, timeStamp); |
| } |
| |
| @Override |
| protected void pageActivated() |
| { |
| if (view == null) |
| { |
| CDOSession session = repository.getSession(); |
| CDOBranchPoint branchPoint = getWizard().getBranchPointPage().getBranchPoint(); |
| |
| log("Opening view to " + repository); |
| view = session.openView(branchPoint); |
| treeViewer.setInput(repository); |
| rootObjectText = null; |
| |
| getShell().getDisplay().asyncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| CDOResource rootResource = view.getRootResource(); |
| treeViewer.setSelection(new StructuredSelection(rootResource)); |
| treeViewer.expandToLevel(rootResource, 1); |
| } |
| }); |
| } |
| } |
| |
| @Override |
| protected void fillProperties(Properties properties) |
| { |
| if (rootID != null) |
| { |
| properties.setProperty(CDOCheckoutImpl.PROP_ROOT_ID, CDOExplorerUtil.getCDOIDString(rootID)); |
| } |
| |
| if (rootObjectText != null) |
| { |
| properties.setProperty(CDOCheckoutImpl.PROP_ROOT_LABEL, rootObjectText); |
| } |
| } |
| |
| private void closeView() |
| { |
| if (view != null) |
| { |
| // Prevent the item provider to use the view while it's closing. |
| CDOView oldView = view; |
| view = null; |
| |
| if (treeViewer != null) |
| { |
| treeViewer.setSelection(StructuredSelection.EMPTY); |
| treeViewer.setInput(LOADING_INPUT); |
| } |
| |
| log("Closing view to " + repository); |
| oldView.close(); |
| } |
| } |
| |
| public static String getRootObjectText(CDOItemProvider itemProvider, EObject object) |
| { |
| String text = itemProvider.getText(object); |
| for (int i = 0; i < AbstractElement.ILLEGAL_LABEL_CHARACTERS.length(); i++) |
| { |
| text = text.replace(AbstractElement.ILLEGAL_LABEL_CHARACTERS.charAt(i), '.'); |
| } |
| |
| Object parent = itemProvider.getParent(object); |
| if (parent instanceof EObject) |
| { |
| text = getRootObjectText(itemProvider, (EObject)parent) + "/" + text; |
| } |
| |
| return text; |
| } |
| } |