/***********************************************************************
* Copyright (c) 2007, 2008 INRIA 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:
* INRIA - initial API and implementation
*
* $Id: RegisteredPackageView.java,v 1.3 2008/05/12 21:53:04 lbigearde Exp $
**********************************************************************/
package org.eclipse.emf.ecoretools.registration.view;
import java.util.Iterator;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecoretools.registration.EMFRegistryHelper;
import org.eclipse.emf.ecoretools.registration.Messages;
import org.eclipse.emf.ecoretools.registration.internal.NsURIComparator;
import org.eclipse.emf.ecoretools.registration.internal.RegisteredPackageComparator;
import org.eclipse.emf.ecoretools.registration.popup.actions.CopyNSURIAction;
import org.eclipse.emf.ecoretools.registration.popup.actions.EcoreUnregisterPackageAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.ViewPart;
/**
* View that displays the EMF registry and allows to unregister the EPackage
* that have been manually registered by the user
*
*/
public class RegisteredPackageView extends ViewPart {
/**
* Internal TreeViewer
*/
private TreeViewer viewer;
// internal actions
private EcoreUnregisterPackageAction unregisterPackageAction;
private CopyNSURIAction copyNSURIAction;
Clipboard clipboard;
/**
* View ID
*/
public static final String ID = "org.eclipse.emf.ecoretools.registration.viewregisteredpackages"; //$NON-NLS-1$
/**
* constructor
*/
public RegisteredPackageView() {
super();
setContentDescription(Messages.RegisteredPackageView_RegisteredPackages);
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent) {
Display display = PlatformUI.getWorkbench().getDisplay();
clipboard = new Clipboard(display);
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new RegisteredPackagesContentProvider());
viewer.setLabelProvider(new RegisteredPackagesLabelProvider());
viewer.setComparator(new NsURIComparator(RegisteredPackageComparator.ASCENDING_ORDER));
createActions();
createContextMenu();
createColumns(viewer);
viewer.setColumnProperties(new String[] { Messages.RegisteredPackageView_RegisteredURI, Messages.RegisteredPackageView_PackageName, Messages.RegisteredPackageView_Origin });
viewer.getTree().setHeaderVisible(true);
viewer.getTree().setLinesVisible(false);
viewer.setInput(getViewSite());
// connect action keys
// enable ctrl + C copy action
IActionBars bars = getViewSite().getActionBars();
bars.setGlobalActionHandler(ActionFactory.COPY.getId(), this.copyNSURIAction);
}
/**
* used by createPartControl Creates the columns in the view
*
* @param treeViewer
*/
private void createColumns(TreeViewer treeViewer) {
TreeColumn column1 = new TreeColumn(treeViewer.getTree(), SWT.LEFT);
column1.setText(Messages.RegisteredPackageView_RegisteredURI);
column1.setWidth(300);
column1.setResizable(true);
column1.addSelectionListener(new PackageNsURIColumnSelectionListener(treeViewer));
TreeColumn column2 = new TreeColumn(treeViewer.getTree(), SWT.LEFT);
column2.setText(Messages.RegisteredPackageView_PackageName);
column2.setWidth(120);
column2.setResizable(true);
column2.addSelectionListener(new PackageNameColumnSelectionListener(treeViewer));
TreeColumn column3 = new TreeColumn(treeViewer.getTree(), SWT.LEFT);
column3.setText(Messages.RegisteredPackageView_Origin);
column3.setWidth(350);
column3.setResizable(true);
}
/**
* used by createPartControl Create the actions
*
*/
private void createActions() {
IWorkbench workbench = PlatformUI.getWorkbench();
ISharedImages platformImages = workbench.getSharedImages();
unregisterPackageAction = new EcoreUnregisterPackageAction(this, Messages.RegisteredPackageView_Unregister);
unregisterPackageAction.setImageDescriptor(platformImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
unregisterPackageAction.setDisabledImageDescriptor(platformImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
unregisterPackageAction.setToolTipText(Messages.RegisteredPackageView_UnregisterSelectedPackages);
copyNSURIAction = new CopyNSURIAction(this, clipboard, Messages.RegisteredPackageView_CopyNsURI);
copyNSURIAction.setImageDescriptor(platformImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
copyNSURIAction.setToolTipText(Messages.RegisteredPackageView_CopyNsURI_tooltip);
}
/**
* used by createPartControl Create the contextMenu
*
*/
private void createContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
RegisteredPackageView.this.fillContextMenu(m);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
/**
* used to create the context menu it is able to filter the actions
* corresponding to the selection ...
*
* @param menuMgr
*/
private void fillContextMenu(IMenuManager menuMgr) {
// filter only dynamically registered packages
unregisterPackageAction.setEnabled(isSelectionDynamicallyRegistered((IStructuredSelection) viewer.getSelection()));
menuMgr.add(unregisterPackageAction);
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuMgr.add(copyNSURIAction);
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
* get the selection
*
* @return a table of the URI selected
*/
public EPackage[] getSelectedPackages() {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
EPackage[] items = new EPackage[selection.size()];
Iterator<?> iter = selection.iterator();
int index = 0;
while (iter.hasNext()) {
items[index++] = (EPackage) iter.next();
}
return items;
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
// nothing to do
}
/**
* rebuild the view, also refresh its content from the ContentProvider
*
*/
public void refresh() {
viewer.refresh();
}
/**
* Checks if the selection is dynamically registered or not
*
* @param selection
* @return true whether the selection is dynamically registered
*/
private boolean isSelectionDynamicallyRegistered(IStructuredSelection selection) {
boolean result = true;
if (selection.isEmpty()) {
return false;
}
Iterator<?> iter = selection.iterator();
while (iter.hasNext()) {
EPackage p = (EPackage) iter.next();
if (!EMFRegistryHelper.isDynamicallyRegistered(p.getNsURI())) {
return false;
}
}
return result;
}
}