blob: ce61d57b0130f02ac1d4a1735da4a18ab28905b0 [file] [log] [blame]
package org.eclipse.team.internal.ccvs.ui;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.util.Properties;
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.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.viewers.TreeViewer;
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.Display;
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.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSProvider;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.ICVSRemoteFile;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.ui.actions.OpenRemoteFileAction;
import org.eclipse.team.internal.ccvs.ui.model.AllRootsElement;
import org.eclipse.team.internal.ccvs.ui.model.RemoteContentProvider;
import org.eclipse.team.internal.ccvs.ui.wizards.NewLocationWizard;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.dialogs.PropertyDialogAction;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
/**
* 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 ViewPart {
public static final String VIEW_ID = "org.eclipse.team.ccvs.ui.RepositoriesView"; //$NON-NLS-1$
// The tree viewer
private TreeViewer viewer;
// The root
private AllRootsElement root;
// Drill down adapter
private DrillDownAdapter drillPart;
// Actions
private Action showFoldersAction;
private Action showModulesAction;
private OpenRemoteFileAction openAction;
private Action refreshAction;
private PropertyDialogAction propertiesAction;
IRepositoryListener listener = new IRepositoryListener() {
public void repositoryAdded(final ICVSRepositoryLocation root) {
viewer.getControl().getDisplay().syncExec(new Runnable() {
public void run() {
viewer.refresh();
viewer.setSelection(new StructuredSelection(root));
}
});
}
public void repositoryRemoved(ICVSRepositoryLocation root) {
refresh();
}
public void branchTagsAdded(CVSTag[] tags, final ICVSRepositoryLocation root) {
refresh();
}
public void branchTagsRemoved(CVSTag[] tags, final ICVSRepositoryLocation root) {
refresh();
}
public void versionTagsAdded(CVSTag[] tags, final ICVSRepositoryLocation root) {
refresh();
}
public void versionTagsRemoved(CVSTag[] tags, final ICVSRepositoryLocation root) {
refresh();
}
private void refresh() {
Display display = viewer.getControl().getDisplay();
display.syncExec(new Runnable() {
public void run() {
viewer.refresh();
}
});
}
};
/**
* Contribute actions to the view
*/
private void contributeActions() {
final Shell shell = viewer.getTree().getShell();
// Create actions
// Refresh (toolbar)
refreshAction = new Action(Policy.bind("RepositoriesView.refresh"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_REFRESH)) { //$NON-NLS-1$
public void run() {
viewer.refresh();
}
};
refreshAction.setToolTipText(Policy.bind("RepositoriesView.refresh")); //$NON-NLS-1$
// New Repository (popup)
final Action 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();
}
};
final Action 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();
}
};
// Properties
propertiesAction = new PropertyDialogAction(shell, viewer);
getViewSite().getActionBars().setGlobalActionHandler(IWorkbenchActionConstants.PROPERTIES, propertiesAction);
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
if (selection.size() == 1 && selection.getFirstElement() instanceof ICVSRepositoryLocation) {
propertiesAction.setEnabled(true);
} else {
propertiesAction.setEnabled(false);
}
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection ss = (IStructuredSelection)event.getSelection();
boolean enabled = ss.size() == 1 && ss.getFirstElement() instanceof ICVSRepositoryLocation;
propertiesAction.setEnabled(enabled);
}
});
// 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) {
// File actions go first (view file)
manager.add(new Separator(IWorkbenchActionConstants.GROUP_FILE));
// 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);
// Misc additions
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
manager.add(refreshAction);
IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
if (selection.size() == 1 && selection.getFirstElement() instanceof ICVSRepositoryLocation) {
manager.add(propertiesAction);
}
sub.add(newAction);
sub.add(newAnonAction);
}
});
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.update(false);
// Create the open action for double clicks
openAction = new OpenRemoteFileAction();
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent e) {
handleDoubleClick(e);
}
});
// Add module toggling to the local pull-down menu
IMenuManager mgr = bars.getMenuManager();
showFoldersAction = new Action(Policy.bind("RepositoriesView.Show_Folders_6")) { //$NON-NLS-1$
public void run() {
CVSUIPlugin.getPlugin().getPreferenceStore().setValue(ICVSUIConstants.PREF_SHOW_MODULES, false);
showModulesAction.setChecked(false);
viewer.refresh();
}
};
showModulesAction = new Action(Policy.bind("RepositoriesView.Show_Modules_7")) { //$NON-NLS-1$
public void run() {
CVSUIPlugin.getPlugin().getPreferenceStore().setValue(ICVSUIConstants.PREF_SHOW_MODULES, true);
showFoldersAction.setChecked(false);
viewer.refresh();
}
};
boolean showModules = CVSUIPlugin.getPlugin().getPreferenceStore().getBoolean(ICVSUIConstants.PREF_SHOW_MODULES);
showFoldersAction.setChecked(!showModules);
showModulesAction.setChecked(showModules);
mgr.add(showFoldersAction);
mgr.add(showModulesAction);
bars.updateActionBars();
}
/*
* @see WorkbenchPart#createPartControl
*/
public void createPartControl(Composite parent) {
initialize();
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new RemoteContentProvider());
viewer.setLabelProvider(new WorkbenchLabelProvider());
getSite().setSelectionProvider(viewer);
viewer.setInput(root);
viewer.setSorter(new RepositorySorter());
viewer.getControl().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if (event.keyCode == SWT.F5) {
if (WorkbenchUserAuthenticator.USE_ALTERNATE_PROMPTER) {
try {
ICVSRepositoryLocation[] locations = CVSProvider.getInstance().getKnownRepositories();
for (int i = 0; i < locations.length; i++) {
locations[i].flushUserInfo();
}
} catch (CVSException e) {
// Do nothing
}
} else {
refreshAction.run();
}
} else if (event.keyCode == SWT.F9 && WorkbenchUserAuthenticator.USE_ALTERNATE_PROMPTER) {
refreshAction.run();
}
}
});
drillPart = new DrillDownAdapter(viewer);
contributeActions();
CVSUIPlugin.getPlugin().getRepositoryManager().addRepositoryListener(listener);
}
/*
* @see WorkbenchPart#dispose
*/
public void dispose() {
CVSUIPlugin.getPlugin().getRepositoryManager().removeRepositoryListener(listener);
}
/**
* 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));
}
}
}
}
/**
* Initialize the repositories and actions
*/
private void initialize() {
root = new AllRootsElement();
}
/*
* @see WorkbenchPart#setFocus
*/
public void setFocus() {
viewer.getControl().setFocus();
}
}