/*******************************************************************************
* Copyright (c) 2009 Borland Software Corporation and others.
*
* 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.runtime.ui.ant;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
public class CompositeTransformationContentPage extends WizardPage {
private final CompositeTransformationModel myModel;
private boolean myWasEverShown;
private Text myProjectNameText;
private Text myTargetNameText;
private TreeViewer myTreeViewer;
private Button myUp;
private Button myDown;
private Button myDelete;
public CompositeTransformationContentPage(CompositeTransformationModel model) {
super("transformationPage"); //$NON-NLS-1$
myModel = model;
setTitle(Messages.TransformPage_title);
setDescription(Messages.TransformPage_descr);
}
@Override
public boolean isPageComplete() {
return myWasEverShown && super.isPageComplete();
}
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
container.setLayout(layout);
layout.numColumns = 2;
layout.verticalSpacing = 9;
Label label = new Label(container, SWT.NULL);
label.setText(Messages.TransformPage_project);
myProjectNameText = new Text(container, SWT.BORDER | SWT.SINGLE);
myProjectNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
myProjectNameText.setText(myModel.getProjectName());
myProjectNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
myModel.setProjectName(myProjectNameText.getText());
}
});
label = new Label(container, SWT.NULL);
label.setText(Messages.TransformPage_task);
myTargetNameText = new Text(container, SWT.BORDER | SWT.SINGLE);
myTargetNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
myTargetNameText.setText(myModel.getTargetName());
myTargetNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
myModel.setTargetName(myTargetNameText.getText());
}
});
Composite composite = new Composite(container, SWT.NONE);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2;
composite.setLayoutData(data);
layout = new GridLayout();
layout.numColumns = 2;
layout.verticalSpacing = 9;
layout.marginWidth = 0;
layout.marginRight = 0;
composite.setLayout(layout);
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
myTreeViewer = new TreeViewer(composite, style);
myTreeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
final DataProvider dp = new DataProvider();
myTreeViewer.setContentProvider(dp);
myTreeViewer.setLabelProvider(dp);
myTreeViewer.setInput(myModel);
myTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateButtons(event.getSelection());
}
});
Tree tree = myTreeViewer.getTree();
TableLayout tableLayout = new TableLayout();
TreeColumn col = new TreeColumn(tree, SWT.NONE);
tableLayout.addColumnData(new ColumnWeightData(3, true));
col.setText(Messages.Name);
col = new TreeColumn(tree, SWT.NONE);
tableLayout.addColumnData(new ColumnWeightData(3, true));
col.setText(Messages.Value);
tree.setLayout(tableLayout);
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
Composite buttons = new Composite(composite, SWT.NONE);
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
layout = new GridLayout();
layout.numColumns = 1;
layout.verticalSpacing = 9;
layout.marginTop = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.marginRight = 0;
buttons.setLayout(layout);
newButton(buttons, Messages.Add, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
CreateQvtoAntTaskWizard taskWizard = new CreateQvtoAntTaskWizard();
WizardDialog dialog = new WizardDialog(getContainer().getShell(), taskWizard);
dialog.create();
if (dialog.open() == Window.OK) {
myModel.getTaskModels().add(taskWizard.getResult());
myTreeViewer.refresh();
}
}
});
myDelete = newButton(buttons, Messages.Delete, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object selectedElement = getSelectedElement();
if (selectedElement instanceof TaskModel) {
myModel.getTaskModels().remove(selectedElement);
myTreeViewer.refresh();
}
}
});
myUp = newButton(buttons, Messages.Up, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object selectedElement = getSelectedElement();
if (selectedElement instanceof TaskModel) {
int i = myModel.getTaskModels().indexOf(selectedElement);
if (i > 0) {
TaskModel p = myModel.getTaskModels().get(i - 1);
myModel.getTaskModels().set(i - 1, (TaskModel) selectedElement);
myModel.getTaskModels().set(i, p);
myTreeViewer.refresh();
}
}
}
});
myDown = newButton(buttons, Messages.Down, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object selectedElement = getSelectedElement();
if (selectedElement instanceof TaskModel) {
int i = myModel.getTaskModels().indexOf(selectedElement);
if (i < myModel.getTaskModels().size() - 1) {
TaskModel n = myModel.getTaskModels().get(i + 1);
myModel.getTaskModels().set(i + 1, (TaskModel) selectedElement);
myModel.getTaskModels().set(i, n);
myTreeViewer.refresh();
}
}
}
});
setControl(container);
updateButtons(StructuredSelection.EMPTY);
}
private Object getSelectedElement() {
IStructuredSelection sel = (IStructuredSelection) myTreeViewer.getSelection();
return sel.getFirstElement();
}
protected void updateButtons(ISelection selection) {
IStructuredSelection sel = (IStructuredSelection) selection;
Object firstElement = sel.getFirstElement();
boolean up = false;
boolean down = false;
boolean del = false;
if (firstElement instanceof TaskModel) {
int i = myModel.getTaskModels().indexOf(firstElement);
up = i > 0;
down = i < myModel.getTaskModels().size() - 1;
del = true;
}
myDelete.setEnabled(!selection.isEmpty() && del);
myUp.setEnabled(!selection.isEmpty() && up);
myDown.setEnabled(!selection.isEmpty() && down);
}
private static Button newButton(Composite buttons, String caption, SelectionListener listener) {
Button button = new Button(buttons, SWT.PUSH);
button.setText(caption);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
button.setLayoutData(gridData);
button.addSelectionListener(listener);
return button;
}
private static class DataProvider extends LabelProvider implements ITableLabelProvider, ITreeContentProvider {
public String getColumnText(Object element, int columnIndex) {
if (element instanceof TaskModel) {
TaskModel value = (TaskModel) element;
return columnIndex == 0 ? value.getTaskName() : " < " + value.getName() + " >"; //$NON-NLS-1$ //$NON-NLS-2$
}
if (element instanceof Map.Entry<?, ?>) {
@SuppressWarnings("unchecked")
Map.Entry<String, Object> value = (Entry<String, Object>) element;
return columnIndex == 0 ? value.getKey() : String.valueOf(value.getValue());
}
return element.toString();
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
// ITreeContentProvider
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof TaskModel) {
TaskModel model = (TaskModel) parentElement;
Set<Entry<String, Object>> entrySet = model.getAttributes().entrySet();
for (Entry<String, Object> entry : entrySet) {
myParentCache.put(entry, parentElement);
}
return entrySet.toArray();
}
return null;
}
public Object getParent(Object element) {
return myParentCache.get(element);
}
public boolean hasChildren(Object element) {
return element instanceof TaskModel;
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof CompositeTransformationModel) {
CompositeTransformationModel model = (CompositeTransformationModel) inputElement;
return model.getTaskModels().toArray();
}
return null;
}
public void dispose() {
myParentCache.clear();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
private final Map<Object, Object> myParentCache = new HashMap<Object, Object>();
}
@Override
public void setVisible(boolean visible) {
if (visible) {
myWasEverShown = true;
}
super.setVisible(visible);
}
}