/*=============================================================================#
# Copyright (c) 2005-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.ecommons.ui.dialogs.groups;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import de.walware.ecommons.ui.util.LayoutUtil;
import de.walware.ecommons.ui.util.PixelConverter;
/**
* use {@link LayoutUtil}, if possible.
*/
public class Layouter {
public static final int DEFAULT_INDENTION = 20;
public Composite composite;
public int fNumColumns;
/**
* Creates a new Layout-util
* <p>
* Warning: Does not create a new composite.
*
* @param composite
* @param numColums
*/
public Layouter(final Composite composite, final int numColums) {
this.composite = composite;
fNumColumns = numColums;
final GridLayout layout = new GridLayout();
if (!(composite instanceof Group)) {
layout.marginHeight = 0;
layout.marginWidth = 0;
}
layout.numColumns = fNumColumns;
composite.setLayout(layout);
}
public Layouter(final Composite composite, final GridLayout layout) {
this.composite = composite;
fNumColumns = layout.numColumns;
composite.setLayout(layout);
}
public void add(final Control composite) {
add(composite, fNumColumns);
}
public void add(final Control composite, final int horizontalSpan) {
final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
gd.horizontalSpan = horizontalSpan;
composite.setLayoutData(gd);
}
public void addFiller() {
Dialog.applyDialogFont(composite);
final PixelConverter pixelConverter = new PixelConverter(composite);
final Label filler = new Label(composite, SWT.LEFT );
final GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = fNumColumns;
gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 2;
filler.setLayoutData(gd);
}
public void addSpaceGrabber() {
final Label filler = new Label(composite, SWT.NONE);
final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.horizontalSpan = fNumColumns;
filler.setLayoutData(gd);
}
/**
* Label (spans all cols)
* @param text
* @return the created label
*/
public Label addLabel(final String text) {
return addLabel(text, 0, fNumColumns);
}
public Label addLabel(final String text, final int indentation, final int hSpan) {
return addLabel(text, indentation, hSpan, false);
}
public Label addLabel(final String text, final int indentation, final int hSpan, final boolean vAlignTop) {
final Label label = new Label(composite, SWT.LEFT);
label.setText(text);
final GridData gd = new GridData(SWT.FILL, vAlignTop ? SWT.TOP : SWT.CENTER, false, false);
gd.horizontalIndent = indentation;
gd.horizontalSpan = hSpan;
label.setLayoutData(gd);
return label;
}
public Button addCheckBox(final String label) {
return addCheckBox(label, 0, fNumColumns);
}
public Button addCheckBox(final String label, final int indentation) {
return addCheckBox(label, indentation, fNumColumns);
}
public Button addCheckBox(final String label, final int indentation, final int horizontalSpan) {
final Button checkBox = new Button(composite, SWT.CHECK);
checkBox.setText(label);
final GridData gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
gd.horizontalIndent = indentation;
gd.horizontalSpan = horizontalSpan;
checkBox.setLayoutData(gd);
//makeScrollableCompositeAware(checkBox);
return checkBox;
}
public Text addTextControl() {
return addTextControl(0, fNumColumns, true, -1);
}
public Text addTextControl(final int hIndent, final int horizontalSpan, final boolean hGrab, final int widthHint) {
final Text text = new Text(composite, SWT.SINGLE | SWT.BORDER);
final GridData gd = new GridData(hGrab ? SWT.FILL : SWT.LEFT, SWT.CENTER, hGrab, false);
gd.horizontalIndent = hIndent;
gd.horizontalSpan = horizontalSpan;
if (widthHint > 0) {
gd.widthHint = new PixelConverter(text).convertWidthInCharsToPixels(widthHint);
}
text.setLayoutData(gd);
return text;
}
public Text addLabeledTextControl(final String label) {
addLabel(label, 0, 1);
return addTextControl(0, fNumColumns - 1, true, -1);
}
public Combo addLabeledComboControl(final String label, final String[] items) {
addLabel(label, 0, 1);
return addComboControl(items, true, 0, fNumColumns - 1, false);
}
public Combo addComboControl(final String[] items, final int numColumns) {
return addComboControl(items, true, 0, numColumns, true);
}
public Combo addComboControl(final String[] items, final boolean readOnly, final int hIndent, final int hSpan, final boolean hGrab) {
int style = SWT.DROP_DOWN;
if (readOnly) {
style |= SWT.READ_ONLY;
}
final Combo combo = new Combo(composite, style);
if (items != null) {
combo.setItems(items);
}
final GridData gd = new GridData(hGrab ? SWT.FILL : SWT.LEFT, SWT.CENTER, hGrab, false);
gd.horizontalIndent = hIndent;
gd.horizontalSpan = hSpan;
gd.widthHint = LayoutUtil.hintWidth(combo, items);
// PixelConverter conv = new PixelConverter(combo);
// gd.widthHint = conv.convertWidthInCharsToPixels(charWidth);
combo.setLayoutData(gd);
return combo;
}
public Button addButton(final String label, final SelectionListener listener) {
return addButton(label, listener, fNumColumns);
}
public Button addButton(final String label, final SelectionListener listener, final int horizontalSpan) {
final Button button = new Button(composite, SWT.PUSH);
button.setText(label);
final GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
gd.horizontalSpan = horizontalSpan;
gd.minimumWidth = LayoutUtil.hintWidth(button);
button.setLayoutData(gd);
if (listener != null) {
button.addSelectionListener(listener);
}
return button;
}
public void addGroup(final OptionsGroup group) {
group.createGroup(composite, fNumColumns);
}
public Group addGroup(final String label) {
return addGroup(label, false);
}
public Group addGroup(final String label, final boolean grabVerticalSpace) {
final Group group = new Group(composite, SWT.NONE);
group.setText(label);
final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, grabVerticalSpace);
gd.horizontalSpan = fNumColumns;
group.setLayoutData(gd);
return group;
}
}