upload tizen1.0 source
[sdk/ide/product.git] / org.eclipse.cdt.ui / src / org / eclipse / cdt / internal / ui / preferences / FoldingConfigurationBlock.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2010 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
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11
12 package org.eclipse.cdt.internal.ui.preferences;
13
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.Iterator;
17 import java.util.Map;
18
19 import org.eclipse.core.runtime.Assert;
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IStatus;
22 import org.eclipse.core.runtime.Status;
23 import org.eclipse.jface.layout.PixelConverter;
24 import org.eclipse.jface.viewers.ComboViewer;
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
26 import org.eclipse.jface.viewers.IStructuredContentProvider;
27 import org.eclipse.jface.viewers.IStructuredSelection;
28 import org.eclipse.jface.viewers.LabelProvider;
29 import org.eclipse.jface.viewers.SelectionChangedEvent;
30 import org.eclipse.jface.viewers.StructuredSelection;
31 import org.eclipse.jface.viewers.Viewer;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.custom.StackLayout;
34 import org.eclipse.swt.events.SelectionEvent;
35 import org.eclipse.swt.events.SelectionListener;
36 import org.eclipse.swt.graphics.Image;
37 import org.eclipse.swt.layout.FillLayout;
38 import org.eclipse.swt.layout.GridData;
39 import org.eclipse.swt.layout.GridLayout;
40 import org.eclipse.swt.widgets.Button;
41 import org.eclipse.swt.widgets.Combo;
42 import org.eclipse.swt.widgets.Composite;
43 import org.eclipse.swt.widgets.Control;
44 import org.eclipse.swt.widgets.Label;
45
46 import org.eclipse.cdt.ui.CUIPlugin;
47 import org.eclipse.cdt.ui.PreferenceConstants;
48 import org.eclipse.cdt.ui.text.folding.ICFoldingPreferenceBlock;
49
50 import org.eclipse.cdt.internal.ui.preferences.OverlayPreferenceStore.OverlayKey;
51 import org.eclipse.cdt.internal.ui.text.folding.CFoldingStructureProviderDescriptor;
52 import org.eclipse.cdt.internal.ui.text.folding.CFoldingStructureProviderRegistry;
53
54 /**
55  * Configures C Editor folding preferences.
56  * 
57  * @since 3.0
58  */
59 class FoldingConfigurationBlock implements IPreferenceConfigurationBlock {
60         
61         private static class ErrorPreferences implements ICFoldingPreferenceBlock {
62                 private String fMessage;
63                 
64                 protected ErrorPreferences(String message) {
65                         fMessage= message;
66                 }
67                 
68                 /*
69                  * @see org.eclipse.cdt.internal.ui.text.folding.ICFoldingPreferences#createControl(org.eclipse.swt.widgets.Group)
70                  */
71                 public Control createControl(Composite composite) {
72                         Composite inner= new Composite(composite, SWT.NONE);
73                         inner.setLayout(new FillLayout(SWT.VERTICAL));
74
75                         Label label= new Label(inner, SWT.CENTER);
76                         label.setText(fMessage);
77                         
78                         return inner;
79                 }
80
81                 public void initialize() {
82                 }
83
84                 public void performOk() {
85                 }
86
87                 public void performDefaults() {
88                 }
89
90                 public void dispose() {
91                 }
92                 
93         }
94
95         /** The overlay preference store. */
96         protected final OverlayPreferenceStore fStore;
97         
98         /* The controls */
99         private Combo fProviderCombo;
100         protected Button fFoldingCheckbox;
101         private ComboViewer fProviderViewer;
102         protected Map<String, CFoldingStructureProviderDescriptor> fProviderDescriptors;
103         private Composite fGroup;
104         private Map<String, ICFoldingPreferenceBlock> fProviderPreferences;
105         private Map<String, Control> fProviderControls;
106         private StackLayout fStackLayout;
107         
108
109         public FoldingConfigurationBlock(OverlayPreferenceStore store) {
110                 Assert.isNotNull(store);
111                 fStore= store;
112                 fStore.addKeys(createOverlayStoreKeys());
113                 fProviderDescriptors= createListModel();
114                 fProviderPreferences= new HashMap<String, ICFoldingPreferenceBlock>();
115                 fProviderControls= new HashMap<String, Control>();
116         }
117
118         private Map<String, CFoldingStructureProviderDescriptor> createListModel() {
119                 CFoldingStructureProviderRegistry reg= CUIPlugin.getDefault().getFoldingStructureProviderRegistry();
120                 reg.reloadExtensions();
121                 CFoldingStructureProviderDescriptor[] descs= reg.getFoldingProviderDescriptors();
122                 Map<String, CFoldingStructureProviderDescriptor> map= new HashMap<String, CFoldingStructureProviderDescriptor>();
123                 for (int i= 0; i < descs.length; i++) {
124                         map.put(descs[i].getId(), descs[i]);
125                 }
126                 return map;
127         }
128
129         private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
130                 
131                 ArrayList<OverlayKey> overlayKeys= new ArrayList<OverlayKey>();
132
133                 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_ENABLED));
134                 overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_FOLDING_PROVIDER));
135                 
136                 OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
137                 overlayKeys.toArray(keys);
138                 return keys;
139         }
140
141         /*
142          * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#createControl(org.eclipse.swt.widgets.Composite)
143          */
144         public Control createControl(Composite parent) {
145
146                 Composite composite= new Composite(parent, SWT.NULL);
147                 // assume parent page uses griddata
148                 GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL);
149                 composite.setLayoutData(gd);
150                 GridLayout layout= new GridLayout();
151                 layout.numColumns= 2;
152                 PixelConverter pc= new PixelConverter(composite);
153                 layout.verticalSpacing= pc.convertHeightInCharsToPixels(1) / 2;
154                 composite.setLayout(layout);
155                 
156                 
157                 /* check box for new editors */
158                 fFoldingCheckbox= new Button(composite, SWT.CHECK);
159                 fFoldingCheckbox.setText(PreferencesMessages.FoldingConfigurationBlock_enable); 
160                 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
161                 fFoldingCheckbox.setLayoutData(gd);
162                 fFoldingCheckbox.addSelectionListener(new SelectionListener() {
163                         public void widgetSelected(SelectionEvent e) {
164                                 boolean enabled= fFoldingCheckbox.getSelection(); 
165                                 fStore.setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, enabled);
166                                 updateCheckboxDependencies();
167                         }
168
169                         public void widgetDefaultSelected(SelectionEvent e) {
170                         }
171                 });
172                 
173                 Label label= new Label(composite, SWT.CENTER);
174                 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
175                 label.setLayoutData(gd);
176
177                 /* list */
178                 Composite comboComp= new Composite(composite, SWT.NONE);
179                 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
180                 GridLayout gridLayout= new GridLayout(2, false);
181                 gridLayout.marginWidth= 0;
182                 comboComp.setLayout(gridLayout);
183                 
184                 Label comboLabel= new Label(comboComp, SWT.CENTER);
185                 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER);
186                 comboLabel.setLayoutData(gd);
187                 comboLabel.setText(PreferencesMessages.FoldingConfigurationBlock_combo_caption); 
188                 
189                 label= new Label(composite, SWT.CENTER);
190                 gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
191                 label.setLayoutData(gd);
192
193                 fProviderCombo= new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN);
194                 gd= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER);
195                 fProviderCombo.setLayoutData(gd);
196
197                 /* list viewer */
198                 fProviderViewer= new ComboViewer(fProviderCombo);
199                 fProviderViewer.setContentProvider(new IStructuredContentProvider() {
200
201                         /*
202                          * @see org.eclipse.jface.viewers.IContentProvider#dispose()
203                          */
204                         public void dispose() {
205                         }
206
207                         /*
208                          * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
209                          */
210                         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
211                         }
212
213                         /*
214                          * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
215                          */
216                         public Object[] getElements(Object inputElement) {
217                                 return fProviderDescriptors.values().toArray();
218                         }
219                 });
220                 fProviderViewer.setLabelProvider(new LabelProvider() {
221                         /*
222                          * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
223                          */
224                         @Override
225                         public Image getImage(Object element) {
226                                 return null;
227                         }
228                         
229                         /*
230                          * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
231                          */
232                         @Override
233                         public String getText(Object element) {
234                                 return ((CFoldingStructureProviderDescriptor) element).getName();
235                         }
236                 });
237                 fProviderViewer.addSelectionChangedListener(new ISelectionChangedListener() {
238
239                         public void selectionChanged(SelectionChangedEvent event) {
240                                 IStructuredSelection sel= (IStructuredSelection) event.getSelection();
241                                 if (!sel.isEmpty()) {
242                                         fStore.setValue(PreferenceConstants.EDITOR_FOLDING_PROVIDER, ((CFoldingStructureProviderDescriptor) sel.getFirstElement()).getId());
243                                         updateListDependencies();
244                                 }
245                         }
246                 });
247                 fProviderViewer.setInput(fProviderDescriptors);
248                 fProviderViewer.refresh();
249                 
250                 Composite groupComp= new Composite(composite, SWT.NONE);
251                 gd= new GridData(GridData.FILL_BOTH);
252                 gd.horizontalSpan= 2;
253                 groupComp.setLayoutData(gd);
254                 gridLayout= new GridLayout(1, false);
255                 gridLayout.marginWidth= 0;
256                 groupComp.setLayout(gridLayout);
257                 
258                 /* contributed provider preferences. */
259                 fGroup= new Composite(groupComp, SWT.NONE);
260                 gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
261                 fGroup.setLayoutData(gd);
262                 fStackLayout= new StackLayout();
263                 fGroup.setLayout(fStackLayout);
264                 
265                 return composite;
266         }
267
268         protected void updateCheckboxDependencies() {
269         }
270
271         void updateListDependencies() {
272                 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
273                 CFoldingStructureProviderDescriptor desc= fProviderDescriptors.get(id);
274                 ICFoldingPreferenceBlock prefs;
275                 
276                 if (desc == null) {
277                         // safety in case there is no such descriptor
278                         String message= PreferencesMessages.FoldingConfigurationBlock_error_not_exist; 
279                         CUIPlugin.log(new Status(IStatus.WARNING, CUIPlugin.getPluginId(), IStatus.OK, message, null));
280                         prefs= new ErrorPreferences(message);
281                 } else {
282                         prefs= fProviderPreferences.get(id);
283                         if (prefs == null) {
284                                 try {
285                                         prefs= desc.createPreferences();
286                                         fProviderPreferences.put(id, prefs);
287                                 } catch (CoreException e) {
288                                         CUIPlugin.log(e);
289                                         prefs= new ErrorPreferences(e.getLocalizedMessage());
290                                 }
291                         }
292                 }
293                 
294                 Control control= fProviderControls.get(id);
295                 if (control == null) {
296                         control= prefs.createControl(fGroup);
297                         if (control == null) {
298                                 String message= PreferencesMessages.FoldingConfigurationBlock_info_no_preferences; 
299                                 control= new ErrorPreferences(message).createControl(fGroup);
300                         } else {
301                                 fProviderControls.put(id, control);
302                         }
303                 }
304                 fStackLayout.topControl= control;
305                 control.pack();
306                 fGroup.layout();
307                 fGroup.getParent().layout();
308                 
309                 prefs.initialize();
310         }
311
312         /*
313          * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#initialize()
314          */
315         public void initialize() {
316                 restoreFromPreferences();
317         }
318
319         /*
320          * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#performOk()
321          */
322         public void performOk() {
323                 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
324                         ICFoldingPreferenceBlock prefs= it.next();
325                         prefs.performOk();
326                 }
327         }
328         
329         /*
330          * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#performDefaults()
331          */
332         public void performDefaults() {
333                 restoreFromPreferences();
334                 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
335                         ICFoldingPreferenceBlock prefs= it.next();
336                         prefs.performDefaults();
337                 }
338         }
339         
340         /*
341          * @see org.eclipse.cdt.internal.ui.preferences.IPreferenceConfigurationBlock#dispose()
342          */
343         public void dispose() {
344                 for (Iterator<ICFoldingPreferenceBlock> it= fProviderPreferences.values().iterator(); it.hasNext();) {
345                         ICFoldingPreferenceBlock prefs= it.next();
346                         prefs.dispose();
347                 }
348         }
349
350         private void restoreFromPreferences() {
351                 boolean enabled= fStore.getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED);
352                 fFoldingCheckbox.setSelection(enabled);
353                 updateCheckboxDependencies();
354                 
355                 String id= fStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER);
356                 Object provider= fProviderDescriptors.get(id);
357                 if (provider != null) {
358                         fProviderViewer.setSelection(new StructuredSelection(provider), true);
359                         updateListDependencies();
360                 }
361         }
362 }
363