/*******************************************************************************
* Copyright (c) 2007, 2011 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* IBM Corporation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.dialogs;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.core.dom.CDOM;
import org.eclipse.cdt.core.parser.CodeReaderCache;
import org.eclipse.cdt.core.parser.ICodeReaderCache;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
/**
* This OptionPage is used in the IndexerPreference page to allow for adjusting
* various parsing related caches.
*
* @noextend This class is not intended to be subclassed by clients.
*/
public class CacheSizeBlock extends AbstractCOptionPage {
private IntegerFieldEditor fDBLimitPct;
private IntegerFieldEditor fDBAbsoluteLimit;
private IntegerFieldEditor fCodeReaderLimit;
private IPropertyChangeListener validityChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID)) {
updateValidState();
}
}
};
public CacheSizeBlock(ICOptionContainer container){
setContainer(container);
}
@Override
public void createControl(Composite parent) {
PixelConverter pixelConverter = new PixelConverter(parent);
GridData gd;
GridLayout gl;
Composite composite = ControlFactory.createComposite(parent, 1);
gl= (GridLayout)composite.getLayout();
gl.marginWidth= 0;
gd= (GridData) composite.getLayoutData();
gd.grabExcessHorizontalSpace= false;
gd.horizontalAlignment= GridData.FILL;
setControl(composite);
Group group= ControlFactory.createGroup(composite, DialogsMessages.CacheSizeBlock_cacheLimitGroup, 1);
gd= (GridData) group.getLayoutData();
gd.grabExcessHorizontalSpace= true;
gd.horizontalAlignment= GridData.FILL;
Composite cacheComp= ControlFactory.createComposite(group, 3);
Label dbCacheLabel= ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_indexDatabaseCache);
fDBLimitPct= new IntegerFieldEditor(CCorePreferenceConstants.INDEX_DB_CACHE_SIZE_PCT, DialogsMessages.CacheSizeBlock_limitRelativeToMaxHeapSize, cacheComp, 3);
fDBLimitPct.setValidRange(1, 75);
Text control = fDBLimitPct.getTextControl(cacheComp);
LayoutUtil.setWidthHint(control, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalGrabbing(control, false);
ControlFactory.createLabel(cacheComp, "%"); //$NON-NLS-1$
fDBAbsoluteLimit= new IntegerFieldEditor(CCorePreferenceConstants.MAX_INDEX_DB_CACHE_SIZE_MB, DialogsMessages.CacheSizeBlock_absoluteLimit, cacheComp, 4);
fDBAbsoluteLimit.setValidRange(1, 10000);
control = fDBAbsoluteLimit.getTextControl(cacheComp);
LayoutUtil.setWidthHint(control, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalGrabbing(control, false);
ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_MB);
Label codeReaderLabel= ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_headerFileCache);
fCodeReaderLimit= new IntegerFieldEditor(CodeReaderCache.CODE_READER_BUFFER, DialogsMessages.CacheSizeBlock_absoluteLimit, cacheComp, 4);
fCodeReaderLimit.setValidRange(1, 10000);
control = fCodeReaderLimit.getTextControl(cacheComp);
LayoutUtil.setWidthHint(control, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalGrabbing(control, false);
ControlFactory.createLabel(cacheComp, DialogsMessages.CacheSizeBlock_MB);
gl= (GridLayout) cacheComp.getLayout();
gl.numColumns= 3;
gl.makeColumnsEqualWidth= false;
gl.marginLeft= 0;
gl.verticalSpacing= 2;
gd= (GridData) dbCacheLabel.getLayoutData();
gd.horizontalSpan= 3;
int vindent= pixelConverter.convertHeightInCharsToPixels(1) / 2;
gd= (GridData) codeReaderLabel.getLayoutData();
gd.verticalIndent= vindent;
gd.horizontalSpan= 3;
int hindent= pixelConverter.convertWidthInCharsToPixels(2);
gd= new GridData();
gd.horizontalAlignment= GridData.FILL;
gd.horizontalIndent= hindent;
fDBLimitPct.getLabelControl(cacheComp).setLayoutData(gd);
gd= new GridData();
gd.horizontalAlignment= GridData.FILL;
gd.horizontalIndent= hindent;
fDBAbsoluteLimit.getLabelControl(cacheComp).setLayoutData(gd);
gd= new GridData();
gd.horizontalAlignment= GridData.FILL;
gd.horizontalIndent= hindent;
fCodeReaderLimit.getLabelControl(cacheComp).setLayoutData(gd);
initializeValues();
}
private void initializeValues() {
ScopedPreferenceStore prefStore= new ScopedPreferenceStore(InstanceScope.INSTANCE, CCorePlugin.PLUGIN_ID);
fDBLimitPct.setPreferenceStore(prefStore);
fDBLimitPct.setPropertyChangeListener(validityChangeListener);
fDBAbsoluteLimit.setPreferenceStore(prefStore);
fDBAbsoluteLimit.setPropertyChangeListener(validityChangeListener);
fCodeReaderLimit.setPreferenceStore(prefStore);
fCodeReaderLimit.setPropertyChangeListener(validityChangeListener);
fDBLimitPct.load();
fDBAbsoluteLimit.load();
fCodeReaderLimit.load();
}
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
fDBLimitPct.store();
fDBAbsoluteLimit.store();
fCodeReaderLimit.store();
// code reader cache does not listen for pref-changes, help out:
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();
if (cache instanceof CodeReaderCache) {
((CodeReaderCache) cache).setCacheSize(fCodeReaderLimit.getIntValue());
}
}
@Override
public void performDefaults() {
fDBLimitPct.loadDefault();
fDBAbsoluteLimit.loadDefault();
fCodeReaderLimit.loadDefault();
}
private void updateValidState() {
if (!fDBLimitPct.isValid()) {
setErrorMessage(fDBLimitPct.getErrorMessage());
setValid(false);
} else if (!fDBAbsoluteLimit.isValid()) {
setErrorMessage(fDBAbsoluteLimit.getErrorMessage());
setValid(false);
} else if (!fCodeReaderLimit.isValid()) {
setErrorMessage(fCodeReaderLimit.getErrorMessage());
setValid(false);
} else {
setValid(true);
}
getContainer().updateContainer();
}
}