blob: f7e2c2f9183ad0a01b1ff9602119417ff48694fd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.admin;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.equinox.internal.p2.ui.admin.preferences.PreferenceConstants;
import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI;
import org.eclipse.equinox.internal.provisional.p2.ui.actions.RefreshAction;
import org.eclipse.equinox.internal.provisional.p2.ui.viewers.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.operations.UndoRedoActionGroup;
import org.eclipse.ui.part.ViewPart;
/**
* This class supports the common characteristics for views that manipulate
* provisioning models.
*
* @since 3.4
*/
abstract class ProvView extends ViewPart {
TreeViewer viewer;
private UndoRedoActionGroup undoRedoGroup;
RefreshAction refreshAction;
private IPropertyChangeListener preferenceListener;
protected Display display;
/**
* The constructor.
*/
public ProvView() {
// constructor
}
/**
* Create and initialize the viewer
*/
public void createPartControl(Composite parent) {
// Store the display so we can make async calls from listeners
display = parent.getDisplay();
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
viewer.getTree().setHeaderVisible(true);
configureViewer(viewer);
// Do this after setting up sorters, filters, etc.
// Otherwise it will retrieve content on each change.
viewer.setContentProvider(getContentProvider());
// Now set up the visuals, columns before labels.
setTreeColumns(viewer.getTree());
viewer.setLabelProvider(getLabelProvider());
// Input is last
viewer.setInput(getInput());
addListeners();
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
ProvView.this.fillContextMenu(manager);
manager.add(new Separator());
manager.add(refreshAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void hookDoubleClickAction() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IAction action = getDoubleClickAction();
if (action != null && action.isEnabled()) {
action.run();
}
}
});
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
IMenuManager manager = bars.getMenuManager();
fillLocalPullDown(manager);
manager.add(new Separator());
manager.add(refreshAction);
fillLocalToolBar(bars.getToolBarManager());
undoRedoGroup.fillActionBars(bars);
}
protected abstract void fillLocalPullDown(IMenuManager manager);
protected abstract void fillContextMenu(IMenuManager manager);
protected abstract void fillLocalToolBar(IToolBarManager manager);
protected abstract IAction getDoubleClickAction();
protected void makeActions() {
undoRedoGroup = new UndoRedoActionGroup(getSite(), ProvUI.getProvisioningUndoContext(), true);
refreshAction = new RefreshAction(viewer, viewer.getControl()) {
protected void refresh() {
refreshAll();
}
};
refreshAction.setToolTipText(ProvAdminUIMessages.ProvView_RefreshCommandTooltip);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
public void dispose() {
if (undoRedoGroup != null) {
undoRedoGroup.dispose();
}
removeListeners();
super.dispose();
}
protected void addListeners() {
IPreferenceStore store = ProvAdminUIActivator.getDefault().getPreferenceStore();
preferenceListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (getVisualProperties().contains(event.getProperty())) {
ProvView.this.refreshAll();
}
}
};
store.addPropertyChangeListener(preferenceListener);
}
protected void removeListeners() {
if (preferenceListener != null) {
IPreferenceStore store = ProvAdminUIActivator.getDefault().getPreferenceStore();
store.removePropertyChangeListener(preferenceListener);
}
}
Shell getShell() {
return viewer.getControl().getShell();
}
Control getViewerControl() {
return viewer.getControl();
}
IStructuredSelection getSelection() {
return (IStructuredSelection) viewer.getSelection();
}
protected void configureViewer(final TreeViewer treeViewer) {
viewer.setComparator(new IUComparator(IUComparator.IU_ID));
viewer.setComparer(new ProvElementComparer());
}
protected void selectionChanged(IStructuredSelection selection) {
// subclasses may override. Do nothing here.
}
protected abstract IContentProvider getContentProvider();
protected Object getInput() {
return null;
}
protected void setTreeColumns(Tree tree) {
// For now we set two columns and the content depends on the elements
TreeColumn tc = new TreeColumn(tree, SWT.LEFT, 0);
tc.setResizable(true);
tc.setWidth(400);
tc = new TreeColumn(tree, SWT.LEFT, 1);
tc.setWidth(600);
tc.setResizable(true);
}
protected ILabelProvider getLabelProvider() {
return new ProvElementLabelProvider();
}
protected void refreshUnderlyingModel() {
// Default is to do nothing
}
protected List getVisualProperties() {
ArrayList list = new ArrayList(1);
list.add(PreferenceConstants.PREF_SHOW_GROUPS_ONLY);
return list;
}
final void refreshAll() {
// Refresh the underlying elements
refreshUnderlyingModel();
// We then reset the input to ensure that anything the content providers
// are caching gets reset also. The net effect is that everything
// will get queried again.
viewer.setInput(getInput());
}
}