/* * Copyright (c) 2012, 2016 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 */ package org.eclipse.emf.cdo.examples.client.offline; import org.eclipse.emf.cdo.common.CDOCommonRepository.State; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.eresource.CDOResourceLeaf; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.ui.CDOEditorUtil; import org.eclipse.emf.cdo.ui.CDOItemProvider; import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.container.ContainerEventAdapter; import org.eclipse.net4j.util.container.IContainer; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; import org.eclipse.emf.spi.cdo.DefaultCDOMerger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PlatformUI; import org.eclipse.wb.swt.ExampleResourceManager; import java.lang.reflect.InvocationTargetException; /** * @author Eike Stepper */ public class ClientView extends AbstractView<CDOSession> { public static final String ID = "org.eclipse.emf.cdo.examples.client.offline.ClientView"; //$NON-NLS-1$ private CDOItemProvider itemProvider; private TreeViewer treeViewer; private CommitAction commitAction = new CommitAction(); private MergeAction mergeAction = new MergeAction(); public ClientView() { super(CDOSession.class); } @Override protected void createPane(Composite parent, CDOSession session) { itemProvider = new CDOItemProvider(getSite().getPage()) { @Override protected void handleElementEvent(final IEvent event) { addEvent(event); } }; treeViewer = new TreeViewer(parent, SWT.BORDER); treeViewer.setLabelProvider(itemProvider); treeViewer.setContentProvider(itemProvider); treeViewer.setComparator(itemProvider); treeViewer.setInput(session); hookDoubleClick(); hookContextMenu(); updateEnablement(); IRepository repository = Application.NODE.getObject(IRepository.class); repository.addListener(new IListener() { public void notifyEvent(IEvent event) { updateEnablement(); } }); final IListener transactionListener = new IListener() { public void notifyEvent(IEvent event) { updateEnablement(); } }; CDOTransaction transaction = Application.NODE.getObject(CDOTransaction.class); if (transaction != null) { transaction.addListener(transactionListener); } else { session.addListener(new ContainerEventAdapter<CDOView>() { @Override protected void onAdded(IContainer<CDOView> container, CDOView view) { updateEnablement(); view.addListener(transactionListener); } }); } } protected void hookDoubleClick() { treeViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { ITreeSelection selection = (ITreeSelection)treeViewer.getSelection(); Object object = selection.getFirstElement(); if (object instanceof CDOResourceLeaf) { CDOResourceLeaf resource = (CDOResourceLeaf)object; CDOEditorUtil.openEditor(getSite().getPage(), resource); } else if (object != null && treeViewer.isExpandable(object)) { if (treeViewer.getExpandedState(object)) { treeViewer.collapseToLevel(object, TreeViewer.ALL_LEVELS); } else { treeViewer.expandToLevel(object, 1); } } } }); } @Override protected void initializeToolBar(IToolBarManager toolbarManager) { super.initializeToolBar(toolbarManager); toolbarManager.add(commitAction); toolbarManager.add(mergeAction); } protected void updateEnablement() { CDOTransaction transaction = Application.NODE.getObject(CDOTransaction.class); commitAction.setEnabled(transaction != null && transaction.isDirty()); mergeAction .setEnabled(transaction != null && transaction.getBranch().isLocal() && Application.NODE.getObject(IRepository.class).getState() == State.ONLINE); } protected void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ITreeSelection selection = (ITreeSelection)treeViewer.getSelection(); fillContextMenu(manager, selection); } }); Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, treeViewer); } protected void fillContextMenu(IMenuManager manager, ITreeSelection selection) { itemProvider.fillContextMenu(manager, selection); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } @Override public void setFocus() { treeViewer.getTree().setFocus(); } @Override public void dispose() { itemProvider.dispose(); super.dispose(); } /** * @author Eike Stepper */ public static class CommitAction extends Action { public CommitAction() { super("Commit", ExampleResourceManager.getPluginImageDescriptor(Application.PLUGIN_ID, "icons/Commit.gif")); } @Override public void run() { try { PlatformUI.getWorkbench().getProgressService().run(true, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { CDOTransaction transaction = Application.NODE.getObject(CDOTransaction.class); try { transaction.commit(monitor); } catch (CommitException ex) { ex.printStackTrace(); transaction.rollback(); } } }); } catch (Exception ex) { ex.printStackTrace(); } } } /** * @author Eike Stepper */ public static class MergeAction extends Action { public MergeAction() { super("Merge", ExampleResourceManager.getPluginImageDescriptor(Application.PLUGIN_ID, "icons/Merge.gif")); } @Override public void run() { CDOTransaction transaction = Application.NODE.getObject(CDOTransaction.class); CDOBranch offlineBranch = transaction.getBranch(); CDOBranch baseBranch = offlineBranch.getBase().getBranch(); transaction.setBranch(baseBranch); transaction.merge(offlineBranch.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); } } }