| /******************************************************************************* |
| * 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 java.util.Properties; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| 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.events.KeyListener; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.team.core.TeamException; |
| import org.eclipse.team.internal.ccvs.core.CVSException; |
| import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; |
| import org.eclipse.team.internal.ccvs.core.ICVSRemoteFile; |
| import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; |
| import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; |
| import org.eclipse.team.internal.ccvs.core.ICVSResource; |
| 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.IRepositoryListener; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.team.internal.ccvs.ui.WorkbenchUserAuthenticator; |
| import org.eclipse.team.internal.ccvs.ui.actions.CVSAction; |
| import org.eclipse.team.internal.ccvs.ui.model.AllRootsElement; |
| import org.eclipse.team.internal.ccvs.ui.wizards.NewLocationWizard; |
| import org.eclipse.team.internal.core.TeamPlugin; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.IWorkbenchActionConstants; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.dialogs.PropertyDialogAction; |
| import org.eclipse.ui.help.WorkbenchHelp; |
| |
| /** |
| * RepositoriesView is a view on a set of known CVS repositories |
| * which allows navigation of the structure of the repository and |
| * the performing of CVS-specific operations on the repository contents. |
| */ |
| public class RepositoriesView extends RemoteViewPart { |
| public static final String VIEW_ID = "org.eclipse.team.ccvs.ui.RepositoriesView"; //$NON-NLS-1$ |
| |
| // The root |
| private AllRootsElement root; |
| |
| // Actions |
| private Action newAction; |
| private Action newAnonAction; |
| private PropertyDialogAction propertiesAction; |
| private RemoveRootAction removeRootAction; |
| |
| IRepositoryListener listener = new IRepositoryListener() { |
| public void repositoryAdded(final ICVSRepositoryLocation root) { |
| getViewer().getControl().getDisplay().syncExec(new Runnable() { |
| public void run() { |
| refreshViewer(); |
| getViewer().setSelection(new StructuredSelection(root)); |
| } |
| }); |
| } |
| public void repositoryRemoved(ICVSRepositoryLocation root) { |
| refresh(); |
| } |
| public void repositoriesChanged(ICVSRepositoryLocation[] roots) { |
| refresh(); |
| } |
| private void refresh() { |
| Display display = getViewer().getControl().getDisplay(); |
| display.syncExec(new Runnable() { |
| public void run() { |
| RepositoriesView.this.refreshViewer(); |
| } |
| }); |
| } |
| }; |
| |
| /** |
| * Constructor for RepositoriesView. |
| * @param partName |
| */ |
| public RepositoriesView() { |
| super(VIEW_ID); |
| } |
| |
| /** |
| * Contribute actions to the view |
| */ |
| protected void contributeActions() { |
| |
| final Shell shell = getShell(); |
| |
| // Create actions |
| |
| // New Repository (popup) |
| newAction = new Action(Policy.bind("RepositoriesView.new"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_NEWLOCATION)) { //$NON-NLS-1$ |
| public void run() { |
| NewLocationWizard wizard = new NewLocationWizard(); |
| WizardDialog dialog = new WizardDialog(shell, wizard); |
| dialog.open(); |
| } |
| }; |
| WorkbenchHelp.setHelp(newAction, IHelpContextIds.NEW_REPOSITORY_LOCATION_ACTION); |
| |
| if (includeAnonConnection()) { |
| newAnonAction = new Action(Policy.bind("RepositoriesView.newAnonCVS"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_NEWLOCATION)) { //$NON-NLS-1$ |
| public void run() { |
| Properties p = new Properties(); |
| p.setProperty("connection", "pserver"); //$NON-NLS-1$ //$NON-NLS-2$ |
| p.setProperty("user", "anonymous"); //$NON-NLS-1$ //$NON-NLS-2$ |
| p.setProperty("host", "dev.eclipse.org"); //$NON-NLS-1$ //$NON-NLS-2$ |
| p.setProperty("root", "/home/eclipse"); //$NON-NLS-1$ //$NON-NLS-2$ |
| NewLocationWizard wizard = new NewLocationWizard(p); |
| WizardDialog dialog = new WizardDialog(shell, wizard); |
| dialog.open(); |
| } |
| }; |
| WorkbenchHelp.setHelp(newAnonAction, IHelpContextIds.NEW_DEV_ECLIPSE_REPOSITORY_LOCATION_ACTION); |
| } |
| |
| // Properties |
| propertiesAction = new PropertyDialogAction(shell, getViewer()); |
| getViewSite().getActionBars().setGlobalActionHandler(IWorkbenchActionConstants.PROPERTIES, propertiesAction); |
| IStructuredSelection selection = (IStructuredSelection)getViewer().getSelection(); |
| if (selection.size() == 1 && selection.getFirstElement() instanceof RepositoryRoot) { |
| propertiesAction.setEnabled(true); |
| } else { |
| propertiesAction.setEnabled(false); |
| } |
| getViewer().addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| IStructuredSelection ss = (IStructuredSelection)event.getSelection(); |
| boolean enabled = ss.size() == 1 && ss.getFirstElement() instanceof RepositoryRoot; |
| propertiesAction.setEnabled(enabled); |
| } |
| }); |
| removeRootAction = new RemoveRootAction(viewer.getControl().getShell(), this); |
| removeRootAction.selectionChanged((IStructuredSelection)null); |
| WorkbenchHelp.setHelp(removeRootAction, IHelpContextIds.REMOVE_REPOSITORY_LOCATION_ACTION); |
| IActionBars bars = getViewSite().getActionBars(); |
| bars.setGlobalActionHandler(IWorkbenchActionConstants.DELETE, removeRootAction); |
| super.contributeActions(); |
| } |
| |
| /** |
| * Method includeEclipseConnection. |
| * @return boolean |
| */ |
| private boolean includeAnonConnection() { |
| return System.getProperty("eclipse.cvs.anon") != null; //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#addWorkbenchActions(org.eclipse.jface.action.IMenuManager) |
| */ |
| protected void addWorkbenchActions(IMenuManager manager) { |
| // New actions go next |
| MenuManager sub = new MenuManager(Policy.bind("RepositoriesView.newSubmenu"), IWorkbenchActionConstants.GROUP_ADD); //$NON-NLS-1$ |
| sub.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); |
| manager.add(sub); |
| super.addWorkbenchActions(manager); |
| IStructuredSelection selection = (IStructuredSelection)getViewer().getSelection(); |
| |
| removeRootAction.selectionChanged(selection); |
| if(removeRootAction.isEnabled()) { |
| manager.add(removeRootAction); |
| } |
| |
| if (selection.size() == 1 && selection.getFirstElement() instanceof RepositoryRoot) { |
| manager.add(new Separator()); |
| manager.add(propertiesAction); |
| } |
| sub.add(newAction); |
| if (newAnonAction != null) |
| sub.add(newAnonAction); |
| } |
| |
| /* |
| * @see WorkbenchPart#createPartControl |
| */ |
| public void createPartControl(Composite parent) { |
| super.createPartControl(parent); |
| CVSUIPlugin.getPlugin().getRepositoryManager().addRepositoryListener(listener); |
| } |
| |
| /* |
| * @see WorkbenchPart#dispose |
| */ |
| public void dispose() { |
| CVSUIPlugin.getPlugin().getRepositoryManager().removeRepositoryListener(listener); |
| super.dispose(); |
| } |
| |
| /** |
| * Initialize the repositories and actions |
| */ |
| private void initialize() { |
| root = new AllRootsElement(); |
| } |
| |
| protected void initializeListeners() { |
| super.initializeListeners(); |
| viewer.addSelectionChangedListener(removeRootAction); |
| viewer.getControl().addKeyListener(new KeyListener() { |
| public void keyPressed(KeyEvent event) { |
| handleKeyPressed(event); |
| } |
| public void keyReleased(KeyEvent event) { |
| handleKeyReleased(event); |
| } |
| }); |
| } |
| public void handleKeyPressed(KeyEvent event) { |
| if (event.character == SWT.DEL && event.stateMask == 0) { |
| removeRootAction.run(); |
| } |
| } |
| protected void handleKeyReleased(KeyEvent event) { |
| } |
| |
| /** |
| * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#getTreeInput() |
| */ |
| protected Object getTreeInput() { |
| initialize(); |
| return root; |
| } |
| |
| /** |
| * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) |
| */ |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| String msg = getStatusLineMessage(selection); |
| getViewSite().getActionBars().getStatusLineManager().setMessage(msg); |
| } |
| |
| private String getStatusLineMessage(ISelection selection) { |
| if (selection==null || selection.isEmpty()) return ""; //$NON-NLS-1$ |
| if (!(selection instanceof IStructuredSelection)) return ""; //$NON-NLS-1$ |
| IStructuredSelection s = (IStructuredSelection)selection; |
| |
| if (s.size() > 1) return Policy.bind("RepositoriesView.NItemsSelected", String.valueOf(s.size())); //$NON-NLS-1$ |
| Object element = CVSAction.getAdapter(s.getFirstElement(), ICVSResource.class); |
| if (element instanceof ICVSRemoteResource) { |
| ICVSRemoteResource res = (ICVSRemoteResource)element; |
| String name; |
| if (res.isContainer()) { |
| name = res.getRepositoryRelativePath(); |
| } else { |
| try { |
| name = res.getRepositoryRelativePath() + " " + ((ICVSRemoteFile)res).getRevision(); //$NON-NLS-1$ |
| } catch (TeamException e) { |
| TeamPlugin.log(IStatus.ERROR, Policy.bind("RepositoriesView.CannotGetRevision"), e); //$NON-NLS-1$ |
| name = res.getRepositoryRelativePath(); |
| } |
| } |
| return Policy.bind("RepositoriesView.ResourceInRepository", name, res.getRepository().getLocation()); //$NON-NLS-1$ |
| } |
| return Policy.bind("RepositoriesView.OneItemSelected"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#getHelpContextId() |
| */ |
| protected String getHelpContextId() { |
| return IHelpContextIds.REPOSITORIES_VIEW; |
| } |
| |
| /** |
| * @see org.eclipse.team.internal.ccvs.ui.repo.RemoteViewPart#getKeyListener() |
| */ |
| protected KeyAdapter getKeyListener() { |
| return new KeyAdapter() { |
| public void keyPressed(KeyEvent event) { |
| if (event.keyCode == SWT.F5) { |
| if (WorkbenchUserAuthenticator.USE_ALTERNATE_PROMPTER) { |
| try { |
| ICVSRepositoryLocation[] locations = CVSProviderPlugin.getPlugin().getKnownRepositories(); |
| for (int i = 0; i < locations.length; i++) { |
| locations[i].flushUserInfo(); |
| } |
| } catch (CVSException e) { |
| // Do nothing |
| } |
| } else { |
| refreshAll(); |
| } |
| } else if (event.keyCode == SWT.F9 && WorkbenchUserAuthenticator.USE_ALTERNATE_PROMPTER) { |
| refreshAll(); |
| } |
| } |
| }; |
| } |
| |
| } |