package org.marketcetera.photon.preferences;
import java.util.TimeZone;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.ControlEnableState;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DateTime;
import org.marketcetera.photon.Messages;
import org.marketcetera.photon.TimeOfDay;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Field editor that provides a {@link DateTime} widget for a time and
* serializes it according to {@link TimeOfDay}.
*
* It can be configured to be "optional", i.e. the widget will be guarded by an
* enablement check box.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: TimeOfDayFieldEditor.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.0.0
*/
@ClassVersion("$Id: TimeOfDayFieldEditor.java 16154 2012-07-14 16:34:05Z colin $")
public final class TimeOfDayFieldEditor extends FieldEditor {
private final boolean mOptional;
private final TimeZone mTimeZone = TimeZone.getDefault();
private ControlEnableState mEnablement;
private DateTime mTime;
private Button mEnableButton;
private Composite mComposite;
/**
* Constructor.
*
* @param name
* the name of the preference this field editor works on
* @param labelText
* the label text of the field editor
* @param parent
* the widget container
* @param optional
* indicates whether the preference is optional
*/
public TimeOfDayFieldEditor(String name, String labelText,
Composite parent, boolean optional) {
init(name, Messages.TIME_OF_DAY_FIELD_EDITOR_PARENTHETICAL_PATTERN
.getText(labelText, mTimeZone.getDisplayName()));
mOptional = optional;
createControl(parent);
}
@Override
protected void adjustForNumColumns(int numColumns) {
// nothing to do
}
@Override
protected void createControl(Composite parent) {
if (mOptional) {
GridLayoutFactory.swtDefaults().applyTo(parent);
mEnableButton = new Button(parent, SWT.CHECK);
mEnableButton
.setText(Messages.TIME_OF_DAY_FIELD_EDITOR_ENABLE_BUTTON_LABEL
.getText());
GridDataFactory.defaultsFor(mEnableButton).applyTo(mEnableButton);
mComposite = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().indent(10, 0).applyTo(mComposite);
super.createControl(mComposite);
mEnablement = ControlEnableState.disable(mComposite);
mEnableButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (mEnableButton.getSelection()) {
mEnablement.restore();
} else {
mEnablement = ControlEnableState.disable(mComposite);
}
}
});
} else {
super.createControl(parent);
}
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
getLabelControl(parent);
mTime = new DateTime(parent, SWT.TIME | SWT.LONG);
mTime.setTime(0, 0, 0);
GridDataFactory.defaultsFor(mTime).applyTo(mTime);
}
@Override
protected void doLoad() {
load(getPreferenceStore().getString(getPreferenceName()));
}
@Override
protected void doLoadDefault() {
load(getPreferenceStore().getDefaultString(getPreferenceName()));
}
private void load(String string) {
if (StringUtils.isNotBlank(string)) {
TimeOfDay time = TimeOfDay.create(string);
if (time != null) {
mTime.setTime(time.getHour(mTimeZone), time
.getMinute(mTimeZone), time.getSecond(mTimeZone));
if (mOptional) {
mEnableButton.setSelection(true);
mEnablement.restore();
}
}
}
}
@Override
protected void doStore() {
String value;
if (mOptional && !mEnableButton.getSelection()) {
value = ""; //$NON-NLS-1$
} else {
TimeOfDay time = TimeOfDay.create(mTime.getHours(), mTime
.getMinutes(), mTime.getSeconds(), mTimeZone);
value = time.toFormattedString();
}
getPreferenceStore().setValue(getPreferenceName(), value);
}
@Override
public int getNumberOfControls() {
return 2;
}
}