1
/*******************************************************************************
2
* Copyright (c) 2007, 2009 Wind River Systems, Inc. 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
* Markus Schorn - initial API and implementation
11
*******************************************************************************/
12
package org.eclipse.cdt.ui.dialogs;
14
import org.eclipse.core.runtime.CoreException;
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.core.runtime.preferences.InstanceScope;
17
import org.eclipse.jface.preference.FieldEditor;
18
import org.eclipse.jface.preference.IntegerFieldEditor;
19
import org.eclipse.jface.util.IPropertyChangeListener;
20
import org.eclipse.jface.util.PropertyChangeEvent;
21
import org.eclipse.swt.layout.GridData;
22
import org.eclipse.swt.layout.GridLayout;
23
import org.eclipse.swt.widgets.Composite;
24
import org.eclipse.swt.widgets.Group;
25
import org.eclipse.swt.widgets.Label;
26
import org.eclipse.ui.preferences.ScopedPreferenceStore;
28
import org.eclipse.cdt.core.CCorePlugin;
29
import org.eclipse.cdt.core.CCorePreferenceConstants;
30
import org.eclipse.cdt.core.dom.CDOM;
31
import org.eclipse.cdt.core.parser.CodeReaderCache;
32
import org.eclipse.cdt.core.parser.ICodeReaderCache;
33
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
36
* This OptionPage is used in the IndexerPreference page to allow for adjusting
37
* various parsing related caches.
39
* @noextend This class is not intended to be subclassed by clients.
41
public class CacheSizeBlock extends AbstractCOptionPage {
42
private IntegerFieldEditor fDBLimitPct;
43
private IntegerFieldEditor fDBAbsoluteLimit;
44
private IntegerFieldEditor fCodeReaderLimit;
46
private IPropertyChangeListener validityChangeListener = new IPropertyChangeListener() {
47
public void propertyChange(PropertyChangeEvent event) {
48
if (event.getProperty().equals(FieldEditor.IS_VALID)) {
54
public CacheSizeBlock(ICOptionContainer container){
55
setContainer(container);
59
public void createControl(Composite parent) {
62
Composite composite = ControlFactory.createComposite(parent, 1);
63
gl= (GridLayout)composite.getLayout();
64
int hindent= gl.marginWidth + gl.marginLeft;
65
int vindent= gl.marginHeight + gl.marginTop;
68
gd= (GridData) composite.getLayoutData();
69
gd.grabExcessHorizontalSpace= false;
70
gd.horizontalAlignment= GridData.FILL;
72
setControl(composite);
74
Group group= ControlFactory.createGroup(composite, DialogsMessages.CacheSizeBlock_cacheLimitGroup, 1);
75
gd= (GridData) group.getLayoutData();
76
gd.grabExcessHorizontalSpace= true;
77
gd.horizontalAlignment= GridData.FILL;
79
Composite cacheComp= ControlFactory.createComposite(group, 3);
81
Label dbCacheLabel= ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_indexDatabaseCache);
82
fDBLimitPct= new IntegerFieldEditor(CCorePreferenceConstants.INDEX_DB_CACHE_SIZE_PCT, DialogsMessages.CacheSizeBlock_limitRelativeToMaxHeapSize, cacheComp, 3);
83
fDBLimitPct.setValidRange(1, 75);
84
ControlFactory.createLabel(cacheComp, "%"); //$NON-NLS-1$
86
fDBAbsoluteLimit= new IntegerFieldEditor(CCorePreferenceConstants.MAX_INDEX_DB_CACHE_SIZE_MB, DialogsMessages.CacheSizeBlock_absoluteLimit, cacheComp, 4);
87
fDBAbsoluteLimit.setValidRange(1, 10000);
88
ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_MB);
90
Label codeReaderLabel= ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_headerFileCache);
91
fCodeReaderLimit= new IntegerFieldEditor(CodeReaderCache.CODE_READER_BUFFER, DialogsMessages.CacheSizeBlock_absoluteLimit, cacheComp, 4);
92
fCodeReaderLimit.setValidRange(1, 10000);
93
ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_MB);
95
gl= (GridLayout) cacheComp.getLayout();
97
gl.makeColumnsEqualWidth= false;
99
gl.verticalSpacing= 2;
101
gd= (GridData) dbCacheLabel.getLayoutData();
102
gd.horizontalSpan= 3;
104
gd= (GridData) codeReaderLabel.getLayoutData();
105
gd.verticalIndent= vindent;
106
gd.horizontalSpan= 3;
109
gd.grabExcessHorizontalSpace= true;
110
gd.horizontalAlignment= GridData.FILL;
111
gd.horizontalIndent= hindent;
112
fDBLimitPct.getLabelControl(cacheComp).setLayoutData(gd);
115
gd.grabExcessHorizontalSpace= true;
116
gd.horizontalAlignment= GridData.FILL;
117
gd.horizontalIndent= hindent;
118
fDBAbsoluteLimit.getLabelControl(cacheComp).setLayoutData(gd);
121
gd.grabExcessHorizontalSpace= true;
122
gd.horizontalAlignment= GridData.FILL;
123
gd.horizontalIndent= hindent;
124
fCodeReaderLimit.getLabelControl(cacheComp).setLayoutData(gd);
129
private void initializeValues() {
130
ScopedPreferenceStore prefStore= new ScopedPreferenceStore(new InstanceScope(), CCorePlugin.PLUGIN_ID);
132
fDBLimitPct.setPreferenceStore(prefStore);
133
fDBLimitPct.setPropertyChangeListener(validityChangeListener);
134
fDBAbsoluteLimit.setPreferenceStore(prefStore);
135
fDBAbsoluteLimit.setPropertyChangeListener(validityChangeListener);
136
fCodeReaderLimit.setPreferenceStore(prefStore);
137
fCodeReaderLimit.setPropertyChangeListener(validityChangeListener);
140
fDBAbsoluteLimit.load();
141
fCodeReaderLimit.load();
145
public void performApply(IProgressMonitor monitor) throws CoreException {
147
fDBAbsoluteLimit.store();
148
fCodeReaderLimit.store();
150
// code reader cache does not listen for pref-changes, help out:
151
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();
152
if (cache instanceof CodeReaderCache) {
153
((CodeReaderCache)cache).setCacheSize(fCodeReaderLimit.getIntValue());
158
public void performDefaults() {
159
fDBLimitPct.loadDefault();
160
fDBAbsoluteLimit.loadDefault();
161
fCodeReaderLimit.loadDefault();
164
private void updateValidState() {
165
if (!fDBLimitPct.isValid()) {
166
setErrorMessage(fDBLimitPct.getErrorMessage());
169
else if (!fDBAbsoluteLimit.isValid()) {
170
setErrorMessage(fDBAbsoluteLimit.getErrorMessage());
173
else if (!fCodeReaderLimit.isValid()) {
174
setErrorMessage(fCodeReaderLimit.getErrorMessage());
180
getContainer().updateContainer();