/*
* Copyright (c) 2006 Eclipse.org
*
* 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:
* Dmitry Stadnik - initial API and implementation
*/
package org.eclipse.gmf.internal.bridge.wizards.pages.simple;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.gmf.internal.bridge.ui.Plugin;
import org.eclipse.gmf.internal.bridge.wizards.pages.simple.ResolvedItem.Resolution;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Tree;
import org.eclipse.swt.widgets.TreeColumn;
/**
* @author dstadnik
*/
public class DefinitionPage extends WizardPage {
private final StructureBuilder structureBuilder;
private final DomainModelSource domainModelSource;
private DomainModelSourceImpl currentModelSource;
private TreeViewer viewer;
private Button deselectAllButton;
private Button recognizeButton;
public DefinitionPage(String pageId, StructureBuilder structureBuilder, DomainModelSource domainModelSource) {
super(pageId);
this.structureBuilder = structureBuilder;
this.domainModelSource = domainModelSource;
}
protected GridData createFillBothGridData(int span) {
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.horizontalSpan = span;
return data;
}
protected GridData createFillHorzGridData(int span) {
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.horizontalSpan = span;
return data;
}
public void createControl(Composite parent) {
setPageComplete(false);
setControl(createDomainModelGroup(parent));
}
private Composite createDomainModelGroup(Composite parent) {
Composite plate = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.verticalSpacing = 12;
plate.setLayout(layout);
Label domainModelElementsLabel = new Label(plate, SWT.NONE);
domainModelElementsLabel.setText(Messages.DefinitionPageElementsToProcess);
domainModelElementsLabel.setLayoutData(createFillHorzGridData(2));
Composite viewerPlate = createViewerGroup(plate);
viewerPlate.setLayoutData(createFillBothGridData(2));
plate.setLayoutData(createFillBothGridData(1));
return plate;
}
private Composite createViewerGroup(Composite parent) {
Composite plate = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.verticalSpacing = 12;
plate.setLayout(layout);
viewer = createViewer(plate);
viewer.getControl().setLayoutData(createFillBothGridData(1));
Composite buttonsPlate = createDomainModelButtons(plate);
buttonsPlate.setLayoutData(new GridData(GridData.FILL_VERTICAL));
return plate;
}
private Composite createDomainModelButtons(Composite parent) {
Composite plate = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.verticalSpacing = 12;
plate.setLayout(layout);
deselectAllButton = new Button(plate, SWT.PUSH);
deselectAllButton.setLayoutData(createFillHorzGridData(1));
deselectAllButton.setText(Messages.DefinitionPageDeselectAll);
deselectAllButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
deselectChildren(getModel());
viewer.refresh(true);
}
private void deselectChildren(ResolvedItem item) {
for (ResolvedItem child : item.getChildren()) {
child.setResolution(null);
deselectChildren(child);
}
}
});
recognizeButton = new Button(plate, SWT.PUSH);
recognizeButton.setLayoutData(createFillHorzGridData(1));
recognizeButton.setText(Messages.DefinitionPageDefaults);
recognizeButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
final EPackage contents = currentModelSource.getContents();
viewer.setInput(contents == null ? null : structureBuilder.process(currentModelSource));
viewer.expandAll();
if (contents != null) {
setPageComplete(validatePage());
} else {
setPageComplete(true);
}
}
});
return plate;
}
protected TreeViewer createViewer(Composite parent) {
final Tree tree = new Tree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
TableLayout layout = new TableLayout() {
private boolean firstTime = true;
public void layout(Composite c, boolean flush) {
super.layout(c, flush);
if (!firstTime) {
return;
}
int cawidth = c.getClientArea().width;
// XXX: Layout is being called with an invalid value the first time
// it is being called on Linux. This method resets the
// Layout to null so we make sure we run it only when
// the value is OK.
if (cawidth <= 1) {
return;
}
TreeColumn elementColumn = ((Tree) c).getColumn(0);
int vsbWidth = tree.getVerticalBar().getSize().x + 9; // 9 is magic since vsbw is not enough
int width = elementColumn.getWidth() - vsbWidth;
if (width < 0) {
width = 0;
}
elementColumn.setWidth(width);
firstTime = false;
}
};
tree.setLayout(layout);
tree.setHeaderVisible(true);
// tree.setLinesVisible(true);
TreeColumn elementColumn = new TreeColumn(tree, SWT.LEFT);
elementColumn.setText(Messages.DefinitionPageElement);
elementColumn.setResizable(true);
layout.addColumnData(new ColumnWeightData(1, 32, true));
addResolutionColumn(tree, Resolution.NODE, Plugin.NODE_ICON);
addResolutionColumn(tree, Resolution.LINK, Plugin.LINK_ICON);
if (structureBuilder.isWithLabels()) {
addResolutionColumn(tree, Resolution.LABEL, Plugin.LABEL_ICON);
}
return viewer = DomainModelViewerFactory.createViewer(tree, structureBuilder.isWithLabels());
}
protected TreeColumn addResolutionColumn(Tree tree, Resolution resolution, String iconId) {
TreeColumn column = new TreeColumn(tree, SWT.CENTER);
// column.setText(resolution.getName());
column.setImage(Plugin.getDefault().getImageRegistry().get(iconId));
column.setResizable(false);
((TableLayout) tree.getLayout()).addColumnData(new ColumnPixelData(18, false, true));
return column;
}
protected boolean validatePage() {
return true;
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (!visible) {
return;
}
final EPackage contents = domainModelSource.getContents();
if (currentModelSource != null && currentModelSource.like(domainModelSource)) {
return; // domain model source is the same; do not reset viewer
}
currentModelSource = createDomainModelSource(contents, domainModelSource.getDiagramElement());
assert currentModelSource != null;
viewer.setInput(contents == null ? null : structureBuilder.process(currentModelSource));
viewer.expandAll();
viewer.getControl().pack();
if (contents != null) {
// domain model is loaded ok
setPageComplete(validatePage());
} else {
// empty domain model
setPageComplete(true);
}
((Composite) getControl()).layout(true, true);
}
protected DomainModelSourceImpl createDomainModelSource(EPackage contents, EClass diagramElement) {
return new DomainModelSourceImpl(contents, diagramElement);
}
public ResolvedItem getModel() {
return (ResolvedItem) viewer.getInput();
}
}