/*******************************************************************************
* 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 org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.navigator.IExtensionStateModel;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.ui.views.ViewConstants;
/**
* @author Viacheslav Kabanovich
*/
public class SeamViewLayoutActionGroup extends ActionGroup implements ViewConstants {
public static final String LAYOUT_GROUP_NAME = "layout"; //$NON-NLS-1$
StructuredViewer structuredViewer;
IExtensionStateModel stateModel;
private boolean hasContributedToViewMenu = false;
private IAction hierarchicalLayoutAction = null;
private IAction flatLayoutAction = null;
private IAction labelScopeAction = null;
private IAction nodeScopeAction = null;
private IMenuManager layoutSubMenu;
private IMenuManager scopeSubMenu;
private MenuItem hierarchicalLayoutItem = null;
private MenuItem flatLayoutItem = null;
private MenuItem labelScopeItem = null;
private MenuItem nodeScopeItem = null;
public SeamViewLayoutActionGroup(StructuredViewer structuredViewer,
IExtensionStateModel stateModel) {
this.structuredViewer = structuredViewer;
this.stateModel = stateModel;
}
private class CommonLayoutAction extends Action implements IAction {
private String property;
private final boolean value;
public CommonLayoutAction(String property, boolean value, String id) {
super("", AS_RADIO_BUTTON); //$NON-NLS-1$
this.property = property;
this.value = value;
this.setId(id);
}
@Override
public void run() {
if (stateModel.getBooleanProperty(property) != value) {
stateModel.setBooleanProperty(property, value);
structuredViewer.getControl().setRedraw(false);
try {
structuredViewer.refresh();
} finally {
structuredViewer.getControl().setRedraw(true);
}
}
}
}
@Override
public void fillActionBars(IActionBars actionBars) {
if (!hasContributedToViewMenu) {
IMenuManager viewMenu = actionBars.getMenuManager();
// Create layout sub menu
if (layoutSubMenu == null) {
layoutSubMenu = new MenuManager(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_SEAM_PACKAGES, SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_SEAM_PACKAGES);
addLayoutActions(layoutSubMenu);
viewMenu.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS, new Separator(LAYOUT_GROUP_NAME));
}
if(scopeSubMenu == null) {
scopeSubMenu = new MenuManager(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_SCOPE_PRESENTATION, SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_SCOPE_PRESENTATION);
addScopeActions(scopeSubMenu);
}
viewMenu.appendToGroup(LAYOUT_GROUP_NAME, layoutSubMenu);
viewMenu.appendToGroup(LAYOUT_GROUP_NAME, scopeSubMenu);
hasContributedToViewMenu = true;
}
}
public void unfillActionBars(IActionBars actionBars) {
if (hasContributedToViewMenu) {
// Create layout sub menu
if (layoutSubMenu != null) {
actionBars.getMenuManager().remove(layoutSubMenu);
layoutSubMenu.dispose();
layoutSubMenu = null;
}
if (scopeSubMenu != null) {
actionBars.getMenuManager().remove(scopeSubMenu);
scopeSubMenu.dispose();
scopeSubMenu = null;
}
hasContributedToViewMenu = false;
}
}
boolean isFlatLayout = true;
boolean isScopeLable = false;
void setFlatLayout(boolean b) {
isFlatLayout = b;
if(flatLayoutAction == null) {
createActions();
flatLayoutAction.setChecked(b);
hierarchicalLayoutAction.setChecked(!b);
}
}
void setScopeLable(boolean b) {
isScopeLable = b;
if(labelScopeAction == null) {
createActions();
labelScopeAction.setChecked(b);
nodeScopeAction.setChecked(!b);
}
}
private void createActions() {
flatLayoutAction = new CommonLayoutAction(PACKAGE_STRUCTURE, true, "package.flat"); //$NON-NLS-1$
hierarchicalLayoutAction = new CommonLayoutAction(PACKAGE_STRUCTURE, false,"package.hierarchical"); //$NON-NLS-1$
labelScopeAction = new CommonLayoutAction(SCOPE_PRESENTATION, true,"layout.label"); //$NON-NLS-1$
nodeScopeAction = new CommonLayoutAction(SCOPE_PRESENTATION, false,"layout.node"); //$NON-NLS-1$
}
protected void addLayoutActions(IMenuManager viewMenu) {
viewMenu.add(new SeamContributionItem(flatLayoutAction) {
@Override
public void fill(Menu menu, int index) {
int style = SWT.RADIO;
MenuItem mi = new MenuItem(menu, style, index);
flatLayoutItem = mi;
mi.setText(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_FLAT);
mi.setSelection(isFlatLayout);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (isFlatLayout) {
flatLayoutItem.setSelection(true);
return;
}
flatLayoutAction.run();
hierarchicalLayoutItem.setSelection(false);
flatLayoutItem.setSelection(true);
isFlatLayout = true;
e.doit = false;
}
});
}
@Override
public boolean isDynamic() {
return false;
}
});
viewMenu.add(new SeamContributionItem(hierarchicalLayoutAction) {
@Override
public void fill(Menu menu, int index) {
int style = SWT.RADIO;
MenuItem mi = new MenuItem(menu, style, index);
hierarchicalLayoutItem = mi;
mi.setText(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_HIERARCHICAL);
mi.setSelection(!isFlatLayout);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!isFlatLayout) {
hierarchicalLayoutItem.setSelection(true);
return;
}
hierarchicalLayoutAction.run();
flatLayoutItem.setSelection(false);
hierarchicalLayoutItem.setSelection(true);
isFlatLayout = false;
e.doit = false;
}
});
}
@Override
public boolean isDynamic() {
return false;
}
});
}
protected void addScopeActions(IMenuManager viewMenu) {
viewMenu.add(new SeamContributionItem(labelScopeAction) {
@Override
public void fill(Menu menu, int index) {
int style = SWT.RADIO;
MenuItem mi = new MenuItem(menu, style, index);
labelScopeItem = mi;
mi.setText(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_LABEL);
mi.setSelection(isScopeLable);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (isScopeLable) {
labelScopeItem.setSelection(true);
return;
}
labelScopeAction.run();
nodeScopeItem.setSelection(false);
labelScopeItem.setSelection(true);
isScopeLable = true;
e.doit = false;
}
});
}
@Override
public boolean isDynamic() {
return false;
}
});
viewMenu.add(new SeamContributionItem(nodeScopeAction) {
@Override
public void fill(Menu menu, int index) {
int style = SWT.RADIO;
MenuItem mi = new MenuItem(menu, style, index);
nodeScopeItem = mi;
mi.setText(SeamCoreMessages.SEAM_VIEW_LAYOUT_ACTION_GROUP_NODE);
mi.setSelection(!isScopeLable);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!isScopeLable) {
nodeScopeItem.setSelection(true);
return;
}
nodeScopeAction.run();
labelScopeItem.setSelection(false);
nodeScopeItem.setSelection(true);
isScopeLable = false;
e.doit = false;
}
});
}
@Override
public boolean isDynamic() {
return false;
}
});
}
public class SeamContributionItem extends ContributionItem{
IAction action;
public SeamContributionItem(IAction action){
super(action.getId());
this.action = action;
}
public IAction getAction(){
return action;
}
}
}