package pctelelog.ui.option; import java.io.Serializable; import java.util.HashMap; import java.util.Set; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; 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.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import pctelelog.ui.PreferenceKey; import pctelelog.ui.PreferenceManager; import pctelelog.ui.WindowWidget; import pctelelog.ui.notify.EventHandler; public class OptionsWindow implements WindowWidget, SelectionListener { private Display m_mainDisplay = null; private Shell m_windowShell = null; private final EventHandler m_eventHandler; private OptionEvent m_event = null; private OptionEffect m_effect = null; /* * Set on close to show saved status. * * Needed so that window can tell if it needs * to revert settings or not. */ private boolean m_isSaved = false; public OptionsWindow(Display display, EventHandler handler) { if(display == null) { throw new NullPointerException("Display cannot be null."); } if(handler == null) { throw new NullPointerException("Event Handler cannot be null."); } m_mainDisplay = display; m_windowShell = new Shell(getMainDisplay(), SWT.CLOSE | SWT.APPLICATION_MODAL); m_windowShell.setText("Options"); m_eventHandler = handler; init(); m_windowShell.pack(); } public Shell getWindowShell() { return m_windowShell; } public Display getMainDisplay() { return m_mainDisplay; } public void open() { getWindowShell().open(); } public void widgetSelected(SelectionEvent e) { Button selected = (Button) e.getSource(); if(selected.getText().contains("OK")) { saveSettings(); m_isSaved = true; } getWindowShell().dispose(); } public void widgetDefaultSelected(SelectionEvent e) {} private void init() { initLayout(); initTabFolder(); initButtons(); initDisposeListener(); } private void initLayout() { GridLayout layout = new GridLayout(1, true); layout.marginBottom = 0; if(System.getProperty("os.name").toLowerCase().contains("mac")) { // Pull buttons up closer to frame layout.verticalSpacing = -5; } getWindowShell().setLayout(layout); } private void initTabFolder() { TabFolder tabFolder = new TabFolder(getWindowShell(), SWT.NONE); tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); m_event = new OptionEvent(tabFolder); m_effect = new OptionEffect(tabFolder, m_eventHandler); } private void initButtons() { Composite buttons = new Composite(getWindowShell(), SWT.NO_FOCUS); buttons.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, true, false)); GridLayout layout = new GridLayout(2,false); layout.marginHeight = 0; layout.verticalSpacing = 0; buttons.setLayout(layout); GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false); gd.widthHint = 80; Button ok = new Button(buttons, SWT.PUSH); ok.setText("OK"); ok.setToolTipText("Save the settings and close the window."); ok.setLayoutData(gd); ok.addSelectionListener(this); Button cancel = new Button(buttons, SWT.PUSH); cancel.setText("Cancel"); cancel.setToolTipText("Cancel currently made settings and close the window."); cancel.setLayoutData(gd); cancel.addSelectionListener(this); getWindowShell().setDefaultButton(cancel); } private void initDisposeListener() { getWindowShell().addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if(!m_isSaved) { m_effect.revertState(); } } }); } /** * Save the option window settings to storage * */ private void saveSettings() { HashMap<PreferenceKey, Serializable> pref = new HashMap<PreferenceKey, Serializable>(); pref.putAll(m_effect.getOptions()); pref.putAll(m_event.getOptions()); Set<PreferenceKey> keys = pref.keySet(); PreferenceManager prefManager = PreferenceManager.getPreferenceManager(); for(PreferenceKey key : keys) { prefManager.set(key, pref.get(key)); } } }