/*******************************************************************************
* Copyright (c) 2013 Pivotal Software, Inc.
* 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:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.springsource.ide.eclipse.commons.quicksearch.ui;
import static org.springsource.ide.eclipse.commons.quicksearch.core.preferences.QuickSearchPreferences.IGNORED_EXTENSIONS;
import static org.springsource.ide.eclipse.commons.quicksearch.core.preferences.QuickSearchPreferences.IGNORED_NAMES;
import static org.springsource.ide.eclipse.commons.quicksearch.core.preferences.QuickSearchPreferences.IGNORED_PREFIXES;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.osgi.service.prefs.BackingStoreException;
import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression;
import org.springsource.ide.eclipse.commons.livexp.core.ValidationResult;
import org.springsource.ide.eclipse.commons.livexp.core.Validator;
import org.springsource.ide.eclipse.commons.livexp.ui.PreferencePageWithSections;
import org.springsource.ide.eclipse.commons.livexp.ui.PrefsGroupSection;
import org.springsource.ide.eclipse.commons.livexp.ui.PrefsPageSection;
import org.springsource.ide.eclipse.commons.livexp.ui.UIConstants;
import org.springsource.ide.eclipse.commons.quicksearch.core.preferences.QuickSearchPreferences;
import org.springsource.ide.eclipse.commons.quicksearch.core.priority.DefaultPriorityFunction;
/**
*
* @author Kris De Volder
*/
public class QuickSearchIgnoreSection extends PrefsPageSection {
private static final String[] prefsKeys = {
IGNORED_EXTENSIONS, IGNORED_PREFIXES, IGNORED_NAMES
};
private static final String[] fieldNames = {
"Extensions", "Prefixes", "Names"
};
private static final String[] toolTips = {
"Enter a list of file extensions. Elements in the list can be separated by commas or newlines." +
"Any file or folder ending with one of the extensions will be ignored.",
"Enter a list of file prefixes. Elements in the list can be separated by commas or newlines." +
"Any file or folder who's name begins with one of the extensions will be ignored.",
"Enter a list of file names. Elements in the list can be separated by commas or newlines." +
"Any file or folder who's name equals one of the extensions will be ignored."
};
private QuickSearchPreferences prefs;
private IEclipsePreferences prefsStore;
private PrefsGroupSection group;
public QuickSearchIgnoreSection(PreferencePageWithSections owner) {
super(owner);
prefs = QuickSearchActivator.getDefault().getPreferences();
prefsStore = prefs.getStore();
String[] defaultIgnores = {
withSeparator(", ", defaultPriorityFun.ignoredExtensions),
withSeparator(", ", defaultPriorityFun.ignoredPrefixes),
withSeparator(", ", defaultPriorityFun.ignoredNames)
};
IgnoreListField[] fields = new IgnoreListField[prefsKeys.length];
for (int i = 0; i < prefsKeys.length; i++) {
fields[i] = new IgnoreListField(owner, fieldNames[i], prefsKeys[i], defaultIgnores[i], toolTips[i]);
};
this.group = new PrefsGroupSection(owner, "Ignore", fields);
}
private DefaultPriorityFunction defaultPriorityFun = new DefaultPriorityFunction();
private class IgnoreListField extends PrefsPageSection {
private static final int HEIGHT_HINT = 60; //TODO: compute based on font size. 3 / 4 lines of text
private static final int FIELD_INDENT = 30;
Label label;
Text text;
private String prefsKey;
private String labelText;
private String defaultValue;
private String tooltip;
public IgnoreListField(PreferencePageWithSections owner, String labelText, String prefsKey, String defaultValue, String tooltip) {
super(owner);
this.labelText = labelText;
this.defaultValue = defaultValue;
this.prefsKey = prefsKey;
this.defaultValue = defaultValue;
this.tooltip = tooltip;
}
public boolean performOK() {
prefsStore.put(prefsKey, text.getText());
return true;
}
public void performDefaults() {
text.setText(defaultValue);
}
public LiveExpression<ValidationResult> getValidator() {
return Validator.constant(ValidationResult.OK);
}
@Override
public void createContents(Composite parent) {
GridDataFactory alignLabel = GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING);
label = new Label(parent, SWT.NONE);
label.setText(this.labelText);
alignLabel.applyTo(label);
label.setToolTipText(tooltip);
text = new Text(parent, SWT.BORDER|SWT.MULTI|SWT.H_SCROLL|SWT.V_SCROLL|SWT.WRAP);
GridDataFactory.fillDefaults()
.hint(UIConstants.FIELD_TEXT_AREA_WIDTH, HEIGHT_HINT)
.grab(true, false)
.indent(FIELD_INDENT, 0)
.applyTo(text);
text.setText(prefsStore.get(prefsKey, defaultValue));
text.setToolTipText(tooltip);
}
}
@Override
public boolean performOK() {
boolean result = group.performOK();
if (result) {
try {
prefsStore.flush();
} catch (BackingStoreException e) {
QuickSearchActivator.log(e);
}
}
return result;
}
@Override
public void performDefaults() {
group.performDefaults();
}
private String withSeparator(String string, String[] strings) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
if (i>0) {
buf.append(", ");
}
buf.append(strings[i]);
}
return buf.toString();
}
@Override
public LiveExpression<ValidationResult> getValidator() {
return group.getValidator();
}
@Override
public void createContents(Composite parent) {
group.createContents(parent);
}
}