content: /*******************************************************************************
   * Copyright (c) 2003, 2008 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.navigator;
  
  import java.util.Arrays;
  
  import org.eclipse.jface.preference.IPreferenceStore;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IMemento;
  import org.eclipse.ui.actions.ActionContext;
  import org.eclipse.ui.navigator.CommonActionProvider;
  import org.eclipse.ui.navigator.ICommonActionExtensionSite;
  import org.eclipse.ui.navigator.IExtensionActivationListener;
  import org.eclipse.ui.navigator.IExtensionStateModel;
  import org.eclipse.ui.navigator.INavigatorActivationService;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.internal.ui.navigator.IExtensionStateConstants.Values;
  
  /**
   * Contributes the following actions to the menu on behalf of the JDT content
   * extension.
   * 
   * <ul>
   * <li>{@link CommonLayoutActionGroup}. Contributes the "Package Presentation>" submenu in the View's drop down menu (not right-click).</li>
   * </ul>
   */
  public class JavaNavigatorViewActionProvider extends CommonActionProvider {
  
  	private static final int HIERARCHICAL_LAYOUT= 0x1;
  
  	private static final int FLAT_LAYOUT= 0x2;
  
  	private static final String TAG_LAYOUT= "org.eclipse.wst.jsdt.internal.ui.navigator.layout"; //$NON-NLS-1$ 
  
  	private IExtensionStateModel fStateModel;
  
  	private CommonLayoutActionGroup fLayoutActionGroup;
  
  	private ICommonActionExtensionSite fExtensionSite;
  
  	private String fExtensionId;
  
  	private IActionBars fActionBars;
  
  	private boolean fEnabled= false;
  
  	private IExtensionActivationListener fMenuUpdater= new IExtensionActivationListener() {
  
  		public void onExtensionActivation(String viewerId, String[] theNavigatorExtensionIds, boolean isCurrentlyActive) {
  
  			if (fExtensionSite != null && fActionBars != null) {
  
  				int search= Arrays.binarySearch(theNavigatorExtensionIds, fExtensionId);
  				if (search > -1) {
  					if (isMyViewer(viewerId)) {
  						if (wasEnabled(isCurrentlyActive))
  							fLayoutActionGroup.fillActionBars(fActionBars);
  
  						else
  							if (wasDisabled(isCurrentlyActive))
  								fLayoutActionGroup.unfillActionBars(fActionBars);
  						// else no change 
  					}
  					fEnabled= isCurrentlyActive;
  				}
  			}
  
  		}
  
  		private boolean isMyViewer(String viewerId) {
  			String myViewerId= fExtensionSite.getViewSite().getId();
  			return myViewerId != null && myViewerId.equals(viewerId);
  		}
  
  		private boolean wasDisabled(boolean isActive) {
  			return fEnabled && !isActive;
  		}
  
  		private boolean wasEnabled(boolean isActive) {
  			return !fEnabled && isActive;
  		}
  	};
  
  
  	public void fillActionBars(IActionBars actionBars) {
  		fActionBars= actionBars;
  		fLayoutActionGroup.fillActionBars(actionBars);
  	}
  
  	public void init(ICommonActionExtensionSite site) {
  
  		fExtensionSite= site;
  
  		fStateModel= fExtensionSite.getExtensionStateModel();
  		fLayoutActionGroup= new CommonLayoutActionGroup(fExtensionSite.getStructuredViewer(), fStateModel);
  
  		INavigatorActivationService activationService= fExtensionSite.getContentService().getActivationService();
  		activationService.addExtensionActivationListener(fMenuUpdater);
  
  		fExtensionId= fExtensionSite.getExtensionId();
  
  		fEnabled= true;
  
  	}
  
  	public void dispose() {
  		super.dispose();
  		fExtensionSite.getContentService().getActivationService().removeExtensionActivationListener(fMenuUpdater);
  	}
  
  	public void setContext(ActionContext context) {
  		super.setContext(context);
  	}
  
  	public void restoreState(IMemento memento) {
  		boolean isCurrentLayoutFlat= false;
  		Integer state= null;
  		if (memento != null)
  			state= memento.getInteger(TAG_LAYOUT);
  
  		// If no memento try an restore from preference store
  		if (state == null) {
  			IPreferenceStore store= JavaScriptPlugin.getDefault().getPreferenceStore();
  			state= Integer.valueOf(store.getInt(TAG_LAYOUT));
  		}
  
  		if (state.intValue() == FLAT_LAYOUT)
  			isCurrentLayoutFlat= true;
  		else
  			if (state.intValue() == HIERARCHICAL_LAYOUT)
  				isCurrentLayoutFlat= false;
  
  		fStateModel.setBooleanProperty(Values.IS_LAYOUT_FLAT, isCurrentLayoutFlat);
  		fLayoutActionGroup.setFlatLayout(isCurrentLayoutFlat);
  	}
  
  	public void saveState(IMemento aMemento) {
  		super.saveState(aMemento);
  		IPreferenceStore store= JavaScriptPlugin.getDefault().getPreferenceStore();
  		if (fStateModel.getBooleanProperty(Values.IS_LAYOUT_FLAT))
  			store.setValue(TAG_LAYOUT, FLAT_LAYOUT);
  		else
  			store.setValue(TAG_LAYOUT, HIERARCHICAL_LAYOUT);
  
  	}
  }
  