package ie.dcu.apps.ist.dialogs; import static ie.dcu.segment.annotate.AnnotationType.*; import ie.dcu.apps.ist.*; import ie.dcu.apps.ist.AppPrefs.Keys; import ie.dcu.apps.ist.widgets.ColorSelector; import ie.dcu.swt.SwtUtils; import ie.dcu.swt.layout.LayoutFactory; import java.util.*; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class PrefsDialog { private static final String APPLICATION = "application"; private static final String STATUS = "status"; private static final String VIEW = "view"; private static final String TITLE = "title"; private static final String GENERAL = "general"; private static final String CLOSE = "close"; private static final String RESET = "reset"; private static final String TEXT = "text"; private static final String ICON = "icon"; private static final String TTIP = "ttip"; private static final String EXPERIMENT = "experiment"; private final AppWindow window; private final AppPrefs prefs; private final Shell shell; private final Composite content; private final TabFolder folder; private final Composite buttonBar; private final Composite generalTab; private final Button resetButton; private final Button closeButton; private final HashMap controls; private transient GridData gd; public PrefsDialog(AppWindow window) { this.window = window; this.prefs = window.getPrefs(); this.shell = createShell(); this.content = createContent(); this.folder = createTabFolder(); this.buttonBar = createButtonBar(); this.generalTab = createTab(GENERAL); this.resetButton = createResetButton(); this.closeButton = createCloseButton(); this.controls = new HashMap(); createControls(); loadPreferences(); SwtUtils.center(window.getShell(), shell); } private void createControls() { // Initialize general tab createBanner(generalTab, APPLICATION); createLabel(generalTab, Keys.CONFIRM_EXIT); createCheckBox(generalTab, Keys.CONFIRM_EXIT); createLabel(generalTab, Keys.CONFIRM_CLOSE); createCheckBox(generalTab, Keys.CONFIRM_CLOSE); createBanner(generalTab, STATUS); createLabel(generalTab, Keys.ENABLE_FEEDBACK); createCheckBox(generalTab, Keys.ENABLE_FEEDBACK); createBanner(generalTab, VIEW); createLabel(generalTab, Keys.FOREGROUND_COLOR); createColorSelector(generalTab, Keys.FOREGROUND_COLOR); createLabel(generalTab, Keys.BACKGROUND_COLOR); createColorSelector(generalTab, Keys.BACKGROUND_COLOR); createBanner(generalTab, EXPERIMENT); createLabel(generalTab, Keys.EXPERIMENT_EMBEDDED); createCheckBox(generalTab, Keys.EXPERIMENT_EMBEDDED); } private void loadPreferences() { // Load confirm exit loadBool(Keys.CONFIRM_EXIT, true); // Load confirm exit loadBool(Keys.CONFIRM_CLOSE, true); // Load enable feedback loadBool(Keys.ENABLE_FEEDBACK, true); // Load foreground color loadColor(Keys.FOREGROUND_COLOR, DEFAULT_FOREGROUND); // Load background color loadColor(Keys.BACKGROUND_COLOR, DEFAULT_BACKGROUND); // Load experiment embedded loadBool(Keys.EXPERIMENT_EMBEDDED, false); } private Shell createShell() { Shell s = new Shell(window.getShell(), SWT.SHELL_TRIM | SWT.SHEET); // Add listener s.addListener(SWT.Close, adapter); // Use a fill layout s.setLayout(new FillLayout()); // Set size and title s.setSize(420, 450); s.setText(property(TITLE, "Preferences")); return s; } private Composite createContent() { // Create content pane with grid layout Composite c = new Composite(shell, 0); c.setLayout(new GridLayout()); return c; } private TabFolder createTabFolder() { // Create folder TabFolder f = new TabFolder(content, SWT.TOP); // Layout folder f.setLayoutData(LayoutFactory.createGridData()); return f; } private Composite createButtonBar() { // Create bar Composite bar = new Composite(content, SWT.NONE); // Layout bar bar.setLayout(LayoutFactory.createGridLayout(0, 0, 2, true)); bar.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false)); return bar; } private Composite createTab(String name) { // Create item TabItem item = new TabItem(folder, SWT.NONE); item.setText(property(name, "tab", name)); // Create control Composite control = new Composite(folder, SWT.NONE); control.setLayout(LayoutFactory.createGridLayout(10, 5, 2, false)); // Set control item.setControl(control); // Return control (item can be ignored) return control; } private Button createResetButton() { // Create button Button bt = createButton(buttonBar, RESET, SWT.PUSH); // Layout button gd = new GridData(SWT.LEFT, SWT.BOTTOM, true, false); gd.minimumWidth = 85; bt.setLayoutData(gd); // Done return bt; } private Button createCloseButton() { // Create button Button bt = createButton(buttonBar, CLOSE, SWT.PUSH); // Layout button gd = new GridData(SWT.RIGHT, SWT.BOTTOM, true, false); gd.minimumWidth = 85; bt.setLayoutData(gd); // Done return bt; } private Button createCheckBox(Composite tab, String key) { Button bt = new Button(tab, SWT.CHECK); // Layout button gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gd.horizontalIndent = 5; bt.setLayoutData(gd); // Add listener bt.addListener(SWT.Selection, adapter); bt.setData(key); // Put into controls controls.put(key, bt); // Done return bt; } private ColorSelector createColorSelector(Composite tab, String key) { ColorSelector cs = new ColorSelector(tab); // Layout button gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gd.horizontalIndent = 10; gd.minimumWidth = 80; cs.setLayoutData(gd); // Add listener cs.addListener(SWT.Selection, adapter); cs.setData(key); // Put into controls controls.put(key, cs); // Done return cs; } private Label createBanner(Composite tab, String key) { // Create label Label lb = new Label(tab, SWT.NONE); lb.setText(property(key, key)); lb.setFont(JFaceResources.getBannerFont()); // Layout label gd = new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1); gd.verticalIndent = 5; lb.setLayoutData(gd); return lb; } private Label createLabel(Composite tab, String key) { // Create label Label lb = new Label(tab, SWT.NONE); lb.setText(property(key, TEXT, key)); // Layout label gd = new GridData(SWT.LEFT, SWT.CENTER, true, false); gd.horizontalIndent = 5; lb.setLayoutData(gd); return lb; } private Button createButton(Composite parent, String key, int style) { Button bt = new Button(parent, style); // Configure button configure(bt, key); // Add listener bt.addListener(SWT.Selection, adapter); // Done return bt; } protected void handleEvent(Event event) { switch (event.type) { case SWT.Close: handleClose(event); break; case SWT.Selection: handleSelection(event); break; } } private void handleClose(Event event) { // Prevent the shell from disposing on close event.doit = false; close(); } private void handleSelection(Event event) { if (event.widget == closeButton) { close(); } else if (event.widget == resetButton) { reset(); } else { Object data = event.widget.getData(); if (data instanceof String) { handleSelection(event, (String) data); } } } private void handleSelection(Event event, String key) { if (key.equals(Keys.ENABLE_FEEDBACK)) { storeBool(key); } else if (key.equals(Keys.FOREGROUND_COLOR)) { storeColor(key); } else if (key.equals(Keys.BACKGROUND_COLOR)) { storeColor(key); } else if (key.equals(Keys.EXPERIMENT_EMBEDDED)) { storeBool(key); } else if (key.equals(Keys.CONFIRM_EXIT)) { storeBool(key); } else if (key.equals(Keys.CONFIRM_CLOSE)) { storeBool(key); } } private void storeBool(String key) { Boolean bool = control(Button.class, key).getSelection(); prefs.put(Boolean.class, key, bool); } private void storeColor(String key) { RGB color = control(ColorSelector.class, key).getColor(); if (color != null) { prefs.put(RGB.class, key, color); } } private void loadBool(String key, boolean def) { Boolean bool = prefs.get(Boolean.class, key, def); control(Button.class, key).setSelection(bool); } private void loadColor(String key, RGB def) { RGB color = prefs.get(RGB.class, key, def); control(ColorSelector.class, key).setColor(color); } public void reset() { // Set defaults prefs.clear(); // Reload loadPreferences(); } public void close() { shell.setVisible(false); } public void open() { shell.setVisible(true); } private void configure(Button bt, String key) { // Read properties String text = property(key, TEXT, ""); String icon = property(key, ICON, null); String ttip = property(key, TTIP, null); // Set values bt.setText(text); bt.setImage(image(icon)); bt.setToolTipText(ttip); bt.setData(key); } private T control(Class clazz, String key) { return clazz.cast(controls.get(key)); } private String property(String key, String def) { Properties p = window.getProperties(); return p.getProperty(String.format("PrefsDialog.%s", key), def); } private String property(String key, String type, String def) { Properties p = window.getProperties(); String prop = String.format("PrefsDialog.%s.%s", key, type); return p.getProperty(prop, def); } private Image image(String url) { return (url != null) ? window.getIcon(url) : null; } private final Listener adapter = new Listener() { public void handleEvent(Event event) { PrefsDialog.this.handleEvent(event); } }; }