1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.ui.wizards.dialogfields;
12 
13 import org.eclipse.jface.util.Assert;
14 import org.eclipse.swt.SWT;
15 import org.eclipse.swt.layout.GridData;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Control;
18 import org.eclipse.swt.widgets.Display;
19 import org.eclipse.swt.widgets.Label;
20 
21 /**
22  * Base class of all dialog fields. Dialog fields manage controls together with
23  * the model, independed from the creation time of the widgets. - support for
24  * automated layouting. - enable / disable, set focus a concept of the base
25  * class.
26  *
27  * DialogField have a label.
28  */
29 public class DialogField {
30 
31 	private Label fLabel;
32 
33 	protected String fLabelText;
34 
35 	private IDialogFieldListener fDialogFieldListener;
36 
37 	private boolean fEnabled;
38 
DialogField()39 	public DialogField() {
40 		fEnabled = true;
41 		fLabel = null;
42 		fLabelText = ""; //$NON-NLS-1$
43 	}
44 
45 	/**
46 	 * Sets the label of the dialog field.
47 	 */
setLabelText(String labeltext)48 	public void setLabelText(String labeltext) {
49 		fLabelText = labeltext;
50 	}
51 
52 	// ------ change listener
53 
54 	/**
55 	 * Defines the listener for this dialog field.
56 	 */
setDialogFieldListener(IDialogFieldListener listener)57 	public final void setDialogFieldListener(IDialogFieldListener listener) {
58 		fDialogFieldListener = listener;
59 	}
60 
61 	/**
62 	 * Programatical invocation of a dialog field change.
63 	 */
dialogFieldChanged()64 	public void dialogFieldChanged() {
65 		if (fDialogFieldListener != null) {
66 			fDialogFieldListener.dialogFieldChanged(this);
67 		}
68 	}
69 
70 	// ------- focus management
71 
72 	/**
73 	 * Tries to set the focus to the dialog field. Returns <code>true</code>
74 	 * if the dialog field can take focus. To be reimplemented by dialog field
75 	 * implementors.
76 	 */
setFocus()77 	public boolean setFocus() {
78 		return false;
79 	}
80 
81 	/**
82 	 * Posts <code>setFocus</code> to the display event queue.
83 	 */
postSetFocusOnDialogField(Display display)84 	public void postSetFocusOnDialogField(Display display) {
85 		if (display != null) {
86 			display.asyncExec(new Runnable() {
87 				public void run() {
88 					setFocus();
89 				}
90 			});
91 		}
92 	}
93 
94 	// ------- layout helpers
95 
96 	/**
97 	 * Creates all controls of the dialog field and fills it to a composite. The
98 	 * composite is assumed to have <code>MGridLayout</code> as layout. The
99 	 * dialog field will adjust its controls' spans to the number of columns
100 	 * given. To be reimplemented by dialog field implementors.
101 	 */
doFillIntoGrid(Composite parent, int nColumns)102 	public Control[] doFillIntoGrid(Composite parent, int nColumns) {
103 		assertEnoughColumns(nColumns);
104 
105 		Label label = getLabelControl(parent);
106 		label.setLayoutData(gridDataForLabel(nColumns));
107 
108 		return new Control[] { label };
109 	}
110 
111 	/**
112 	 * Returns the number of columns of the dialog field. To be reimplemented by
113 	 * dialog field implementors.
114 	 */
getNumberOfControls()115 	public int getNumberOfControls() {
116 		return 1;
117 	}
118 
gridDataForLabel(int span)119 	protected static GridData gridDataForLabel(int span) {
120 		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
121 		gd.horizontalSpan = span;
122 		return gd;
123 	}
124 
125 	// ------- ui creation
126 
127 	/**
128 	 * Creates or returns the created label widget.
129 	 *
130 	 * @param parent
131 	 *            The parent composite or <code>null</code> if the widget has
132 	 *            already been created.
133 	 */
getLabelControl(Composite parent)134 	public Label getLabelControl(Composite parent) {
135 		if (fLabel == null) {
136 			assertCompositeNotNull(parent);
137 
138 			fLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
139 			fLabel.setFont(parent.getFont());
140 			fLabel.setEnabled(fEnabled);
141 			if (fLabelText != null && !"".equals(fLabelText)) { //$NON-NLS-1$
142 				fLabel.setText(fLabelText);
143 			} else {
144 				// XXX: to avoid a 16 pixel wide empty label - revisit
145 				fLabel.setText("."); //$NON-NLS-1$
146 				fLabel.setVisible(false);
147 			}
148 		}
149 		return fLabel;
150 	}
151 
152 	/**
153 	 * Creates a spacer control.
154 	 *
155 	 * @param parent
156 	 *            The parent composite
157 	 */
createEmptySpace(Composite parent)158 	public static Control createEmptySpace(Composite parent) {
159 		return createEmptySpace(parent, 1);
160 	}
161 
162 	/**
163 	 * Creates a spacer control with the given span. The composite is assumed to
164 	 * have <code>MGridLayout</code> as layout.
165 	 *
166 	 * @param parent
167 	 *            The parent composite
168 	 */
createEmptySpace(Composite parent, int span)169 	public static Control createEmptySpace(Composite parent, int span) {
170 		Label label = new Label(parent, SWT.LEFT);
171 		GridData gd = new GridData();
172 		gd.horizontalAlignment = GridData.BEGINNING;
173 		gd.grabExcessHorizontalSpace = false;
174 		gd.horizontalSpan = span;
175 		gd.horizontalIndent = 0;
176 		gd.widthHint = 0;
177 		gd.heightHint = 0;
178 		label.setLayoutData(gd);
179 		return label;
180 	}
181 
182 	/**
183 	 * Tests is the control is not <code>null</code> and not disposed.
184 	 */
isOkToUse(Control control)185 	protected final boolean isOkToUse(Control control) {
186 		return (control != null) && !(control.isDisposed());
187 	}
188 
189 	// --------- enable / disable management
190 
191 	/**
192 	 * Sets the enable state of the dialog field.
193 	 */
setEnabled(boolean enabled)194 	public final void setEnabled(boolean enabled) {
195 		if (enabled != fEnabled) {
196 			fEnabled = enabled;
197 			updateEnableState();
198 		}
199 	}
200 
201 	/**
202 	 * Called when the enable state changed. To be extended by dialog field
203 	 * implementors.
204 	 */
updateEnableState()205 	protected void updateEnableState() {
206 		if (fLabel != null) {
207 			fLabel.setEnabled(fEnabled);
208 		}
209 	}
210 
211 	/**
212 	 * Gets the enable state of the dialog field.
213 	 */
isEnabled()214 	public final boolean isEnabled() {
215 		return fEnabled;
216 	}
217 
assertCompositeNotNull(Composite comp)218 	protected final void assertCompositeNotNull(Composite comp) {
219 		Assert.isNotNull(comp,
220 				"uncreated control requested with composite null"); //$NON-NLS-1$
221 	}
222 
assertEnoughColumns(int nColumns)223 	protected final void assertEnoughColumns(int nColumns) {
224 		Assert.isTrue(nColumns >= getNumberOfControls(),
225 				"given number of columns is too small"); //$NON-NLS-1$
226 	}
227 
228 }
229