[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Working Set Patch for C View
|
All,
This patch provides the UI controls and filters to use the working set
concept and apply it to the
CView. The UI mimics the behaviour of what is used by the Java packages
view (rather than
incorporating it as a part of the Filters... dialog as was done in the
Navigator). I didn't create a
specific C/C++ Working Set type since I figured that for C and C++
projects which might include
other projects it wasn't required. This can be re-examined at a later
date if required.
Thanks,
Thomas
Index: AdjustWorkingSetFilterAction.java
===================================================================
RCS file: AdjustWorkingSetFilterAction.java
diff -N AdjustWorkingSetFilterAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ AdjustWorkingSetFilterAction.java 20 Feb 2003 18:26:04 -0000
@@ -0,0 +1,27 @@
+package org.eclipse.cdt.internal.ui.cview;
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * @author ThomasF
+ *
+ * Set a manager with a specific filter type/working set
+ */
+public class AdjustWorkingSetFilterAction extends Action {
+ CWorkingSetFilter fFilter;
+ String fName;
+
+ public AdjustWorkingSetFilterAction(String name, String setName, CWorkingSetFilter filter) {
+ super(name);
+ fName = setName;
+ fFilter = filter;
+ }
+
+ public void run() {
+ if(fFilter == null) {
+ return;
+ }
+
+ fFilter.setWorkingSetName(fName);
+ }
+}
Index: CView.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/cview/CView.java,v
retrieving revision 1.14
diff -u -r1.14 CView.java
--- CView.java 13 Feb 2003 14:00:29 -0000 1.14
+++ CView.java 20 Feb 2003 18:26:04 -0000
@@ -40,6 +40,9 @@
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
@@ -85,6 +88,8 @@
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.AddBookmarkAction;
@@ -147,6 +152,9 @@
ForwardAction forwardAction;
GoIntoAction goIntoAction;
UpAction upAction;
+ NewWorkingSetFilterAction wsFilterAction;
+ AdjustWorkingSetFilterAction wsClearFilterAction;
+
FrameList frameList;
CViewFrameSource frameSource;
@@ -156,6 +164,8 @@
CLibFilter clibFilter = new CLibFilter ();
ShowLibrariesAction clibFilterAction;
+ CWorkingSetFilter workingSetFilter = new CWorkingSetFilter ();
+ ActionContributionItem adjustWorkingSetContributions [] = new ActionContributionItem[5];
// Persistance tags.
static final String TAG_SELECTION= "selection"; //$NON-NLS-1$
@@ -167,6 +177,11 @@
static final String TAG_FILTERS = "filters"; //$NON-NLS-1$
static final String TAG_FILTER = "filter"; //$NON-NLS-1$
static final String TAG_SHOWLIBRARIES = "showLibraries"; //$NON-NLS-1$
+ static final String TAG_WORKINGSET = "workingSet"; //$NON-NLS-1$
+
+ //Menu tags
+ final String WORKING_GROUP_MARKER = "workingSetGroup";
+ final String WORKING_GROUP_MARKER_END = "end-workingSetGroup";
private IPartListener partListener = new IPartListener() {
public void partActivated(IWorkbenchPart part) {
@@ -179,8 +194,46 @@
public void partDeactivated(IWorkbenchPart part) {}
public void partOpened(IWorkbenchPart part) {}
};
+
+ private IPropertyChangeListener workingSetListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent ev) {
+ String prop = ev.getProperty();
+ if(prop == null) {
+ return;
+ }
-
+ if(prop.equals(CWorkingSetFilter.WORKING_SET_ACTIVE_CHANGED)) {
+ updateWorkingSetMenu();
+ viewer.getControl().setRedraw(false);
+ viewer.refresh();
+ viewer.getControl().setRedraw(true);
+ } else if(prop.equals(IWorkingSetManager.CHANGE_WORKING_SET_ADD)) {
+ updateWorkingSetMenu();
+ } else if(prop.equals(IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE)) {
+ updateWorkingSetMenu();
+ } else if(prop.equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)){
+ if(ev.getOldValue() instanceof IWorkingSet) {
+ String name = ((IWorkingSet)(ev.getOldValue())).getName();
+ String wsName = workingSetFilter.getWorkingSetName();
+ if(wsName != null && name.equals(wsName)) {
+ viewer.getControl().setRedraw(false);
+ viewer.refresh();
+ viewer.getControl().setRedraw(true);
+ }
+ }
+ } else if(prop.equals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE)) {
+ if(ev.getOldValue() instanceof IWorkingSet) {
+ String name = ((IWorkingSet)(ev.getOldValue())).getName();
+ String wsName = workingSetFilter.getWorkingSetName();
+ if(wsName != null && name.equals(wsName)) {
+ workingSetFilter.setWorkingSetName(null);
+ }
+ }
+ updateWorkingSetMenu();
+ }
+ }
+ };
+
public CView() {
super();
}
@@ -375,12 +428,17 @@
CUIPlugin.getDefault().getProblemMarkerManager().addListener(viewer);
CUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
+ IWorkingSetManager wsmanager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
+ workingSetFilter.setWorkingSetManager(wsmanager);
+
+
// FIXME: Add Drag and Drop support.
initFrameList();
initRefreshKey();
updateTitle();
initDragAndDrop();
viewer.addFilter(patternFilter);
+ viewer.addFilter(workingSetFilter);
//viewer.addFilter(clibFilter);
viewer.setSorter(new CViewSorter ());
// FIXME: Add different Sorting.
@@ -402,6 +460,10 @@
// Make the Actions for the Context Menu
makeActions();
+ //Add the property changes after all of the UI work has been done.
+ wsmanager.addPropertyChangeListener(workingSetListener);
+ workingSetFilter.addChangeListener(workingSetListener);
+
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleDoubleClick(event);
@@ -447,6 +509,10 @@
IWorkspace workspace = CUIPlugin.getWorkspace();
workspace.removeResourceChangeListener(closeProjectAction);
workspace.removeResourceChangeListener(openProjectAction);
+
+ IWorkingSetManager wsmanager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
+ wsmanager.removePropertyChangeListener(workingSetListener);
+
super.dispose();
}
@@ -478,14 +544,21 @@
return clibFilter;
}
- /**
- * Returns the pattern filter for this view.
- * @return the pattern filter
- */
+ /**
+ * Returns the pattern filter for this view.
+ * @return the pattern filter
+ */
CPatternFilter getPatternFilter() {
return patternFilter;
}
-
+
+ /**
+ * Returns the working set filter for this view.
+ * @return the working set filter
+ */
+ CWorkingSetFilter getWorkingSetFilter() {
+ return workingSetFilter;
+ }
TreeViewer getViewer () {
return viewer;
@@ -522,6 +595,9 @@
patternFilterAction = new FilterSelectionAction(shell, this, "Filters...");
clibFilterAction = new ShowLibrariesAction(shell, this, "Show Referenced Libs");
+ wsFilterAction = new NewWorkingSetFilterAction(getViewSite().getShell(), this, "Select Working Set...");
+ wsClearFilterAction = new AdjustWorkingSetFilterAction("Deselect Working Set", null, workingSetFilter);
+
goIntoAction = new GoIntoAction(frameList);
backAction = new BackAction(frameList);
forwardAction = new ForwardAction(frameList);
@@ -955,9 +1031,63 @@
actionBars.updateActionBars();
IMenuManager menu = actionBars.getMenuManager();
+ menu.add(wsFilterAction);
+ menu.add(wsClearFilterAction);
+
+ menu.add(new Separator());
+ menu.add(new GroupMarker(WORKING_GROUP_MARKER));
+ menu.add(new GroupMarker(WORKING_GROUP_MARKER_END));
+ menu.add(new Separator());
+
+ updateWorkingSetMenu();
+
//menu.add (clibFilterAction);
menu.add (patternFilterAction);
}
+
+ void updateWorkingSetMenu() {
+ IMenuManager menu = getViewSite().getActionBars().getMenuManager();
+
+ //Remove the previous entries
+ for(int i = 0; i < adjustWorkingSetContributions.length; i++) {
+ if(adjustWorkingSetContributions[i] != null) {
+ menu.remove(adjustWorkingSetContributions[i]);
+ }
+ }
+
+ //Find out what we are currently using
+ String currentWorkingSetName = workingSetFilter.getWorkingSetName();
+
+ //If we have no working set, then we can't disable it
+ if(wsClearFilterAction != null) {
+ wsClearFilterAction.setEnabled((currentWorkingSetName != null));
+ }
+
+ IWorkingSetManager manager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
+ IWorkingSet recentsets [] = manager.getWorkingSets();
+ for(int i = 0; i < adjustWorkingSetContributions.length; i++) {
+ if(i < recentsets.length) {
+ Action action = new AdjustWorkingSetFilterAction(recentsets[i].getName(),
+ recentsets[i].getName(),
+ workingSetFilter);
+ adjustWorkingSetContributions[i] = new ActionContributionItem(action);
+ if(currentWorkingSetName != null &&
+ currentWorkingSetName.equals(recentsets[i].getName())) {
+ adjustWorkingSetContributions[i].getAction().setChecked(true);
+ }
+ } else {
+ adjustWorkingSetContributions[i] = null;
+ }
+ }
+
+ //Put the new entries in
+ for(int i = 0; i < adjustWorkingSetContributions.length; i++) {
+ if(adjustWorkingSetContributions[i] != null) {
+ menu.appendToGroup(WORKING_GROUP_MARKER, adjustWorkingSetContributions[i]);
+ }
+ }
+ }
+
/**
* Sets the decorator for the package explorer.
@@ -1058,6 +1188,15 @@
}
else
initFilterFromPreferences();
+
+ //restore working set
+ String wsname = memento.getString(TAG_WORKINGSET);
+ if(wsname != null && workingSetFilter != null) {
+ IWorkingSet set = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager().getWorkingSet(wsname);
+ if(set != null) {
+ workingSetFilter.setWorkingSetName(wsname);
+ }
+ }
}
void restoreState(IMemento memento) {
@@ -1177,11 +1316,17 @@
child.putString(TAG_ELEMENT,filters[i]);
}
}
+
//save library filter
boolean showLibraries= getLibraryFilter().getShowLibraries();
String show= "true"; //$NON-NLS-1$
if (!showLibraries)
show= "false"; //$NON-NLS-1$
memento.putString(TAG_SHOWLIBRARIES, show);
+
+ String wsname = workingSetFilter.getWorkingSetName();
+ if(wsname != null) {
+ memento.putString(TAG_WORKINGSET, wsname);
+ }
}
}
Index: CWorkingSetFilter.java
===================================================================
RCS file: CWorkingSetFilter.java
diff -N CWorkingSetFilter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CWorkingSetFilter.java 20 Feb 2003 18:26:04 -0000
@@ -0,0 +1,114 @@
+package org.eclipse.cdt.internal.ui.cview;
+
+/*
+ * (c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ */
+
+import java.util.ArrayList;
+
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+
+public class CWorkingSetFilter extends ViewerFilter {
+ public static final String WORKING_SET_ACTIVE_CHANGED = CUIPlugin.getPluginId() + ".ACTIVE_CHANGED";
+
+ private IWorkingSetManager fWorkingSetManager;
+ private IWorkingSet fWorkingSet;
+ private String fWorkingSetName;
+ private ArrayList fListeners;
+
+ public CWorkingSetFilter() {
+ this(null);
+ }
+
+ public CWorkingSetFilter(IWorkingSetManager manager) {
+ fWorkingSetManager = manager;
+ fWorkingSet = null;
+ fListeners = new ArrayList(1);
+ }
+
+ public void setWorkingSetManager(IWorkingSetManager manager) {
+ fWorkingSetManager = manager;
+ }
+
+ public void setWorkingSetName(String name) {
+ fWorkingSetName = name;
+ if(name == null) {
+ fWorkingSet = null;
+ notifyChange();
+ return;
+ }
+
+ if(fWorkingSetManager != null) {
+ fWorkingSet = fWorkingSetManager.getWorkingSet(fWorkingSetName);
+ } else {
+ fWorkingSet = null;
+ }
+
+ notifyChange();
+ }
+
+ public String getWorkingSetName() {
+ return fWorkingSetName;
+ }
+
+ public void addChangeListener(IPropertyChangeListener listener) {
+ fListeners.remove(listener);
+ fListeners.add(listener);
+ }
+
+ public void removeChangeListener(IPropertyChangeListener listener) {
+ fListeners.remove(listener);
+ }
+
+ private void notifyChange() {
+ PropertyChangeEvent ev = new PropertyChangeEvent(this, WORKING_SET_ACTIVE_CHANGED, null, null);
+ for(int i = 0; i < fListeners.size(); i++) {
+ IPropertyChangeListener l = (IPropertyChangeListener)fListeners.get(i);
+ l.propertyChange(ev);
+ }
+ }
+
+ /* (non-Javadoc)
+ * Method declared on ViewerFilter.
+ */
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ //No filter set, everything allowed
+ if(fWorkingSet == null) {
+ return true;
+ }
+
+ IResource resource = null;
+ if (element instanceof IResource) {
+ resource = (IResource) element;
+ } else if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ resource = (IResource) adaptable.getAdapter(IResource.class);
+ }
+
+ //We only filter projects out (should this be ICProjects?)
+ if(!(resource instanceof IProject)) {
+ return true;
+ }
+
+ //Run our list to see if we are included in this working set
+ IAdaptable [] adaptables = fWorkingSet.getElements();
+ for(int i = 0; i < adaptables.length; i++) {
+ if(adaptables[i].equals(resource)) {
+ return true;
+ }
+ }
+
+ //Not in the working set, so we aren't shown
+ return false;
+ }
+}
Index: NewWorkingSetFilterAction.java
===================================================================
RCS file: NewWorkingSetFilterAction.java
diff -N NewWorkingSetFilterAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ NewWorkingSetFilterAction.java 20 Feb 2003 18:26:04 -0000
@@ -0,0 +1,55 @@
+package org.eclipse.cdt.internal.ui.cview;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
+
+/**
+ * @author ThomasF
+ *
+ * This action is specifically designed to invoke the working set selection
+ * dialog to allow the user to select/edit a working set.
+ */
+public class NewWorkingSetFilterAction extends Action {
+ CView cview;
+ Shell shell;
+
+ public NewWorkingSetFilterAction(Shell shell, CView cview, String label) {
+ super(label);
+ this.cview = cview;
+ this.shell = shell;
+ }
+
+ public void run() {
+ if(cview == null || shell == null) {
+ return;
+ }
+
+ IWorkingSetManager wsmanager = cview.getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
+ IWorkingSetSelectionDialog dialog;
+ dialog = wsmanager.createWorkingSetSelectionDialog(shell, false);
+ if(dialog.open() == Window.CANCEL) {
+ return;
+ }
+
+ IWorkingSet [] selection = dialog.getSelection();
+ if(selection.length != 0) {
+ CWorkingSetFilter filter = cview.getWorkingSetFilter();
+ if(filter == null) {
+ return;
+ }
+
+ filter.setWorkingSetName(selection[0].getName());
+
+ TreeViewer viewer= cview.getViewer();
+ viewer.getControl().setRedraw(false);
+ viewer.refresh();
+ viewer.getControl().setRedraw(true);
+ }
+ }
+
+}