/*******************************************************************************
* Copyright (c) 2008 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.smooks.configuration.editors;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.MoveCommand;
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.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
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.ui.IEditorPart;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.model.common.AbstractAnyType;
/**
* @author Dart
*
*/
public class ModelChildrenTablePanelCreator {
private ISmooksModelProvider smooksModelProvider;
protected TableViewer childrenTableViewer;
private Button newChildButton;
private Button removeRemoveButton;
private Button upChildButton;
private Button downChildButton;
private Button childPropertiesButton;
private EObject parentModel;
private FormToolkit toolkit;
private IEditorPart editorPart;
public ModelChildrenTablePanelCreator(ISmooksModelProvider smooksModelProvider, EObject parentModel,
FormToolkit toolkit, IEditorPart editorPart) {
this.parentModel = parentModel;
this.smooksModelProvider = smooksModelProvider;
this.toolkit = toolkit;
this.editorPart = editorPart;
}
public Composite createChildrenTablePanel(Composite parent) {
Composite mainComposite = toolkit.createComposite(parent);
GridLayout gl = new GridLayout();
gl.numColumns = 2;
mainComposite.setLayout(gl);
createChildrenTablePanel(mainComposite, toolkit);
return mainComposite;
}
protected void createChildrenTablePanel(Composite mainComposite, FormToolkit toolkit) {
if (smooksModelProvider != null) {
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) smooksModelProvider
.getEditingDomain();
EObject parentModel = getParentModel();
childrenTableViewer = new TableViewer(mainComposite);
GridData gd = new GridData(GridData.FILL_BOTH);
childrenTableViewer.getControl().setLayoutData(gd);
toolkit.paintBordersFor(mainComposite);
Composite buttonArea = toolkit.createComposite(mainComposite);
gd = new GridData(GridData.FILL_VERTICAL);
gd.widthHint = 30;
GridLayout bgl = new GridLayout();
buttonArea.setLayout(bgl);
newChildButton = toolkit.createButton(buttonArea, Messages.ModelChildrenTablePanelCreator_NewButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.BEGINNING;
newChildButton.setLayoutData(gd);
removeRemoveButton = toolkit.createButton(buttonArea, Messages.ModelChildrenTablePanelCreator_RemoveButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.BEGINNING;
removeRemoveButton.setLayoutData(gd);
upChildButton = toolkit.createButton(buttonArea, Messages.ModelChildrenTablePanelCreator_UpButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.BEGINNING;
upChildButton.setLayoutData(gd);
downChildButton = toolkit.createButton(buttonArea, Messages.ModelChildrenTablePanelCreator_DownButtonLable, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.BEGINNING;
downChildButton.setLayoutData(gd);
childPropertiesButton = toolkit.createButton(buttonArea, Messages.ModelChildrenTablePanelCreator_PropertiesButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.BEGINNING;
childPropertiesButton.setLayoutData(gd);
childrenTableViewer
.setContentProvider(new AdapterFactoryContentProvider(editingDomain.getAdapterFactory()) {
@Override
public boolean hasChildren(Object object) {
return false;
}
});
childrenTableViewer.setLabelProvider(new DecoratingLabelProvider(new AdapterFactoryLabelProvider(
editingDomain.getAdapterFactory()) {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
* # getText(java.lang.Object)
*/
@Override
public String getText(Object object) {
Object obj = AdapterFactoryEditingDomain.unwrap(object);
if (obj instanceof AbstractAnyType) {
return super.getText(obj);
}
return super.getText(object);
}
}, SmooksConfigurationActivator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
if (parentModel != null) {
childrenTableViewer.setInput(parentModel);
}
childrenTableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
openChildPropertiesModifyDialog();
}
});
childrenTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateButtons();
}
});
hookButtons();
updateButtons();
}
}
protected TableViewer getChildrenTableViewer() {
return childrenTableViewer;
}
protected EObject newChildModel() {
return null;
}
protected EStructuralFeature getChildrenFeature() {
return null;
}
protected boolean performNewChild() {
return true;
}
protected void endNewChild() {
}
protected void performRemoveChild() {
}
protected void endRemoveChild() {
}
protected void hookButtons() {
newChildButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (getSmooksVersion() == null) {
return;
}
if (performNewChild()) {
EObject childModel = newChildModel();
EObject parent = getParentModel();
if (parent == null || childModel == null) {
return;
}
EStructuralFeature profileFeature = getChildrenFeature();
try {
NewOrModifySmooksElementDialog dialog = new NewOrModifySmooksElementDialog(editorPart
.getEditorSite().getShell(), profileFeature, childModel, parent, toolkit,
smooksModelProvider, editorPart, false);
if (dialog.open() == Dialog.OK) {
endNewChild();
}
} catch (Throwable e1) {
e1.printStackTrace();
}
}
super.widgetSelected(e);
}
});
removeRemoveButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) childrenTableViewer.getSelection();
if (selection == null)
return;
Object obj = selection.getFirstElement();
if (obj instanceof EObject) {
performRemoveChild();
EObject profile = (EObject) obj;
EObject parent = getParentModel();
if (parent == null)
return;
CompoundCommand compoundCommand = new CompoundCommand();
Command command = RemoveCommand.create(smooksModelProvider.getEditingDomain(), profile);
compoundCommand.append(command);
performRunRemoveCommand(compoundCommand, smooksModelProvider.getEditingDomain());
smooksModelProvider.getEditingDomain().getCommandStack().execute(compoundCommand);
endRemoveChild();
}
}
});
upChildButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) childrenTableViewer.getSelection();
if (selection == null)
return;
Object obj = selection.getFirstElement();
if (obj instanceof EObject) {
EObject profilesType = getParentModel();
if (profilesType == null)
return;
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command command = MoveCommand.create(smooksModelProvider.getEditingDomain(), parent, null, obj,
index - 1);
smooksModelProvider.getEditingDomain().getCommandStack().execute(command);
}
}
});
downChildButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) childrenTableViewer.getSelection();
if (selection == null)
return;
Object obj = selection.getFirstElement();
if (obj instanceof EObject) {
EObject profilesType = getParentModel();
if (profilesType == null)
return;
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command command = MoveCommand.create(smooksModelProvider.getEditingDomain(), parent, null, obj,
index + 1);
smooksModelProvider.getEditingDomain().getCommandStack().execute(command);
}
}
});
childPropertiesButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
openChildPropertiesModifyDialog();
super.widgetSelected(e);
}
});
}
protected void performRunRemoveCommand(CompoundCommand compoundCommand, EditingDomain editDomain) {
}
protected void updateButtons() {
if (getSmooksVersion() == null) {
childPropertiesButton.setEnabled(false);
newChildButton.setEnabled(false);
removeRemoveButton.setEnabled(false);
upChildButton.setEnabled(false);
downChildButton.setEnabled(false);
return;
}
childPropertiesButton.setEnabled(true);
removeRemoveButton.setEnabled(true);
IStructuredSelection selection = (IStructuredSelection) childrenTableViewer.getSelection();
if (selection == null) {
childPropertiesButton.setEnabled(false);
removeRemoveButton.setEnabled(false);
upChildButton.setEnabled(false);
downChildButton.setEnabled(false);
} else {
if (selection.getFirstElement() == null) {
childPropertiesButton.setEnabled(false);
removeRemoveButton.setEnabled(false);
upChildButton.setEnabled(false);
downChildButton.setEnabled(false);
return;
}
Object obj = selection.getFirstElement();
if (obj instanceof EObject) {
EObject profilesType = getParentModel();
if (profilesType == null)
return;
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command command = MoveCommand.create(smooksModelProvider.getEditingDomain(), parent, null, obj,
index - 1);
upChildButton.setEnabled(command.canExecute());
Command command1 = MoveCommand.create(smooksModelProvider.getEditingDomain(), parent, null, obj,
index + 1);
downChildButton.setEnabled(command1.canExecute());
}
if (selection.size() > 1) {
childPropertiesButton.setEnabled(false);
removeRemoveButton.setEnabled(false);
}
}
}
protected void openChildPropertiesModifyDialog() {
IStructuredSelection selection = (IStructuredSelection) childrenTableViewer.getSelection();
if (selection == null)
return;
Object obj = selection.getFirstElement();
if (obj instanceof EObject) {
EObject child = (EObject) obj;
EObject parent = getParentModel();
EStructuralFeature childFeature = getChildrenFeature();
NewOrModifySmooksElementDialog dialog = new NewOrModifySmooksElementDialog(editorPart.getEditorSite()
.getShell(), childFeature, child, parent, toolkit, smooksModelProvider, editorPart, true);
dialog.open();
}
}
public EObject getParentModel() {
return parentModel;
}
public void setParentModel(EObject parentModel) {
this.parentModel = parentModel;
}
public String getSmooksVersion() {
if (this.smooksModelProvider != null) {
return this.smooksModelProvider.getPlatformVersion();
}
return null;
}
}