/******************************************************************************* * Copyright (c) 2000, 2008 IBM 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.examples.layoutexample; import org.eclipse.swt.*; import org.eclipse.swt.custom.*; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; class StackLayoutTab extends Tab { /* Controls for setting layout parameters */ Button backButton, advanceButton; Label topControl; Spinner marginWidth, marginHeight; /* The example layout instance */ StackLayout stackLayout; int currentLayer = -1; /* TableEditors and related controls*/ TableEditor comboEditor, nameEditor; CCombo combo; Text nameText; final int NAME_COL = 0; final int TOTAL_COLS = 2; /** * Creates the Tab within a given instance of LayoutExample. */ StackLayoutTab(LayoutExample instance) { super(instance); } /** * Creates the widgets in the "child" group. */ @Override void createChildWidgets() { /* Add common controls */ super.createChildWidgets(); /* Add TableEditors */ comboEditor = new TableEditor(table); nameEditor = new TableEditor(table); table.addMouseListener (new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { resetEditors(); index = table.getSelectionIndex(); if (index == -1) return; //set top layer of stack to the selected item setTopControl (index); TableItem oldItem = comboEditor.getItem(); newItem = table.getItem(index); if (newItem == oldItem || newItem != lastSelected) { lastSelected = newItem; return; } table.showSelection(); combo = new CCombo(table, SWT.READ_ONLY); createComboEditor(combo, comboEditor); nameText = new Text(table, SWT.SINGLE); nameText.setText(data.elementAt(index)[NAME_COL]); createTextEditor(nameText, nameEditor, NAME_COL); } }); } /** * Creates the control widgets. */ @Override void createControlWidgets() { /* Controls the topControl in the StackLayout */ Group columnGroup = new Group (controlGroup, SWT.NONE); columnGroup.setText ("topControl");//(LayoutExample.getResourceString ("Top_Control")); columnGroup.setLayout(new GridLayout(3, false)); columnGroup.setLayoutData(new GridData (SWT.FILL, SWT.FILL, false, false)); backButton = new Button(columnGroup, SWT.PUSH); backButton.setText("<<"); backButton.setEnabled(false); backButton.setLayoutData(new GridData (SWT.END, SWT.CENTER, false, false)); backButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setTopControl (currentLayer - 1); } }); topControl = new Label (columnGroup, SWT.BORDER); topControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); advanceButton = new Button(columnGroup, SWT.PUSH); advanceButton.setText(">>"); advanceButton.setEnabled(false); advanceButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setTopControl (currentLayer + 1); } }); /* Controls the margins of the StackLayout */ Group marginGroup = new Group(controlGroup, SWT.NONE); marginGroup.setText (LayoutExample.getResourceString("Margins")); marginGroup.setLayout(new GridLayout(2, false)); marginGroup.setLayoutData (new GridData(SWT.FILL, SWT.CENTER, false, false)); new Label(marginGroup, SWT.NONE).setText("marginWidth"); marginWidth = new Spinner(marginGroup, SWT.BORDER); marginWidth.setSelection(0); marginWidth.addSelectionListener(selectionListener); new Label(marginGroup, SWT.NONE).setText("marginHeight"); marginHeight = new Spinner(marginGroup, SWT.BORDER); marginHeight.setSelection(0); marginHeight.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); marginHeight.addSelectionListener(selectionListener); /* Add common controls */ super.createControlWidgets(); } /** * Creates the example layout. */ @Override void createLayout() { stackLayout = new StackLayout(); layoutComposite.setLayout(stackLayout); } @Override void createLayoutComposite() { layoutComposite = new Composite(layoutGroup, SWT.BORDER); layoutComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); createLayout(); } /** * Disposes the editors without placing their contents * into the table. */ @Override void disposeEditors() { comboEditor.setEditor(null, null, -1); combo.dispose(); nameText.dispose(); } /** * Generates code for the example layout. */ @Override StringBuffer generateLayoutCode() { StringBuffer code = new StringBuffer(); code.append("\t\tStackLayout stackLayout = new StackLayout ();\n"); if (stackLayout.marginWidth != 0) { code.append("\t\tstackLayout.marginWidth = " + stackLayout.marginWidth + ";\n"); } if (stackLayout.marginHeight != 0) { code.append("\t\tstackLayout.marginHeight = " + stackLayout.marginHeight + ";\n"); } code.append("\t\tshell.setLayout (stackLayout);\n"); for(int i = 0; i < children.length; i++) { Control control = children[i]; code.append (getChildCode(control, i)); } if (children.length > 0 && currentLayer != -1) { code.append("\n\t\tstackLayout.topControl = " + names[currentLayer] + ";\n"); } return code; } @Override boolean needsCustom() { return true; } /** * Returns the string to insert when a new child control is added to the table. */ @Override String[] getInsertString (String name, String controlType) { return new String [] {name, controlType}; } /** * Returns the layout data field names. */ @Override String[] getLayoutDataFieldNames() { return new String[] {"Control Name", "Control Type"}; } /** * Gets the text for the tab folder item. */ @Override String getTabText() { return "StackLayout"; } /** * Takes information from TableEditors and stores it. */ @Override void resetEditors (boolean tab) { TableItem oldItem = comboEditor.getItem (); comboEditor.setEditor (null, null, -1); if (oldItem != null) { int row = table.indexOf (oldItem); try { new String (nameText.getText ()); } catch (NumberFormatException e) { nameText.setText (oldItem.getText (NAME_COL)); } String [] insert = new String [] {nameText.getText (), combo.getText ()}; data.setElementAt (insert, row); for (int i = 0 ; i < TOTAL_COLS; i++) { oldItem.setText (i, data.elementAt (row) [i]); } if (!tab) disposeEditors (); } setLayoutState (); refreshLayoutComposite (); setTopControl (currentLayer); layoutGroup.layout (true); } void setTopControl (int index) { if (index == -1 || children.length == 0) { currentLayer = -1; topControl.setText (""); } else { currentLayer = index; stackLayout.topControl = children [currentLayer]; layoutComposite.layout (); TableItem item = table.getItem(currentLayer); topControl.setText (item.getText(0)); } backButton.setEnabled(children.length > 1 && currentLayer > 0); advanceButton.setEnabled(children.length > 1 && currentLayer < children.length - 1); } /** * Sets the state of the layout. */ @Override void setLayoutState() { /* Set the margins and spacing */ stackLayout.marginWidth = marginWidth.getSelection(); stackLayout.marginHeight = marginHeight.getSelection(); } }