/**
* Copyright (c) 2005-2013 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 static final String INITIALLY_FOLD_COMMENTS = "INITIALLY_COLLAPSE_COMMENTS";
public static final boolean DEFAULT_INITIALLY_FOLD_COMMENTS = false;
public static final String INITIALLY_FOLD_IF = "INITIALLY_FOLD_IF";
public static final boolean DEFAULT_INITIALLY_FOLD_IF = false;
public static final String INITIALLY_FOLD_WHILE = "INITIALLY_FOLD_WHILE";
public static final boolean DEFAULT_INITIALLY_FOLD_WHILE = false;
public static final String INITIALLY_FOLD_CLASSDEF = "INITIALLY_FOLD_CLASSDEF";
public static final boolean DEFAULT_INITIALLY_FOLD_CLASSDEF = false;
public static final String INITIALLY_FOLD_FUNCTIONDEF = "INITIALLY_FOLD_FUNCTIONDEF";
public static final boolean DEFAULT_INITIALLY_FOLD_FUNCTIONDEF = false;
public static final String INITIALLY_FOLD_STRINGS = "INITIALLY_FOLD_STRINGS";
public static final boolean DEFAULT_INITIALLY_FOLD_STRINGS = false;
public static final String INITIALLY_FOLD_WITH = "INITIALLY_FOLD_WITH";
public static final boolean DEFAULT_INITIALLY_FOLD_WITH = false;
public static final String INITIALLY_FOLD_TRY = "INITIALLY_FOLD_TRY";
public static final boolean DEFAULT_INITIALLY_FOLD_TRY = false;
public static final String INITIALLY_FOLD_IMPORTS = "INITIALLY_FOLD_IMPORTS";
public static final boolean DEFAULT_INITIALLY_FOLD_IMPORTS = false;
public static final String INITIALLY_FOLD_FOR = "INITIALLY_FOLD_FOR";
public static final boolean DEFAULT_INITIALLY_FOLD_FOR = false;
/**
*
*/
public PyDevCodeFoldingPrefPage() {
//super();
setPreferenceStore(PydevPlugin.getDefault().getPreferenceStore());
setDescription("PyDev Code Folding Options");
fOverlayStore = createOverlayStore();
}
/**
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
@Override
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");
/*[[[cog
import cog
template = '''Button slave%(titled)s = addCheckBox(top, "Fold %(caption)ss?", %(constant)s, 0);
Button slaveInitialCollapse%(titled)s = addCheckBox(top, "Initially Fold %(caption)ss?", INITIALLY_%(constant)s, 0);
createDependency(new Button[] { master, slave%(titled)s }, slaveInitialCollapse%(titled)s, USE_CODE_FOLDING, %(constant)s);
'''
import folding_entries
for constant, caption in zip(folding_entries.FOLDING_ENTRIES, folding_entries.FOLDING_CAPTIONS):
titled = constant.title().replace('_', '');
cog.outl(template % dict(titled=titled, constant=constant, caption=caption))
]]]*/
Button slaveFoldImports = addCheckBox(top, "Fold Imports?", FOLD_IMPORTS, 0);
Button slaveInitialCollapseFoldImports = addCheckBox(top, "Initially Fold Imports?", INITIALLY_FOLD_IMPORTS, 0);
createDependency(new Button[] { master, slaveFoldImports }, slaveInitialCollapseFoldImports, USE_CODE_FOLDING, FOLD_IMPORTS);
Button slaveFoldClassdef = addCheckBox(top, "Fold Class Definitions?", FOLD_CLASSDEF, 0);
Button slaveInitialCollapseFoldClassdef = addCheckBox(top, "Initially Fold Class Definitions?", INITIALLY_FOLD_CLASSDEF, 0);
createDependency(new Button[] { master, slaveFoldClassdef }, slaveInitialCollapseFoldClassdef, USE_CODE_FOLDING, FOLD_CLASSDEF);
Button slaveFoldFunctiondef = addCheckBox(top, "Fold Function Definitions?", FOLD_FUNCTIONDEF, 0);
Button slaveInitialCollapseFoldFunctiondef = addCheckBox(top, "Initially Fold Function Definitions?", INITIALLY_FOLD_FUNCTIONDEF, 0);
createDependency(new Button[] { master, slaveFoldFunctiondef }, slaveInitialCollapseFoldFunctiondef, USE_CODE_FOLDING, FOLD_FUNCTIONDEF);
Button slaveFoldComments = addCheckBox(top, "Fold Comments?", FOLD_COMMENTS, 0);
Button slaveInitialCollapseFoldComments = addCheckBox(top, "Initially Fold Comments?", INITIALLY_FOLD_COMMENTS, 0);
createDependency(new Button[] { master, slaveFoldComments }, slaveInitialCollapseFoldComments, USE_CODE_FOLDING, FOLD_COMMENTS);
Button slaveFoldStrings = addCheckBox(top, "Fold Strings?", FOLD_STRINGS, 0);
Button slaveInitialCollapseFoldStrings = addCheckBox(top, "Initially Fold Strings?", INITIALLY_FOLD_STRINGS, 0);
createDependency(new Button[] { master, slaveFoldStrings }, slaveInitialCollapseFoldStrings, USE_CODE_FOLDING, FOLD_STRINGS);
Button slaveFoldIf = addCheckBox(top, "Fold If statements?", FOLD_IF, 0);
Button slaveInitialCollapseFoldIf = addCheckBox(top, "Initially Fold If statements?", INITIALLY_FOLD_IF, 0);
createDependency(new Button[] { master, slaveFoldIf }, slaveInitialCollapseFoldIf, USE_CODE_FOLDING, FOLD_IF);
Button slaveFoldWhile = addCheckBox(top, "Fold While statements?", FOLD_WHILE, 0);
Button slaveInitialCollapseFoldWhile = addCheckBox(top, "Initially Fold While statements?", INITIALLY_FOLD_WHILE, 0);
createDependency(new Button[] { master, slaveFoldWhile }, slaveInitialCollapseFoldWhile, USE_CODE_FOLDING, FOLD_WHILE);
Button slaveFoldWith = addCheckBox(top, "Fold With statements?", FOLD_WITH, 0);
Button slaveInitialCollapseFoldWith = addCheckBox(top, "Initially Fold With statements?", INITIALLY_FOLD_WITH, 0);
createDependency(new Button[] { master, slaveFoldWith }, slaveInitialCollapseFoldWith, USE_CODE_FOLDING, FOLD_WITH);
Button slaveFoldTry = addCheckBox(top, "Fold Try statements?", FOLD_TRY, 0);
Button slaveInitialCollapseFoldTry = addCheckBox(top, "Initially Fold Try statements?", INITIALLY_FOLD_TRY, 0);
createDependency(new Button[] { master, slaveFoldTry }, slaveInitialCollapseFoldTry, USE_CODE_FOLDING, FOLD_TRY);
Button slaveFoldFor = addCheckBox(top, "Fold For statements?", FOLD_FOR, 0);
Button slaveInitialCollapseFoldFor = addCheckBox(top, "Initially Fold For statements?", INITIALLY_FOLD_FOR, 0);
createDependency(new Button[] { master, slaveFoldFor }, slaveInitialCollapseFoldFor, USE_CODE_FOLDING, FOLD_FOR);
//[[[end]]]
return top;
}
/*
* @see PreferencePage#performOk()
*/
@Override
public boolean performOk() {
fOverlayStore.propagate();
PydevPlugin.getDefault().savePluginPreferences();
return true;
}
/*
* @see PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
fOverlayStore.loadDefaults();
initializeFields();
super.performDefaults();
}
protected void initializeFields() {
Iterator<Button> e = fCheckBoxes.keySet().iterator();
while (e.hasNext()) {
Button b = e.next();
String key = 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<SelectionListener> iter = fMasterSlaveListeners.iterator();
while (iter.hasNext()) {
SelectionListener listener = iter.next();
listener.widgetSelected(null);
}
}
protected OverlayPreferenceStore fOverlayStore;
protected Map<Button, String> fCheckBoxes = new HashMap<Button, String>();
protected SelectionListener fCheckBoxListener = new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
@Override
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
fOverlayStore.setValue(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[] masterControls, final Control slave, String... masterKeys) {
indent(slave, 20 * masterKeys.length);
boolean masterState = true;
for (String string : masterKeys) {
masterState &= fOverlayStore.getBoolean(string);
}
slave.setEnabled(masterState);
SelectionListener listener = new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean enabled = true;
for (Button master : masterControls) {
enabled &= master.getSelection();
}
slave.setEnabled(enabled);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
};
for (Button master : masterControls) {
master.addSelectionListener(listener);
}
fMasterSlaveListeners.add(listener);
}
protected static void indent(Control control, int horizontalIndent) {
GridData gridData = new GridData();
gridData.horizontalIndent = horizontalIndent;
control.setLayoutData(gridData);
}
protected OverlayPreferenceStore createOverlayStore() {
java.util.List<OverlayPreferenceStore.OverlayKey> overlayKeys = new ArrayList<OverlayPreferenceStore.OverlayKey>();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_CODE_FOLDING));
//checkbox
/*[[[cog
import cog
template = '''overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, %s));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_%s));
'''
import folding_entries
for s in folding_entries.FOLDING_ENTRIES:
cog.outl(template % (s, s))
]]]*/
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_IMPORTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_IMPORTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_CLASSDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_CLASSDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_FUNCTIONDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_FUNCTIONDEF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_COMMENTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_COMMENTS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_STRINGS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_STRINGS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_IF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_IF));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_WHILE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_WHILE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_WITH));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_WITH));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_TRY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_TRY));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, FOLD_FOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_FOLD_FOR));
//[[[end]]]
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
}