/*******************************************************************************
* Copyright (c) 2009, 2010 Progress Software Corporation.
* 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
******************************************************************************/
// Copyright (c) 2009 Progress Software Corporation.
package org.fusesource.tools.messaging.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.CreateChildCommand;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.fusesource.tools.core.message.Message;
import org.fusesource.tools.core.message.MessagePackage;
import org.fusesource.tools.core.message.Properties;
import org.fusesource.tools.core.message.Property;
import org.fusesource.tools.message.editors.MessageEditorConstants;
import org.fusesource.tools.message.editors.MessageEditorPageBean;
import org.fusesource.tools.message.extensions.IMessageEditorExtension;
import org.fusesource.tools.messaging.IConstants;
public class SimpleMessageEditorExtension implements IMessageEditorExtension {
protected int count = -1;
protected TableViewer propertiesTableViewer;
protected Composite propertiesComposite = null;
protected EditingDomain editingDomain;
protected Message messageModel;
public void createBody(Composite parent, EditingDomain editingDomain, Message messageModel) {
parent.setLayout(new GridLayout(1, false));
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
label.setText("This message type does not support body. Please configure headers in the Headers tab.");
}
public Collection<MessageEditorPageBean> getEditorPages(Composite container, EditingDomain editingDomain,
Message messageModel) {
this.editingDomain = editingDomain;
this.messageModel = messageModel;
List<MessageEditorPageBean> list = new ArrayList<MessageEditorPageBean>();
list
.add(new MessageEditorPageBean(MessageEditorConstants.HEADER, createPropertiesTab(container,
editingDomain)));
return list;
}
protected Composite createPropertiesTab(Composite parent, final EditingDomain editingDomain) {
propertiesComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
propertiesComposite.setLayout(layout);
layout.numColumns = 1;
Group propertiesGroup = new Group(propertiesComposite, SWT.NONE);
propertiesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
propertiesGroup.setLayout(new GridLayout(3, false));
propertiesGroup.setText("Headers");
propertiesTableViewer = new DefaultMessageTableViewer(propertiesGroup, SWT.FULL_SELECTION,
IConstants.EMPTY_STRING);
propertiesTableViewer.addFilter(new PropertyFilter());
buildTable(propertiesTableViewer, propertiesGroup, editingDomain, false);
if (messageModel != null && messageModel.getProperties() != null) {
propertiesTableViewer.setInput(messageModel.getProperties());
}
return propertiesComposite;
}
protected void buildTable(final TableViewer tableViewer, Group group, final EditingDomain editingDomain,
boolean isHeader) {
GridData data = new GridData();
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = SWT.FILL;
data.verticalAlignment = SWT.FILL;
((DefaultMessageTableViewer) tableViewer).refreshTable("Name;Value");
Table table = tableViewer.getTable();
table.setLayoutData(data);
table.setLinesVisible(true);
final CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(table);
editors[1] = new TextCellEditor(table);
editors[1].addListener(new ICellEditorListener() {
public void applyEditorValue() {
}
public void cancelEditor() {
}
public void editorValueChanged(boolean oldValidState, boolean newValidState) {
IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
Property property = (Property) selection.getFirstElement();
modifyProperty((String) editors[1].getValue(), property, MessagePackage.eINSTANCE.getProperty_Value());
}
});
editors[0].addListener(new ICellEditorListener() {
public void applyEditorValue() {
}
public void cancelEditor() {
}
public void editorValueChanged(boolean oldValidState, boolean newValidState) {
IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
Property property = (Property) selection.getFirstElement();
modifyProperty((String) editors[0].getValue(), property, MessagePackage.eINSTANCE.getProperty_Name());
}
});
tableViewer.setColumnProperties(new String[] { "Name", "Value" });
tableViewer.setCellModifier(new HeadersModifierSupport(tableViewer));
tableViewer.setCellEditors(editors);
Composite buttonComposite = new Composite(group, SWT.NONE);
data = new GridData();
data.horizontalSpan = 1;
data.grabExcessVerticalSpace = true;
data.verticalAlignment = SWT.FILL;
buttonComposite.setLayoutData(data);
GridLayout gridLayout = new GridLayout();
buttonComposite.setLayout(gridLayout);
gridLayout.numColumns = 1;
propertyOperations(tableViewer, buttonComposite);
tableViewer.setContentProvider(new HeadersContentProvider());
tableViewer.setLabelProvider(new HeadersLabelProvider());
}
/**
*
* @param tableViewer
* @param buttonComposite
*/
protected void propertyOperations(final TableViewer tableViewer, Composite buttonComposite) {
GridData data;
final Button addProperty = new Button(buttonComposite, SWT.PUSH);
addProperty.setText(" Add ");
data = new GridData();
data.horizontalSpan = 1;
data.verticalAlignment = SWT.TOP;
addProperty.setLayoutData(data);
final Button deleteProperty = new Button(buttonComposite, SWT.PUSH);
deleteProperty.setText("Delete");
data = new GridData();
data.verticalAlignment = SWT.TOP;
data.horizontalSpan = 1;
deleteProperty.setLayoutData(data);
addProperty.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.widget == addProperty) {
createNewDefaultHeader(getMessageModel().getProperties());
tableViewer.refresh();
propertiesTableViewer.refresh();
}
}
});
deleteProperty.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.widget == deleteProperty) {
int selectionIndex = tableViewer.getTable().getSelectionIndex();
Object elementAt = tableViewer.getElementAt(selectionIndex);
if (elementAt instanceof Property) {
Property property = (Property) elementAt;
deleteProperty(property);
tableViewer.refresh();
}
}
}
});
}
/**
*
* @param properties
*/
protected void createNewDefaultHeader(Properties properties) {
Collection<?> newChildDescriptors = getEditingDomain().getNewChildDescriptors(properties, null);
CommandParameter commandParameter = null;
for (Object object : newChildDescriptors) {
Object value = ((CommandParameter) object).getValue();
if (value instanceof Property) {
commandParameter = (CommandParameter) object;
Property property = (Property) value;
property.setName("new_name_" + ++count);
property.setValue("new_value_" + count);
property.setIsheader(false);
break;
}
}
Command create = CreateChildCommand.create(getEditingDomain(), properties, commandParameter,
new StructuredSelection(properties).toList());
getEditingDomain().getCommandStack().execute(create);
propertiesTableViewer.refresh();
}
/**
* modify the property name in the model
*
* @param name
* @param property
* @param attribute
*/
protected void modifyProperty(String value, Property property, EAttribute attribute) {
Command command = SetCommand.create(getEditingDomain(), property, attribute, value);
getEditingDomain().getCommandStack().execute(command);
}
/**
* @param property
*/
protected void deleteProperty(Property property) {
Command create = DeleteCommand.create(getEditingDomain(), property);
editingDomain.getCommandStack().execute(create);
}
/**
* @return the editingDomain
*/
public EditingDomain getEditingDomain() {
return editingDomain;
}
/**
* @return the messageModel
*/
public Message getMessageModel() {
return messageModel;
}
protected class PropertyFilter extends ViewerFilter {
public PropertyFilter() {
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof Property) {
Property property = (Property) element;
if (!property.isIsheader()) {
return true;
}
}
return false;
}
}
}