/******************************************************************************* * 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(); } }