/******************************************************************************* * 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.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.internal.ui.newui.StatusMessageLine; import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.ui.Messages; import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuiltinSpecsDetector; import org.eclipse.cdt.managedbuilder.language.settings.providers.ToolchainBuiltinSpecsDetector; import org.eclipse.cdt.managedbuilder.ui.properties.ManagedBuilderUIPlugin; import org.eclipse.cdt.ui.language.settings.providers.AbstractLanguageSettingProviderOptionPage; import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; 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.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * Options page for {@link AbstractBuiltinSpecsDetector}. * * @noinstantiate This class is not intended to be instantiated by clients. */ public final class BuiltinSpecsDetectorOptionPage extends AbstractLanguageSettingProviderOptionPage { private boolean fEditable; private Text inputCommand; private Button allocateConsoleCheckBox; private StatusMessageLine fStatusLine; @Override public void createControl(Composite parent) { fEditable = parent.isEnabled(); AbstractBuiltinSpecsDetector provider = (AbstractBuiltinSpecsDetector) getProvider(); Composite composite = createCompositeForPageArea(parent); createCompilerCommandInputControl(composite, provider); createBrowseButton(composite); createConsoleCheckbox(composite, provider); createStatusLine(composite, provider); setControl(composite); } /** * Create composite for the page. */ private Composite createCompositeForPageArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); 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); return composite; } /** * Create input control for compiler command. */ private void createCompilerCommandInputControl(Composite composite, AbstractBuiltinSpecsDetector provider) { Label label = ControlFactory.createLabel(composite, Messages.BuiltinSpecsDetectorOptionPage_CompilerSpecsCommand); GridData gd = new GridData(); gd.horizontalSpan = 2; label.setLayoutData(gd); label.setEnabled(fEditable); inputCommand = ControlFactory.createTextField(composite, SWT.SINGLE | SWT.BORDER); String command = provider.getCommand(); inputCommand.setText(command!=null ? command : ""); //$NON-NLS-1$ inputCommand.setEnabled(fEditable); inputCommand.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String text = inputCommand.getText(); AbstractBuiltinSpecsDetector provider = (AbstractBuiltinSpecsDetector) getProvider(); if (!text.equals(provider.getCommand())) { AbstractBuiltinSpecsDetector selectedProvider = (AbstractBuiltinSpecsDetector) getProviderWorkingCopy(); selectedProvider.setCommand(text); refreshItem(selectedProvider); } } }); } /** * Create "Browse" button. */ private void createBrowseButton(Composite composite) { Button button = ControlFactory.createPushButton(composite, Messages.BuiltinSpecsDetectorOptionPage_Browse); button.setEnabled(fEditable); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { FileDialog dialog = new FileDialog(getShell(), SWT.NONE); dialog.setText(Messages.BuiltinSpecsDetectorOptionPage_ChooseFile); String fileName = inputCommand.getText(); // taking chance that the first word is a compiler path int space = fileName.indexOf(' '); if (space > 0) { fileName = fileName.substring(0, space); } IPath folder = new Path(fileName).removeLastSegments(1); dialog.setFilterPath(folder.toOSString()); String chosenFile = dialog.open(); if (chosenFile != null) { inputCommand.insert(chosenFile); } } }); } /** * Create check-box for console. */ private void createConsoleCheckbox(Composite composite, AbstractBuiltinSpecsDetector provider) { allocateConsoleCheckBox = new Button(composite, SWT.CHECK); allocateConsoleCheckBox.setText(Messages.BuiltinSpecsDetectorOptionPage_AllocateConsole); allocateConsoleCheckBox.setSelection(provider.isConsoleEnabled()); allocateConsoleCheckBox.setEnabled(fEditable); allocateConsoleCheckBox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean enabled = allocateConsoleCheckBox.getSelection(); AbstractBuiltinSpecsDetector provider = (AbstractBuiltinSpecsDetector) getProvider(); if (enabled != provider.isConsoleEnabled()) { AbstractBuiltinSpecsDetector selectedProvider = (AbstractBuiltinSpecsDetector) getProviderWorkingCopy(); selectedProvider.setConsoleEnabled(enabled); refreshItem(selectedProvider); } } @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); } /** * Create status line to display messages for user. */ private void createStatusLine(Composite composite, AbstractBuiltinSpecsDetector provider) { fStatusLine = new StatusMessageLine(composite, SWT.LEFT, 2); if (provider instanceof ToolchainBuiltinSpecsDetector) { String toolchainId = ((ToolchainBuiltinSpecsDetector) provider).getToolchainId(); IToolChain toolchain = ManagedBuildManager.getExtensionToolChain(toolchainId); if (toolchain == null) { fStatusLine.setErrorStatus(new Status(IStatus.ERROR, ManagedBuilderUIPlugin.getUniqueIdentifier(), IStatus.ERROR, "Toolchain support for CDT is not installed. Toolchain id=[" + toolchainId + "].", null)); } else if (!toolchain.isSupported()) { fStatusLine.setErrorStatus(new Status(IStatus.INFO, ManagedBuilderUIPlugin.getUniqueIdentifier(), IStatus.INFO, "Toolchain " + toolchain.getName() + " is not detected on this system.", null)); } } } @Override public void performApply(IProgressMonitor monitor) throws CoreException { ILanguageSettingsProvider provider = providerTab.getProvider(providerId); if ((provider instanceof AbstractBuiltinSpecsDetector)) { // basically check for working copy ILanguageSettingsProvider initialProvider = providerTab.getInitialProvider(providerId); if (!(initialProvider instanceof AbstractBuiltinSpecsDetector) || !((AbstractBuiltinSpecsDetector) initialProvider).getCommand().equals(((AbstractBuiltinSpecsDetector) provider).getCommand())) { // clear and reset isExecuted flag ((AbstractBuiltinSpecsDetector) provider).clear(); } } super.performApply(monitor); } }