Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Working Sets for CView ... again

Hmm,

Alain and Dave have given me a hard time over the patch format. Here is is again.

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 20:44:28 -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 20:44:28 -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 20:44:27 -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 20:44:28 -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);
+		}
+	}
+
+}

Back to the top