/*******************************************************************************
* Copyright (c) 2005, 2011 IBM Corporation 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:
* Bogdan Gheorghe (IBM) - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.dialogs;
import java.util.Properties;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
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.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.internal.core.model.CProject;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
/**
* Configuration for indexer.
*/
public abstract class AbstractIndexerPage extends AbstractCOptionPage {
protected static final String INDEX_ALL_FILES = DialogsMessages.AbstractIndexerPage_indexAllFiles;
protected static final String TRUE = String.valueOf(true);
private Button fAllSources;
private Button fAllHeadersDefault;
private Button fAllHeadersAlt;
private Button fIndexOnOpen;
private Button fIncludeHeuristics;
private IntegerFieldEditor fFileSizeLimit;
private Text fFilesToParseUpFront;
private Button fSkipReferences;
private Button fSkipImplicitReferences;
private Button fSkipMacroAndTypeReferences;
private IPropertyChangeListener validityChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID)) {
updateValidState();
}
}
};
/** @since 5.3 */
protected PixelConverter pixelConverter;
protected AbstractIndexerPage() {
super();
}
final public IProject getCurrentProject() {
ICOptionContainer container = getContainer();
if (container != null) {
return container.getProject();
}
return null;
}
@Override
public void createControl(Composite parent) {
pixelConverter = new PixelConverter(parent);
GridLayout gl;
Composite page = new Composite(parent, SWT.NULL);
page.setFont(parent.getFont());
page.setLayout(gl= new GridLayout(1, true));
gl.marginHeight = 0;
gl.marginWidth = 0;
page.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite group= new Composite(page, SWT.NONE);
fAllSources= createAllFilesButton(group);
IProject prj= getCurrentProject();
if (prj == null || !CProject.hasCCNature(prj)) {
fAllHeadersDefault= createAllHeadersButton(group);
} else {
fAllHeadersDefault= createAllCppHeadersButton(group);
fAllHeadersAlt= createAllCHeadersButton(group);
}
fIndexOnOpen= createIndexOnOpenButton(group);
fIncludeHeuristics= createIncludeHeuristicsButton(group);
fFileSizeLimit= createFileSizeLimit(group);
group.setLayout(gl= new GridLayout(3, false));
gl.marginHeight = 0;
gl.marginWidth= 0;
group.setLayoutData(new GridData());
group= new Composite(page, SWT.NONE);
group.setLayout(gl= new GridLayout(1, false));
gl.marginHeight = 0;
gl.marginWidth= 0;
group.setLayoutData(new GridData());
fSkipReferences= createSkipReferencesButton(group);
fSkipImplicitReferences= createSkipImplicitReferencesButton(group);
fSkipMacroAndTypeReferences= createSkipMacroAndTypeReferencesButton(group);
fFilesToParseUpFront= createParseUpFrontTextField(page);
final SelectionAdapter selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateEnablement();
}
};
fSkipReferences.addSelectionListener(selectionListener);
fAllSources.addSelectionListener(selectionListener);
setControl(page);
}
/**
* Use the properties to initialize the controls of the page. Fill in defaults
* for properties that are missing.
* @since 4.0
*/
public void setProperties(Properties properties) {
if (fAllSources != null) {
boolean indexAllFiles= TRUE.equals(properties.get(IndexerPreferences.KEY_INDEX_ALL_FILES));
fAllSources.setSelection(indexAllFiles);
}
if (fAllHeadersDefault != null) {
boolean indexAllFiles= TRUE.equals(properties.get(IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG));
fAllHeadersDefault.setSelection(indexAllFiles);
}
if (fAllHeadersAlt != null) {
boolean indexAllFiles= TRUE.equals(properties.get(IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_ALTERNATE_LANG));
fAllHeadersAlt.setSelection(indexAllFiles);
}
if (fIndexOnOpen != null) {
boolean indexOnOpen= TRUE.equals(properties.get(IndexerPreferences.KEY_INDEX_ON_OPEN));
fIndexOnOpen.setSelection(indexOnOpen);
}
if (fIncludeHeuristics != null) {
Object prop= properties.get(IndexerPreferences.KEY_INCLUDE_HEURISTICS);
boolean use= prop == null || TRUE.equals(prop);
fIncludeHeuristics.setSelection(use);
}
if (fFileSizeLimit != null) {
Object prop= properties.get(IndexerPreferences.KEY_SKIP_FILES_LARGER_THAN_MB);
int size= 0;
if (prop != null) {
try {
size= Integer.parseInt(prop.toString());
} catch (NumberFormatException e) {
}
}
if (size <= 0) {
size= IndexerPreferences.DEFAULT_FILE_SIZE_LIMIT;
}
fFileSizeLimit.setStringValue(String.valueOf(size));
}
if (fSkipReferences != null) {
boolean skipReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_ALL_REFERENCES));
fSkipReferences.setSelection(skipReferences);
}
if (fSkipImplicitReferences != null) {
boolean skipImplicitReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_IMPLICIT_REFERENCES));
fSkipImplicitReferences.setSelection(skipImplicitReferences);
}
if (fSkipMacroAndTypeReferences != null) {
boolean skipTypeReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES));
boolean skipMacroReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES));
fSkipMacroAndTypeReferences.setSelection(skipTypeReferences && skipMacroReferences);
}
if (fFilesToParseUpFront != null) {
String files = getNotNull(properties, IndexerPreferences.KEY_FILES_TO_PARSE_UP_FRONT);
fFilesToParseUpFront.setText(files);
}
updateEnablement();
}
/**
* Return the properties according to the selections on the page.
* @since 4.0
*/
public Properties getProperties(){
Properties props= new Properties();
if (fAllSources != null) {
props.put(IndexerPreferences.KEY_INDEX_ALL_FILES, String.valueOf(fAllSources.getSelection()));
}
if (fAllHeadersDefault != null) {
props.put(IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_DEFAULT_LANG, String.valueOf(fAllHeadersDefault.getSelection()));
}
if (fAllHeadersAlt != null) {
props.put(IndexerPreferences.KEY_INDEX_UNUSED_HEADERS_WITH_ALTERNATE_LANG, String.valueOf(fAllHeadersAlt.getSelection()));
}
if (fIndexOnOpen != null) {
props.put(IndexerPreferences.KEY_INDEX_ON_OPEN, String.valueOf(fIndexOnOpen.getSelection()));
}
if (fIncludeHeuristics != null) {
props.put(IndexerPreferences.KEY_INCLUDE_HEURISTICS, String.valueOf(fIncludeHeuristics.getSelection()));
}
if (fFileSizeLimit != null) {
props.put(IndexerPreferences.KEY_SKIP_FILES_LARGER_THAN_MB, String.valueOf(fFileSizeLimit.getIntValue()));
}
if (fFilesToParseUpFront != null) {
props.put(IndexerPreferences.KEY_FILES_TO_PARSE_UP_FRONT, fFilesToParseUpFront.getText());
}
if (fSkipReferences != null) {
props.put(IndexerPreferences.KEY_SKIP_ALL_REFERENCES, String.valueOf(fSkipReferences.getSelection()));
}
if (fSkipImplicitReferences != null) {
props.put(IndexerPreferences.KEY_SKIP_IMPLICIT_REFERENCES, String.valueOf(fSkipImplicitReferences.getSelection()));
}
if (fSkipMacroAndTypeReferences != null) {
final String value = String.valueOf(fSkipMacroAndTypeReferences.getSelection());
props.put(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES, value);
props.put(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES, value);
}
return props;
}
/**
* {@link #getProperties()} will be called instead.
*/
@Override
final public void performApply(IProgressMonitor monitor) {
throw new UnsupportedOperationException();
}
/**
* {@link #setProperties(Properties)} will be called instead.
*/
@Override
final public void performDefaults() {
throw new UnsupportedOperationException();
}
public void updateEnablement() {
if (fSkipReferences != null) {
final boolean skipReferences = fSkipReferences.getSelection();
if (fSkipImplicitReferences != null) {
fSkipImplicitReferences.setEnabled(!skipReferences);
}
if (fSkipMacroAndTypeReferences != null) {
fSkipMacroAndTypeReferences.setEnabled(!skipReferences);
}
}
}
private void updateValidState() {
if (!fFileSizeLimit.isValid()) {
setErrorMessage(fFileSizeLimit.getErrorMessage());
setValid(false);
} else {
setValid(true);
}
final ICOptionContainer container = getContainer();
if (container != null) {
container.updateContainer();
}
}
private String getNotNull(Properties properties, String key) {
String files= (String) properties.get(key);
if (files == null) {
files= ""; //$NON-NLS-1$
}
return files;
}
private Text createParseUpFrontTextField(Composite page) {
Label l= ControlFactory.createLabel(page, DialogsMessages.AbstractIndexerPage_indexUpFront);
((GridData) l.getLayoutData()).verticalIndent= 5;
return ControlFactory.createTextField(page);
}
private Button createAllFilesButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_indexAllFiles);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private Button createAllHeadersButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_indexAllHeaders);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private Button createAllCHeadersButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_indexAllHeadersC);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private Button createAllCppHeadersButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_indexAllHeadersCpp);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private Button createIndexOnOpenButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_indexOpenedFiles);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private Button createIncludeHeuristicsButton(Composite page) {
Button result= ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_heuristicIncludes);
((GridData) result.getLayoutData()).horizontalSpan= 3;
return result;
}
private IntegerFieldEditor createFileSizeLimit(Composite group) {
IntegerFieldEditor result= new IntegerFieldEditor(IndexerPreferences.KEY_SKIP_FILES_LARGER_THAN_MB, DialogsMessages.AbstractIndexerPage_fileSizeLimit, group, 5);
result.setValidRange(1, 100000);
ControlFactory.createLabel(group, DialogsMessages.CacheSizeBlock_MB);
Text control = result.getTextControl(group);
LayoutUtil.setWidthHint(control, pixelConverter.convertWidthInCharsToPixels(10));
LayoutUtil.setHorizontalGrabbing(control, false);
result.setPropertyChangeListener(validityChangeListener);
return result;
}
private Button createSkipReferencesButton(Composite page) {
return ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_skipAllReferences);
}
private Button createSkipImplicitReferencesButton(Composite page) {
return ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_skipImplicitReferences);
}
private Button createSkipMacroAndTypeReferencesButton(Composite page) {
return ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_skipTypeAndMacroReferences);
}
/**
* Enable or disable support for parsing files up front. Essentially the according widget will be
* enabled or disabled.
* There will be no effect by calling this function before the IndexerPage is created
* (by {@link #createControl(Composite)}).
* <p> By default, support for parsing files up front is enabled.
*
* @since 5.3
*/
protected void setSupportForFilesParsedUpFront(boolean enable){
if(fFilesToParseUpFront!=null){
fFilesToParseUpFront.setEnabled(enable);
}
}
}