blob: 9266bfb66692dfac5f3cfbd1e45fa99c8b459366 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.preferences;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.authoring.ui.editors.EditorChooser;
import org.eclipse.epf.authoring.ui.util.AuthoringAccessibleListener;
import org.eclipse.epf.common.ui.util.CommonPreferences;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.preferences.LibraryPreferences;
import org.eclipse.epf.library.ui.LibraryUIPlugin;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.epf.ui.preferences.BasePreferencePage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
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.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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
/**
* The Authoring preference page.
*
* @author Kelvin Low
* @author Shilpa Toraskar
* @since 1.2
*/
public class AuthoringPreferencePage extends BasePreferencePage implements
ModifyListener {
private static int MIN_PREFERENCE_HISTORY_SIZE = 5;
private static int MAX_PREFERENCE_HISTORY_SIZE = 20;
private Composite composite;
private Text defaultLibraryPathText;
private Button browseButton;
private Button discardUnresolvedReferencesCheckbox;
private Button useNewExtendsSemanticsCheckbox;
private Button enableLibraryValidationCheckbox;
private Text preferenceHistorySizeText;
private Button enableUIFieldsCheckbox;
private Button enableAutoNameGenCheckbox;
private Button skipAllCheckbox;
private Button skipSelectedChebox;
private TableViewer selectedHexByteViewer;
private Map<String, String> selectedHexByteStrMap;
private Button addOneButton;
private Button addButton;
private Button removeButton;
private Text addOneButtonText;
private static Set<String> skipableSet = new HashSet<String>();
static {
String[] hexStrs = {
AuthoringUIResources.hex_24,
AuthoringUIResources.hex_26,
AuthoringUIResources.hex_2B,
AuthoringUIResources.hex_2C,
AuthoringUIResources.hex_2F,
AuthoringUIResources.hex_3A,
AuthoringUIResources.hex_3B,
AuthoringUIResources.hex_3D,
AuthoringUIResources.hex_3F,
AuthoringUIResources.hex_40,
AuthoringUIResources.hex_20,
AuthoringUIResources.hex_22,
AuthoringUIResources.hex_3C,
AuthoringUIResources.hex_3E,
AuthoringUIResources.hex_23,
AuthoringUIResources.hex_25,
AuthoringUIResources.hex_7B,
AuthoringUIResources.hex_7D,
AuthoringUIResources.hex_7C,
AuthoringUIResources.hex_5C,
AuthoringUIResources.hex_5E,
AuthoringUIResources.hex_7E,
AuthoringUIResources.hex_5B,
AuthoringUIResources.hex_5D,
AuthoringUIResources.hex_60,
};
for (String s : hexStrs) {
skipableSet.add("%" + s); //$NON-NLS-1$
}
}
/**
* Creates and returns the SWT control for the customized body of this
* preference page under the given parent composite.
*
* @param parent
* the parent composite
* @return the new control
*/
protected Control createContents(Composite parent) {
composite = createGridLayoutComposite(parent, 1);
// Create the Method library group.
Group libraryGroup = createGridLayoutGroup(composite,
AuthoringUIResources.methodLibraryGroup_text, 3);
createLabel(libraryGroup, AuthoringUIResources.defaultPathLabel_text);
defaultLibraryPathText = createEditableText(libraryGroup);
browseButton = createButton(libraryGroup,
AuthoringUIText.BROWSE_BUTTON_TEXT);
discardUnresolvedReferencesCheckbox = createCheckbox(libraryGroup,
AuthoringUIResources.discardunresolvedref, 3);
// Create the Modeling group.
Group modelingGroup = createGridLayoutGroup(composite,
AuthoringUIResources.modelingGroup_text, 1);
useNewExtendsSemanticsCheckbox = createCheckbox(modelingGroup,
AuthoringUIResources.extend_semantics_button_text);
// Create the UI group.
Group userInterfaceGroup = createGridLayoutGroup(composite,
AuthoringUIResources.userInterfaceGroup_text, 2);
createLabel(userInterfaceGroup,
AuthoringUIResources.default_list_length_label);
preferenceHistorySizeText = createEditableText(userInterfaceGroup,
"", 25); //$NON-NLS-1$
// Create the debug group.
Group debugGroup = createGridLayoutGroup(composite,
AuthoringUIResources.debugGroup_text, 2);
enableLibraryValidationCheckbox = createCheckbox(debugGroup,
AuthoringUIResources.enableLibraryValidationCheckbox_text);
// Create the editor group.
Group editorGroup = createGridLayoutGroup(composite,
AuthoringUIResources.editorGroup_text, 1);
enableUIFieldsCheckbox = createCheckbox(editorGroup,
AuthoringUIResources.enableUIFieldsCheckbox_text);
enableAutoNameGenCheckbox = createCheckbox(editorGroup,
AuthoringUIResources.enableAutoNameGenCheckbox_text);
// Create the editor group.
Group rteGroup = createGridLayoutGroup(composite,
AuthoringUIResources.rteGroup_text, 3);
skipAllCheckbox = createCheckbox(rteGroup,
AuthoringUIResources.skipAllCheckbox_text, 3);
skipSelectedChebox = createCheckbox(rteGroup,
AuthoringUIResources.skipSelectedChebox_text, 3);
selectedHexByteViewer = new TableViewer(rteGroup);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.heightHint = 100;
selectedHexByteViewer.getTable().setLayoutData(gridData);
selectedHexByteViewer.setContentProvider(new ArrayContentProvider() {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Map) {
List list = new ArrayList(((Map) inputElement).values());
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
return list.toArray();
}
return super.getElements(inputElement);
}
});
createAddRemoveButtons(rteGroup);
initControls();
addListeners();
selectedHexByteViewer.setLabelProvider(new LabelProvider());
selectedHexByteViewer.setInput(getSelectedHexByteStrMap());
return composite;
}
/**
* Initializes the preference page controls with data.
*/
protected void initControls() {
defaultLibraryPathText.setText(LibraryUIPreferences
.getDefaultLibraryPath());
discardUnresolvedReferencesCheckbox.setSelection(LibraryPreferences
.getDiscardUnresolvedReferences());
useNewExtendsSemanticsCheckbox.setSelection(LibraryPreferences
.getUseNewExtendsSemantics());
preferenceHistorySizeText.setText("" //$NON-NLS-1$
+ CommonPreferences.getPreferenceHistorySize());
enableLibraryValidationCheckbox.setSelection(AuthoringUIPreferences
.getEnableLibraryValidation());
enableUIFieldsCheckbox.setSelection(AuthoringUIPreferences
.getEnableUIFields());
enableAutoNameGenCheckbox.setSelection(AuthoringUIPreferences
.getEnableAutoNameGen());
for (Map.Entry<String, String> entry : AuthoringUIPreferences.getRteUrlDecodingHexMap().entrySet()) {
getSelectedHexByteStrMap().put(entry.getKey(), entry.getValue());
}
int ix = AuthoringUIPreferences.getRteUrlDecodingOption();
skipAllCheckbox.setSelection(ix == 1);
skipSelectedChebox.setSelection(ix == 2);
}
/**
* Adds event listeners to the preference page controls.
*/
protected void addListeners() {
browseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
openDirectoryDialog();
}
});
preferenceHistorySizeText.addModifyListener(this);
enableUIFieldsCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Shell shell = Display.getCurrent().getActiveShell();
if (AuthoringUIPlugin.getDefault().getMsgDialog()
.displayConfirmation(shell.getText(), AuthoringUIResources.enableUIFieldsChange_message)) {
// close editors with saving
EditorChooser.getInstance().closeAllMethodEditorsWithSaving();
} else {
enableUIFieldsCheckbox.setSelection(!enableUIFieldsCheckbox
.getSelection());
}
}
});
skipAllCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (skipAllCheckbox.getSelection()) {
skipSelectedChebox.setSelection(false);
}
}
});
skipSelectedChebox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (skipSelectedChebox.getSelection()) {
skipAllCheckbox.setSelection(false);
}
}
});
}
/**
* @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
*/
public void modifyText(ModifyEvent e) {
setErrorMessage(null);
setValid(true);
int value = 0;
if (e.widget == preferenceHistorySizeText) {
value = getPreferenceHistorySize();
if (value < MIN_PREFERENCE_HISTORY_SIZE
|| value > MAX_PREFERENCE_HISTORY_SIZE) {
setErrorMessage(AuthoringUIResources
.bind(
AuthoringUIResources.invalidPreferenceHistorySizeError_msg,
new Object[] {
new Integer(MIN_PREFERENCE_HISTORY_SIZE),
new Integer(MAX_PREFERENCE_HISTORY_SIZE) }));
setValid(false);
}
}
}
/**
* Performs special processing when this page's Defaults button has been
* pressed.
*/
protected void performDefaults() {
super.performDefaults();
String defaultLibraryPath = LibraryUIPreferences
.getInitialDefaultLibraryPath();
LibraryUIPreferences.setDefaultLibraryPath(defaultLibraryPath);
defaultLibraryPathText.setText(defaultLibraryPath);
boolean discardUnresolvedReferences = LibraryPreferences
.getDefaultDiscardUnresolvedReferences();
LibraryPreferences
.setDiscardUnresolvedReferences(discardUnresolvedReferences);
discardUnresolvedReferencesCheckbox
.setSelection(discardUnresolvedReferences);
boolean useNewExtendsSemantics = LibraryPreferences
.getDefaultUseNewExtendsSemantics();
LibraryPreferences.setUseNewExtendsSemantics(useNewExtendsSemantics);
useNewExtendsSemanticsCheckbox.setSelection(useNewExtendsSemantics);
int preferenceHistorySize = CommonPreferences
.getDefaultPreferenceHistorySize();
CommonPreferences.setPreferenceHistorySize(preferenceHistorySize);
preferenceHistorySizeText.setText("" + preferenceHistorySize); //$NON-NLS-1$
boolean enableLibraryValidation = AuthoringUIPreferences
.getDefaultEnableLibraryValidation();
AuthoringUIPreferences
.setEnableLibraryValidation(enableLibraryValidation);
enableLibraryValidationCheckbox.setSelection(enableLibraryValidation);
boolean enableUIFields = AuthoringUIPreferences
.getDefaultEnableUIFields();
AuthoringUIPreferences
.setEnableUIFields(enableUIFields);
enableUIFieldsCheckbox.setSelection(enableUIFields);
boolean enableAutoNameGen = AuthoringUIPreferences
.getDefaultEnableAutoNameGen();
AuthoringUIPreferences
.setEnableAutoNameGen(enableAutoNameGen);
enableAutoNameGenCheckbox.setSelection(enableAutoNameGen);
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
public boolean performOk() {
LibraryUIPreferences.setDefaultLibraryPath(getDefaultLibraryPath());
LibraryPreferences
.setDiscardUnresolvedReferences(getDiscardUnresolvedReferences());
LibraryPreferences
.setUseNewExtendsSemantics(getUseNewExtendsSemantics());
CommonPreferences.setPreferenceHistorySize(getPreferenceHistorySize());
AuthoringUIPreferences
.setEnableLibraryValidation(getEnableLibraryValidation());
AuthoringUIPreferences
.setEnableUIFields(getEnableUIFields());
AuthoringUIPreferences
.setEnableAutoNameGen(getEnableAutoNameGen());
// update the settings for browsing
LibraryUIPlugin.getDefault().updateLayoutSettings();
int ix = 0;
if (skipAllCheckbox.getSelection()) {
ix = 1;
} else if (skipSelectedChebox.getSelection()) {
ix = 2;
}
AuthoringUIPreferences.setgetRteUrlDecodingOption(ix);
String toSaveStr = ""; //$NON-NLS-1$
for (String str : getSelectedHexByteStrMap().values()) {
if (toSaveStr.length() > 0) {
toSaveStr += "\n"; //$NON-NLS-1$
}
toSaveStr += str;
}
AuthoringUIPreferences.setRteUrlDecodingHexNumbers(toSaveStr);
return true;
}
/**
* Gets the user specified default method library path.
*/
protected String getDefaultLibraryPath() {
return defaultLibraryPathText.getText().trim();
}
/**
* Gets the user specified discard unresolved references preference.
*/
protected boolean getDiscardUnresolvedReferences() {
return discardUnresolvedReferencesCheckbox.getSelection();
}
/**
* Gets the user specified use new extends semantics preference.
*/
protected boolean getUseNewExtendsSemantics() {
return useNewExtendsSemanticsCheckbox.getSelection();
}
/**
* Gets the user specified preference history size.
*/
protected int getPreferenceHistorySize() {
return StrUtil.getIntValue(preferenceHistorySizeText.getText().trim(),
0);
}
/**
* Gets the enabled library validation preference
* @return
*/
protected boolean getEnableLibraryValidation() {
return enableLibraryValidationCheckbox.getSelection();
}
/**
* Gets the show long presentation name / external ID preference
* @return
*/
protected boolean getEnableUIFields() {
return enableUIFieldsCheckbox.getSelection();
}
/**
* Gets auto name gen flag
* @return
*/
protected boolean getEnableAutoNameGen() {
return enableAutoNameGenCheckbox.getSelection();
}
/**
* Opens the directory dialog.
*/
private void openDirectoryDialog() {
try {
DirectoryDialog dd = new DirectoryDialog(composite.getShell(),
SWT.NONE);
String path = dd.open();
if (path != null) {
defaultLibraryPathText.setText(path);
}
} catch (Exception e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
}
protected void createAddRemoveButtons(Composite parent) {
Composite buttonComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
buttonComposite.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
buttonComposite.setLayoutData(data);
Group addOneButtonGroup = createGridLayoutGroup(buttonComposite,
AuthoringUIResources.rteAddOneButtonGroup_title, 2);
addOneButton = new Button(addOneButtonGroup, SWT.PUSH);
data = new GridData(SWT.FILL, SWT.DEFAULT, false, false);
addOneButton.setLayoutData(data);
addOneButton
.setText(AuthoringUIResources.rteAddOneButton_text);
addOneButton.getAccessible().addAccessibleListener(
new AuthoringAccessibleListener(
AuthoringUIResources.rteAddOneButton_text));
addOneButton.addSelectionListener(newAddOneButtonListener());
addOneButton.setEnabled(false);
addOneButtonText = createEditableText(addOneButtonGroup, "", 30); //$NON-NLS-1$
addOneButtonText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
addOneButton.setEnabled(true);
String text = addOneButtonText.getText();
if (StrUtil.getHexStr(text) == null) {
addOneButton.setEnabled(false);
return;
}
}
});
addButton = new Button(buttonComposite, SWT.PUSH);
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
addButton.setLayoutData(data);
addButton
.setText(AuthoringUIResources.rteAddButton_text);
addButton.getAccessible().addAccessibleListener(
new AuthoringAccessibleListener(
AuthoringUIText.ADD_BUTTON_TEXT));
addButton.addSelectionListener(newAddButtonListener());
removeButton = new Button(buttonComposite, SWT.PUSH);
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
removeButton.setLayoutData(data);
removeButton
.setText(AuthoringUIText.REMOVE_BUTTON_TEXT);
removeButton.getAccessible().addAccessibleListener(
new AuthoringAccessibleListener(
AuthoringUIText.REMOVE_BUTTON_TEXT));
removeButton
.addSelectionListener(newRemoveButtonListener());
}
private SelectionListener newAddOneButtonListener() {
return new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
String text = addOneButtonText.getText();
String key = StrUtil.getHexStr(text);
if (key == null) {
return;
}
getSelectedHexByteStrMap().put(key, text);
selectedHexByteViewer.refresh();
addOneButtonText.setText("");
}
};
}
private SelectionListener newAddButtonListener() {
return new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
ElementListSelectionDialog dialog = new ElementListSelectionDialog(MsgBox.getDefaultShell(),
new LabelProvider());
List<String> selectableList = new ArrayList<String>();
for (String str : skipableSet) {
String key = StrUtil.getHexStr(str);
if (! getSelectedHexByteStrMap().containsKey(key)) {
selectableList.add(str);
}
}
Collections.sort(selectableList);
dialog.setElements(selectableList.toArray());
dialog.setMultipleSelection(true);
dialog.setMessage(AuthoringUIResources.rteGroupAddDialog_msg);
dialog.setTitle(AuthoringUIResources.rteGroupAddDialog_title);
if (dialog.open() == Dialog.CANCEL) {
return;
}
Object[] objs = dialog.getResult();
if (objs == null || objs.length == 0) {
return;
}
for (Object obj : objs) {
if (obj instanceof String) {
String value = (String) obj;
String key = StrUtil.getHexStr(value);
if (key != null) {
getSelectedHexByteStrMap().put(key, value);
}
}
}
selectedHexByteViewer.refresh();
}
};
}
private SelectionListener newRemoveButtonListener() {
return new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
ISelection s = selectedHexByteViewer.getSelection();
if (s instanceof IStructuredSelection) {
for (Iterator it = ((IStructuredSelection) s).iterator(); it.hasNext();) {
Object obj = it.next();
if (obj instanceof String) {
String key = StrUtil.getHexStr((String) obj);
if (key != null) {
getSelectedHexByteStrMap().remove(key);
}
}
}
}
selectedHexByteViewer.refresh();
}
};
}
private Map<String, String> getSelectedHexByteStrMap() {
if (selectedHexByteStrMap == null) {
selectedHexByteStrMap = new HashMap<String,String>();
}
return selectedHexByteStrMap;
}
}