1 /*******************************************************************************
2 * Copyright (c) 2000, 2008 QNX Software Systems and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 * Anton Leherbauer (Wind River Systems)
11 * Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
12 *******************************************************************************/
14 package org.eclipse.cdt.internal.ui.text.folding;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.Iterator;
21 import org.eclipse.jface.preference.IPreferenceStore;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.events.SelectionListener;
25 import org.eclipse.swt.layout.GridData;
26 import org.eclipse.swt.layout.GridLayout;
27 import org.eclipse.swt.widgets.Button;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Control;
31 import org.eclipse.cdt.ui.CUIPlugin;
32 import org.eclipse.cdt.ui.PreferenceConstants;
33 import org.eclipse.cdt.ui.text.folding.ICFoldingPreferenceBlock;
34 import org.eclipse.cdt.utils.ui.controls.ControlFactory;
36 import org.eclipse.cdt.internal.ui.preferences.OverlayPreferenceStore;
37 import org.eclipse.cdt.internal.ui.preferences.OverlayPreferenceStore.OverlayKey;
41 public class DefaultCFoldingPreferenceBlock implements ICFoldingPreferenceBlock {
43 private IPreferenceStore fStore;
44 protected OverlayPreferenceStore fOverlayStore;
45 private OverlayKey[] fKeys;
46 protected Map<Button, String> fCheckBoxes= new HashMap<Button, String>();
48 private SelectionListener fCheckBoxListener= new SelectionListener() {
49 public void widgetDefaultSelected(SelectionEvent e) {
51 public void widgetSelected(SelectionEvent e) {
52 Button button= (Button) e.widget;
53 String key= fCheckBoxes.get(button);
54 fOverlayStore.setValue(key, button.getSelection());
55 updateEnablement(key);
58 private Button fInactiveCodeFoldingCheckBox;
61 public DefaultCFoldingPreferenceBlock() {
62 fStore= CUIPlugin.getDefault().getPreferenceStore();
64 fOverlayStore= new OverlayPreferenceStore(fStore, fKeys);
67 private OverlayKey[] createKeys() {
68 ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>();
70 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_MACROS));
71 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_FUNCTIONS));
72 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_METHODS));
73 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_STRUCTURES));
74 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_COMMENTS));
75 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_HEADERS));
76 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE));
77 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED));
78 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_STATEMENTS));
80 return overlayKeys.toArray(new OverlayKey[overlayKeys.size()]);
84 * @see org.eclipse.cdt.internal.ui.text.folding.ICFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
86 public Control createControl(Composite composite) {
88 fOverlayStore.start();
90 Composite inner= new Composite(composite, SWT.NONE);
91 GridLayout layout= new GridLayout(1, true);
92 layout.verticalSpacing= 3;
93 layout.marginWidth= 0;
94 inner.setLayout(layout);
96 addCheckBox(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_preprocessor_enabled, PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED, 1);
97 addCheckBox(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_statements_enabled, PreferenceConstants.EDITOR_FOLDING_STATEMENTS, 1);
98 ControlFactory.createEmptySpace(inner);
100 Composite group= ControlFactory.createGroup(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_title, 1);
102 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_macros, PreferenceConstants.EDITOR_FOLDING_MACROS, 0);
103 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_functions, PreferenceConstants.EDITOR_FOLDING_FUNCTIONS, 0);
104 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_methods, PreferenceConstants.EDITOR_FOLDING_METHODS, 0);
105 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_structures, PreferenceConstants.EDITOR_FOLDING_STRUCTURES, 0);
106 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_comments, PreferenceConstants.EDITOR_FOLDING_COMMENTS, 0);
107 addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_headers, PreferenceConstants.EDITOR_FOLDING_HEADERS, 0);
108 fInactiveCodeFoldingCheckBox= addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_inactive_code, PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE, 0);
113 private Button addCheckBox(Composite parent, String label, String key, int indentation) {
114 Button checkBox= new Button(parent, SWT.CHECK);
115 checkBox.setText(label);
117 GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
118 gd.horizontalIndent= indentation;
119 gd.horizontalSpan= 1;
120 gd.grabExcessVerticalSpace= false;
121 checkBox.setLayoutData(gd);
122 checkBox.addSelectionListener(fCheckBoxListener);
124 fCheckBoxes.put(checkBox, key);
129 private void initializeFields() {
130 Iterator<Button> it= fCheckBoxes.keySet().iterator();
131 while (it.hasNext()) {
133 String key= fCheckBoxes.get(b);
134 b.setSelection(fOverlayStore.getBoolean(key));
135 updateEnablement(key);
139 protected void updateEnablement(String key) {
140 if (PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED.equals(key)) {
141 fInactiveCodeFoldingCheckBox.setEnabled(fOverlayStore.getBoolean(key));
146 * @see org.eclipse.cdt.internal.ui.text.folding.AbstractCFoldingPreferences#performOk()
148 public void performOk() {
149 fOverlayStore.propagate();
154 * @see org.eclipse.cdt.internal.ui.text.folding.AbstractCFoldingPreferences#initialize()
156 public void initialize() {
161 * @see org.eclipse.cdt.internal.ui.text.folding.AbstractCFoldingPreferences#performDefaults()
163 public void performDefaults() {
164 fOverlayStore.loadDefaults();
169 * @see org.eclipse.cdt.internal.ui.text.folding.AbstractCFoldingPreferences#dispose()
171 public void dispose() {
172 fOverlayStore.stop();