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