blob: b43de5c1af5bc5112ad11670817765518e87e6a6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Asim Ullah 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:
* Asim Ullah - initial implementation [Sep 13, 2004]
*******************************************************************************/
package org.eclipse.draw2d.examples.layouts;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Ellipse;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.GridLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.Shape;
import org.eclipse.draw2d.Triangle;
import org.eclipse.draw2d.examples.AbstractExample;
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.widgets.Button;
import org.eclipse.swt.widgets.Combo;
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.Text;
/**
* GridLayout Example that allows for the dynamic creation of child Shape
* objects, as well as the modification of their layout properties (via
* GridData). N.b You can mouse select a Shape to view it's details in the
* GridData Group area. Also note when modifiying a value in a Text widget you
* need to press RETURN after you enter the value to get the update. The Text
* widget won't update the view by TABbing!
*/
public class GridLayoutExample extends AbstractExample {
Figure container;
Composite composite;
GridLayout gridLayout;
// for the GridData Group
Text widthHint, heightHint, horizIndent, vertSpan, horizSpan;
Combo vertAlign, horizAlign;
Button grabVSpace, grabHSpace;
// SWT layout references.
org.eclipse.swt.layout.GridLayout _layout;
org.eclipse.swt.layout.GridData _data;
Shape selectedShape = null, prevSelectedShape = null;
int shapeCount = 0;
int colorCount = 0;
Color colors[] = new Color[] { ColorConstants.blue, ColorConstants.red,
ColorConstants.yellow, ColorConstants.gray, ColorConstants.green,
ColorConstants.lightBlue, ColorConstants.cyan,
ColorConstants.darkGreen, ColorConstants.orange };
/**
* @param args
*/
public static void main(String[] args) {
new GridLayoutExample().run();
}
/**
* @see org.eclipse.draw2d.examples.AbstractExample#getContents()
*/
protected IFigure getContents() {
container = new Figure();
container.setBorder(new LineBorder());
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.makeColumnsEqualWidth = false;
container.setLayoutManager(gridLayout);
container.addMouseListener(new MouseListener.Stub() {
public void mousePressed(MouseEvent event) {
if (selectedShape != null)
prevSelectedShape.setLineWidth(1);
selectedShape = prevSelectedShape = null;
setEnableGridDataGroup(false);
}
});
Shape shape = createShape();
container.add(shape);
container.add(createShape());
return container;
}
protected Shape createShape() {
Shape shape = null;
if (shapeCount == 0)
shape = new Ellipse();
else if (shapeCount == 1)
shape = new RectangleFigure();
else if (shapeCount == 2)
shape = new RoundedRectangle();
else if (shapeCount == 3)
shape = new RectangleFigure();
else if (shapeCount == 4)
shape = new Ellipse();
else if (shapeCount == 5)
shape = new Triangle();
else if (shapeCount == 6)
shape = new RoundedRectangle();
else if (shapeCount == 7)
shape = new Triangle();
else
shape = new RoundedRectangle();
shape.setBackgroundColor(colors[colorCount]);
shape.setSize(70, 70);
shape.addMouseListener(new MouseListener.Stub() {
public void mousePressed(MouseEvent event) {
selectedShape = (Shape) event.getSource();
setEnableGridDataGroup(true);
selectedShape.setLineWidth(4);
if (prevSelectedShape != null
&& prevSelectedShape != selectedShape)
prevSelectedShape.setLineWidth(1);
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
populateGridDataGroup(d);
prevSelectedShape = selectedShape;
}
});
if (shapeCount == 8) // reset shapes and colors
shapeCount = colorCount = 0;
else {
shapeCount++;
colorCount++;
}
return shape;
}
protected Integer getEventValue(Event e, String id) {
int val = 1;
try {
if (e.widget instanceof Text) {
val = Integer.parseInt(((Text) e.widget).getText());
}
} catch (NumberFormatException ex) {
System.out.println("Error: Invalid Number entered for " + id);
}
return new Integer(val);
}
protected Integer getEventValue(SelectionEvent e, String id) {
int val = 5;
try {
if (e.widget instanceof Combo) {
val = Integer.parseInt(((Combo) e.widget).getText());
}
} catch (NumberFormatException ex) {
System.out.println("Error: Invalid Number entered for " + id);
}
return new Integer(val);
}
protected void updateView() {
contents.revalidate();
shell.pack();
}
protected void createColumnGroup() {
// Columns section
Group columnsGroup = new Group(composite, 0);
columnsGroup.setText("Columns");
_layout = new org.eclipse.swt.layout.GridLayout();
_layout.numColumns = 2;
columnsGroup.setLayout(_layout);
_data = new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.VERTICAL_ALIGN_FILL);
columnsGroup.setLayoutData(_data);
Text numColumns = new Text(columnsGroup, SWT.BORDER);
numColumns.setText("2");
numColumns.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
gridLayout.numColumns = getEventValue(e, "numColumns")
.intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 15;
numColumns.setLayoutData(_data);
new Label(columnsGroup, SWT.NONE).setText("numColumns");
Button makeColumnsEqualWidth = new Button(columnsGroup, SWT.CHECK);
makeColumnsEqualWidth.setText("makeColumnsEqualWidth");
makeColumnsEqualWidth.setSelection(false);
makeColumnsEqualWidth.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
gridLayout.makeColumnsEqualWidth = !gridLayout.makeColumnsEqualWidth;
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.horizontalSpan = 2;
_data.horizontalIndent = 14;
makeColumnsEqualWidth.setLayoutData(_data);
}
protected void createMarginGroup() {
// Margins and Spacing section
Group marginGroup = new Group(composite, 0);
marginGroup.setLayout(new FillLayout(SWT.VERTICAL));
marginGroup.setText("Margins and Spacing");
String[] marginValues = new String[] { "0", "3", "5", "10" };
_data = new org.eclipse.swt.layout.GridData();
_data.verticalSpan = 2;
marginGroup.setLayoutData(_data);
_layout = new org.eclipse.swt.layout.GridLayout();
_layout.numColumns = 2;
marginGroup.setLayout(_layout);
new Label(marginGroup, SWT.NONE).setText("marginHeight");
Combo marginHeight = new Combo(marginGroup, SWT.NONE);
marginHeight.setItems(marginValues);
marginHeight.select(2);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
marginHeight.setLayoutData(_data);
marginHeight.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
gridLayout.marginHeight = getEventValue(e, "marginHeight")
.intValue();
updateView();
};
});
marginHeight.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
gridLayout.marginHeight = getEventValue(e, "marginHeight")
.intValue();
updateView();
}
});
new Label(marginGroup, SWT.NONE).setText("marginWidth");
Combo marginWidth = new Combo(marginGroup, SWT.NONE);
marginWidth.setItems(marginValues);
marginWidth.select(2);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
marginWidth.setLayoutData(_data);
marginWidth.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
gridLayout.marginWidth = getEventValue(e, "marginWidth")
.intValue();
updateView();
};
});
marginWidth.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
gridLayout.marginWidth = getEventValue(e, "marginWidth")
.intValue();
updateView();
}
});
new Label(marginGroup, SWT.NONE).setText("horizontalSpacing");
Combo horizontalSpacing = new Combo(marginGroup, SWT.NONE);
horizontalSpacing.setItems(marginValues);
horizontalSpacing.select(2);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
horizontalSpacing.setLayoutData(_data);
horizontalSpacing.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
gridLayout.horizontalSpacing = getEventValue(e,
"horizontalSpacing").intValue();
updateView();
};
});
horizontalSpacing.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
gridLayout.horizontalSpacing = getEventValue(e,
"horizontalSpacing").intValue();
updateView();
}
});
new Label(marginGroup, SWT.NONE).setText("verticalSpacing");
Combo verticalSpacing = new Combo(marginGroup, SWT.NONE);
verticalSpacing.setItems(marginValues);
verticalSpacing.select(2);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
verticalSpacing.setLayoutData(_data);
verticalSpacing.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
gridLayout.verticalSpacing = getEventValue(e, "verticalSpacing")
.intValue();
updateView();
};
});
verticalSpacing.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
gridLayout.verticalSpacing = getEventValue(e, "verticalSpacing")
.intValue();
;
updateView();
}
});
}
protected void createChildGroup() {
Group childGroup;
Button add, clear;
childGroup = new Group(composite, SWT.NONE);
childGroup.setText("Children");
org.eclipse.swt.layout.GridLayout layout = new org.eclipse.swt.layout.GridLayout();
layout.numColumns = 3;
childGroup.setLayout(layout);
org.eclipse.swt.layout.GridData data = new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
childGroup.setLayoutData(data);
/* Controls for adding and removing children */
add = new Button(childGroup, SWT.PUSH);
add.setText("Add");
add.setLayoutData(new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.FILL_HORIZONTAL));
add.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
container.add(createShape());
updateView();
}
});
clear = new Button(childGroup, SWT.PUSH);
clear.setText("Clear All");
clear.setLayoutData(new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.FILL_HORIZONTAL));
clear.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
container.removeAll();
setEnableGridDataGroup(false);
updateView();
}
});
}
protected void createGridDataGroup() {
String[] alignValues = new String[] { "BEGINNING", "CENTER", "END",
"FILL" };
Group gridDataGroup;
gridDataGroup = new Group(composite, SWT.NONE);
gridDataGroup.setText("Selected Figure's GridData");
_layout = new org.eclipse.swt.layout.GridLayout();
_layout.numColumns = 2;
gridDataGroup.setLayout(_layout);
_data = new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.VERTICAL_ALIGN_FILL);
gridDataGroup.setLayoutData(_data);
// widthHint --------------------------------------
widthHint = new Text(gridDataGroup, SWT.BORDER);
widthHint.setText("-1");
widthHint.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.widthHint = getEventValue(e, "widthHint").intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 35;
widthHint.setLayoutData(_data);
new Label(gridDataGroup, SWT.NONE).setText("widthHint");
// heightHint ------------------------------------
heightHint = new Text(gridDataGroup, SWT.BORDER);
heightHint.setText("-1");
heightHint.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.heightHint = getEventValue(e, "heightHint").intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 35;
heightHint.setLayoutData(_data);
new Label(gridDataGroup, SWT.NONE).setText("heightHint");
// horizontalAlignment ------------------------------------
horizAlign = new Combo(gridDataGroup, SWT.READ_ONLY);
horizAlign.setItems(alignValues);
horizAlign.select(0);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
horizAlign.setLayoutData(_data);
horizAlign.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
String align = ((Combo) e.widget).getText();
d.horizontalAlignment = findAlignment(align);
updateView();
}
});
new Label(gridDataGroup, SWT.NONE).setText("horizontalAlignment");
// verticalAlignment ------------------------------------
vertAlign = new Combo(gridDataGroup, SWT.READ_ONLY);
vertAlign.setItems(alignValues);
vertAlign.select(0);
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 60;
vertAlign.setLayoutData(_data);
vertAlign.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
String align = ((Combo) e.widget).getText();
d.verticalAlignment = findAlignment(align);
updateView();
}
});
new Label(gridDataGroup, SWT.NONE).setText("verticalAlignment");
// horizontalIndent ------------------------------------
horizIndent = new Text(gridDataGroup, SWT.BORDER);
horizIndent.setText("0");
horizIndent.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.horizontalIndent = getEventValue(e, "horizontalIndent")
.intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 35;
horizIndent.setLayoutData(_data);
new Label(gridDataGroup, SWT.NONE).setText("horizontalIndent");
// horizontalSpan ------------------------------------
horizSpan = new Text(gridDataGroup, SWT.BORDER);
horizSpan.setText("1");
horizSpan.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.horizontalSpan = getEventValue(e, "horizontalSpan")
.intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 35;
horizSpan.setLayoutData(_data);
new Label(gridDataGroup, SWT.NONE).setText("horizontalSpan");
// verticalSpan ------------------------------------
vertSpan = new Text(gridDataGroup, SWT.BORDER);
vertSpan.setText("1");
vertSpan.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.verticalSpan = getEventValue(e, "verticalSpan").intValue();
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.widthHint = 35;
vertSpan.setLayoutData(_data);
new Label(gridDataGroup, SWT.NONE).setText("verticalSpan");
// grabExcessHorizontalSpace ------------------------------------
grabHSpace = new Button(gridDataGroup, SWT.CHECK);
grabHSpace.setText("grabExcessHorizontalSpace");
grabHSpace.setSelection(false);
grabHSpace.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.grabExcessHorizontalSpace = !d.grabExcessHorizontalSpace;
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.horizontalSpan = 2;
_data.horizontalIndent = 14;
grabHSpace.setLayoutData(_data);
// grabExcessVerticalSpace ------------------------------------
grabVSpace = new Button(gridDataGroup, SWT.CHECK);
grabVSpace.setText("grabExcessVerticalSpace");
grabVSpace.setSelection(false);
grabVSpace.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (selectedShape == null)
return;
GridData d = (GridData) gridLayout.getConstraint(selectedShape);
d.grabExcessVerticalSpace = !d.grabExcessVerticalSpace;
updateView();
}
});
_data = new org.eclipse.swt.layout.GridData();
_data.horizontalSpan = 2;
_data.horizontalIndent = 14;
grabVSpace.setLayoutData(_data);
setEnableGridDataGroup(false);
}
protected void setEnableGridDataGroup(boolean enable) {
widthHint.setEnabled(enable);
heightHint.setEnabled(enable);
horizIndent.setEnabled(enable);
vertSpan.setEnabled(enable);
horizSpan.setEnabled(enable);
vertAlign.setEnabled(enable);
horizAlign.setEnabled(enable);
grabVSpace.setEnabled(enable);
grabHSpace.setEnabled(enable);
}
protected void populateGridDataGroup(GridData d) {
widthHint.setText(Integer.toString(d.widthHint));
heightHint.setText(Integer.toString(d.heightHint));
horizIndent.setText(Integer.toString(d.horizontalIndent));
vertSpan.setText(Integer.toString(d.verticalSpan));
horizSpan.setText(Integer.toString(d.horizontalSpan));
vertAlign.select(findAlignment(d.verticalAlignment));
horizAlign.select(findAlignment(d.horizontalAlignment));
grabVSpace.setSelection(d.grabExcessVerticalSpace);
grabHSpace.setSelection(d.grabExcessHorizontalSpace);
}
protected int findAlignment(int align) {
switch (align) {
case SWT.BEGINNING:
return 0; // these are the index into the align combo
case SWT.CENTER:
return 1;
case SWT.END:
return 2;
case SWT.FILL:
return 3;
default:
break;
}
return -1;
}
protected int findAlignment(String align) {
if (align.equals("BEGINNING")) {
return SWT.BEGINNING;
} else if (align.equals("CENTER")) {
return SWT.CENTER;
} else if (align.equals("END")) {
return SWT.END;
} else if (align.equals("FILL")) {
return SWT.FILL;
}
return -1;
}
/**
* @see org.eclipse.draw2d.examples.AbstractExample#hookShell()
*/
protected void hookShell() {
composite = new Composite(shell, 0);
_data = new org.eclipse.swt.layout.GridData(
org.eclipse.swt.layout.GridData.FILL_VERTICAL);
_data.widthHint = 300;
composite.setLayoutData(_data);
composite.setLayout(new org.eclipse.swt.layout.GridLayout());
createColumnGroup();
createMarginGroup();
createChildGroup();
createGridDataGroup();
}
}