Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java')
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java279
1 files changed, 192 insertions, 87 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java
index 8fb2326b8..ff82a2bd0 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/TreeViewerAdvisor.java
@@ -10,21 +10,20 @@
*******************************************************************************/
package org.eclipse.team.ui.synchronize;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
+import java.util.*;
+import org.eclipse.compare.internal.INavigatable;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
-import org.eclipse.team.core.TeamException;
-import org.eclipse.team.core.synchronize.SyncInfoTree;
-import org.eclipse.team.internal.ui.*;
+import org.eclipse.team.internal.ui.Policy;
+import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.synchronize.*;
-import org.eclipse.team.internal.ui.synchronize.CompressedFoldersModelProvider;
-import org.eclipse.team.internal.ui.synchronize.HierarchicalModelProvider;
import org.eclipse.team.internal.ui.synchronize.actions.ExpandAllAction;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.team.internal.ui.synchronize.actions.NavigateAction;
+import org.eclipse.ui.*;
import org.eclipse.ui.internal.dialogs.ContainerCheckedTreeViewer;
/**
@@ -42,15 +41,65 @@ import org.eclipse.ui.internal.dialogs.ContainerCheckedTreeViewer;
* <p>
* @since 3.0
*/
-public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPropertyChangeListener {
+public class TreeViewerAdvisor extends StructuredViewerAdvisor {
/**
+ * Style bit that indicates that a checkbox viewer is desired.
+ */
+ public static final int CHECKBOX = 1;
+
+ private ExpandAllAction expandAllAction;
+ private Action collapseAll;
+ private NavigateAction gotoNext;
+ private NavigateAction gotoPrevious;
+
+ class NavigationActionGroup extends SynchronizePageActionGroup {
+ public void initialize(ISynchronizePageConfiguration configuration) {
+ super.initialize(configuration);
+ final StructuredViewer viewer = getViewer();
+ if (viewer instanceof AbstractTreeViewer) {
+
+ expandAllAction = new ExpandAllAction((AbstractTreeViewer) viewer);
+ Utils.initAction(expandAllAction, "action.expandAll."); //$NON-NLS-1$
+
+ collapseAll = new Action() {
+ public void run() {
+ if (viewer == null || viewer.getControl().isDisposed() || !(viewer instanceof AbstractTreeViewer)) return;
+ viewer.getControl().setRedraw(false);
+ ((AbstractTreeViewer)viewer).collapseToLevel(viewer.getInput(), TreeViewer.ALL_LEVELS);
+ viewer.getControl().setRedraw(true);
+ }
+ };
+ Utils.initAction(collapseAll, "action.collapseAll."); //$NON-NLS-1$
+
+ INavigatable nav = new INavigatable() {
+ public boolean gotoDifference(boolean next) {
+ return TreeViewerAdvisor.this.navigate(next);
+ }
+ };
+ ISynchronizeParticipant participant = configuration.getParticipant();
+ ISynchronizePageSite site = configuration.getSite();
+ gotoNext = new NavigateAction(site, participant.getName(), nav, true /*next*/);
+ gotoPrevious = new NavigateAction(site, participant.getName(), nav, false /*previous*/);
+ }
+ }
+ public void fillContextMenu(IMenuManager manager) {
+ appendToGroup(manager, ISynchronizePageConfiguration.NAVIGATE_GROUP, expandAllAction);
+ }
+ public void fillActionBars(IActionBars actionBars) {
+ IToolBarManager manager = actionBars.getToolBarManager();
+ appendToGroup(manager, ISynchronizePageConfiguration.NAVIGATE_GROUP, gotoNext);
+ appendToGroup(manager, ISynchronizePageConfiguration.NAVIGATE_GROUP, gotoPrevious);
+ appendToGroup(manager, ISynchronizePageConfiguration.NAVIGATE_GROUP, collapseAll);
+ }
+ }
+
+ /**
* Interface used to implement navigation for tree viewers. This interface is used by
* {@link TreeViewerAdvisor#navigate(TreeViewer, boolean, boolean, boolean) to open
* selections and navigate.
*/
public interface ITreeViewerAccessor {
-
public void createChildren(TreeItem item);
public void openSelection();
}
@@ -73,6 +122,77 @@ public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPrope
}
}
+ public static class CheckboxSelectionProvider implements ISelectionProvider {
+
+ ContainerCheckedTreeViewer viewer;
+ ISynchronizePageConfiguration configuration;
+ Map listeners = new HashMap();
+
+ /**
+ *
+ */
+ public CheckboxSelectionProvider(ContainerCheckedTreeViewer viewer, ISynchronizePageConfiguration configuration) {
+ this.viewer = viewer;
+ this.configuration = configuration;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void addSelectionChangedListener(final ISelectionChangedListener listener) {
+ ICheckStateListener checkListener = new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ SelectionChangedEvent se = new SelectionChangedEvent(CheckboxSelectionProvider.this, getSelection());
+ listener.selectionChanged(se);
+ }
+ };
+ viewer.addCheckStateListener(checkListener);
+ listeners.put(listener, checkListener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+ */
+ public ISelection getSelection() {
+ if (viewer == null) {
+ return StructuredSelection.EMPTY;
+ }
+ IResource[] resources = Utils.getResources(viewer.getCheckedElements());
+ ArrayList result = new ArrayList();
+ for (int i = 0; i < resources.length; i++) {
+ IResource resource = resources[i];
+ if (configuration.getSyncInfoSet().getSyncInfo(resource) != null) {
+ result.add(resource);
+ }
+ }
+ return new StructuredSelection((IResource[]) result.toArray(new IResource[result.size()]));
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ ICheckStateListener checkListener = (ICheckStateListener)listeners.get(listener);
+ if (checkListener != null) {
+ viewer.removeCheckStateListener(checkListener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+ */
+ public void setSelection(ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection)selection;
+ for (Iterator iter = ss.iterator(); iter.hasNext();) {
+ Object element = (Object) iter.next();
+ // TODO:
+ }
+ }
+ }
+ }
+
/**
* A navigable tree viewer that will work with the <code>navigate</code> method of
* this advisor.
@@ -91,7 +211,18 @@ public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPrope
}
}
- private ExpandAllAction expandAllAction;
+ public static StructuredViewer createViewer(Composite parent, ISynchronizePageConfiguration configuration) {
+ int style = ((SynchronizePageConfiguration)configuration).getViewerStyle();
+ if ((style & CHECKBOX) > 0) {
+ NavigableCheckboxTreeViewer v = new TreeViewerAdvisor.NavigableCheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ configuration.getSite().setSelectionProvider(new CheckboxSelectionProvider(v, configuration));
+ return v;
+ } else {
+ NavigableTreeViewer v = new TreeViewerAdvisor.NavigableTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ configuration.getSite().setSelectionProvider(v);
+ return v;
+ }
+ }
/**
* Create an advisor that will allow viewer contributions with the given <code>targetID</code>. This
@@ -103,30 +234,25 @@ public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPrope
* case a site will be found using the default workbench page.
* @param set the set of <code>SyncInfo</code> objects that are to be shown to the user.
*/
- public TreeViewerAdvisor(String menuId, IWorkbenchPartSite site, SyncInfoTree set) {
- super(menuId,site, set);
- TeamUIPlugin.getPlugin().getPreferenceStore().addPropertyChangeListener(this);
+ public TreeViewerAdvisor(Composite parent, ISynchronizePageConfiguration configuration) {
+ super(configuration);
+
+ configuration.addActionContribution(new NavigationActionGroup());
+
+ StructuredViewer viewer = TreeViewerAdvisor.createViewer(parent, configuration);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ viewer.getControl().setLayoutData(data);
+ initializeViewer(viewer);
}
/**
- * Create a tree viewer advisor that will provide a presentation model based on the given
- * sync info set. Note that it's important to call {@link #dispose()} when finished with
- * an advisor.
- *
- * @param set the set of <code>SyncInfo</code> objects that are to be shown to the user.
- */
- public TreeViewerAdvisor(SyncInfoTree set) {
- this(null, null, set);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#dispose()
+ * Create the model manager to be used by this advisor
+ * @param configuration
*/
- public void dispose() {
- TeamUIPlugin.getPlugin().getPreferenceStore().removePropertyChangeListener(this);
- super.dispose();
+ protected SynchronizeModelManager createModelManager(ISynchronizePageConfiguration configuration) {
+ return new HierarchicalModelManager(this, configuration);
}
-
+
/* (non-Javadoc)
* @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#navigate(boolean)
*/
@@ -135,51 +261,20 @@ public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPrope
}
/* (non-Javadoc)
- * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
- */
- public void propertyChange(PropertyChangeEvent event) {
- if (getViewer() != null && event.getProperty().equals(IPreferenceIds.SYNCVIEW_COMPRESS_FOLDERS)) {
- try {
- prepareInput(null);
- setInput(getViewer());
- } catch (TeamException e) {
- TeamUIPlugin.log(e);
- }
- }
- }
-
- /* (non-Javadoc)
* @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#initializeViewer(org.eclipse.jface.viewers.StructuredViewer)
*/
public boolean validateViewer(StructuredViewer viewer) {
return viewer instanceof AbstractTreeViewer;
}
-
- /* (non-Javadoc)
- * @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#fillContextMenu(org.eclipse.jface.viewers.StructuredViewer, org.eclipse.jface.action.IMenuManager)
- */
- protected void fillContextMenu(StructuredViewer viewer, IMenuManager manager) {
- manager.add(expandAllAction);
- manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#getDiffNodeController()
- */
- protected ISynchronizeModelProvider getModelProvider() {
- if(getShowCompressedFolders()) {
- return new CompressedFoldersModelProvider((SyncInfoTree)getSyncInfoSet());
- }
- return new HierarchicalModelProvider((SyncInfoTree)getSyncInfoSet());
- }
-
+
/**
* Handles a double-click event from the viewer. Expands or collapses a folder when double-clicked.
*
* @param viewer the viewer
* @param event the double-click event
*/
- protected void handleDoubleClick(StructuredViewer viewer, DoubleClickEvent event) {
+ protected boolean handleDoubleClick(StructuredViewer viewer, DoubleClickEvent event) {
+ if (super.handleDoubleClick(viewer, event)) return true;
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
Object element = selection.getFirstElement();
AbstractTreeViewer treeViewer = (AbstractTreeViewer) getViewer();
@@ -190,36 +285,46 @@ public class TreeViewerAdvisor extends StructuredViewerAdvisor implements IPrope
TreeViewerAdvisor.navigate((TreeViewer)getViewer(), true /* next */, false /* no-open */, true /* only-expand */);
}
}
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#initializeActions(org.eclipse.jface.viewers.StructuredViewer)
- */
- protected void initializeActions(StructuredViewer viewer) {
- super.initializeActions(viewer);
- expandAllAction = new ExpandAllAction((AbstractTreeViewer) viewer);
- Utils.initAction(expandAllAction, "action.expandAll."); //$NON-NLS-1$
+ return true;
}
/* (non-Javadoc)
* @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#initializeListeners(org.eclipse.jface.viewers.StructuredViewer)
*/
- protected void initializeListeners(StructuredViewer viewer) {
+ protected void initializeListeners(final StructuredViewer viewer) {
super.initializeListeners(viewer);
- viewer.addDoubleClickListener(new IDoubleClickListener() {
- public void doubleClick(DoubleClickEvent event) {
- handleDoubleClick(getViewer(), event);
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateStatusLine((IStructuredSelection) event.getSelection());
}
});
}
- /**
- * Return the state of the compressed folder setting.
- *
- * @return the state of the compressed folder setting.
- */
- private boolean getShowCompressedFolders() {
- return TeamUIPlugin.getPlugin().getPreferenceStore().getBoolean(IPreferenceIds.SYNCVIEW_COMPRESS_FOLDERS);
+ private void updateStatusLine(IStructuredSelection selection) {
+ IWorkbenchSite ws = getConfiguration().getSite().getWorkbenchSite();
+ if (ws != null && ws instanceof IViewSite) {
+ String msg = getStatusLineMessage(selection);
+ ((IViewSite)ws).getActionBars().getStatusLineManager().setMessage(msg);
+ }
+ }
+
+ private String getStatusLineMessage(IStructuredSelection selection) {
+ if (selection.size() == 1) {
+ Object first = selection.getFirstElement();
+ if (first instanceof SyncInfoModelElement) {
+ SyncInfoModelElement node = (SyncInfoModelElement) first;
+ IResource resource = node.getResource();
+ if (resource == null) {
+ return node.getName();
+ } else {
+ return resource.getFullPath().makeRelative().toString();
+ }
+ }
+ }
+ if (selection.size() > 1) {
+ return selection.size() + Policy.bind("SynchronizeView.13"); //$NON-NLS-1$
+ }
+ return ""; //$NON-NLS-1$
}
private static TreeItem findNextPrev(TreeViewer viewer, TreeItem item, boolean next) {

Back to the top