/**
* <copyright>
* </copyright>
*
* $Id$
*/
package net.enilink.komma.edit.ui.rcp.internal.editor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import net.enilink.komma.common.ui.viewer.IViewerProvider;
import net.enilink.komma.edit.domain.IEditingDomain;
import net.enilink.komma.edit.domain.IEditingDomainProvider;
import net.enilink.komma.edit.ui.action.CreateChildrenActionContributor;
import net.enilink.komma.edit.ui.action.EditingDomainActionBarContributor;
import net.enilink.komma.edit.ui.action.ValidateAction;
import net.enilink.komma.edit.ui.rcp.KommaEditUIRCP;
/**
* This is the action bar contributor for the default model editor.
*/
public class ActionBarContributor extends EditingDomainActionBarContributor
implements ISelectionChangedListener {
/**
* This keeps track of the active editor.
*/
protected IEditorPart activeEditorPart;
protected CreateChildrenActionContributor createChildActionContributor = new CreateChildrenActionContributor();
/**
* This action refreshes the viewer of the current editor if the editor
* implements {@link IViewerProvider}.
*/
protected IAction refreshViewerAction = new Action(
KommaEditUIRCP.INSTANCE.getString("_UI_RefreshViewer_menu_item")) {
@Override
public boolean isEnabled() {
return activeEditorPart instanceof IViewerProvider;
}
@Override
public void run() {
if (activeEditorPart instanceof IViewerProvider) {
Viewer viewer = ((IViewerProvider) activeEditorPart)
.getViewer();
if (viewer != null) {
viewer.refresh();
}
}
}
};
/**
* This keeps track of the current selection provider.
*/
protected ISelectionProvider selectionProvider;
/**
* This action opens the Properties view.
*/
protected IAction showPropertiesViewAction = new Action(
KommaEditUIRCP.INSTANCE
.getString("_UI_ShowPropertiesView_menu_item")) {
@Override
public void run() {
try {
getPage().showView("org.eclipse.ui.views.PropertySheet");
} catch (PartInitException exception) {
KommaEditUIRCP.INSTANCE.log(exception);
}
}
};
/**
* This creates an instance of the contributor.
*/
public ActionBarContributor() {
super(ADDITIONS_LAST_STYLE);
}
/**
* This inserts global actions before the "additions-end" separator.
*/
@Override
protected void addGlobalActions(IMenuManager menuManager) {
menuManager.insertAfter("additions-end", new Separator("ui-actions"));
menuManager.insertAfter("ui-actions", showPropertiesViewAction);
refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
menuManager.insertAfter("ui-actions", refreshViewerAction);
super.addGlobalActions(menuManager);
}
/**
* This adds to the menu bar a menu and some separators for editor
* additions, as well as the sub-menus for object creation items.
*/
@Override
public void contributeToMenu(IMenuManager menuManager) {
super.contributeToMenu(menuManager);
IMenuManager editorMenuManager = new MenuManager(
KommaEditUIRCP.INSTANCE.getString("_UI_BasicEditor_menu"),
"BasicEditor");
menuManager.insertAfter("additions", editorMenuManager);
editorMenuManager.add(new Separator("settings"));
editorMenuManager.add(new Separator("actions"));
editorMenuManager.add(new Separator("additions"));
editorMenuManager.add(new Separator("additions-end"));
createChildActionContributor.contributeToMenu(editorMenuManager,
"additions");
// Force an update because Eclipse hides empty menus now.
editorMenuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager menuManager) {
menuManager.updateAll(true);
}
});
addGlobalActions(editorMenuManager);
}
/**
* This adds Separators for editor additions to the tool bar.
*/
@Override
public void contributeToToolBar(IToolBarManager toolBarManager) {
toolBarManager.add(new Separator("editor-settings"));
toolBarManager.add(new Separator("editor-additions"));
}
@Override
public void init(IActionBars bars, IWorkbenchPage page) {
super.init(bars, page);
validateAction = new ValidateAction(page);
}
/**
* This populates the pop-up menu before it appears.
*/
@Override
public void menuAboutToShow(IMenuManager menuManager) {
super.menuAboutToShow(menuManager);
createChildActionContributor.menuAboutToShow(menuManager, "edit");
}
/**
* This ensures that a delete action will clean up all references to deleted
* objects.
*/
@Override
protected boolean removeAllReferencesOnDelete() {
return true;
}
/**
* This implements
* {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling
* {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for
* the children and siblings that can be added to the selected object and
* updating the menus accordingly.
*/
public void selectionChanged(SelectionChangedEvent event) {
final IEditingDomain domain = ((IEditingDomainProvider) activeEditorPart)
.getEditingDomain();
createChildActionContributor.selectionChanged(activeEditorPart, domain,
event.getSelection());
}
/**
* When the active editor changes, this remembers the change and registers
* with it as a selection provider.
*/
@Override
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
activeEditorPart = part;
// Switch to the new selection provider.
if (selectionProvider != null) {
selectionProvider.removeSelectionChangedListener(this);
}
if (part == null) {
selectionProvider = null;
} else {
selectionProvider = part.getSite().getSelectionProvider();
selectionProvider.addSelectionChangedListener(this);
// Fake a selection changed event to update the menus.
if (selectionProvider.getSelection() != null) {
selectionChanged(new SelectionChangedEvent(selectionProvider,
selectionProvider.getSelection()));
}
}
}
@Override
public void dispose() {
if (selectionProvider != null) {
selectionProvider.removeSelectionChangedListener(this);
selectionProvider = null;
}
if (createChildActionContributor != null) {
createChildActionContributor.dispose();
createChildActionContributor = null;
}
super.dispose();
}
}