/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/**
* @author Carl Robinson
* @author fabioz
*
* Created 12/09/07
*/
package org.python.pydev.editor.codefolding;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.plugin.preferences.OverlayPreferenceStore;
/**
* @author Carl Robinson
*
* Creates the preference page for code folding
* Extends PreferencePage rather than FieldEditorPreferencePage
* as it was easier to use some of the code in AbstractPydevPrefs
* to create dependent checkboxes.
*/
public class PyDevCodeFoldingPrefPage extends PreferencePage implements IWorkbenchPreferencePage {
public static final String USE_CODE_FOLDING = "USE_CODE_FOLDING";
public static final boolean DEFAULT_USE_CODE_FOLDING = true;
public static final boolean DEFAULT_FOLD_IF = false;
public static final String FOLD_IF = "FOLD_IF";
public static final boolean DEFAULT_FOLD_WHILE = false;
public static final String FOLD_WHILE = "FOLD_WHILE";
public static final boolean DEFAULT_FOLD_IMPORTS = true;
public static final String FOLD_IMPORTS = "FOLD_IMPORTS";
public static final boolean DEFAULT_FOLD_COMMENTS = true;
public static final String FOLD_COMMENTS = "FOLD_COMMENTS";
public static final boolean DEFAULT_FOLD_STRINGS = true;
public static final String FOLD_STRINGS = "FOLD_STRINGS";
public static final boolean DEFAULT_FOLD_CLASSDEF = true;
public static final String FOLD_CLASSDEF = "FOLD_CLASSDEF";
public static final boolean DEFAULT_FOLD_FUNCTIONDEF = true;
public static final String FOLD_FUNCTIONDEF = "FOLD_FUNCTIONDEF";
public static final boolean DEFAULT_FOLD_FOR = false;
public static final String FOLD_FOR = "FOLD_FOR";
public static final boolean DEFAULT_FOLD_TRY = false;
public static final String FOLD_TRY = "FOLD_TRY";
public static final boolean DEFAULT_FOLD_WITH = false;
public static final String FOLD_WITH = "FOLD_WITH";
/**
*
*/
public PyDevCodeFoldingPrefPage() {
//super();
setPreferenceStore(PydevPlugin.getDefault().getPreferenceStore());
setDescription("PyDev Code Folding Options");
fOverlayStore = createOverlayStore();
}
/**
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
}
@Override
protected Control createContents(Composite parent) {
fOverlayStore.load();
fOverlayStore.start();
Control control = createPreferencePage(parent);
initializeFields();
// Dialog.applyDialogFont(control);
return control;
}
protected Control createPreferencePage(Composite parent) {
Composite top = new Composite(parent, SWT.LEFT);
// Sets the layout data for the top composite's
// place in its parent's layout.
top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Sets the layout for the top composite's
// children to populate.
top.setLayout(new GridLayout());
Button master = addCheckBox(top, "Use Code Folding? - Will apply to new editors", USE_CODE_FOLDING, 0);
Label listLabel = new Label(top, SWT.NONE);
listLabel
.setText("\nSelect the elements you would like PyDev \nto fold on.\n\nWill be applied when the document is saved");
Button slaveImport = addCheckBox(top, "Fold Imports?", FOLD_IMPORTS, 0);
Button slaveClass = addCheckBox(top, "Fold Class Definitions?", FOLD_CLASSDEF, 0);
Button slaveFunc = addCheckBox(top, "Fold Function Definitions?", FOLD_FUNCTIONDEF, 0);
Button slaveString = addCheckBox(top, "Fold Multi-line Strings?", FOLD_STRINGS, 0);
Button slaveComment = addCheckBox(top, "Fold Comments?", FOLD_COMMENTS, 0);
Button slaveFor = addCheckBox(top, "Fold FOR statments?", FOLD_FOR, 0);
Button slaveIf = addCheckBox(top, "Fold IF statments?", FOLD_IF, 0);
Button slaveTry = addCheckBox(top, "Fold TRY statments?", FOLD_TRY, 0);
Button slaveWhile = addCheckBox(top, "Fold WHILE statments?", FOLD_WHILE, 0);
Button slaveWith = addCheckBox(top, "Fold WITH statments?", FOLD_WITH, 0);
createDependency(master, USE_CODE_FOLDING, slaveClass);
createDependency(master, USE_CODE_FOLDING, slaveFunc);
createDependency(master, USE_CODE_FOLDING, slaveImport);
createDependency(master, USE_CODE_FOLDING, slaveFor);
createDependency(master, USE_CODE_FOLDING, slaveIf);
createDependency(master, USE_CODE_FOLDING, slaveTry);
createDependency(master, USE_CODE_FOLDING, slaveWhile);
createDependency(master, USE_CODE_FOLDING, slaveWith);
createDependency(master, USE_CODE_FOLDING, slaveString);
createDependency(master, USE_CODE_FOLDING, slaveComment);
return top;
}
/*
* @see PreferencePage#performOk()
*/
public boolean performOk() {
fOverlayStore.propagate();
PydevPlugin.getDefault().savePluginPreferences();
return true;
}
/*
* @see PreferencePage#performDefaults()
*/
protected void performDefaults() {
fOverlayStore.loadDefaults();
initializeFields();
super.performDefaults();
}
protected void initializeFields() {
Iterator e = fCheckBoxes.keySet().iterator();
while (e.hasNext()) {
Button b = (Button) e.next();
String key = (String) fCheckBoxes.get(b);
b.setSelection(fOverlayStore.getBoolean(key));
}
// e= fTextFields.keySet().iterator();
// while (e.hasNext()) {
// Text t= (Text) e.next();
// String key= (String) fTextFields.get(t);
// t.setText(fOverlayStore.getString(key));
// }
//
// fFieldsInitialized= true;
// updateStatus(validatePositiveNumber("0"));
// Update slaves
Iterator iter = fMasterSlaveListeners.iterator();
while (iter.hasNext()) {
SelectionListener listener = (SelectionListener) iter.next();
listener.widgetSelected(null);
}
}
protected OverlayPreferenceStore fOverlayStore;
protected Map<Button, String> fCheckBoxes = new HashMap<Button, String>();
protected SelectionListener fCheckBoxListener = new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection());
}
};
protected Button addCheckBox(Composite parent, String label, String key, int indentation) {
Button checkBox = new Button(parent, SWT.CHECK);
checkBox.setText(label);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = indentation;
gd.horizontalSpan = 2;
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(fCheckBoxListener);
fCheckBoxes.put(checkBox, key);
return checkBox;
}
protected java.util.List<SelectionListener> fMasterSlaveListeners = new ArrayList<SelectionListener>();
protected void createDependency(final Button master, String masterKey, final Control slave) {
indent(slave);
boolean masterState = fOverlayStore.getBoolean(masterKey);
slave.setEnabled(masterState);
SelectionListener listener = new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
slave.setEnabled(master.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
}
};
master.addSelectionListener(listener);
fMasterSlaveListeners.add(listener);
}
protected static void indent(Control control) {
GridData gridData = new GridData();
gridData.horizontalIndent = 20;
control.setLayoutData(gridData);
}
protected OverlayPreferenceStore createOverlayStore() {
java.util.List<OverlayPreferenceStore.OverlayKey> overlayKeys = new ArrayList<OverlayPreferenceStore.OverlayKey>();
//checkbox
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_CODE_FOLDING));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_CLASSDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_COMMENTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_FOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_FUNCTIONDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_IF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_IMPORTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_STRINGS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_TRY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_WHILE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_WITH));
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
}