blob: a6827e91d959b587103a5df30d7fb63583c0ceb8 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* 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 Implementation
*
*****************************************************************************/
package org.eclipse.ptp.utils.ui.swt;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
/**
* This generic group of controls provides an structure with
* an optional label and an optional button and provides space
* for a user-defined control.
*
* @author Richard Maciel
*
*/
public abstract class GenericControlGroup extends Composite {
Label label;
Button button;
Control customControl;
boolean buttonEnabled = true;
public GenericControlGroup(Composite parent, int bitmask, int rows, int chars) {
super(parent, SWT.NONE);
createContents(bitmask, rows, chars);
}
public GenericControlGroup(Composite parent, GenericControlMold mold) {
super(parent, SWT.NONE);
int rows = 0, chars = 0;
if (mold.hasHeight()) {
rows = mold.getHeight();
}
if (mold.hasWidth()) {
chars = mold.getWidth();
}
createContents(mold.bitmask, rows, chars);
if (mold.label != null) {
setLabel(mold.label);
}
if (mold.buttonLabel != null) {
setButtonLabel(mold.buttonLabel);
}
if (mold.tooltip != null) {
setToolTip(mold.tooltip);
}
}
protected void createContents(int bitmask, int rows, int chars) {
createLayout(bitmask);
createLabel(bitmask);
// Generate GridData for control
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
gd.horizontalSpan = 1;
customControl = createCustomControl(bitmask, gd);
if (rows > 0) {
gd.heightHint = getControlCharHeight(customControl) * rows;
}
if (chars > 0) {
gd.widthHint = getControlCharWidth(customControl) * chars;
}
customControl.setLayoutData(gd);
createButton(bitmask);
}
/**
* Create the layout for the enclosing composite..
*
* @param mold
* @return Layout
*/
protected void createLayout(int bitmask) {
GridLayout layout = new GridLayout();
layout.marginHeight = LayoutDefinitions.marginHeight;
layout.marginWidth = LayoutDefinitions.marginWidth;
layout.marginRight = 0;
layout.marginLeft = 0;
layout.marginBottom = 0;
layout.marginTop = 0;
layout.horizontalSpacing = LayoutDefinitions.horizontalSpacing;
layout.verticalSpacing = LayoutDefinitions.verticalSpacing;
/*
* Start with one column
*/
layout.numColumns = 1;
/*
* Add a second column if the label is shown on the left/
*/
if( ( (bitmask & GenericControlMold.HAS_LABEL) != 0 ) &&
( (bitmask & GenericControlMold.LABELABOVE) == 0 ) ) {
layout.numColumns++;
}
/*
* Add one more column if the button is shown on the right.
*/
if( (bitmask & GenericControlMold.HASBUTTON ) != 0 ) {
layout.numColumns++;
}
this.setLayout(layout);
/**
* Set layout data if parent has a GridLayout
*/
if (this.getParent().getLayout() instanceof GridLayout) {
if ((bitmask & TextMold.GRID_DATA_ALIGNMENT_FILL) != 0
|| (bitmask & TextMold.GRID_DATA_GRAB_EXCESS_SPACE) != 0
|| (bitmask & TextMold.GRID_DATA_SPAN) != 0) {
GridData gdpp = new GridData();
if( (bitmask & GenericControlMold.GRID_DATA_ALIGNMENT_FILL) != 0) {
//gdpp.grabExcessHorizontalSpace = true;
gdpp.horizontalAlignment = SWT.FILL;
}
if( (bitmask & GenericControlMold.GRID_DATA_GRAB_EXCESS_SPACE) != 0) {
gdpp.grabExcessHorizontalSpace = true;
//gdpp.horizontalAlignment = SWT.FILL;
}
if( (bitmask & GenericControlMold.GRID_DATA_SPAN) != 0) {
GridLayout glayout = (GridLayout)this.getParent().getLayout();
gdpp.horizontalSpan = glayout.numColumns;
}
this.setLayoutData(gdpp);
}
}
}
/**
* Generates a label control on this composite
*
* @param mold
*/
protected void createLabel(int bitmask) {
if ((bitmask & GenericControlMold.HAS_LABEL) != 0) {
label = new Label(this, SWT.NONE);
GridData gd = new GridData();
gd.horizontalAlignment = SWT.LEFT;
gd.verticalAlignment = SWT.CENTER;
gd.verticalSpan = 1;
if( (bitmask & GenericControlMold.LABELABOVE )
!= 0 ) {
gd.horizontalSpan =
((GridLayout)this.getLayout()).numColumns;
}
label.setLayoutData(gd);
}
}
/**
* User-implemented method to generate a control on this
* composite
*
* @param mold
*/
abstract protected Control createCustomControl(int bitmask, GridData gridData);
protected void createButton(int bitmask) {
// Create Button if desired
if( (bitmask & GenericControlMold.HASBUTTON) != 0) {
button = new Button(this, SWT.BUTTON1);
GridData gd = new GridData();
gd.horizontalAlignment = SWT.RIGHT;
gd.verticalAlignment = SWT.TOP;
gd.verticalSpan = 1;
gd.horizontalSpan = 1;
button.setLayoutData(gd);
}
}
protected int getControlCharWidth(Control control) {
GC gc = new GC (control);
FontMetrics fm = gc.getFontMetrics ();
int width = fm.getAverageCharWidth();
gc.dispose();
return width;
}
protected int getControlCharHeight(Control control) {
GC gc = new GC (control);
FontMetrics fm = gc.getFontMetrics ();
int height = fm.getHeight();
gc.dispose();
return height;
}
public Button getButton() {
return button;
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
*/
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
enableButton();
if(label != null) {
label.setEnabled(enabled);
}
customControl.setEnabled(enabled);
}
public void setButtonEnabled(boolean enabled) {
this.buttonEnabled = enabled;
enableButton();
}
private void enableButton() {
if(button != null) {
button.setEnabled(buttonEnabled && this.getEnabled());
}
}
public String getLabel() {
if (label != null) {
return label.getText();
} else {
return null;
}
}
public void setLabel(String text) {
if (label != null) {
label.setText(text);
} else {
throw new IllegalArgumentException(Messages.GenericControlGroup_NoControlGroupLabel);
}
}
public String getButtonLabel() {
if (button != null) {
return button.getText();
} else {
return null;
}
}
public void setButtonLabel(String text) {
if (button != null) {
button.setText(text);
} else {
throw new IllegalArgumentException(Messages.GenericControlGroup_NoControlGroupButton);
}
}
public void setToolTip(String text) {
this.setToolTipText(text);
if (button != null) {
button.setToolTipText(text);
}
if (label != null) {
label.setToolTipText(text);
}
}
}