/*******************************************************************************
* Copyright (c) 2009 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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.command.MoveCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
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.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
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.Menu;
import org.eclipse.ui.forms.DetailsPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.MasterDetailsBlock;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.model.smooks.DocumentRoot;
import org.jboss.tools.smooks.model.smooks.SmooksResourceListType;
/**
* @author Dart Peng (dpeng@redhat.com)
* <p>
* Date Apr 1, 2009
*/
public class SmooksMasterDetailBlock extends MasterDetailsBlock implements IMenuListener, ISelectionChangedListener {
private Section configurationSection;
private SectionPart sectionPart;
private TreeViewer smooksTreeViewer;
private Button addButton;
private Button removeButton;
private Button upButton;
private Button downButton;
private String newSmooksElementTitle;
private String newSmooksElementDescription;
private AdapterFactoryEditingDomain editingDomain = null;
private ViewerFilter[] viewerFilters = null;
private FormEditor formEditor;
private String sectionTitle;
private String sectionDescription;
public SmooksMasterDetailBlock(FormEditor formEditor, AdapterFactoryEditingDomain editingDomain) {
this.editingDomain = editingDomain;
this.formEditor = formEditor;
}
public ViewerFilter[] getViewerFilters() {
return viewerFilters;
}
public void setViewerFilters(ViewerFilter[] viewerFilters) {
this.viewerFilters = viewerFilters;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.forms.MasterDetailsBlock#createMasterPart(org.eclipse.
* ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createMasterPart(IManagedForm managedForm, Composite parent) {
FormToolkit tool = managedForm.getToolkit();
createSmooksTreeViewer(tool, managedForm, parent);
}
@Override
public void createContent(IManagedForm managedForm) {
super.createContent(managedForm);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 2;
sashForm.setLayoutData(gd);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.forms.MasterDetailsBlock#createToolBarActions(org.eclipse
* .ui.forms.IManagedForm)
*/
@Override
protected void createToolBarActions(IManagedForm managedForm) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.forms.MasterDetailsBlock#registerPages(org.eclipse.ui.
* forms.DetailsPart)
*/
@Override
protected void registerPages(DetailsPart detailsPart) {
SmooksStuffDetailsPageProvider provider = new SmooksStuffDetailsPageProvider();
detailsPart.setPageProvider(provider);
// provider.registePage(ResourceType.class, new
// SmooksStuffPropertyDetailPage());
detailsPart.registerPage(EObject.class, new SmooksStuffPropertyDetailPage(formEditor,
(ISmooksModelProvider) this.formEditor ));
}
protected void refreshSmooksTreeViewer() {
if (smooksTreeViewer.getControl().isDisposed()) {
return;
}
smooksTreeViewer.refresh();
}
public void setMainSectionTitle(String sectionTitle) {
this.sectionTitle = sectionTitle;
}
public String getMainSectionTitle() {
return sectionTitle;
}
public String getMainSectionDescription() {
return sectionDescription;
}
public void setMainSectionDescription(String sectionDescription) {
this.sectionDescription = sectionDescription;
}
protected void createSmooksTreeViewer(FormToolkit tool, final IManagedForm managedForm, Composite rootMainControl) {
configurationSection = tool.createSection(rootMainControl, Section.TITLE_BAR | Section.DESCRIPTION);
if (this.getMainSectionTitle() != null) {
configurationSection.setText(getMainSectionTitle());
}
if (this.getMainSectionDescription() != null) {
configurationSection.setDescription(getMainSectionDescription());
}
sectionPart = new SectionPart(configurationSection);
managedForm.addPart(sectionPart);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
Composite dataTypeComposite = tool.createComposite(configurationSection);
configurationSection.setClient(dataTypeComposite);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
dataTypeComposite.setLayout(layout);
Composite tableComposite = tool.createComposite(dataTypeComposite);
FillLayout fillLayout = new FillLayout();
fillLayout.marginHeight = 1;
fillLayout.marginWidth = 1;
tableComposite.setLayout(fillLayout);
smooksTreeViewer = new TreeViewer(tableComposite, SWT.NONE);
smooksTreeViewer.addSelectionChangedListener(this);
smooksTreeViewer.setContentProvider(new AdapterFactoryContentProvider(editingDomain.getAdapterFactory()));
smooksTreeViewer.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 EObject) {
return super.getText(obj);
}
return super.getText(object);
}
}, SmooksConfigurationActivator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
smooksTreeViewer.setComparer(new IElementComparer() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IElementComparer#equals(java.lang
* .Object, java.lang.Object)
*/
public boolean equals(Object a, Object b) {
Object elementA = AdapterFactoryEditingDomain.unwrap(a);
Object elementB = AdapterFactoryEditingDomain.unwrap(b);
if (elementA == elementB) {
return true;
}
return elementA == null ? elementB == null : elementA.equals(elementB);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IElementComparer#hashCode(java.
* lang.Object)
*/
public int hashCode(Object element) {
return element.hashCode();
}
});
if (this.getViewerFilters() != null) {
smooksTreeViewer.setFilters(getViewerFilters());
}
Object smooksModel = ((ISmooksModelProvider) this.formEditor).getSmooksModel();
if (smooksModel != null) {
setTreeViewerModel(smooksModel);
}
createMenuForViewer(smooksTreeViewer);
// formEditor.getSite().setSelectionProvider(smooksTreeViewer);
if (formEditor.getEditorSite().getActionBarContributor() instanceof ISelectionChangedListener) {
smooksTreeViewer.addSelectionChangedListener((ISelectionChangedListener) formEditor.getEditorSite()
.getActionBarContributor());
}
smooksTreeViewer.addSelectionChangedListener(this);
tableComposite.setBackground(new Color(null, 128, 128, 128));
gd = new GridData(GridData.FILL_BOTH);
tableComposite.setLayoutData(gd);
tool.paintBordersFor(tableComposite);
Composite buttonComposite = tool.createComposite(dataTypeComposite);
gd = new GridData(GridData.FILL_VERTICAL);
gd.widthHint = 100;
buttonComposite.setLayoutData(gd);
GridLayout buttonLayout = new GridLayout();
buttonComposite.setLayout(buttonLayout);
addButton = tool.createButton(buttonComposite, Messages.SmooksMasterDetailBlock_AddButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
addButton.setLayoutData(gd);
removeButton = tool.createButton(buttonComposite, Messages.SmooksMasterDetailBlock_RemoveButtonlabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
removeButton.setLayoutData(gd);
Composite sc = tool.createComposite(buttonComposite);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.heightHint = 40;
sc.setLayoutData(gd);
upButton = tool.createButton(buttonComposite, Messages.SmooksMasterDetailBlock_UpButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
upButton.setLayoutData(gd);
downButton = tool.createButton(buttonComposite, Messages.SmooksMasterDetailBlock_DownButtonLabel, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
downButton.setLayoutData(gd);
// don't display button area
gd = new GridData(GridData.FILL_VERTICAL);
gd.widthHint = 70;
buttonComposite.setLayoutData(gd);
// buttonComposite.setVisible(false);
hookButtons();
}
private void setTreeViewerModel(Object smooksModel) {
boolean seted = false;
// if (smooksModel instanceof org.jboss.tools.smooks10.model.smooks.DocumentRoot) {
// smooksTreeViewer.setInput(((org.jboss.tools.smooks10.model.smooks.DocumentRoot) smooksModel)
// .getSmooksResourceList());
// seted = true;
// }
if (smooksModel instanceof DocumentRoot) {
SmooksResourceListType list = ((DocumentRoot) smooksModel).getSmooksResourceList();
try {
smooksTreeViewer.setInput(list);
seted = true;
} catch (Exception e) {
e.printStackTrace();
}
}
if (!seted) {
smooksTreeViewer.setInput(smooksModel);
}
}
private EObject getTreeViewerInput() {
EObject smooksModel = ((ISmooksModelProvider) this.formEditor).getSmooksModel();
// if (smooksModel instanceof org.jboss.tools.smooks10.model.smooks.DocumentRoot) {
// return ((org.jboss.tools.smooks10.model.smooks.DocumentRoot) smooksModel).getSmooksResourceList();
// }
if (smooksModel instanceof DocumentRoot) {
return (((DocumentRoot) smooksModel).getSmooksResourceList());
}
return null;
}
public List<?> getViewerSelections() {
IStructuredSelection selections = (IStructuredSelection) smooksTreeViewer.getSelection();
if (selections == null)
return null;
return selections.toList();
// List<Object> nl = new ArrayList<Object>();
// for (Iterator<?> iterator = l.iterator(); iterator.hasNext();) {
// Object object = (Object) iterator.next();
// // object = AdapterFactoryEditingDomain.unwrap(object);
// nl.add(object);
// }
// return l;
}
public String getNewSmooksElementTitle() {
return newSmooksElementTitle;
}
public void setNewSmooksElementTitle(String newSmooksElementTitle) {
this.newSmooksElementTitle = newSmooksElementTitle;
}
public String getNewSmooksElementDescription() {
return newSmooksElementDescription;
}
public void setNewSmooksElementDescription(String newSmooksElementDescription) {
this.newSmooksElementDescription = newSmooksElementDescription;
}
private void hookButtons() {
removeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List<?> list = getViewerSelections();
CompoundCommand ccommand = new CompoundCommand();
for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
Command command = DeleteCommand.create(editingDomain, object);
if (command.canExecute()) {
ccommand.append(command);
}
}
editingDomain.getCommandStack().execute(ccommand);
}
});
downButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List<?> list = getViewerSelections();
if (list.size() == 1) {
Object obj = list.get(0);
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command command = MoveCommand.create(editingDomain, parent, null, obj, index + 1);
editingDomain.getCommandStack().execute(command);
}
}
});
upButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List<?> list = getViewerSelections();
if (list.size() == 1) {
Object obj = list.get(0);
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command command = MoveCommand.create(editingDomain, parent, null, obj, index - 1);
editingDomain.getCommandStack().execute(command);
}
}
});
}
private void createMenuForViewer(TreeViewer smooksTreeViewer2) {
MenuManager contextMenu = new MenuManager();
// contextMenu.add(new Separator("additions"));
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(this);
Menu menu = contextMenu.createContextMenu(smooksTreeViewer2.getControl());
smooksTreeViewer2.getControl().setMenu(menu);
// formEditor.getSite().registerContextMenu(contextMenu,
// new UnwrappingSelectionProvider(smooksTreeViewer2));
}
public TreeViewer getSmooksTreeViewer() {
return smooksTreeViewer;
}
public void setSmooksTreeViewer(TreeViewer smooksTreeViewer) {
this.smooksTreeViewer = smooksTreeViewer;
}
public void menuAboutToShow(IMenuManager menuManager) {
((IMenuListener) formEditor.getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
}
public void setSmooksModel(Object model) {
if (model != null) {
setTreeViewerModel(model);
// smooksTreeViewer.setInput(model);
} else {
smooksTreeViewer.setInput(new Object());
}
}
/**
*
* @param selections
*/
protected void updateButtons(List<?> selections) {
removeButton.setEnabled(true);
upButton.setEnabled(true);
downButton.setEnabled(true);
List<?> list = getViewerSelections();
if (list.size() == 1) {
Object obj = list.get(0);
EObject v = (EObject) AdapterFactoryEditingDomain.unwrap(obj);
EObject parent = v.eContainer();
int index = parent.eContents().indexOf(v);
Command upCommand = MoveCommand.create(editingDomain, parent, null, obj, index - 1);
upButton.setEnabled(upCommand.canExecute());
Command downCommand = MoveCommand.create(editingDomain, parent, null, obj, index + 1);
downButton.setEnabled(downCommand.canExecute());
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(
* org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
if (sectionPart != null && sectionPart.getManagedForm() != null) {
Object[] objs = ((IStructuredSelection) event.getSelection()).toArray();
List<Object> objList = new ArrayList<Object>();
for (int i = 0; i < objs.length; i++) {
Object obj = objs[i];
obj = AdapterFactoryEditingDomain.unwrap(obj);
objList.add(obj);
}
if (objList.isEmpty()) {
Object input = smooksTreeViewer.getInput();
if (input instanceof EObject) {
Object defaultObj = getEmptyDefaultSelection((EObject) input);
if (defaultObj != null) {
objList.add(defaultObj);
}
}
}
if (objList.isEmpty()) {
sectionPart.getManagedForm().fireSelectionChanged(sectionPart, event.getSelection());
} else {
sectionPart.getManagedForm().fireSelectionChanged(sectionPart,
new StructuredSelection(objList.toArray()));
}
updateButtons(objList);
}
if (formEditor instanceof ISelectionProvider) {
((ISelectionProvider) formEditor).setSelection(event.getSelection());
}
}
protected Object getEmptyDefaultSelection(EObject smooksTreeViewerInput) {
return null;
// if (((EObject) smooksTreeViewerInput).eContents().isEmpty()) {
// return AdapterFactoryEditingDomain.unwrap(((EObject)
// smooksTreeViewerInput).eContents().get(0));
// }
// return null;
}
}