/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.views.actions;
import java.util.Arrays;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.PlatformUI;
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.jboss.tools.seam.core.SeamPreferences;
import org.jboss.tools.seam.ui.views.ViewConstants;
/**
* Action provider for Seam Components view.
* @author Viacheslav Kabanovich
*/
public class ScopePresentationActionProvider extends CommonActionProvider implements ViewConstants {
private ICommonActionExtensionSite fExtensionSite;
IExtensionStateModel stateModel;
private String fExtensionId;
private IActionBars fActionBars;
private boolean fEnabled = false;
SeamViewLayoutActionGroup actionGroup;
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))
actionGroup.fillActionBars(fActionBars);
else
if (wasDisabled(isCurrentlyActive)) {
actionGroup.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 ScopePresentationActionProvider() {}
@Override
public void init(ICommonActionExtensionSite site) {
super.init(site);
fExtensionSite = site;
stateModel = site.getExtensionStateModel();
actionGroup = new SeamViewLayoutActionGroup(fExtensionSite.getStructuredViewer(), stateModel);
INavigatorActivationService activationService= fExtensionSite.getContentService().getActivationService();
activationService.addExtensionActivationListener(fMenuUpdater);
fExtensionId = fExtensionSite.getExtensionId();
fEnabled = true;
}
public static void setPackageStructureFlat(boolean s) {
IEclipsePreferences p = SeamPreferences.getInstance().getInstancePreferences();
p.put(PACKAGE_STRUCTURE, s ? PACKAGES_FLAT : PACKAGES_HIERARCHICAL);
}
public static void setScopePresentedAsLabel(boolean s) {
IEclipsePreferences p = SeamPreferences.getInstance().getInstancePreferences();
p.put(SCOPE_PRESENTATION, s ? SCOPE_AS_LABEL : SCOPE_AS_NODE);
}
@Override
public void fillActionBars(IActionBars actionBars) {
fActionBars = actionBars;
actionGroup.fillActionBars(actionBars);
}
@Override
public void dispose() {
super.dispose();
fExtensionSite.getContentService().getActivationService().removeExtensionActivationListener(fMenuUpdater);
}
void updateViewer() {
BusyIndicator.showWhile(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell().getDisplay(),
new Runnable() {
public void run() {
getActionSite().getStructuredViewer().refresh();
}
}
);
}
@Override
public void restoreState(IMemento memento) {
boolean isCurrentLayoutFlat = true;
String state = null;
if (memento != null)
state = memento.getString("seam-isFlatLayout"); //$NON-NLS-1$
if (state == null) {
state = SeamPreferences.getInstance().getInstancePreference(PACKAGE_STRUCTURE);
}
isCurrentLayoutFlat = !(PACKAGES_HIERARCHICAL.equals(state));
setFlatLayout(isCurrentLayoutFlat);
boolean isCurrentScopeLabel = false;
state = null;
if (memento != null)
state = memento.getString("seam-isScopeLabel"); //$NON-NLS-1$
if (state == null) {
state = SeamPreferences.getInstance().getInstancePreference(SCOPE_PRESENTATION);
}
isCurrentScopeLabel = !SCOPE_AS_NODE.equals(state);
setScopeLable(isCurrentScopeLabel);
}
@Override
public void saveState(IMemento aMemento) {
super.saveState(aMemento);
setPackageStructureFlat(stateModel.getBooleanProperty(PACKAGE_STRUCTURE));
setScopePresentedAsLabel(stateModel.getBooleanProperty(SCOPE_PRESENTATION));
}
void setFlatLayout(boolean b) {
stateModel.setBooleanProperty(PACKAGE_STRUCTURE, b);
actionGroup.setFlatLayout(b);
}
void setScopeLable(boolean b) {
stateModel.setBooleanProperty(SCOPE_PRESENTATION, b);
actionGroup.setScopeLable(b);
}
}