/*******************************************************************************
* Copyright (c) 2008, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.ui.widgets.masterdetails;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.action.ValidateAction;
import org.eclipse.emf.eef.runtime.EEFRuntimePlugin;
import org.eclipse.emf.eef.runtime.ui.editors.pages.EEFDetailsPage;
import org.eclipse.emf.eef.runtime.ui.layout.EEFFormLayoutFactory;
import org.eclipse.emf.eef.runtime.ui.notify.OpenWizardOnDoubleClick;
import org.eclipse.emf.eef.runtime.ui.utils.EEFRuntimeUIMessages;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.DetailsPart;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IDetailsPageProvider;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.MasterDetailsBlock;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*
*/
public abstract class AbstractEEFMasterDetailsBlock extends MasterDetailsBlock {
protected FormToolkit toolkit;
protected AbstractEEFMasterPart masterPart;
protected EditingDomain editingDomain;
private AdapterFactory adapterFactory;
protected ValidateAction validateAction;
private EEFDetailsPage lastDetailsPage;
private boolean orientable = true;
private boolean showValidateAction = true;
/**
* Default constructor.
* The block is orientable.
*/
public AbstractEEFMasterDetailsBlock() {
super();
}
/**
* Constructor defining if the orientation of the block can be changed and if the validate action is visible.
* @param isOrientable the block is orientable or not.
* @param showValidationAction defining the visibility of the action.
*/
public AbstractEEFMasterDetailsBlock(boolean isOrientable, boolean showValidationAction) {
this();
orientable = isOrientable;
this.showValidateAction = showValidationAction;
}
/**
* {@inheritDoc}
* @see org.eclipse.ui.forms.MasterDetailsBlock#createMasterPart(org.eclipse.ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite)
*/
protected final void createMasterPart(IManagedForm managedForm, Composite parent) {
this.toolkit = managedForm.getToolkit();
Composite masterContainer = managedForm.getToolkit().createComposite(parent);
masterContainer.setLayout(EEFFormLayoutFactory.createMasterGridLayout(false, 1));
masterContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
masterPart = createEEFMasterPart(masterContainer);
managedForm.addPart(masterPart);
Section section = masterPart.getSection();
section.setLayout(EEFFormLayoutFactory.createClearGridLayout(false, 1));
section.setLayoutData(new GridData(GridData.FILL_BOTH));
masterPart.getModelViewer().addDoubleClickListener((new OpenWizardOnDoubleClick(editingDomain, getAdapterFactory())));
if (showValidateAction) {
masterPart.addSelectionChangeListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection)
validateAction.updateSelection((IStructuredSelection) selection);
}
});
}
}
/**
* Create contents of the Master part
* @param masterContainer the container of this contents
* @return an EEFMasterPart defining the contents of the MasterPart
*/
protected abstract AbstractEEFMasterPart createEEFMasterPart(Composite masterContainer);
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.forms.MasterDetailsBlock#createToolBarActions(org.eclipse.ui.forms.IManagedForm)
*/
protected void createToolBarActions(IManagedForm managedForm) {
final ScrolledForm form = managedForm.getForm();
if (showValidateAction) {
validateAction = new ValidateAction();
validateAction.setToolTipText(EEFRuntimeUIMessages.AbstractEEFMasterDetailsBlock_validate_action_tooltip);
validateAction.setImageDescriptor(EEFRuntimePlugin.getImageDescriptor(EEFRuntimePlugin.ICONS_16x16 + "validate.gif")); //$NON-NLS-1$
form.getToolBarManager().add(validateAction);
}
if (orientable) {
Action haction = new Action("hor", IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$
public void run() {
sashForm.setOrientation(SWT.HORIZONTAL);
form.reflow(true);
}
};
haction.setChecked(true);
haction.setToolTipText(EEFRuntimeUIMessages.AbstractEEFMasterDetailsBlock_horizontal_layout);
haction.setImageDescriptor(EEFRuntimePlugin.getImageDescriptor(EEFRuntimePlugin.ICONS_16x16 + "th_horizontal.gif")); //$NON-NLS-1$
haction.setDisabledImageDescriptor(EEFRuntimePlugin.getImageDescriptor(EEFRuntimePlugin.ICONS_16x16 + "disabled/th_horizontal.gif")); //$NON-NLS-1$
form.getToolBarManager().add(haction);
Action vaction = new Action("ver", IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$
public void run() {
sashForm.setOrientation(SWT.VERTICAL);
form.reflow(true);
}
};
vaction.setChecked(false);
vaction.setToolTipText(EEFRuntimeUIMessages.AbstractEEFMasterDetailsBlock_vertical_layout);
vaction.setImageDescriptor(EEFRuntimePlugin.getImageDescriptor(EEFRuntimePlugin.ICONS_16x16 + "th_vertical.gif")); //$NON-NLS-1$
vaction.setDisabledImageDescriptor(EEFRuntimePlugin.getImageDescriptor(EEFRuntimePlugin.ICONS_16x16 + "disabled/th_vertical.gif")); //$NON-NLS-1$
form.getToolBarManager().add(vaction);
}
if (additionalPageActions() != null) {
for (Action additionalAction : additionalPageActions()) {
form.getToolBarManager().add(additionalAction);
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.forms.MasterDetailsBlock#registerPages(org.eclipse.ui.forms.DetailsPart)
*/
protected void registerPages(DetailsPart detailsPart) {
detailsPart.setPageProvider(new IDetailsPageProvider() {
public Object getPageKey(Object object) {
if (object instanceof EObject)
return EObject.class;
return object.getClass();
}
public IDetailsPage getPage(Object key) {
if (key.equals(EObject.class)) {
lastDetailsPage = new EEFDetailsPage(toolkit, editingDomain, adapterFactory);
return lastDetailsPage;
}
return null;
}
});
}
/**
* @return the master part of the block
*/
public AbstractEEFMasterPart getMasterPart() {
return masterPart;
}
/**
* @return the lastDetailsPage
*/
public EEFDetailsPage getLastDetailsPage() {
return lastDetailsPage;
}
/**
* Defines the orientation of the block.
* @param orientation the orientation to set
*/
public void setOrientation(int orientation) {
sashForm.setOrientation(orientation);
}
/**
* @return the adapterFactory
*/
public AdapterFactory getAdapterFactory() {
return masterPart.getAdapterFactory();
}
/**
* @param adapterFactory the adapterFactory to set
*/
public void setAdapterFactory(AdapterFactory adapterFactory) {
this.adapterFactory = adapterFactory;
masterPart.setAdapterFactory(adapterFactory);
}
/**
* @return the editingDomain
*/
public EditingDomain getEditingDomain() {
return editingDomain;
}
/**
* @param editingDomain the editingDomain to set
*/
public void setEditingDomain(EditingDomain editingDomain) {
this.editingDomain = editingDomain;
}
/**
* @param input the input of the model viewer
*/
public void setInput(Object input) {
masterPart.setInput(input);
}
/**
* @param filter add a filter to the model viewer
*/
public void addFilter(ViewerFilter filter) {
masterPart.addFilter(filter);
}
/**
* @return the list of actions to add to the form toolbar
*/
protected List<Action> additionalPageActions() {
// nothing to add
return null;
}
}