/*******************************************************************************
* Copyright (c) 2009, 2012 Andrew Gvozdev 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:
* Andrew Gvozdev - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.ui.language.settings.providers;
import org.eclipse.cdt.managedbuilder.internal.ui.Messages;
import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuildCommandParser;
import org.eclipse.cdt.ui.language.settings.providers.AbstractLanguageSettingProviderOptionPage;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* Options page for {@link AbstractBuildCommandParser}.
*
*/
public final class GCCBuildCommandParserOptionPage extends AbstractLanguageSettingProviderOptionPage {
private boolean fEditable;
private Text inputCommand;
private Button expandRelativePathCheckBox;
private Button scopeProjectRadioButton;
private Button scopeFolderRadioButton;
private Button scopeFileRadioButton;
@Override
public void createControl(Composite parent) {
fEditable = parent.isEnabled();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
Composite composite = new Composite(parent, SWT.NONE);
createCompositeForPageArea(composite);
createCompilerPatternInputControl(provider, composite);
createResourceScopeGroup(provider, composite);
createResolvePathsCheckbox(composite, provider);
setControl(composite);
}
/**
* Create composite for the page.
*/
private void createCompositeForPageArea(final Composite composite) {
{
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 1;
layout.marginHeight = 1;
layout.marginRight = 1;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
Dialog.applyDialogFont(composite);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
composite.setLayoutData(gd);
}
}
/**
* Create input control for compiler pattern.
*/
private void createCompilerPatternInputControl(AbstractBuildCommandParser provider, Composite composite) {
Label label = ControlFactory.createLabel(composite, Messages.GCCBuildCommandParserOptionPage_CompilerPattern);
GridData gd = new GridData();
gd.horizontalSpan = 1;
label.setLayoutData(gd);
label.setEnabled(fEditable);
inputCommand = ControlFactory.createTextField(composite, SWT.SINGLE | SWT.BORDER);
String compilerPattern = provider.getCompilerPattern();
inputCommand.setText(compilerPattern!=null ? compilerPattern : ""); //$NON-NLS-1$
gd = new GridData();
gd.horizontalSpan = 1;
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = SWT.FILL;
inputCommand.setLayoutData(gd);
inputCommand.setEnabled(fEditable);
inputCommand.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String text = inputCommand.getText();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
if (!text.equals(provider.getCompilerPattern())) {
AbstractBuildCommandParser selectedProvider = (AbstractBuildCommandParser) getProviderWorkingCopy();
selectedProvider.setCompilerPattern(text);
refreshItem(selectedProvider);
}
}
});
}
/**
* Create check-box for resolving paths.
*/
private void createResolvePathsCheckbox(Composite composite, AbstractBuildCommandParser provider) {
expandRelativePathCheckBox = new Button(composite, SWT.CHECK);
expandRelativePathCheckBox.setText(Messages.GCCBuildCommandParserOptionPage_ResolvePaths);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
expandRelativePathCheckBox.setLayoutData(gd);
expandRelativePathCheckBox.setSelection(provider.isResolvingPaths());
expandRelativePathCheckBox.setEnabled(fEditable);
expandRelativePathCheckBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean enabled = expandRelativePathCheckBox.getSelection();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
if (enabled != provider.isResolvingPaths()) {
AbstractBuildCommandParser selectedProvider = (AbstractBuildCommandParser) getProviderWorkingCopy();
selectedProvider.setResolvingPaths(enabled);
refreshItem(selectedProvider);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
}
/**
* Create group and radio buttons for container to keep discovered entries.
*/
private void createResourceScopeGroup(AbstractBuildCommandParser provider, Composite composite) {
Group resourceScopeGroup = new Group(composite, SWT.NONE);
resourceScopeGroup.setText(Messages.GCCBuildCommandParserOptionPage_ContainerForDiscoveredEntries);
resourceScopeGroup.setLayout(new GridLayout(2, false));
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
resourceScopeGroup.setLayoutData(gd);
scopeFileRadioButton = new Button(resourceScopeGroup, SWT.RADIO);
scopeFileRadioButton.setText(Messages.GCCBuildCommandParserOptionPage_File);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
scopeFileRadioButton.setLayoutData(gd);
scopeFileRadioButton.setSelection(provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.FILE);
scopeFileRadioButton.setEnabled(fEditable);
scopeFileRadioButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean enabled = scopeFileRadioButton.getSelection();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
if (enabled != (provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.FILE)) {
AbstractBuildCommandParser selectedProvider = (AbstractBuildCommandParser) getProviderWorkingCopy();
selectedProvider.setResourceScope(AbstractBuildCommandParser.ResourceScope.FILE);
refreshItem(selectedProvider);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
scopeFolderRadioButton = new Button(resourceScopeGroup, SWT.RADIO);
scopeFolderRadioButton.setText(Messages.GCCBuildCommandParserOptionPage_Folder);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
scopeFolderRadioButton.setLayoutData(gd);
scopeFolderRadioButton.setSelection(provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.FOLDER);
scopeFolderRadioButton.setEnabled(fEditable);
scopeFolderRadioButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean enabled = scopeFolderRadioButton.getSelection();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
if (enabled != (provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.FOLDER)) {
AbstractBuildCommandParser selectedProvider = (AbstractBuildCommandParser) getProviderWorkingCopy();
selectedProvider.setResourceScope(AbstractBuildCommandParser.ResourceScope.FOLDER);
refreshItem(selectedProvider);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
scopeProjectRadioButton = new Button(resourceScopeGroup, SWT.RADIO);
scopeProjectRadioButton.setText(Messages.GCCBuildCommandParserOptionPage_Project);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
scopeProjectRadioButton.setLayoutData(gd);
scopeProjectRadioButton.setSelection(provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.PROJECT);
scopeProjectRadioButton.setEnabled(fEditable);
scopeProjectRadioButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean enabled = scopeProjectRadioButton.getSelection();
AbstractBuildCommandParser provider = (AbstractBuildCommandParser) getProvider();
if (enabled != (provider.getResourceScope() == AbstractBuildCommandParser.ResourceScope.PROJECT)) {
AbstractBuildCommandParser selectedProvider = (AbstractBuildCommandParser) getProviderWorkingCopy();
selectedProvider.setResourceScope(AbstractBuildCommandParser.ResourceScope.PROJECT);
refreshItem(selectedProvider);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
}
}