/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.preferences;
/**
* @author BREDEX GmbH
* @created 01.09.2004
*/
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jubula.client.ui.constants.Constants;
import org.eclipse.jubula.client.ui.constants.ContextHelpIds;
import org.eclipse.jubula.client.ui.rcp.Plugin;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.rcp.provider.ControlDecorator;
import org.eclipse.jubula.client.ui.rcp.widgets.CheckedDirnameText;
import org.eclipse.jubula.client.ui.rcp.widgets.CheckedIntText;
import org.eclipse.jubula.client.ui.rcp.widgets.CheckedText;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.exception.Assert;
import org.eclipse.jubula.tools.internal.i18n.I18n;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
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.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
* Custom preference page implementation. Uses the <code>Constants</code> API to
* access the <code>Preferences</code> object for storing preference values.
* <p>
* Preference keys are defined in the <code>JubulaPlugin</code> interface.
* </p>
*/
public class PrefPageBasic extends PreferencePage implements
IWorkbenchPreferencePage {
/** 1 column */
private static final int NUM_COLUMNS_1 = 1;
/** 10 horizontal spaces */
private static final int HORIZONTAL_SPACING_10 = 10;
/** 10 vertical spaces */
private static final int VERTICAL_SPACING_10 = 10;
/** margin height = 10 */
private static final int MARGIN_HEIGHT_10 = 10;
/** margin width = 10 */
private static final int MARGIN_WIDTH_10 = 10;
/** widgets used in preference page to define preference values private */
private Button m_minimize;
/** widgets used in preference page to define preference values private */
private Button m_treeScroll;
/** widgets used in preference page to define preference values private */
private Button m_askStopAUT;
/** checkbox to decide if CAP infos should be displayed after CAP-name in testCaseEditor */
private Button m_capInfoCheckbox;
/** checkbox to decide if CAP infos should be displayed after CAP-name in testCaseEditor */
private Button m_showTransientChildrenCheckBox;
/** checkbox to decide if load most recent project is active or not */
private Button m_loadDefaultProjectCheckBox;
/** Update reused project */
private Button m_updateReusedProject;
/** widgets used in preference page to define preference values private */
private Button m_perspChange0Button;
/** widgets used in preference page to define preference values private */
private Button m_perspChange1Button;
/** widgets used in preference page to define preference values private */
private Button m_perspChange2Button;
/** widgets used in preference page to define preference values private */
private Button m_dataDirIsWorkspaceButton;
/** if the data is not in the workspace, it's in this path */
private CheckedText m_dataDirPathTextfield;
/** open a file selection dialog */
private Button m_dataDirPathButton;
/** time after which the content assist for the component names view opens itself*/
private CheckedIntText m_compNamesContentAssistTime;
/** Yes = 0; No = 1; Prompt = 2 */
private int m_perspChangeValue;
/** true or false */
private boolean m_rememberValue;
/** should data be retrieved from workspace */
private boolean m_dataDirIsWorkspaceValue;
/** The preference store to hold the existing preference values. */
private IPreferenceStore m_store = Plugin.getDefault()
.getPreferenceStore();
/** a new selection listener */
private final WidgetSelectionListener m_selectionListener =
new WidgetSelectionListener();
/** watches changes on the ws selection button */
private final SelectionListener m_dataDirIsWsButtonListener =
new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
dataDirIsWsChanged(m_dataDirIsWorkspaceButton.getSelection());
}
public void widgetSelected(SelectionEvent e) {
dataDirIsWsChanged(m_dataDirIsWorkspaceButton.getSelection());
}
};
/** show a file selection dialog if the button is pressed */
private final SelectionListener m_dataDirPathButtonListener =
new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
browseForDir();
}
public void widgetSelected(SelectionEvent e) {
browseForDir();
}
};
/**
* The constructor.
*
*/
public PrefPageBasic() {
setPreferenceStore(m_store);
}
/**
* Implement the user interface for the preference page. Returns a control
* that should be used as the main control for the page.
* <p>
* User interface defined here supports the definition of preference
* settings used by the management logic.
* </p>
*
* {@inheritDoc}
*/
protected Control createContents(Composite parent) {
final ScrolledComposite scrollComposite =
new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
final Composite composite = new Composite(scrollComposite, SWT.NONE);
setGridLayout(composite, NUM_COLUMNS_1);
createTreeScrollButton(composite);
createMinimizeClientButton(composite);
createAskStopAUTButton(composite);
createShowCAPInfosCheckbox(composite);
createShowTransientChildrensCheckbox(composite);
createDefaultProjectCheckbox(composite);
createUpdateReusedProjectsCheckbox(composite);
createSeparator(composite, 3);
createComponentNamesViewSettings(composite);
createSeparator(composite, 3);
createRememberGroup(composite);
createSeparator(composite, 3);
createDataDirGroup(composite);
Label hint = new Label(composite, SWT.NONE);
hint.setText(Messages.JubulaPrefPageBasicHint);
addListener();
Plugin.getHelpSystem().setHelp(parent, ContextHelpIds.PREFPAGE_BASIC);
/** return the widget used as the base for the user interface */
scrollComposite.setContent(composite);
scrollComposite.setExpandHorizontal(true);
scrollComposite.setExpandVertical(true);
scrollComposite.setMinSize(composite.computeSize(
SWT.DEFAULT, SWT.DEFAULT));
validatePage();
return scrollComposite;
}
/**
* @param composite the parent composite
*/
private void createShowCAPInfosCheckbox(Composite composite) {
m_capInfoCheckbox = new Button(composite, SWT.CHECK);
m_capInfoCheckbox.setText(Messages.EditorPreferencePageShowCapInfo);
m_capInfoCheckbox.setSelection(Plugin.getDefault()
.getPreferenceStore().getBoolean(
Constants.SHOWCAPINFO_KEY));
ControlDecorator.createInfo(m_capInfoCheckbox,
I18n.getString("ControlDecorator.ShowCapInfo"), false); //$NON-NLS-1$
}
/**
* @param composite
* the parent composite
*/
private void createShowTransientChildrensCheckbox(Composite composite) {
m_showTransientChildrenCheckBox = new Button(composite, SWT.CHECK);
m_showTransientChildrenCheckBox.setText(
Messages.EditorPreferencePageShowTransientChildrenCheckBox);
m_showTransientChildrenCheckBox.setSelection(Plugin.getDefault()
.getPreferenceStore().getBoolean(
Constants.SHOW_TRANSIENT_CHILDREN_KEY));
ControlDecorator.createInfo(m_showTransientChildrenCheckBox,
I18n.getString("ControlDecorator.showTransientChildrenCheckBox"), false); //$NON-NLS-1$
}
/**
* creates the check box so set load most recent project as active or inactive
* @param composite the parent composite
*/
private void createDefaultProjectCheckbox(Composite composite) {
m_loadDefaultProjectCheckBox = new Button(composite, SWT.CHECK);
m_loadDefaultProjectCheckBox.setText(
Messages.LoadDefaultProject);
m_loadDefaultProjectCheckBox.setSelection(m_store.getBoolean(
Constants.PERFORM_AUTO_PROJECT_LOAD_KEY));
}
/**
* @param composite parent composite
*/
private void createUpdateReusedProjectsCheckbox(Composite composite) {
m_updateReusedProject = new Button(composite, SWT.CHECK);
m_updateReusedProject.setText(
Messages.UpdateReusedProjectsLabel);
m_updateReusedProject.setSelection(m_store.getBoolean(
Constants.UPDATE_REUSED_PROJECT_KEY));
}
/**
* creates the settings for the component names view
* @param composite the parent composite
*/
private void createComponentNamesViewSettings(Composite composite) {
Group group = new Group(composite, SWT.NONE);
group.setText(Messages.PrefPageBasicComponentNamesView);
group.setLayout(new GridLayout());
GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
layoutData.grabExcessHorizontalSpace = true;
group.setLayoutData(layoutData);
Composite content = new Composite(group, SWT.None);
setGridLayout(content, 2);
Label l = new Label(content, SWT.NONE);
l.setText(Messages.SetContentAssistTimeForCompNames);
m_compNamesContentAssistTime = new CheckedIntText(
content, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.grabExcessHorizontalSpace = true;
m_compNamesContentAssistTime.setLayoutData(data);
m_compNamesContentAssistTime.setText(m_store.getString(
Constants.MILLIS_TO_OPEN_COMP_NAMES_CONTENT_PROPOSAL));
m_compNamesContentAssistTime.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
// nothing
}
public void keyReleased(KeyEvent e) {
validatePage();
}
});
ControlDecorator.createInfo(m_compNamesContentAssistTime,
I18n.getString("ControlDecorator.ComponentNamesContentAssistInfo"), false); //$NON-NLS-1$
}
/**
* create a grid layout with a selectable number of columns
* @param composite composite for the grid
* @param numColumns number of columns in the grid
*/
private void setGridLayout(final Composite composite, int numColumns) {
/** Define layout rules for widget placement */
GridLayout compositeLayout = new GridLayout();
compositeLayout.numColumns = numColumns;
compositeLayout.horizontalSpacing = HORIZONTAL_SPACING_10;
compositeLayout.verticalSpacing = VERTICAL_SPACING_10;
compositeLayout.marginHeight = MARGIN_HEIGHT_10;
compositeLayout.marginWidth = MARGIN_WIDTH_10;
composite.setLayout(compositeLayout);
GridData compositeData = new GridData(GridData.FILL_BOTH);
compositeData.grabExcessHorizontalSpace = true;
composite.setLayoutData(compositeData);
}
/**
* @param composite the parent composite
* @param horSpan the horizontal span
*/
private void createSeparator(Composite composite, int horSpan) {
Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
GridData sepData = new GridData();
sepData.horizontalAlignment = GridData.FILL;
sepData.horizontalSpan = horSpan;
sep.setLayoutData(sepData);
}
/**
* @param composite The parent composite.
*/
private void createRememberGroup(Composite composite) {
Group group = new Group(composite, SWT.NONE);
group.setText(Messages.PrefPageBasicOpenPerspective);
RowLayout layout = new RowLayout();
group.setLayout(layout);
GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
layoutData.grabExcessHorizontalSpace = true;
group.setLayoutData(layoutData);
m_perspChange0Button = new Button(group, SWT.RADIO);
m_perspChange0Button.setText(Messages.PrefPageBasicAlways);
m_perspChange1Button = new Button(group, SWT.RADIO);
m_perspChange1Button.setText(Messages.PrefPageBasicNever);
m_perspChange2Button = new Button(group, SWT.RADIO);
m_perspChange2Button.setText(Messages.PrefPageBasicPrompt);
m_perspChangeValue = m_store.getInt(Constants.PERSP_CHANGE_KEY);
setRadioSelection();
}
/**
* GUI components for specifying the base directory for external data.
*
* @param parent parent composite
*/
private void createDataDirGroup(Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(Messages.PrefPageBasicSelectDataDir);
group.setLayout(new GridLayout());
GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
layoutData.grabExcessHorizontalSpace = true;
group.setLayoutData(layoutData);
Composite content = new Composite(group, SWT.None);
setGridLayout(content, 3);
m_dataDirIsWorkspaceButton = new Button(content, SWT.CHECK);
m_dataDirIsWorkspaceButton.setText(
Messages.PrefPageBasicDataDirWSLabel);
GridData data = new GridData();
data.horizontalSpan = 3;
m_dataDirIsWorkspaceButton.setLayoutData(data);
Label l = new Label(content, SWT.None);
l.setText(Messages.PrefPageBasicDataDirLabel);
m_dataDirPathTextfield = new CheckedDirnameText(content,
SWT.SINGLE | SWT.BORDER);
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
m_dataDirPathTextfield.setLayoutData(data);
m_dataDirPathButton = new Button(content, SWT.PUSH);
m_dataDirPathButton.
setText(Messages.PrefPageBasicDataDirBrowse);
m_store.setDefault(Constants.DATADIR_WS_KEY, true);
m_store.setDefault(Constants.DATADIR_PATH_KEY, Platform.getLocation()
.toOSString());
m_dataDirIsWorkspaceValue = m_store
.getBoolean(Constants.DATADIR_WS_KEY);
setDataDirFields();
}
/**
* Set the controls from the supplied data
*/
private void setDataDirFields() {
m_dataDirIsWorkspaceButton.setSelection(m_dataDirIsWorkspaceValue);
m_dataDirPathTextfield.setEnabled(!m_dataDirIsWorkspaceValue);
m_dataDirPathTextfield.setText(m_store
.getString(Constants.DATADIR_PATH_KEY));
}
/**
* Adds listener to swt widgets.
*/
private void addListener() {
m_perspChange0Button.addSelectionListener(m_selectionListener);
m_perspChange1Button.addSelectionListener(m_selectionListener);
m_perspChange2Button.addSelectionListener(m_selectionListener);
m_dataDirIsWorkspaceButton
.addSelectionListener(m_dataDirIsWsButtonListener);
m_dataDirPathButton.addSelectionListener(m_dataDirPathButtonListener);
m_dataDirPathTextfield.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validatePage();
}
});
}
/**
* the selection on this button changed
* @param selection the new value
*/
private void dataDirIsWsChanged(boolean selection) {
m_dataDirPathButton.setEnabled(!selection);
m_dataDirPathTextfield.setEnabled(!selection);
m_dataDirIsWorkspaceValue = selection;
m_dataDirPathTextfield.setText(m_dataDirPathTextfield.getText());
validatePage();
}
/**
* display a file selection dialog and write the result into the
* data path field.
*/
private void browseForDir() {
DirectoryDialog dialog = new DirectoryDialog(getShell(),
SWT.APPLICATION_MODAL | SWT.OPEN);
dialog.setFilterPath(m_dataDirPathTextfield.getText());
dialog.setText(Messages.PrefPageBasicDataDirFileDialogTitle);
String path = dialog.open();
if (path != null) {
m_dataDirPathTextfield.setText(path);
}
}
/**
* validate the page depending on its components
*/
private void validatePage() {
if (!m_dataDirIsWorkspaceValue) {
if (!m_dataDirPathTextfield.isValid()) {
setErrorMessage(Messages.PrefPageBasicDataDirInvalid);
setValid(false);
return;
}
}
String compNamesContentAssistTime =
m_compNamesContentAssistTime.getText().trim();
try {
int time = Integer.parseInt(compNamesContentAssistTime);
if (time < 0) {
setErrorMessage(Messages
.CompNamesViewPreferencePageInvalidContentAssistTime);
setValid(false);
return;
}
} catch (NumberFormatException e) {
setErrorMessage(Messages
.CompNamesViewPreferencePageInvalidContentAssistTime);
setValid(false);
return;
}
setErrorMessage(null);
setValid(true);
}
/**
* Removes listener from swt widgets.
*/
private void removeListener() {
m_perspChange0Button.removeSelectionListener(m_selectionListener);
m_perspChange1Button.removeSelectionListener(m_selectionListener);
m_perspChange2Button.removeSelectionListener(m_selectionListener);
m_dataDirIsWorkspaceButton
.removeSelectionListener(m_dataDirIsWsButtonListener);
}
/**
* Sets the selection the radio buttons.
*/
private void setRadioSelection() {
if (m_perspChangeValue == Constants.PERSPECTIVE_CHANGE_YES) {
m_perspChange0Button.setSelection(true);
m_perspChange1Button.setSelection(false);
m_perspChange2Button.setSelection(false);
}
if (m_perspChangeValue == Constants.PERSPECTIVE_CHANGE_NO) {
m_perspChange1Button.setSelection(true);
m_perspChange0Button.setSelection(false);
m_perspChange2Button.setSelection(false);
}
if (m_perspChangeValue == Constants.PERSPECTIVE_CHANGE_PROMPT) {
m_perspChange2Button.setSelection(true);
m_perspChange0Button.setSelection(false);
m_perspChange1Button.setSelection(false);
}
}
/**
* @param composite The parent composite.
*/
private void createMinimizeClientButton(Composite composite) {
m_minimize = new Button(composite, SWT.CHECK);
m_minimize.setText(Messages.JubulaPrefPageBasicMinimize);
m_minimize.setSelection(getPreferenceStore()
.getBoolean(Constants.MINIMIZEONSUITESTART_KEY));
}
/**
* @param composite The parent composite.
*/
private void createAskStopAUTButton(Composite composite) {
m_askStopAUT = new Button(composite, SWT.CHECK);
m_askStopAUT.setText(Messages.JubulaPrefPageBasicAskStopAUT);
m_askStopAUT.setSelection(getPreferenceStore()
.getBoolean(Constants.ASKSTOPAUT_KEY));
}
/**
* @param composite The parent composite.
*/
private void createTreeScrollButton(Composite composite) {
m_treeScroll = new Button(composite, SWT.CHECK);
m_treeScroll.setText(Messages.JubulaPrefPageBasicScroll);
m_treeScroll.setSelection(getPreferenceStore()
.getBoolean(Constants.TREEAUTOSCROLL_KEY));
}
/**
* Initializes the preference page
*
* {@inheritDoc}
*/
public void init(IWorkbench workbench) {
// do nothing
}
/**
* Performs special processing when this page's Restore Defaults button has
* been pressed. Sets the contents of the nameEntry field to be the default
*/
protected void performDefaults() {
m_minimize.setSelection(m_store
.getDefaultBoolean(Constants.MINIMIZEONSUITESTART_KEY));
m_treeScroll.setSelection(m_store
.getDefaultBoolean(Constants.TREEAUTOSCROLL_KEY));
m_askStopAUT.setSelection(m_store
.getDefaultBoolean(Constants.ASKSTOPAUT_KEY));
m_capInfoCheckbox.setSelection(m_store
.getDefaultBoolean(Constants.SHOWCAPINFO_KEY));
m_showTransientChildrenCheckBox.setSelection(m_store
.getDefaultBoolean(Constants.SHOW_TRANSIENT_CHILDREN_KEY));
m_compNamesContentAssistTime.setText(m_store.getDefaultString(
Constants.MILLIS_TO_OPEN_COMP_NAMES_CONTENT_PROPOSAL));
m_loadDefaultProjectCheckBox.setSelection(m_store.getDefaultBoolean(
Constants.PERFORM_AUTO_PROJECT_LOAD_KEY));
m_updateReusedProject.setSelection(m_store.getDefaultBoolean(
Constants.UPDATE_REUSED_PROJECT_KEY));
m_perspChangeValue = m_store.getDefaultInt(Constants.PERSP_CHANGE_KEY);
m_rememberValue = m_store.getDefaultBoolean(Constants.REMEMBER_KEY);
setRadioSelection();
m_dataDirIsWorkspaceValue = m_store
.getDefaultBoolean(Constants.DATADIR_WS_KEY);
setDataDirFields();
m_dataDirPathTextfield.setText(m_store
.getDefaultString(Constants.DATADIR_PATH_KEY));
validatePage();
}
/**
* Method declared on IPreferencePage.
*
* @return performOK
*/
public boolean performOk() {
getPreferenceStore().setValue(Constants.MINIMIZEONSUITESTART_KEY,
m_minimize.getSelection());
getPreferenceStore().setValue(Constants.REMEMBER_KEY, m_rememberValue);
getPreferenceStore().setValue(Constants.PERSP_CHANGE_KEY,
m_perspChangeValue);
getPreferenceStore().setValue(
Constants.MILLIS_TO_OPEN_COMP_NAMES_CONTENT_PROPOSAL,
m_compNamesContentAssistTime.getValue());
getPreferenceStore().setValue(Constants.TREEAUTOSCROLL_KEY,
m_treeScroll.getSelection());
getPreferenceStore().setValue(Constants.ASKSTOPAUT_KEY,
m_askStopAUT.getSelection());
getPreferenceStore().setValue(Constants.DATADIR_WS_KEY,
m_dataDirIsWorkspaceValue);
getPreferenceStore().setValue(Constants.DATADIR_PATH_KEY,
m_dataDirPathTextfield.getText());
getPreferenceStore().setValue(Constants.SHOWCAPINFO_KEY,
m_capInfoCheckbox.getSelection());
getPreferenceStore().setValue(Constants.SHOW_TRANSIENT_CHILDREN_KEY,
m_showTransientChildrenCheckBox.getSelection());
getPreferenceStore().setValue(Constants.PERFORM_AUTO_PROJECT_LOAD_KEY,
m_loadDefaultProjectCheckBox.getSelection());
getPreferenceStore().setValue(Constants.UPDATE_REUSED_PROJECT_KEY,
m_updateReusedProject.getSelection());
removeListener();
return super.performOk();
}
/**
* This inner class creates a new SelectionListener.
* @author BREDEX GmbH
* @created 09.08.2005
*/
private class WidgetSelectionListener extends SelectionAdapter {
/** @param e The selection event. */
public void widgetSelected(SelectionEvent e) {
Object o = e.getSource();
if (o == m_perspChange0Button) {
m_perspChangeValue = Constants.PERSPECTIVE_CHANGE_YES;
return;
} else if (o == m_perspChange1Button) {
m_perspChangeValue = Constants.PERSPECTIVE_CHANGE_NO;
return;
} else if (o == m_perspChange2Button) {
m_perspChangeValue = Constants.PERSPECTIVE_CHANGE_PROMPT;
return;
}
Assert.notReached(Messages.EventActivatedUnknownWidget
+ StringConstants.LEFT_PARENTHESIS + o
+ StringConstants.RIGHT_PARENTHESIS + StringConstants.DOT);
}
}
}