blob: 1a9f858a25b8063958ec0188218ead4975a0939d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 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.tree;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.eef.runtime.EEFRuntimePlugin;
import org.eclipse.emf.eef.runtime.impl.utils.EEFCommandParameter;
import org.eclipse.emf.eef.runtime.ui.layout.EEFFormLayoutFactory;
import org.eclipse.emf.eef.runtime.ui.notify.DropDownSelectionListener;
import org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.AbstractEEFMasterDetailsBlock;
import org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.AbstractEEFMasterPart;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class EEFTreeMasterPart extends AbstractEEFMasterPart {
private List<EEFCommandParameter> commandParameters;
private EObject modelRoot;
private EditingDomain editingDomain;
private Composite modelToolBar;
private boolean showModelToolBar = true;
/**
* @param managedForm
* the form where this part will be
* @param container
* the composite where to create the part
* @param block
* the AbstractEEFMasterDetailsBlock which will contain this part
*/
public EEFTreeMasterPart(FormToolkit toolkit, Composite container, AbstractEEFMasterDetailsBlock block) {
super(toolkit, container, block);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.AbstractEEFMasterPart#createSectionClientContents(org.eclipse.swt.widgets.Composite,
* org.eclipse.ui.forms.widgets.FormToolkit)
*/
protected TreeViewer createSectionClientContents(Composite sectionContainer, FormToolkit toolkit) {
Tree tree = toolkit.createTree(sectionContainer, SWT.MULTI | SWT.BORDER);
TreeViewer result = new TreeViewer(tree);
result.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory()));
result.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory()));
GridData gd = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(gd);
return result;
}
/**
* @return the list of command parameters
*/
public List<EEFCommandParameter> getCommandParameter() {
if (commandParameters == null) {
createCommandParameters();
}
return commandParameters;
}
/**
* initialize the command parameters. If this method is called whether command parameters are already
* initialized, old values will be erased
*/
private void createCommandParameters() {
if (modelRoot == null) {
commandParameters = new ArrayList<EEFCommandParameter>();
} else {
ViewerFilter[] filters = getModelViewer().getFilters();
commandParameters = new ArrayList<EEFCommandParameter>();
for (EReference reference : modelRoot.eClass().getEAllReferences()) {
if (!reference.isContainment()) {
// Create command parameter for containment references only.
continue;
} else if (filters.length > 0) {
// if filters has been added
for (ViewerFilter filter : filters) {
if (filter.select(modelViewer, modelRoot,
EcoreUtil.create(reference.getEReferenceType()))) {
commandParameters.add(new EEFCommandParameter(reference, reference
.getEReferenceType()));
}
}
} else {
commandParameters.add(new EEFCommandParameter(reference, reference.getEReferenceType()));
}
}
}
}
/**
* {@inheritDoc}
*/
@Override
protected void createSectionClient(Composite sectionContainer, FormToolkit toolkit) {
sectionContainer.setLayout(new GridLayout());
createModelRoot();
if (modelRoot != null) {
createToolBar(sectionContainer, toolkit);
}
createModelViewer(sectionContainer, toolkit);
}
/**
* initialize model root
*/
private void createModelRoot() {
editingDomain = getBlock().getEditingDomain();
if (editingDomain instanceof AdapterFactoryEditingDomain) {
AdapterFactoryEditingDomain afed = (AdapterFactoryEditingDomain)editingDomain;
setAdapterFactory(afed.getAdapterFactory());
EList<Resource> resources = afed.getResourceSet().getResources();
if (resources != null && resources.size() != 0) {
// Assuming the main resource is the first resource
Resource resource = resources.get(0);
if (resource.getContents() != null && resource.getContents().size() > 0) {
modelRoot = resource.getContents().get(0);
}
}
}
}
/**
* create the tool bar (add button and delete button)
*
* @param sectionContainer
* @param toolkit
*/
private void createToolBar(Composite sectionContainer, FormToolkit toolkit) {
if (modelRoot != null) {
modelToolBar = new Composite(sectionContainer, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = true;
modelToolBar.setLayout(layout);
// if the root element doesn't has any child, the toolbar (add and delete buttons) is hidden.
if (modelRoot.eClass().getEAllReferences().size() == 0)
modelToolBar.setVisible(false);
// Add button
createAddButton(toolkit, modelToolBar);
// delete button
createDeleteButton(toolkit, modelToolBar);
}
}
/**
* Create the TreeView container
*
* @param sectionContainer
* @param toolkit
*/
private void createModelViewer(Composite sectionContainer, FormToolkit toolkit) {
Composite modelViewerComposite = new Composite(sectionContainer, SWT.NONE);
modelViewerComposite.setLayout(EEFFormLayoutFactory.createMasterGridLayout(false, 1));
modelViewerComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
super.createSectionClient(modelViewerComposite, toolkit);
}
/**
* initialize delete button
*
* @param toolkit
*/
private void createDeleteButton(FormToolkit toolkit, Composite modelToolBar) {
Button delete = toolkit.createButton(modelToolBar, "", SWT.PUSH);
delete.setImage(EEFRuntimePlugin.getImage(EEFRuntimePlugin.ICONS_16x16 + "Delete_16x16.gif"));
delete.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection)getModelViewer().getSelection();
for (Object object : selection.toList()) {
if (editingDomain != null) {
Command command = RemoveCommand.create(editingDomain, object);
editingDomain.getCommandStack().execute(command);
}
}
}
});
}
/**
* initialize add button
*
* @param toolkit
*/
private void createAddButton(FormToolkit toolkit, Composite modelToolBar) {
Button add = toolkit.createButton(modelToolBar, "", SWT.PUSH);
add.setImage(EEFRuntimePlugin.getImage(EEFRuntimePlugin.ICONS_16x16 + "Add_16x16.gif"));
DropDownSelectionListener listenerAdd = new DropDownSelectionListener(add) {
boolean init = false;
@Override
public void widgetSelected(SelectionEvent e) {
if (!init) {
// add every element into menu
for (EEFCommandParameter commandParameter : getCommandParameter()) {
add(commandParameter);
}
if (menu.getItemCount() == 0) {
((Button)e.getSource()).setEnabled(false);
}
init = true;
}
super.widgetSelected(e);
}
public void add(final EEFCommandParameter commandParameter) {
IItemLabelProvider adapte = (IItemLabelProvider)getAdapterFactory().adapt(
EcoreUtil.create(commandParameter.geteClass()), IItemLabelProvider.class);
URL image = (URL)adapte.getImage(EcoreUtil.create(commandParameter.geteClass()));
MenuItem menuItem = new MenuItem(menu, SWT.NONE);
menuItem.setText(adapte.getText(EcoreUtil.create(commandParameter.geteClass())));
menuItem.setImage(ImageDescriptor.createFromURL(image).createImage(menuItem.getDisplay()));
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
EObject value = EcoreUtil.create(commandParameter.geteClass());
if (editingDomain != null) {
Command command = AddCommand.create(editingDomain, modelRoot, null, value);
editingDomain.getCommandStack().execute(command);
}
// try {
// modelRoot.eResource().save(Collections.EMPTY_MAP);
//
// } catch (IOException e1) {
// e1.printStackTrace();
// }
}
});
}
};
add.addSelectionListener(listenerAdd);
}
/**
* {@inheritDoc}
*/
@Override
public void addFilter(ViewerFilter filter) {
super.addFilter(filter);
createCommandParameters();
if (modelToolBar != null) {
if (commandParameters.size() == 0) {
modelToolBar.setVisible(false);
} else if (showModelToolBar != false) {
modelToolBar.setVisible(true);
}
}
}
public void showToolBar(boolean value) {
if (modelToolBar != null) {
modelToolBar.setVisible(value);
showModelToolBar = value;
}
}
}