/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** 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.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.ui.internal.dialogs.preferences;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.ui.internal.Application;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.util.LayoutUtils;
/**
* Container for all Preferences that have not yet been categorized.
*
* @author bpasero
*/
public class MiscPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
/** ID of this Preferences Page */
public static final String ID = "org.rssowl.ui.MiscPreferences"; //$NON-NLS-1$
private IPreferenceScope fGlobalScope;
private IPreferenceScope fEclipseScope;
private Button fMinimizeToTray;
private Button fMoveToTrayOnStart;
private Button fMoveToTrayOnExit;
private Spinner fAutoCloseTabsSpinner;
private Button fAutoCloseTabsCheck;
private Button fUseMultipleTabsCheck;
private Button fReopenFeedsOnStartupCheck;
private Button fAlwaysReuseFeedView;
private Button fOpenOnSingleClick;
private Button fUpdateOnStartup;
private Button fSingleClickRestore;
private Button fDoubleClickRestore;
/** Leave for reflection */
public MiscPreferencePage() {
fGlobalScope = Owl.getPreferenceService().getGlobalScope();
fEclipseScope = Owl.getPreferenceService().getEclipseScope();
setImageDescriptor(OwlUI.getImageDescriptor("icons/elcl16/view.gif")); //$NON-NLS-1$
}
/**
* @param title
*/
public MiscPreferencePage(String title) {
super(title);
}
/*
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {}
/*
* @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
super.createControl(parent);
updateApplyEnablement(false);
}
/*
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
Composite container = createComposite(parent);
/* Tab Options */
createTabOptions(container);
/* System Tray Options */
if (!Application.IS_ECLIPSE)
createTrayOptions(container);
/* Misc Options */
createMiscOptions(container);
applyDialogFont(container);
/* Enable Apply Button on Selection Changes */
OwlUI.runOnSelection(new Runnable() {
public void run() {
updateApplyEnablement(true);
}
}, container);
return container;
}
private void createTabOptions(Composite container) {
Label label = new Label(container, SWT.NONE);
label.setText(Messages.MiscPreferencePage_TABBED_BROWSING);
label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
/* Group */
Composite group = new Composite(container, SWT.None);
group.setLayout(LayoutUtils.createGridLayout(1, 7, 3));
((GridLayout) group.getLayout()).marginBottom = 5;
group.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
fAlwaysReuseFeedView = new Button(group, SWT.CHECK);
fAlwaysReuseFeedView.setText(Messages.MiscPreferencePage_SAME_TAB);
fAlwaysReuseFeedView.setSelection(fGlobalScope.getBoolean(DefaultPreferences.ALWAYS_REUSE_FEEDVIEW));
fUseMultipleTabsCheck = new Button(group, SWT.CHECK);
fUseMultipleTabsCheck.setText(Messages.MiscPreferencePage_MULTIPLE_TABS);
fUseMultipleTabsCheck.setSelection(fEclipseScope.getBoolean(DefaultPreferences.ECLIPSE_MULTIPLE_TABS));
Composite autoCloseTabsContainer = new Composite(group, SWT.None);
autoCloseTabsContainer.setLayout(LayoutUtils.createGridLayout(3, 0, 0, 0, 2, false));
fAutoCloseTabsCheck = new Button(autoCloseTabsContainer, SWT.CHECK);
fAutoCloseTabsCheck.setText(Messages.MiscPreferencePage_TAB_LIMIT);
fAutoCloseTabsCheck.setSelection(fEclipseScope.getBoolean(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS));
fAutoCloseTabsCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fAutoCloseTabsSpinner.setEnabled(fAutoCloseTabsCheck.getSelection());
fAlwaysReuseFeedView.setEnabled(!fAutoCloseTabsCheck.getSelection() || fAutoCloseTabsSpinner.getSelection() > 1);
}
});
fAutoCloseTabsSpinner = new Spinner(autoCloseTabsContainer, SWT.BORDER);
fAutoCloseTabsSpinner.setMinimum(1);
fAutoCloseTabsSpinner.setMaximum(100);
fAutoCloseTabsSpinner.setSelection(fEclipseScope.getInteger(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS_THRESHOLD));
fAutoCloseTabsSpinner.setEnabled(fAutoCloseTabsCheck.getSelection());
fAutoCloseTabsSpinner.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fAlwaysReuseFeedView.setEnabled(!fAutoCloseTabsCheck.getSelection() || fAutoCloseTabsSpinner.getSelection() > 1);
}
});
label = new Label(autoCloseTabsContainer, SWT.None);
label.setText(Messages.MiscPreferencePage_TABS);
fAlwaysReuseFeedView.setEnabled(!fAutoCloseTabsCheck.getSelection() || fAutoCloseTabsSpinner.getSelection() > 1);
}
private void createMiscOptions(Composite container) {
Label label = new Label(container, SWT.NONE);
label.setText(Messages.MiscPreferencePage_MISC);
label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
/* Group */
Composite miscGroup = new Composite(container, SWT.None);
miscGroup.setLayout(LayoutUtils.createGridLayout(1, 7, 3));
miscGroup.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
fReopenFeedsOnStartupCheck = new Button(miscGroup, SWT.CHECK);
fReopenFeedsOnStartupCheck.setText(Messages.MiscPreferencePage_REOPEN_LAST_OPENED);
fReopenFeedsOnStartupCheck.setSelection(fEclipseScope.getBoolean(DefaultPreferences.ECLIPSE_RESTORE_TABS));
fOpenOnSingleClick = new Button(miscGroup, SWT.CHECK);
fOpenOnSingleClick.setText(Messages.MiscPreferencePage_SINGLE_CLICK);
fOpenOnSingleClick.setSelection(fEclipseScope.getBoolean(DefaultPreferences.ECLIPSE_SINGLE_CLICK_OPEN));
if (!Application.IS_ECLIPSE) {
fUpdateOnStartup = new Button(miscGroup, SWT.CHECK);
fUpdateOnStartup.setText(Messages.MiscPreferencePage_UPDATE_ON_STARTUP);
fUpdateOnStartup.setSelection(fGlobalScope.getBoolean(DefaultPreferences.UPDATE_ON_STARTUP));
}
}
private void createTrayOptions(Composite container) {
Label label = new Label(container, SWT.NONE);
label.setText(Messages.MiscPreferencePage_SYSTEM_TRAY);
label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
/* Group */
Composite group = new Composite(container, SWT.None);
group.setLayout(LayoutUtils.createGridLayout(1, 7, 3));
((GridLayout) group.getLayout()).marginBottom = 5;
group.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
label = new Label(group, SWT.NONE);
label.setText(Messages.MiscPreferencePage_MOVE_TO_TRAY);
/* Enable / Disable Tray */
fMinimizeToTray = new Button(group, SWT.CHECK);
fMinimizeToTray.setText(Messages.MiscPreferencePage_ON_MINIMIZE);
fMinimizeToTray.setSelection(fGlobalScope.getBoolean(DefaultPreferences.TRAY_ON_MINIMIZE));
fMinimizeToTray.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateRestoreEnablement();
}
});
/* Move to Tray on Start */
fMoveToTrayOnStart = new Button(group, SWT.CHECK);
fMoveToTrayOnStart.setText(Messages.MiscPreferencePage_ON_START);
fMoveToTrayOnStart.setSelection(fGlobalScope.getBoolean(DefaultPreferences.TRAY_ON_START));
fMoveToTrayOnStart.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateRestoreEnablement();
}
});
/* Move to Tray on Close */
fMoveToTrayOnExit = new Button(group, SWT.CHECK);
fMoveToTrayOnExit.setText(Messages.MiscPreferencePage_ON_CLOSE);
fMoveToTrayOnExit.setSelection(fGlobalScope.getBoolean(DefaultPreferences.TRAY_ON_CLOSE));
fMoveToTrayOnExit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateRestoreEnablement();
}
});
label = new Label(group, SWT.NONE);
label.setText(Messages.MiscPreferencePage_RESTORE_FROM_TRAY);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
((GridData) label.getLayoutData()).verticalIndent = 5;
Composite buttonContainer = new Composite(group, SWT.None);
buttonContainer.setLayout(LayoutUtils.createGridLayout(2, 0, 0));
fSingleClickRestore = new Button(buttonContainer, SWT.RADIO);
fSingleClickRestore.setText(Messages.MiscPreferencePage_SINGLE_CLICK_RESTORE);
fSingleClickRestore.setSelection(!fGlobalScope.getBoolean(DefaultPreferences.RESTORE_TRAY_DOUBLECLICK));
fDoubleClickRestore = new Button(buttonContainer, SWT.RADIO);
fDoubleClickRestore.setText(Messages.MiscPreferencePage_DOUBLE_CLICK_RESTORE);
fDoubleClickRestore.setSelection(fGlobalScope.getBoolean(DefaultPreferences.RESTORE_TRAY_DOUBLECLICK));
updateRestoreEnablement();
}
private void updateRestoreEnablement() {
boolean enable = fMinimizeToTray.getSelection() || fMoveToTrayOnStart.getSelection() || fMoveToTrayOnExit.getSelection();
fSingleClickRestore.setEnabled(enable);
fDoubleClickRestore.setEnabled(enable);
}
private Composite createComposite(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
composite.setFont(parent.getFont());
return composite;
}
/*
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
if (!Application.IS_ECLIPSE)
fGlobalScope.putBoolean(DefaultPreferences.UPDATE_ON_STARTUP, fUpdateOnStartup.getSelection());
fEclipseScope.putBoolean(DefaultPreferences.ECLIPSE_SINGLE_CLICK_OPEN, fOpenOnSingleClick.getSelection());
if (!Application.IS_ECLIPSE)
OpenStrategy.setOpenMethod(fOpenOnSingleClick.getSelection() ? OpenStrategy.SINGLE_CLICK | OpenStrategy.ARROW_KEYS_OPEN : OpenStrategy.DOUBLE_CLICK);
fEclipseScope.putBoolean(DefaultPreferences.ECLIPSE_RESTORE_TABS, fReopenFeedsOnStartupCheck.getSelection());
fGlobalScope.putBoolean(DefaultPreferences.ALWAYS_REUSE_FEEDVIEW, fAlwaysReuseFeedView.getSelection());
fEclipseScope.putBoolean(DefaultPreferences.ECLIPSE_MULTIPLE_TABS, fUseMultipleTabsCheck.getSelection());
fEclipseScope.putBoolean(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS, fAutoCloseTabsCheck.getSelection());
fEclipseScope.putInteger(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS_THRESHOLD, fAutoCloseTabsSpinner.getSelection());
if (!Application.IS_ECLIPSE) {
fGlobalScope.putBoolean(DefaultPreferences.TRAY_ON_MINIMIZE, fMinimizeToTray.getSelection());
fGlobalScope.putBoolean(DefaultPreferences.TRAY_ON_START, fMoveToTrayOnStart.getSelection());
fGlobalScope.putBoolean(DefaultPreferences.TRAY_ON_CLOSE, fMoveToTrayOnExit.getSelection());
fGlobalScope.putBoolean(DefaultPreferences.RESTORE_TRAY_DOUBLECLICK, fDoubleClickRestore.getSelection());
}
return super.performOk();
}
/*
* @see org.eclipse.jface.preference.PreferencePage#performApply()
*/
@Override
protected void performApply() {
super.performApply();
updateApplyEnablement(false);
}
/*
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
super.performDefaults();
IPreferenceScope defaultScope = Owl.getPreferenceService().getDefaultScope();
if (!Application.IS_ECLIPSE)
fUpdateOnStartup.setSelection(defaultScope.getBoolean(DefaultPreferences.UPDATE_ON_STARTUP));
fOpenOnSingleClick.setSelection(defaultScope.getBoolean(DefaultPreferences.ECLIPSE_SINGLE_CLICK_OPEN));
if (!Application.IS_ECLIPSE)
OpenStrategy.setOpenMethod(fOpenOnSingleClick.getSelection() ? OpenStrategy.SINGLE_CLICK | OpenStrategy.ARROW_KEYS_OPEN : OpenStrategy.DOUBLE_CLICK);
fReopenFeedsOnStartupCheck.setSelection(defaultScope.getBoolean(DefaultPreferences.ECLIPSE_RESTORE_TABS));
fAlwaysReuseFeedView.setSelection(true); //Forced for performance reasons
fUseMultipleTabsCheck.setSelection(defaultScope.getBoolean(DefaultPreferences.ECLIPSE_MULTIPLE_TABS));
fAutoCloseTabsCheck.setSelection(defaultScope.getBoolean(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS));
fAutoCloseTabsSpinner.setSelection(defaultScope.getInteger(DefaultPreferences.ECLIPSE_AUTOCLOSE_TABS_THRESHOLD));
fAutoCloseTabsSpinner.setEnabled(fAutoCloseTabsCheck.getSelection());
if (!Application.IS_ECLIPSE) {
fMinimizeToTray.setSelection(defaultScope.getBoolean(DefaultPreferences.TRAY_ON_MINIMIZE));
fMoveToTrayOnStart.setSelection(defaultScope.getBoolean(DefaultPreferences.TRAY_ON_START));
fMoveToTrayOnExit.setSelection(defaultScope.getBoolean(DefaultPreferences.TRAY_ON_CLOSE));
fSingleClickRestore.setSelection(!defaultScope.getBoolean(DefaultPreferences.RESTORE_TRAY_DOUBLECLICK));
fDoubleClickRestore.setSelection(defaultScope.getBoolean(DefaultPreferences.RESTORE_TRAY_DOUBLECLICK));
updateRestoreEnablement();
}
fAlwaysReuseFeedView.setEnabled(!fAutoCloseTabsCheck.getSelection() || fAutoCloseTabsSpinner.getSelection() > 1);
updateApplyEnablement(true);
}
private void updateApplyEnablement(boolean enable) {
Button applyButton = getApplyButton();
if (applyButton != null && !applyButton.isDisposed() && applyButton.isEnabled() != enable)
applyButton.setEnabled(enable);
}
}