content: /*******************************************************************************
   * Copyright (c) 2000, 2007 IBM Corporation and others.
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of the Eclipse Public License v1.0
   * which accompanies this distribution, and is available at
   * http://www.eclipse.org/legal/epl-v10.html
   *
   * Contributors:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.workingsets;
  
  import org.eclipse.jface.action.IMenuManager;
  import org.eclipse.jface.action.MenuManager;
  import org.eclipse.jface.action.Separator;
  import org.eclipse.jface.util.IPropertyChangeListener;
  import org.eclipse.jface.util.PropertyChangeEvent;
  import org.eclipse.jface.viewers.ISelectionProvider;
  import org.eclipse.jface.viewers.StructuredViewer;
  import org.eclipse.jface.viewers.ViewerFilter;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IMemento;
  import org.eclipse.ui.IWorkbenchPartSite;
  import org.eclipse.ui.actions.ActionGroup;
  import org.eclipse.wst.jsdt.ui.IContextMenuConstants;
  
  /**
   * An action group to provide access to the working sets.
   */
  public class ViewActionGroup extends ActionGroup {
  
  	public static final int SHOW_PROJECTS= 1;
  	public static final int SHOW_WORKING_SETS= 2;
  	public static final String MODE_CHANGED= ViewActionGroup.class.getName() + ".mode_changed"; //$NON-NLS-1$
  	
  	private static final Integer INT_SHOW_PROJECTS= Integer.valueOf(SHOW_PROJECTS);
  	private static final Integer INT_SHOW_WORKING_SETS= Integer.valueOf(SHOW_WORKING_SETS);
  	
  	private IPropertyChangeListener fChangeListener;
  	
  	private int fMode;
  	private IMenuManager fMenuManager;
  	private IWorkingSetActionGroup fActiveActionGroup;
  	private final WorkingSetShowActionGroup fShowActionGroup;
  	private final WorkingSetFilterActionGroup fFilterActionGroup;
  	private final ConfigureWorkingSetAssignementAction fWorkingSetAssignementAction;
  	private final OpenPropertiesWorkingSetAction fEditWorkingSetGroupAction; // active on working sets: edit
  	private final IWorkbenchPartSite fSite;
  
  	public ViewActionGroup(int mode, IPropertyChangeListener changeListener, IWorkbenchPartSite site) {
  		fChangeListener= changeListener;
  		fSite= site;
  		if (fChangeListener == null) {
  			fChangeListener = new IPropertyChangeListener() {
  				public void propertyChange(PropertyChangeEvent event) {}
  			};
  		}
  		fFilterActionGroup= new WorkingSetFilterActionGroup(site, fChangeListener);
  		fShowActionGroup= new WorkingSetShowActionGroup(site);
  		fWorkingSetAssignementAction= new ConfigureWorkingSetAssignementAction(site);
  		fEditWorkingSetGroupAction= new OpenPropertiesWorkingSetAction(site);
  
  		ISelectionProvider selectionProvider= site.getSelectionProvider();
  		selectionProvider.addSelectionChangedListener(fWorkingSetAssignementAction);
  		selectionProvider.addSelectionChangedListener(fEditWorkingSetGroupAction);
  		
  		fMode= mode;
  		if (showWorkingSets())
  			fActiveActionGroup= fShowActionGroup;
  		else
  			fActiveActionGroup= fFilterActionGroup;
  	}
  	
  	public void dispose() {
  		fFilterActionGroup.dispose();
  		fShowActionGroup.dispose();
  		fChangeListener= null;
  		ISelectionProvider selectionProvider= fSite.getSelectionProvider();
  		selectionProvider.removeSelectionChangedListener(fWorkingSetAssignementAction);
  		selectionProvider.removeSelectionChangedListener(fEditWorkingSetGroupAction);
  		super.dispose();
  	}
  	
  	public void setWorkingSetModel(WorkingSetModel model) {
  		fShowActionGroup.setWorkingSetMode(model);
  		fWorkingSetAssignementAction.setWorkingSetModel(model);
  	}
  	
  	public void fillContextMenu(IMenuManager menu) {
  		if (fWorkingSetAssignementAction.isEnabled())
  			menu.appendToGroup(IContextMenuConstants.GROUP_BUILD, fWorkingSetAssignementAction);
  		
  		if (fEditWorkingSetGroupAction.isEnabled()) {
  			menu.appendToGroup(IContextMenuConstants.GROUP_BUILD, fEditWorkingSetGroupAction);
  		}
  	}
  
  	/**
  	 * {@inheritDoc}
  	 */
  	public void fillActionBars(IActionBars actionBars) {
  		super.fillActionBars(actionBars);
  		fMenuManager= actionBars.getMenuManager();
  		fillViewMenu(fMenuManager);
  
  		if (fActiveActionGroup == null)
  			fActiveActionGroup= fFilterActionGroup;
  		((ActionGroup)fActiveActionGroup).fillActionBars(actionBars);
  	}
  	
  	private void fillViewMenu(IMenuManager menu) { 
  		IMenuManager showMenu= new MenuManager(WorkingSetMessages.ViewActionGroup_show_label); 
  		fillShowMenu(showMenu);
  		menu.add(showMenu);
  		menu.add(new Separator(IWorkingSetActionGroup.ACTION_GROUP));
  	}
  	
  	private void fillShowMenu(IMenuManager menu) {
  		ViewAction projects= new ViewAction(this, SHOW_PROJECTS);
  		projects.setText(WorkingSetMessages.ViewActionGroup_projects_label); 
  		menu.add(projects);
  		ViewAction workingSets= new ViewAction(this, SHOW_WORKING_SETS);
  		workingSets.setText(WorkingSetMessages.ViewActionGroup_workingSets_label); 
  		menu.add(workingSets);
  		if (fMode == SHOW_PROJECTS) {
  			projects.setChecked(true);
  		} else {
  			workingSets.setChecked(true);
  		}
  	}
  
  	public void fillFilters(StructuredViewer viewer) {
  		ViewerFilter workingSetFilter= fFilterActionGroup.getWorkingSetFilter();
  		if (showProjects()) {
  			viewer.addFilter(workingSetFilter);
  		} else if (showWorkingSets()) {
  			viewer.removeFilter(workingSetFilter);
  		}
  	}
  	
  	public void setMode(int mode) {
  		fMode= mode;
  		fActiveActionGroup.cleanViewMenu(fMenuManager);
  		PropertyChangeEvent event;
  		if (mode == SHOW_PROJECTS) {
  			fActiveActionGroup= fFilterActionGroup;
  			event= new PropertyChangeEvent(this, MODE_CHANGED, INT_SHOW_WORKING_SETS, INT_SHOW_PROJECTS);
  		} else {
  			fActiveActionGroup= fShowActionGroup;
  			event= new PropertyChangeEvent(this, MODE_CHANGED, INT_SHOW_PROJECTS, INT_SHOW_WORKING_SETS);
  		}
  		fActiveActionGroup.fillViewMenu(fMenuManager);
  		fMenuManager.updateAll(true);
  		if(fChangeListener != null)
  			fChangeListener.propertyChange(event);
  	}
  	
  	public WorkingSetFilterActionGroup getFilterGroup() {
  		return fFilterActionGroup;
  	}
  
  	public void restoreState(IMemento memento) {
  		fFilterActionGroup.restoreState(memento);
  	}
  
  	public void saveState(IMemento memento) {
  		fFilterActionGroup.saveState(memento);
  	}
  	
  	private boolean showProjects() {
  		return fMode == SHOW_PROJECTS;
  	}
  	
  	private boolean showWorkingSets() {
  		return fMode == SHOW_WORKING_SETS;
  	}
  }
  