/*******************************************************************************
* Copyright (c) 2009 Andrey Loskutov.
* 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
* Contributor: Andrey Loskutov - initial API and implementation
*******************************************************************************/
package de.loskutov.anyedit.ui.preferences;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.WorkbenchViewerComparator;
import org.osgi.framework.Version;
import de.loskutov.anyedit.AnyEditToolsPlugin;
import de.loskutov.anyedit.IAnyEditConstants;
import de.loskutov.anyedit.Messages;
import de.loskutov.anyedit.actions.AbstractTextAction;
import de.loskutov.anyedit.util.EclipseUtils;
import de.loskutov.anyedit.util.TextUtil;
/**
*
*/
public class AnyEditPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage, SelectionListener {
private static final String DEFAULT_BASE64_LENGTH = "" + TextUtil.DEFAULT_BASE64_LINE_LENGTH;
private static final String DEFAULT_TAB_WIDTH = "2";
private static final String DEFAULT_NEW_FILTER_TEXT = "";
protected Text tabWidthText;
protected Text base64LineLengthText;
protected Text disallowedInPathText;
protected Text lineSeparatorRegex;
protected Text requiredInPathText;
protected Button requiredInPathEnabledCheck;
protected Button useJavaTabsCheck;
protected Button useModulo4TabsCheck;
protected Button saveDirtyBufferCheck;
protected Button removeTrailingSpacesCheck;
protected Button fixLineDelimitersCheck;
protected Button replaceAllTabsCheck;
protected Button replaceAllSpacesCheck;
protected Button preserveEntitiesCheck;
protected Button unicodifyAllCheck;
protected Button base64SplitLineCheck;
protected Button removePrintCheck;
protected Button hideOpenTypeCheck;
protected Group saveComposite;
protected Button saveAndTrimCheck;
protected Button ignoreBlankLinesOnTrimCheck;
protected Button saveAndAddLineCheck;
protected Button saveAndFixLineDelimitersCheck;
protected Button askBeforeConvertAllCheck;
protected Button saveAndConvertCheck;
protected Group convertChoiceComposite;
protected Button convertTabsOnSaveRadio;
protected Button convertSpacesOnSaveRadio;
protected TabFolder tabFolder;
private Color red;
protected FilterContentProvider fileFilterContentProvider;
private CheckboxTableViewer filterViewer;
private TableEditor tableEditor;
private Table filterTable;
protected Button removeFilterButton;
private Button enableAllButton;
private Button disableAllButton;
protected Text editorText;
private Filter newFilter;
private TableItem newTableItem;
protected String invalidEditorText;
private Button includeDerivedCheck;
private Button showSaveToDialogCheck;
private Button saveToNoSelectionCheck;
private Button saveToOpenEditorCheck;
private Button useWorkspaceScopeCheck;
private Button addNewLineCheck;
private Button showTrailingOnly;
private Button showTrailingDifferently;
public AnyEditPreferencePage() {
super();
setPreferenceStore(AnyEditToolsPlugin.getDefault().getPreferenceStore());
}
/*
* @see PreferencePage#createContents(Composite)
*/
@Override
protected Control createContents(Composite parent) {
tabFolder = new TabFolder(parent, SWT.TOP);
createTabAutoSave();
createTabConvert();
createTabOpen();
createTabSave();
createTabMisc();
return tabFolder;
}
private void createTabSave() {
GridLayout layout;
GridData gridData;
TabItem tabOpen = new TabItem(tabFolder, SWT.NONE);
tabOpen.setText(Messages.pref_tab_saveTo);
Composite defPanel3 = createContainer(tabFolder);
tabOpen.setControl(defPanel3);
IPreferenceStore store = getPreferenceStore();
Group saveToComposite = new Group(defPanel3, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
saveToComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
saveToComposite.setLayoutData(gridData);
saveToComposite.setText(Messages.pref_saveToIntro);
saveToOpenEditorCheck = createLabeledCheck(Messages.pref_saveToOpenEditor,
Messages.pref_saveToOpenEditorTip,
store.getBoolean(IAnyEditConstants.SAVE_TO_OPEN_EDITOR),
saveToComposite);
Composite tmp = new Composite(saveToComposite, SWT.SHADOW_ETCHED_IN);// SWT.SHADOW_NONE
layout = new GridLayout();
layout.numColumns = 2;
tmp.setLayout(layout);
gridData = new GridData();
gridData.horizontalIndent = 20;
tmp.setLayoutData(gridData);
// tmp.setText(Messages.pref_convertChoiceIntro);
showSaveToDialogCheck = createLabeledCheck(Messages.pref_saveToShowOptions,
Messages.pref_saveToShowOptionsTip,
store.getBoolean(IAnyEditConstants.SAVE_TO_SHOW_OPTIONS),
tmp);
saveToNoSelectionCheck = createLabeledCheck(Messages.pref_saveToNoSelection,
Messages.pref_saveToNoSelectionTip,
store.getBoolean(IAnyEditConstants.SAVE_TO_IGNORE_SELECTION),
saveToComposite);
}
private void createTabOpen() {
GridLayout layout;
GridData gridData;
TabItem tabOpen = new TabItem(tabFolder, SWT.NONE);
tabOpen.setText(Messages.pref_tab_open);
Composite defPanel3 = createContainer(tabFolder);
tabOpen.setControl(defPanel3);
IPreferenceStore store = getPreferenceStore();
hideOpenTypeCheck = createLabeledCheck(Messages.pref_hideOpenType,
Messages.pref_hideOpenTypeTip,
store.getBoolean(IAnyEditConstants.HIDE_OPEN_TYPE_ACTION),
defPanel3);
Group searchComposite = new Group(defPanel3, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
searchComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
searchComposite.setLayoutData(gridData);
searchComposite.setText(Messages.pref_searchFileIntro);
includeDerivedCheck = createLabeledCheck(Messages.pref_includeDerived,
Messages.pref_includeDerivedTip,
store.getBoolean(IAnyEditConstants.INCLUDE_DERIVED_RESOURCES),
searchComposite);
useWorkspaceScopeCheck = createLabeledCheck(Messages.pref_useWorkspaceScope,
Messages.pref_useWorkspaceScopeTip,
store.getBoolean(IAnyEditConstants.USE_WORKSPACE_SCOPE_FOR_SEARCH),
searchComposite);
Group openFileComposite = new Group(defPanel3, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
openFileComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
openFileComposite.setLayoutData(gridData);
openFileComposite.setText(Messages.pref_openFileIntro);
disallowedInPathText = createLabeledText(Messages.pref_disallowedInPath,
Messages.pref_disallowedInPathTip,
store.getString(IAnyEditConstants.CHARACTERS_DISALLOWED_IN_PATH),
openFileComposite, true, SWT.NONE);
requiredInPathEnabledCheck = createLabeledCheck(Messages.pref_requiredInPathEnabled,
Messages.pref_requiredInPathEnabledTip,
store.getBoolean(IAnyEditConstants.USE_REQUIRED_IN_PATH_CHARACTERS),
openFileComposite);
requiredInPathText = createLabeledText(Messages.pref_requiredInPath,
Messages.pref_requiredInPathTip,
store.getString(IAnyEditConstants.CHARACTERS_REQUIRED_IN_PATH),
openFileComposite, true, SWT.NONE);
lineSeparatorRegex = createLabeledText(Messages.pref_lineSeparatorRegex,
Messages.pref_lineSeparatorRegexTip,
store.getString(IAnyEditConstants.LINE_SEPARATOR_REGEX),
openFileComposite, true, SWT.NONE);
requiredInPathEnabledCheck.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
requiredInPathText.setEditable(requiredInPathEnabledCheck.getSelection());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// ignored
}
});
requiredInPathText.setEditable(requiredInPathEnabledCheck.getSelection());
}
private void createTabConvert() {
GridLayout layout;
GridData gridData;
TabItem tabManual = new TabItem(tabFolder, SWT.NONE);
tabManual.setText(Messages.pref_tab_convert);
Composite defPanel = createContainer(tabFolder);
tabManual.setControl(defPanel);
IPreferenceStore store = getPreferenceStore();
saveDirtyBufferCheck = createLabeledCheck(Messages.pref_saveDirtyEditor,
Messages.pref_saveDirtyEditorTip,
store.getBoolean(IAnyEditConstants.SAVE_DIRTY_BUFFER), defPanel);
Group spacesComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
spacesComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
spacesComposite.setLayoutData(gridData);
spacesComposite.setText(Messages.pref_spacesIntro);
tabWidthText = createLabeledText(Messages.pref_tabWidth, Messages.pref_tabWidthTip,
store.getString(IAnyEditConstants.EDITOR_TAB_WIDTH), spacesComposite,
false, SWT.NONE);
tabWidthText.setTextLimit(2);
tabWidthText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String number = ((Text) e.widget).getText();
number = number == null ? DEFAULT_TAB_WIDTH : number.trim();
try {
int value = Integer.parseInt(number);
if (value <= 0) {
tabWidthText.setText(DEFAULT_TAB_WIDTH);
}
} catch (NumberFormatException ex) {
tabWidthText.setText(DEFAULT_TAB_WIDTH);
}
}
});
useJavaTabsCheck = createLabeledCheck(Messages.pref_javaTabWidthForJava,
Messages.pref_javaTabWidthForJavaTip,
store.getBoolean(IAnyEditConstants.USE_JAVA_TAB_WIDTH_FOR_JAVA),
spacesComposite);
useModulo4TabsCheck = createLabeledCheck(Messages.pref_useModulo4Tabs,
Messages.pref_useModulo4TabsTip,
store.getBoolean(IAnyEditConstants.USE_MODULO_CALCULATION_FOR_TABS_REPLACE),
spacesComposite);
removeTrailingSpacesCheck = createLabeledCheck(Messages.pref_removeTrailingSpaces,
Messages.pref_removeTrailingSpacesTip,
store.getBoolean(IAnyEditConstants.REMOVE_TRAILING_SPACES),
spacesComposite);
fixLineDelimitersCheck = createLabeledCheck(Messages.pref_fixLineDelimiters,
Messages.pref_fixLineDelimitersTip,
store.getBoolean(IAnyEditConstants.FIX_LINE_DELIMITERS),
spacesComposite);
addNewLineCheck = createLabeledCheck(Messages.pref_addNewline,
Messages.pref_addNewlineTip,
store.getBoolean(IAnyEditConstants.ADD_NEW_LINE),
spacesComposite);
replaceAllTabsCheck = createLabeledCheck(Messages.pref_replaceAllTabs,
Messages.pref_replaceAllTabsTip,
store.getBoolean(IAnyEditConstants.REPLACE_ALL_TABS_WITH_SPACES),
spacesComposite);
replaceAllSpacesCheck = createLabeledCheck(Messages.pref_replaceAllSpaces,
Messages.pref_replaceAllSpacesTip,
store.getBoolean(IAnyEditConstants.REPLACE_ALL_SPACES_WITH_TABS),
spacesComposite);
// -------------------------------------------------------------------------------
Group entitiesComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
entitiesComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
entitiesComposite.setLayoutData(gridData);
entitiesComposite.setText(Messages.pref_entitiesIntro);
preserveEntitiesCheck = createLabeledCheck(Messages.pref_preserveEntities,
Messages.pref_preserveEntitiesTip,
store.getBoolean(IAnyEditConstants.PRESERVE_ENTITIES), entitiesComposite);
// -------------------------------------------------------------------------------
Group base64Composite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
base64Composite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
base64Composite.setLayoutData(gridData);
base64Composite.setText(Messages.pref_base64Intro);
base64SplitLineCheck = createLabeledCheck(Messages.pref_base64SplitLine,
Messages.pref_base64LineLengthTip,
store.getBoolean(IAnyEditConstants.BASE64_SPLIT_LINE), base64Composite);
base64LineLengthText = createLabeledText(Messages.pref_base64LineLength,
Messages.pref_base64LineLengthTip,
store.getString(IAnyEditConstants.BASE64_LINE_LENGTH), base64Composite, false, SWT.NONE);
base64LineLengthText.setTextLimit(3);
base64LineLengthText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String number = ((Text) e.widget).getText();
number = number == null ? DEFAULT_BASE64_LENGTH : number.trim();
try {
int value = Integer.parseInt(number);
if (value <= 0) {
base64LineLengthText.setText(DEFAULT_BASE64_LENGTH);
}
} catch (NumberFormatException ex) {
base64LineLengthText.setText(DEFAULT_BASE64_LENGTH);
}
}
});
// -------------------------------------------------------------------------------
Group unicodeComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
unicodeComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
unicodeComposite.setLayoutData(gridData);
unicodeComposite.setText(Messages.pref_unicodifyIntro);
unicodifyAllCheck = createLabeledCheck(Messages.pref_unicodifyAll,
Messages.pref_unicodifyAllTip,
store.getBoolean(IAnyEditConstants.UNICODIFY_ALL), unicodeComposite);
}
private void createTabMisc() {
GridLayout layout;
GridData gridData;
TabItem tabManual = new TabItem(tabFolder, SWT.NONE);
tabManual.setText(Messages.pref_tab_misc);
Composite defPanel = createContainer(tabFolder);
tabManual.setControl(defPanel);
IPreferenceStore store = getPreferenceStore();
if(EclipseUtils.getWorkbenchVersion().compareTo(new Version(3,100,0)) < 0) {
Group toolbarComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
toolbarComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
toolbarComposite.setLayoutData(gridData);
toolbarComposite.setText(Messages.pref_toolbarIntro);
removePrintCheck = createLabeledCheck(Messages.pref_removePrint,
Messages.pref_removePrintTip,
store.getBoolean(IAnyEditConstants.REMOVE_PRINT_FROM_TOOLBAR), toolbarComposite);
}
Group showWhitespaceComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
showWhitespaceComposite.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
showWhitespaceComposite.setLayoutData(gridData);
showWhitespaceComposite.setText(Messages.pref_showWhitespaceGroup);
showTrailingOnly = createLabeledCheck(Messages.pref_showTrailingOnly,
Messages.pref_showTrailingOnlyTip,
store.getBoolean(IAnyEditConstants.SHOW_TRAILING_ONLY),
showWhitespaceComposite);
showTrailingDifferently = createLabeledCheck(Messages.pref_showTrailingDifferently,
Messages.pref_showTrailingDifferentlyTip,
store.getBoolean(IAnyEditConstants.SHOW_TRAILING_DIFFERENTLY),
showWhitespaceComposite);
Group ratingComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
layout = new GridLayout();
ratingComposite.setLayout(layout);
gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
ratingComposite.setLayoutData(gridData);
ratingComposite.setText("Support AnyEdit plugin and get support too :-)");
SupportPanel.createSupportLinks(ratingComposite);
}
private void createTabAutoSave() {
TabItem tabAuto = new TabItem(tabFolder, SWT.NONE);
tabAuto.setText(Messages.pref_tab_auto);
Composite defPanel = createContainer(tabFolder);
tabAuto.setControl(defPanel);
boolean isSaveHookEnabled = AnyEditToolsPlugin.isSaveHookInitialized();
saveComposite = new Group(defPanel, SWT.SHADOW_ETCHED_IN);
GridLayout layout = new GridLayout();
saveComposite.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL
| GridData.GRAB_HORIZONTAL);
saveComposite.setLayoutData(gridData);
String saveGroupText = Messages.pref_saveIntro;
if (!isSaveHookEnabled) {
saveComposite.setToolTipText(saveGroupText);
Label label = new Label(saveComposite, SWT.WRAP);
red = new Color(tabFolder.getDisplay(), 255, 0, 0);
label.setForeground(red);
label.setText(Messages.pref_saveHookNotEnabled);
}
saveComposite.setText(saveGroupText);
Composite firstRow = new Composite(saveComposite, SWT.NONE);
layout = new GridLayout(2, false);
firstRow.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
gridData.horizontalIndent = -5;
firstRow.setLayoutData(gridData);
IPreferenceStore store = getPreferenceStore();
saveAndTrimCheck = createLabeledCheck(Messages.pref_saveAndTrim,
Messages.pref_saveAndTrimTip,
store.getBoolean(IAnyEditConstants.SAVE_AND_TRIM_ENABLED), firstRow);
ignoreBlankLinesOnTrimCheck = createLabeledCheck(Messages.pref_ignoreOnTrim,
Messages.pref_ignoreOnTrimTip,
store.getBoolean(IAnyEditConstants.IGNORE_BLANK_LINES_WHEN_TRIMMING), firstRow);
saveAndAddLineCheck = createLabeledCheck(Messages.pref_saveAndAddLine,
Messages.pref_saveAndAddLineTip,
store.getBoolean(IAnyEditConstants.SAVE_AND_ADD_LINE), firstRow);
saveAndFixLineDelimitersCheck = createLabeledCheck(Messages.pref_saveAndFixLineDelimiters,
Messages.pref_saveAndFixLineDelimitersTip,
store.getBoolean(IAnyEditConstants.SAVE_AND_FIX_LINE_DELIMITERS), firstRow);
saveAndConvertCheck = createLabeledCheck(Messages.pref_saveAndConvert,
Messages.pref_saveAndConvertTip,
store.getBoolean(IAnyEditConstants.SAVE_AND_CONVERT_ENABLED),
saveComposite);
convertChoiceComposite = new Group(saveComposite, SWT.SHADOW_ETCHED_IN);// SWT.SHADOW_NONE
layout = new GridLayout();
layout.numColumns = 2;
convertChoiceComposite.setLayout(layout);
gridData = new GridData(300, 50);
gridData.horizontalIndent = 20;
convertChoiceComposite.setLayoutData(gridData);
convertChoiceComposite.setText(Messages.pref_convertChoiceIntro);
boolean convertTabsAction = AbstractTextAction.ACTION_ID_CONVERT_TABS
.equals(store.getString(IAnyEditConstants.CONVERT_ACTION_ON_SAVE));
convertTabsOnSaveRadio = createLabeledRadio(Messages.pref_convertTabsOnSave,
Messages.pref_convertTabsOnSaveTip,
convertTabsAction, convertChoiceComposite);
convertSpacesOnSaveRadio = createLabeledRadio(Messages.pref_convertSpacesOnSave,
Messages.pref_convertSpacesOnSaveTip,
!convertTabsAction, convertChoiceComposite);
saveAndConvertCheck.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
convertTabsOnSaveRadio.setEnabled(saveAndConvertCheck.getSelection());
convertSpacesOnSaveRadio.setEnabled(saveAndConvertCheck.getSelection());
convertChoiceComposite.setEnabled(saveAndConvertCheck.getSelection());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// ignored
}
});
convertTabsOnSaveRadio.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
convertSpacesOnSaveRadio.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
convertChoiceComposite.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
saveAndTrimCheck.setEnabled(isSaveHookEnabled);
ignoreBlankLinesOnTrimCheck.setEnabled(isSaveHookEnabled);
saveAndAddLineCheck.setEnabled(isSaveHookEnabled);
saveAndFixLineDelimitersCheck.setEnabled(isSaveHookEnabled);
saveAndConvertCheck.setEnabled(isSaveHookEnabled);
saveComposite.setEnabled(isSaveHookEnabled);
askBeforeConvertAllCheck = createLabeledCheck(Messages.pref_askBeforeConvertAll,
Messages.pref_askBeforeConvertAllTip,
store.getBoolean(IAnyEditConstants.ASK_BEFORE_CONVERT_ALL_IN_FOLDER),
defPanel);
createExclusionGroup(defPanel);
}
private Control createExclusionGroup(Composite parent) {
// PreferenceLinkArea contentTypeArea = new PreferenceLinkArea(parent, SWT.NONE,
// "org.eclipse.ui.preferencePages.ContentTypes",
// getText("AnyEditPreferencePage.linkToContentTypes"),
// (IWorkbenchPreferenceContainer) getContainer(), null);
//
// GridData data = new GridData(GridData.FILL_HORIZONTAL |
// GridData.GRAB_HORIZONTAL);
// contentTypeArea.getControl().setLayoutData(data);
Group exclGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
exclGroup.setText(Messages.pref_group_exclude);
exclGroup.setToolTipText(Messages.pref_group_excludeTip);
GridLayout layout = new GridLayout();
exclGroup.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL
| GridData.GRAB_HORIZONTAL);
exclGroup.setLayoutData(gridData);
createFilterPreferences(exclGroup);
return exclGroup;
}
protected static Composite createContainer(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
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));
return composite;
}
/*
* @see IWorkbenchPreferencePage#init(IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
// ignored
}
/*
* @see SelectionListener#widgetDefaultSelected(SelectionEvent)
*/
@Override
public void widgetDefaultSelected(SelectionEvent selectionEvent) {
widgetSelected(selectionEvent);
}
/*
* @see SelectionListener#widgetSelected(SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
// ignored
}
@Override
public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
if (!TextUtil.isValidLineSeparatorRegex(lineSeparatorRegex.getText())) {
return false;
}
fileFilterContentProvider.saveFilters();
store.setValue(IAnyEditConstants.EDITOR_TAB_WIDTH, tabWidthText.getText());
store.setValue(IAnyEditConstants.CHARACTERS_REQUIRED_IN_PATH, requiredInPathText
.getText());
store.setValue(IAnyEditConstants.CHARACTERS_DISALLOWED_IN_PATH,
disallowedInPathText.getText());
store.setValue(IAnyEditConstants.USE_REQUIRED_IN_PATH_CHARACTERS,
requiredInPathEnabledCheck.getSelection());
store.setValue(IAnyEditConstants.LINE_SEPARATOR_REGEX,
lineSeparatorRegex.getText());
store.setValue(IAnyEditConstants.HIDE_OPEN_TYPE_ACTION,
hideOpenTypeCheck.getSelection());
store.setValue(IAnyEditConstants.INCLUDE_DERIVED_RESOURCES,
includeDerivedCheck.getSelection());
store.setValue(IAnyEditConstants.USE_WORKSPACE_SCOPE_FOR_SEARCH,
useWorkspaceScopeCheck.getSelection());
store.setValue(IAnyEditConstants.USE_JAVA_TAB_WIDTH_FOR_JAVA, useJavaTabsCheck
.getSelection());
store.setValue(IAnyEditConstants.USE_MODULO_CALCULATION_FOR_TABS_REPLACE, useModulo4TabsCheck
.getSelection());
store.setValue(IAnyEditConstants.SAVE_DIRTY_BUFFER, saveDirtyBufferCheck
.getSelection());
store.setValue(IAnyEditConstants.REMOVE_TRAILING_SPACES,
removeTrailingSpacesCheck.getSelection());
store.setValue(IAnyEditConstants.FIX_LINE_DELIMITERS,
fixLineDelimitersCheck.getSelection());
store.setValue(IAnyEditConstants.ADD_NEW_LINE,
addNewLineCheck.getSelection());
store.setValue(IAnyEditConstants.REPLACE_ALL_TABS_WITH_SPACES,
replaceAllTabsCheck.getSelection());
store.setValue(IAnyEditConstants.REPLACE_ALL_SPACES_WITH_TABS,
replaceAllSpacesCheck.getSelection());
store.setValue(IAnyEditConstants.PRESERVE_ENTITIES, preserveEntitiesCheck
.getSelection());
if(removePrintCheck != null) {
store.setValue(IAnyEditConstants.REMOVE_PRINT_FROM_TOOLBAR, removePrintCheck
.getSelection());
}
store.setValue(IAnyEditConstants.SAVE_AND_TRIM_ENABLED, saveAndTrimCheck
.getSelection());
store.setValue(IAnyEditConstants.IGNORE_BLANK_LINES_WHEN_TRIMMING, ignoreBlankLinesOnTrimCheck
.getSelection());
store.setValue(IAnyEditConstants.SAVE_AND_ADD_LINE, saveAndAddLineCheck
.getSelection());
store.setValue(IAnyEditConstants.SAVE_AND_FIX_LINE_DELIMITERS, saveAndFixLineDelimitersCheck
.getSelection());
store.setValue(IAnyEditConstants.SAVE_AND_CONVERT_ENABLED, saveAndConvertCheck
.getSelection());
store.setValue(IAnyEditConstants.ASK_BEFORE_CONVERT_ALL_IN_FOLDER,
askBeforeConvertAllCheck.getSelection());
store.setValue(IAnyEditConstants.SAVE_TO_SHOW_OPTIONS,
showSaveToDialogCheck.getSelection());
store.setValue(IAnyEditConstants.SAVE_TO_OPEN_EDITOR,
saveToOpenEditorCheck.getSelection());
store.setValue(IAnyEditConstants.SAVE_TO_IGNORE_SELECTION,
saveToNoSelectionCheck.getSelection());
store.setValue(IAnyEditConstants.BASE64_LINE_LENGTH,
base64LineLengthText.getText());
store.setValue(IAnyEditConstants.UNICODIFY_ALL,
unicodifyAllCheck.getSelection());
store.setValue(IAnyEditConstants.BASE64_SPLIT_LINE,
base64SplitLineCheck.getSelection());
store.setValue(IAnyEditConstants.SHOW_TRAILING_ONLY, showTrailingOnly.getSelection());
store.setValue(IAnyEditConstants.SHOW_TRAILING_DIFFERENTLY, showTrailingDifferently.getSelection());
if (convertSpacesOnSaveRadio.getSelection()) {
store.setValue(IAnyEditConstants.CONVERT_ACTION_ON_SAVE,
AbstractTextAction.ACTION_ID_CONVERT_SPACES);
} else {
store.setValue(IAnyEditConstants.CONVERT_ACTION_ON_SAVE,
AbstractTextAction.ACTION_ID_CONVERT_TABS);
}
TextUtil.updateTextUtils();
return true;
}
protected static Text createLabeledText(String title, String tooltip, String value, Composite defPanel,
boolean fillAllSpace, int style) {
Composite commonPanel = new Composite(defPanel, SWT.NONE);
GridData gridData = new GridData (SWT.FILL, SWT.FILL, true, true);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
commonPanel.setLayout(layout);
commonPanel.setLayoutData(gridData);
Label label = new Label(commonPanel, SWT.LEFT);
label.setText(title);
label.setToolTipText(tooltip);
Text fText = new Text(commonPanel, SWT.SHADOW_IN | SWT.BORDER | style);
if (fillAllSpace) {
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
fText.setLayoutData(gridData);
} else {
gridData = new GridData();
gridData.widthHint = 20;
fText.setLayoutData(gridData);
}
fText.setText(value);
fText.setToolTipText(tooltip);
return fText;
}
protected static Button createLabeledCheck(String title, String tooltip, boolean value, Composite defPanel) {
Button fButton = new Button(defPanel, SWT.CHECK | SWT.LEFT);
GridData data = new GridData();
fButton.setLayoutData(data);
fButton.setText(title);
fButton.setSelection(value);
fButton.setToolTipText(tooltip);
return fButton;
}
protected static Button createLabeledRadio(String title, String tooltip, boolean value, Composite defPanel) {
Button fButton = new Button(defPanel, SWT.RADIO);
fButton.setText(title);
fButton.setSelection(value);
fButton.setToolTipText(tooltip);
return fButton;
}
@Override
protected void performDefaults() {
super.performDefaults();
fileFilterContentProvider.setDefaults();
IPreferenceStore store = getPreferenceStore();
tabWidthText.setText(store.getDefaultString(IAnyEditConstants.EDITOR_TAB_WIDTH));
disallowedInPathText.setText(store
.getDefaultString(IAnyEditConstants.CHARACTERS_DISALLOWED_IN_PATH));
requiredInPathText.setText(store
.getDefaultString(IAnyEditConstants.CHARACTERS_REQUIRED_IN_PATH));
requiredInPathEnabledCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.USE_REQUIRED_IN_PATH_CHARACTERS));
lineSeparatorRegex.setText(store
.getDefaultString(IAnyEditConstants.LINE_SEPARATOR_REGEX));
hideOpenTypeCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.HIDE_OPEN_TYPE_ACTION));
includeDerivedCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.INCLUDE_DERIVED_RESOURCES));
useWorkspaceScopeCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.USE_WORKSPACE_SCOPE_FOR_SEARCH));
requiredInPathText.setEditable(requiredInPathEnabledCheck.getSelection());
useJavaTabsCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.USE_JAVA_TAB_WIDTH_FOR_JAVA));
useModulo4TabsCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.USE_MODULO_CALCULATION_FOR_TABS_REPLACE));
saveDirtyBufferCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_DIRTY_BUFFER));
removeTrailingSpacesCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.REMOVE_TRAILING_SPACES));
fixLineDelimitersCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.FIX_LINE_DELIMITERS));
addNewLineCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.ADD_NEW_LINE));
replaceAllTabsCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.REPLACE_ALL_TABS_WITH_SPACES));
replaceAllSpacesCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.REPLACE_ALL_SPACES_WITH_TABS));
preserveEntitiesCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.PRESERVE_ENTITIES));
if(removePrintCheck != null) {
removePrintCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.REMOVE_PRINT_FROM_TOOLBAR));
}
saveAndTrimCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_AND_TRIM_ENABLED));
ignoreBlankLinesOnTrimCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.IGNORE_BLANK_LINES_WHEN_TRIMMING));
saveAndAddLineCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_AND_ADD_LINE));
saveAndFixLineDelimitersCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_AND_FIX_LINE_DELIMITERS));
saveAndConvertCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_AND_CONVERT_ENABLED));
askBeforeConvertAllCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.ASK_BEFORE_CONVERT_ALL_IN_FOLDER));
showSaveToDialogCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_TO_SHOW_OPTIONS));
saveToOpenEditorCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_TO_OPEN_EDITOR));
saveToNoSelectionCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SAVE_TO_IGNORE_SELECTION));
base64LineLengthText.setText(store
.getDefaultString(IAnyEditConstants.BASE64_LINE_LENGTH));
unicodifyAllCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.UNICODIFY_ALL));
base64SplitLineCheck.setSelection(store
.getDefaultBoolean(IAnyEditConstants.BASE64_SPLIT_LINE));
showTrailingOnly.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SHOW_TRAILING_ONLY));
showTrailingDifferently.setSelection(store
.getDefaultBoolean(IAnyEditConstants.SHOW_TRAILING_DIFFERENTLY));
boolean convertTabsAction = AbstractTextAction.ACTION_ID_CONVERT_TABS
.equals(store.getDefaultString(
IAnyEditConstants.CONVERT_ACTION_ON_SAVE));
boolean isSaveHookEnabled = AnyEditToolsPlugin.isSaveHookInitialized();
convertTabsOnSaveRadio.setSelection(convertTabsAction);
convertSpacesOnSaveRadio.setSelection(!convertTabsAction);
convertTabsOnSaveRadio.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
convertSpacesOnSaveRadio.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
convertChoiceComposite.setEnabled(isSaveHookEnabled
&& saveAndConvertCheck.getSelection());
}
@Override
public void dispose() {
if (tabFolder != null) {
tabFolder.dispose();
}
if (red != null && !red.isDisposed()) {
red.dispose();
}
super.dispose();
}
/**
* Create a group to contain the step filter related widgetry
*/
private void createFilterPreferences(Composite parent) {
// top level container
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
container.setLayout(layout);
GridData gd = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_FILL);
container.setLayoutData(gd);
// table label
Label tableLabel = new Label(container, SWT.WRAP);
tableLabel.setText(Messages.pref_Defined_file_filters);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalSpan = 2;
tableLabel.setLayoutData(gd);
filterTable = new Table(container, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
filterTable.setHeaderVisible(false);
// fFilterTable.setLinesVisible(true);
filterTable.setLayoutData(new GridData(GridData.FILL_BOTH));
TableLayout tlayout = new TableLayout();
tlayout.addColumnData(new ColumnWeightData(100, true));
filterTable.setLayout(tlayout);
TableColumn tableCol = new TableColumn(filterTable, SWT.LEFT);
tableCol.setResizable(true);
filterViewer = new CheckboxTableViewer(filterTable);
tableEditor = new TableEditor(filterTable);
filterViewer.setLabelProvider(new FilterLabelProvider());
filterViewer.setComparator(new FilterViewerSorter());
fileFilterContentProvider = new FilterContentProvider(filterViewer);
filterViewer.setContentProvider(fileFilterContentProvider);
// @todo table width input just needs to be non-null
filterViewer.setInput(this);
filterViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
Filter filter = (Filter) event.getElement();
fileFilterContentProvider.toggleFilter(filter);
}
});
filterViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection.isEmpty()) {
removeFilterButton.setEnabled(false);
} else {
removeFilterButton.setEnabled(true);
}
}
});
createFilterButtons(container);
}
private void createFilterButtons(Composite container) {
// button container
Composite buttonContainer = new Composite(container, SWT.NONE);
GridData gd = new GridData(GridData.FILL_VERTICAL);
buttonContainer.setLayoutData(gd);
GridLayout buttonLayout = new GridLayout();
buttonLayout.numColumns = 1;
buttonLayout.marginHeight = 0;
buttonLayout.marginWidth = 0;
buttonContainer.setLayout(buttonLayout);
// Add filter button
Button addFilterButton = new Button(buttonContainer, SWT.PUSH);
addFilterButton.setText(Messages.pref_Add_filter);
addFilterButton.setToolTipText(Messages.pref_Add_filterTip);
gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
addFilterButton.setLayoutData(gd);
addFilterButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
editFilter();
}
});
// Remove button
removeFilterButton = new Button(buttonContainer, SWT.PUSH);
removeFilterButton.setText(Messages.pref_RemoveFilter);
removeFilterButton.setToolTipText(Messages.pref_RemoveFilterTip);
gd = getButtonGridData(removeFilterButton);
removeFilterButton.setLayoutData(gd);
removeFilterButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
removeFilters();
}
});
removeFilterButton.setEnabled(false);
enableAllButton = new Button(buttonContainer, SWT.PUSH);
enableAllButton.setText(Messages.pref_Enable_all);
enableAllButton.setToolTipText(Messages.pref_Enable_allTip);
gd = getButtonGridData(enableAllButton);
enableAllButton.setLayoutData(gd);
enableAllButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
checkAllFilters(true);
}
});
disableAllButton = new Button(buttonContainer, SWT.PUSH);
disableAllButton.setText(Messages.pref_Disable_all);
disableAllButton.setToolTipText(Messages.pref_Disable_allTip);
gd = getButtonGridData(disableAllButton);
disableAllButton.setLayoutData(gd);
disableAllButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
checkAllFilters(false);
}
});
}
protected static GridData getButtonGridData(Button button) {
GridData gd = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_BEGINNING);
GC gc = new GC(button);
gc.setFont(button.getFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
true).x);
// gd.heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics,
// IDialogConstants.BUTTON_HEIGHT);
return gd;
}
protected void checkAllFilters(boolean check) {
Object[] filters = fileFilterContentProvider.getElements(null);
for (int i = 0; i != filters.length; i++) {
((Filter) filters[i]).setChecked(check);
}
filterViewer.setAllChecked(check);
}
/**
* Create a new filter in the table (with the default 'new filter' value), then open
* up an in-place editor on it.
*/
protected void editFilter() {
// if a previous edit is still in progress, finish it
if (editorText != null) {
validateChangeAndCleanup();
}
newFilter = fileFilterContentProvider.addFilter(DEFAULT_NEW_FILTER_TEXT,
true);
newTableItem = filterTable.getItem(0);
// create & configure Text widget for editor
// Fix for bug 1766. Border behavior on for text fields varies per platform.
// On Motif, you always get a border, on other platforms,
// you don't. Specifying a border on Motif results in the characters
// getting pushed down so that only there very tops are visible. Thus,
// we have to specify different style constants for the different platforms.
int textStyles = SWT.SINGLE | SWT.LEFT;
if (!"motif".equals(SWT.getPlatform())) {
textStyles |= SWT.BORDER;
}
editorText = new Text(filterTable, textStyles);
GridData gd = new GridData(GridData.FILL_BOTH);
editorText.setLayoutData(gd);
// set the editor
tableEditor.horizontalAlignment = SWT.LEFT;
tableEditor.grabHorizontal = true;
tableEditor.setEditor(editorText, newTableItem, 0);
// get the editor ready to use
editorText.setText(newFilter.getName());
editorText.selectAll();
setEditorListeners(editorText);
editorText.setFocus();
}
private void setEditorListeners(Text text) {
// CR means commit the changes, ESC means abort and don't commit
text.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent event) {
if (event.character == SWT.CR) {
if (invalidEditorText != null) {
String infoText = Messages.pref_Invalid_file_filter;
String text2 = editorText.getText();
if (!invalidEditorText.equals(text2)
&& !infoText.equals(text2)) {
validateChangeAndCleanup();
} else {
editorText.setText(infoText);
}
invalidEditorText = null;
} else {
validateChangeAndCleanup();
}
} else if (event.character == SWT.ESC) {
removeNewFilter();
cleanupEditor();
}
}
});
// Consider loss of focus on the editor to mean the same as CR
text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent event) {
if (invalidEditorText != null) {
String infoText = Messages.pref_Invalid_file_filter;
String text2 = editorText.getText();
if (!invalidEditorText.equals(text2)
&& !infoText.equals(text2)) {
validateChangeAndCleanup();
} else {
editorText.setText(infoText);
}
invalidEditorText = null;
} else {
validateChangeAndCleanup();
}
}
});
// Consume traversal events from the text widget so that CR doesn't
// traverse away to dialog's default button. Without this, hitting
// CR in the text field closes the entire dialog.
text.addListener(SWT.Traverse, new Listener() {
@Override
public void handleEvent(Event event) {
event.doit = false;
}
});
}
protected void validateChangeAndCleanup() {
String trimmedValue = editorText.getText().trim();
// if the new value is blank, remove the filter
if (trimmedValue.length() < 1) {
removeNewFilter();
}
// if it's invalid, beep and leave sitting in the editor
else if (!validateEditorInput(trimmedValue)) {
invalidEditorText = trimmedValue;
editorText.setText(Messages.pref_Invalid_file_filter);
getShell().getDisplay().beep();
return;
// otherwise, commit the new value if not a duplicate
} else {
Object[] filters = fileFilterContentProvider.getElements(null);
for (int i = 0; i < filters.length; i++) {
Filter filter = (Filter) filters[i];
if (filter.getName().equals(trimmedValue)) {
removeNewFilter();
cleanupEditor();
return;
}
}
newTableItem.setText(trimmedValue);
newFilter.setName(trimmedValue);
filterViewer.refresh();
}
cleanupEditor();
}
/**
* Cleanup all widgetry & resources used by the in-place editing
*/
protected void cleanupEditor() {
if (editorText != null) {
newFilter = null;
newTableItem = null;
tableEditor.setEditor(null, null, 0);
editorText.dispose();
editorText = null;
}
}
protected void removeNewFilter() {
fileFilterContentProvider.removeFilters(new Object[] { newFilter });
}
/**
* A valid filter is either *.[\w] or [\w].* or [\w]
*/
protected static boolean validateEditorInput(String trimmedValue) {
char firstChar = trimmedValue.charAt(0);
if (firstChar == '*' && trimmedValue.length() == 1) {
return false;
}
if (firstChar == '*') {
// '*' should be followed by '.'
if (trimmedValue.charAt(1) != '.') {
return false;
}
}
char lastChar = trimmedValue.charAt(trimmedValue.length() - 1);
if (lastChar == '*') {
// '*' should be preceeded by '.' and it should exist only once
if (trimmedValue.charAt(trimmedValue.length() - 2) != '.') {
return false;
}
}
if (TextUtil.count(trimmedValue, '*') > 1) {
return false;
}
return true;
}
protected void removeFilters() {
IStructuredSelection selection = (IStructuredSelection) filterViewer
.getSelection();
fileFilterContentProvider.removeFilters(selection.toArray());
}
/**
* Serializes the array of strings into one comma separated string.
*
* @param list
* array of strings
* @return a single string composed of the given list
*/
public static String serializeList(String[] list) {
if (list == null) {
return "";
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < list.length; i++) {
if (i > 0) {
buffer.append(',');
}
buffer.append(list[i]);
}
return buffer.toString();
}
protected void updateActions() {
if (enableAllButton != null) {
boolean enabled = filterViewer.getTable().getItemCount() > 0;
enableAllButton.setEnabled(enabled);
disableAllButton.setEnabled(enabled);
}
}
/**
* Content provider for the table. Content consists of instances of StepFilter.
*/
protected class FilterContentProvider implements IStructuredContentProvider {
private final CheckboxTableViewer fViewer;
private final List<Filter> fFilters;
public FilterContentProvider(CheckboxTableViewer viewer) {
fViewer = viewer;
List<String> active = createActiveStepFiltersList();
List<String> inactive = createInactiveStepFiltersList();
fFilters = new ArrayList<Filter>(active.size() + inactive.size());
populateList(inactive, false);
populateList(active, true);
updateActions();
}
public void setDefaults() {
fViewer.remove(fFilters.toArray());
List<String> defaultlist = createDefaultStepFiltersList();
fFilters.clear();
populateList(defaultlist, true);
}
protected final void populateList(List<String> list, boolean checked) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
addFilter(name, checked);
}
}
/**
* Returns a list of active step filters.
*
* @return list
*/
protected final List<String> createActiveStepFiltersList() {
String[] strings = EclipseUtils.parseList(getPreferenceStore().getString(
IAnyEditConstants.PREF_ACTIVE_FILTERS_LIST));
return Arrays.asList(strings);
}
/**
* Returns a list of active step filters.
*
* @return list
*/
protected List<String> createDefaultStepFiltersList() {
String[] strings = EclipseUtils.parseList(getPreferenceStore()
.getDefaultString(IAnyEditConstants.PREF_ACTIVE_FILTERS_LIST));
return Arrays.asList(strings);
}
/**
* Returns a list of active step filters.
*
* @return list
*/
protected final List<String> createInactiveStepFiltersList() {
String[] strings = EclipseUtils.parseList(getPreferenceStore().getString(
IAnyEditConstants.PREF_INACTIVE_FILTERS_LIST));
return Arrays.asList(strings);
}
public Filter addFilter(String name, boolean checked) {
Filter filter = new Filter(name, checked);
if (!fFilters.contains(filter)) {
fFilters.add(filter);
fViewer.add(filter);
fViewer.setChecked(filter, checked);
}
updateActions();
return filter;
}
public void saveFilters() {
int filtersSize = fFilters.size();
List<String> active = new ArrayList<String>(filtersSize);
List<String> inactive = new ArrayList<String>(filtersSize);
Iterator<Filter> iterator = fFilters.iterator();
while (iterator.hasNext()) {
Filter filter = iterator.next();
String name = filter.getName();
if (filter.isChecked()) {
active.add(name);
} else {
inactive.add(name);
}
}
String pref = serializeList(active.toArray(new String[active
.size()]));
IPreferenceStore prefStore = getPreferenceStore();
prefStore.setValue(IAnyEditConstants.PREF_ACTIVE_FILTERS_LIST,
pref);
pref = serializeList(inactive.toArray(new String[inactive.size()]));
prefStore.setValue(IAnyEditConstants.PREF_INACTIVE_FILTERS_LIST,
pref);
}
public void removeFilters(Object[] filters) {
for (int i = 0; i < filters.length; i++) {
Filter filter = (Filter) filters[i];
fFilters.remove(filter);
}
fViewer.remove(filters);
updateActions();
}
public void toggleFilter(Filter filter) {
boolean newState = !filter.isChecked();
filter.setChecked(newState);
fViewer.setChecked(filter, newState);
}
/**
* @see IStructuredContentProvider#getElements(Object)
*/
@Override
public Object[] getElements(Object inputElement) {
return fFilters.toArray();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
/** ignored */
}
@Override
public void dispose() {
/** ignored */
}
}
}
/**
* Model object that represents a single entry in a filter table.
*/
final class Filter {
private String fName;
private boolean fChecked;
public Filter(String name, boolean checked) {
setName(name);
setChecked(checked);
}
public String getName() {
return fName;
}
public void setName(String name) {
fName = name;
}
public boolean isChecked() {
return fChecked;
}
public void setChecked(boolean checked) {
fChecked = checked;
}
@Override
public boolean equals(Object o) {
if (o instanceof Filter) {
Filter other = (Filter) o;
if (getName().equals(other.getName())) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return getName().hashCode();
}
}
/**
* Label provider for Filter model objects
*/
class FilterLabelProvider extends LabelProvider implements ITableLabelProvider {
private final Image imgPkg = PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FILE);
/**
* @see ITableLabelProvider#getColumnText(Object, int)
*/
@Override
public String getColumnText(Object object, int column) {
if (column == 0) {
return ((Filter) object).getName();
}
return "";
}
/**
* @see ILabelProvider#getText(Object)
*/
@Override
public String getText(Object element) {
return ((Filter) element).getName();
}
/**
* @see ITableLabelProvider#getColumnImage(Object, int)
*/
@Override
public Image getColumnImage(Object object, int column) {
return imgPkg;
}
}
class FilterViewerSorter extends WorkbenchViewerComparator {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if(!(viewer instanceof ContentViewer)) {
return 0;
}
ILabelProvider lprov = (ILabelProvider) ((ContentViewer) viewer)
.getLabelProvider();
String name1 = lprov.getText(e1);
String name2 = lprov.getText(e2);
if (name1 == null) {
name1 = "";
}
if (name2 == null) {
name2 = "";
}
if (name1.length() > 0 && name2.length() > 0) {
char char1 = name1.charAt(name1.length() - 1);
char char2 = name2.charAt(name2.length() - 1);
if (char1 == '*' && char1 != char2) {
return -1;
}
if (char2 == '*' && char2 != char1) {
return 1;
}
}
return name1.compareTo(name2);
}
}