| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui.repo; |
| |
| 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.dialogs.IDialogSettings; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.IDoubleClickListener; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.jface.wizard.WizardDialog; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.KeyAdapter; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.team.internal.ccvs.core.ICVSRemoteFile; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; |
| import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; |
| import org.eclipse.team.internal.ccvs.ui.IHelpContextIds; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.team.internal.ccvs.ui.actions.OpenRemoteFileAction; |
| import org.eclipse.team.internal.ccvs.ui.model.RemoteContentProvider; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.ISelectionListener; |
| import org.eclipse.ui.IWorkbenchActionConstants; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.IWorkingSetManager; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.dialogs.IWorkingSetEditWizard; |
| import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog; |
| import org.eclipse.ui.help.WorkbenchHelp; |
| import org.eclipse.ui.model.WorkbenchLabelProvider; |
| import org.eclipse.ui.part.DrillDownAdapter; |
| import org.eclipse.ui.part.ViewPart; |
| |
| /** |
| * This class acts as a superclass to all remote CVS tree views. |
| */ |
| public abstract class RemoteViewPart extends ViewPart implements ISelectionListener { |
| |
| // The tree viewer |
| protected TreeViewer viewer; |
| |
| // Drill down adapter |
| private DrillDownAdapter drillPart; |
| |
| private Action refreshAction; |
| private Action collapseAllAction; |
| |
| private Action selectWorkingSetAction; |
| private Action deselectWorkingSetAction; |
| private Action editWorkingSetAction; |
| private OpenRemoteFileAction openAction; |
| |
| private RemoteContentProvider contentProvider; |
| private IDialogSettings settings; |
| private static final String SELECTED_WORKING_SET = "SelectedWorkingSet"; //$NON-NLS-1$ |
| |
| private class ChangeWorkingSetAction extends Action { |
| String name; |
| public ChangeWorkingSetAction(String name, int index) { |
| super(Policy.bind("RepositoriesView.workingSetMenuItem", new Integer(index).toString(), name)); //$NON-NLS-1$ |
| this.name = name; |
| } |
| public void run() { |
| IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager(); |
| setWorkingSet(manager.getWorkingSet(name), true); |
| } |
| } |
| |
| protected RemoteViewPart(String partName) { |
| IDialogSettings workbenchSettings = CVSUIPlugin.getPlugin().getDialogSettings(); |
| settings = workbenchSettings.getSection(partName); |
| if (settings == null) { |
| settings = workbenchSettings.addNewSection(partName); |
| } |
| String name = settings.get(SELECTED_WORKING_SET); |
| IWorkingSet set = null; |
| if (name != null) |
| set = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(name); |
| setWorkingSet(set, false); |
| } |
| |
| /** |
| * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) |
| */ |
| public void createPartControl(Composite parent) { |
| viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); |
| viewer.setContentProvider(getContentProvider()); |
| viewer.setLabelProvider(new WorkbenchLabelProvider()); |
| getSite().setSelectionProvider(viewer); |
| viewer.setInput(getTreeInput()); |
| viewer.setSorter(new RepositorySorter()); |
| viewer.getControl().addKeyListener(getKeyListener()); |
| drillPart = new DrillDownAdapter(viewer); |
| |
| contributeActions(); |
| initializeListeners(); |
| |
| // F1 Help |
| String helpID = getHelpContextId(); |
| if (helpID != null) |
| WorkbenchHelp.setHelp(viewer.getControl(), helpID); |
| } |
| |
| /** |
| * @see WorkbenchPart#setFocus |
| */ |
| public void setFocus() { |
| viewer.getControl().setFocus(); |
| } |
| |
| /** |
| * Method getHelpContextId should be overridden by subclasses to provide the |
| * appropriate help id. |
| * |
| * @return String |
| */ |
| protected String getHelpContextId() { |
| return null; |
| } |
| |
| /** |
| * Method getTreeInput. |
| * @return Object |
| */ |
| protected abstract Object getTreeInput(); |
| |
| /** |
| * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#getContentProvider() |
| */ |
| protected RemoteContentProvider getContentProvider() { |
| if (contentProvider == null) { |
| contentProvider = new RemoteContentProvider(); |
| } |
| return contentProvider; |
| }; |
| |
| protected KeyAdapter getKeyListener() { |
| return new KeyAdapter() { |
| public void keyPressed(KeyEvent event) { |
| if (event.keyCode == SWT.F5) { |
| refreshAction.run(); |
| } |
| } |
| }; |
| } |
| |
| protected void initializeListeners() { |
| // listen for selection changes in the repo view |
| getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(this); |
| } |
| |
| protected IWorkingSet getWorkingSet() { |
| return getContentProvider().getWorkingSet(); |
| } |
| |
| protected void setWorkingSet(IWorkingSet workingSet, boolean refreshViewer) { |
| if (settings != null) { |
| String name = null; |
| if (workingSet != null) |
| name = workingSet.getName(); |
| settings.put(SELECTED_WORKING_SET, name); |
| } |
| getContentProvider().setWorkingSet(workingSet); |
| String toolTip; |
| if (workingSet == null) { |
| toolTip = null; |
| } else { |
| toolTip = Policy.bind("RemoteViewPart.workingSetToolTip", workingSet.getName()); //$NON-NLS-1$ |
| } |
| setTitleToolTip(toolTip); |
| if (refreshViewer) refreshViewer(); |
| } |
| |
| /** |
| * Contribute actions to the view |
| */ |
| protected void contributeActions() { |
| |
| final Shell shell = getShell(); |
| |
| // Refresh (toolbar) |
| CVSUIPlugin plugin = CVSUIPlugin.getPlugin(); |
| refreshAction = new Action(Policy.bind("RepositoriesView.refresh"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_REFRESH_ENABLED)) { //$NON-NLS-1$ |
| public void run() { |
| refreshAll(); |
| } |
| }; |
| refreshAction.setToolTipText(Policy.bind("RepositoriesView.refreshTooltip")); //$NON-NLS-1$ |
| refreshAction.setDisabledImageDescriptor(plugin.getImageDescriptor(ICVSUIConstants.IMG_REFRESH_DISABLED)); |
| refreshAction.setHoverImageDescriptor(plugin.getImageDescriptor(ICVSUIConstants.IMG_REFRESH)); |
| getViewSite().getActionBars().setGlobalActionHandler(IWorkbenchActionConstants.REFRESH, refreshAction); |
| |
| collapseAllAction = new Action(Policy.bind("RepositoriesView.collapseAll"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_COLLAPSE_ALL_ENABLED)) { //$NON-NLS-1$ |
| public void run() { |
| collapseAll(); |
| } |
| }; |
| collapseAllAction.setToolTipText(Policy.bind("RepositoriesView.collapseAllTooltip")); //$NON-NLS-1$ |
| collapseAllAction.setHoverImageDescriptor(plugin.getImageDescriptor(ICVSUIConstants.IMG_COLLAPSE_ALL)); |
| |
| // Select Working Set (popup) |
| selectWorkingSetAction = new Action(Policy.bind("RepositoriesView.newWorkingSet")) { //$NON-NLS-1$ |
| public void run() { |
| IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager(); |
| IWorkingSetSelectionDialog dialog = manager.createWorkingSetSelectionDialog(shell, false); |
| IWorkingSet workingSet = null; |
| if (workingSet != null) |
| dialog.setSelection(new IWorkingSet[]{workingSet}); |
| |
| if (dialog.open() == Window.OK) { |
| IWorkingSet[] result = dialog.getSelection(); |
| if (result != null && result.length > 0) { |
| setWorkingSet(result[0], true); |
| manager.addRecentWorkingSet(result[0]); |
| } else { |
| setWorkingSet(null, true); |
| } |
| } |
| } |
| }; |
| WorkbenchHelp.setHelp(selectWorkingSetAction, IHelpContextIds.SELECT_WORKING_SET_ACTION); |
| |
| // Deselect Working Set (popup) |
| deselectWorkingSetAction = new Action(Policy.bind("RepositoriesView.deselectWorkingSet")) { //$NON-NLS-1$ |
| public void run() { |
| setWorkingSet(null, true); |
| } |
| }; |
| WorkbenchHelp.setHelp(deselectWorkingSetAction, IHelpContextIds.DESELECT_WORKING_SET_ACTION); |
| |
| // Edit Working Set (popup) |
| editWorkingSetAction = new Action(Policy.bind("RepositoriesView.editWorkingSet")) { //$NON-NLS-1$ |
| public void run() { |
| IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager(); |
| IWorkingSet workingSet = getWorkingSet(); |
| if (workingSet == null) { |
| setEnabled(false); |
| return; |
| } |
| IWorkingSetEditWizard wizard = manager.createWorkingSetEditWizard(workingSet); |
| if (wizard == null) { |
| // todo |
| String title = Policy.bind("EditWorkingSetAction.error.nowizard.title"); //$NON-NLS-1$ |
| String message = Policy.bind("EditWorkingSetAction.error.nowizard.message"); //$NON-NLS-1$ |
| CVSUIPlugin.openError(shell, title, message, null); |
| return; |
| } |
| WizardDialog dialog = new WizardDialog(shell, wizard); |
| dialog.create(); |
| if (dialog.open() == WizardDialog.OK) |
| setWorkingSet(wizard.getSelection(), true); |
| } |
| }; |
| WorkbenchHelp.setHelp(editWorkingSetAction, IHelpContextIds.EDIT_WORKING_SET_ACTION); |
| |
| // Create the popup menu |
| MenuManager menuMgr = new MenuManager(); |
| Tree tree = viewer.getTree(); |
| Menu menu = menuMgr.createContextMenu(tree); |
| menuMgr.addMenuListener(new IMenuListener() { |
| public void menuAboutToShow(IMenuManager manager) { |
| addWorkbenchActions(manager); |
| } |
| |
| }); |
| menuMgr.setRemoveAllWhenShown(true); |
| tree.setMenu(menu); |
| getSite().registerContextMenu(menuMgr, viewer); |
| |
| // Create the local tool bar |
| IActionBars bars = getViewSite().getActionBars(); |
| IToolBarManager tbm = bars.getToolBarManager(); |
| drillPart.addNavigationActions(tbm); |
| tbm.add(refreshAction); |
| tbm.add(new Separator()); |
| tbm.add(collapseAllAction); |
| tbm.update(false); |
| |
| // Create the open action for double clicks |
| openAction = new OpenRemoteFileAction(); |
| viewer.addDoubleClickListener(new IDoubleClickListener() { |
| public void doubleClick(DoubleClickEvent e) { |
| handleDoubleClick(e); |
| } |
| }); |
| |
| updateWorkingSetMenu(); |
| bars.updateActionBars(); |
| } |
| |
| /** |
| * Add the menu actions that were contributed in plugin.xml |
| * |
| * @param manager |
| */ |
| protected void addWorkbenchActions(IMenuManager manager) { |
| // File actions go first (view file) |
| manager.add(new Separator(IWorkbenchActionConstants.GROUP_FILE)); |
| // Misc additions |
| manager.add(new Separator("checkoutGroup")); //$NON-NLS-1$ |
| manager.add(new Separator("tagGroup")); //$NON-NLS-1$ |
| manager.add(new Separator("miscGroup")); //$NON-NLS-1$ |
| manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); |
| |
| manager.add(refreshAction); |
| } |
| |
| /** |
| * Method getShell. |
| * @return Shell |
| */ |
| protected Shell getShell() { |
| return viewer.getTree().getShell(); |
| } |
| |
| public void updateWorkingSetMenu() { |
| IActionBars bars = getViewSite().getActionBars(); |
| IMenuManager mgr = bars.getMenuManager(); |
| |
| mgr.removeAll(); |
| |
| mgr.add(selectWorkingSetAction); |
| mgr.add(deselectWorkingSetAction); |
| deselectWorkingSetAction.setEnabled(getWorkingSet() != null); |
| mgr.add(editWorkingSetAction); |
| editWorkingSetAction.setEnabled(getWorkingSet() != null); |
| |
| mgr.add(new Separator()); |
| |
| IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager(); |
| IWorkingSet[] workingSets = manager.getWorkingSets(); |
| for (int i = 0; i < workingSets.length; i++) { |
| String name = workingSets[i].getName(); |
| ChangeWorkingSetAction action = new ChangeWorkingSetAction(name, i + 1); |
| mgr.add(action); |
| action.setChecked(getWorkingSet() != null && getWorkingSet().getName().equals(name)); |
| } |
| |
| bars.updateActionBars(); |
| } |
| |
| protected void refreshAll() { |
| //CVSUIPlugin.getPlugin().getRepositoryManager().clearCaches(); |
| refreshViewer(); |
| } |
| |
| protected void refreshViewer() { |
| if (viewer == null) return; |
| ((RemoteContentProvider)viewer.getContentProvider()).cancelJobs(CVSUIPlugin.getPlugin().getRepositoryManager().getKnownRepositoryRoots()); |
| CVSUIPlugin.getPlugin().getRepositoryManager().purgeCache(); |
| updateWorkingSetMenu(); |
| viewer.refresh(); |
| } |
| |
| public void collapseAll() { |
| if (viewer == null) return; |
| viewer.getControl().setRedraw(false); |
| viewer.collapseToLevel(viewer.getInput(), TreeViewer.ALL_LEVELS); |
| viewer.getControl().setRedraw(true); |
| } |
| /** |
| * The mouse has been double-clicked in the tree, perform appropriate |
| * behaviour. |
| */ |
| private void handleDoubleClick(DoubleClickEvent e) { |
| // Only act on single selection |
| ISelection selection = e.getSelection(); |
| if (selection instanceof IStructuredSelection) { |
| IStructuredSelection structured = (IStructuredSelection)selection; |
| if (structured.size() == 1) { |
| Object first = structured.getFirstElement(); |
| if (first instanceof ICVSRemoteFile) { |
| // It's a file, open it. |
| openAction.selectionChanged(null, selection); |
| openAction.run(null); |
| } else { |
| // Try to expand/contract |
| viewer.setExpandedState(first, !viewer.getExpandedState(first)); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Returns the viewer. |
| * @return TreeViewer |
| */ |
| protected TreeViewer getViewer() { |
| return viewer; |
| } |
| |
| /** |
| * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) |
| */ |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| } |
| |
| /** |
| * @see org.eclipse.ui.IWorkbenchPart#dispose() |
| */ |
| public void dispose() { |
| getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(this); |
| super.dispose(); |
| viewer = null; |
| } |
| |
| } |