/*******************************************************************************
* Copyright (c) 2004, 2010 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:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.ui.dialogs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeProjectNature;
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.preferences.TabFolderLayout;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
/**
* A dialog to set scanner config discovery options.
*
* @deprecated as of CDT 4.0. This tab was used to set preferences/properties
* for 3.X style projects.
*
* @author vhirsl
* @since 3.0
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
@Deprecated
public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
private static final String MISSING_BUILDER_MSG = "ScannerConfigOptionsDialog.label.missingBuilderInformation"; //$NON-NLS-1$
private static final String DIALOG_TITLE = "ScannerConfigOptionsDialog.title"; //$NON-NLS-1$
private static final String DIALOG_DESCRIPTION = "ScannerConfigOptionsDialog.description"; //$NON-NLS-1$
private static final String SC_GROUP_LABEL = "ScannerConfigOptionsDialog.scGroup.label"; //$NON-NLS-1$
private static final String SC_ENABLED_BUTTON = "ScannerConfigOptionsDialog.scGroup.enabled.button"; //$NON-NLS-1$
private static final String SC_PROBLEM_REPORTING_ENABLED_BUTTON = "ScannerConfigOptionsDialog.scGroup.problemReporting.enabled.button"; //$NON-NLS-1$
private static final String SC_SELECTED_PROFILE_COMBO = "ScannerConfigOptionsDialog.scGroup.selectedProfile.combo"; //$NON-NLS-1$
// private static final String BO_PROVIDER_GROUP_LABEL = "ScannerConfigOptionsDialog.boProvider.group.label"; //$NON-NLS-1$
private static final String SC_APPLY_PROGRESS_MESSAGE = "ScannerConfigOptionsDialog.apply.progressMessage"; //$NON-NLS-1$
private Button scEnabledButton;
private Button scProblemReportingEnabledButton;
private Combo profileComboBox;
private Composite profileComp;
private boolean needsSCNature = false;
private boolean fCreatePathContainer = false;
// private boolean isValid = true;
// private boolean persistedProfileChanged = false; // new persisted selected profile different than the old one
/**
*
*/
public DiscoveryOptionsBlock() {
super(MakeUIPlugin.getResourceString(DIALOG_TITLE));
setDescription(MakeUIPlugin.getResourceString(DIALOG_DESCRIPTION));
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#setContainer(org.eclipse.cdt.ui.dialogs.ICOptionContainer)
*/
@Override
public void setContainer(ICOptionContainer container) {
super.setContainer(container);
if (container.getProject() == null) {
fCreatePathContainer = true;
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
// Create the composite control for the tab
int tabColumns = 2;
Font font = parent.getFont();
Composite composite = ControlFactory.createComposite(parent, 1);
((GridLayout)composite.getLayout()).marginHeight = 0;
((GridLayout)composite.getLayout()).marginWidth = 0;
((GridLayout)composite.getLayout()).verticalSpacing = 0;
((GridData)composite.getLayoutData()).horizontalAlignment = GridData.FILL_HORIZONTAL;
composite.setFont(font);
setControl(composite);
MakeUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(), IMakeHelpContextIds.SCANNER_CONFIG_DISCOVERY_OPTIONS);
// create a composite for general scanner config discovery options
Composite scComp = ControlFactory.createComposite(composite, 1);
((GridLayout)scComp.getLayout()).marginHeight = 0;
((GridLayout)scComp.getLayout()).marginTop = 5;
scComp.setFont(font);
// Create a group for scanner config discovery
if (createScannerConfigControls(scComp, tabColumns)) {
// create a composite for discovery profile options
profileComp = new Composite(composite, SWT.NULL);
// ((GridLayout)profileComp.getLayout()).marginHeight = 5;
// ((GridLayout)profileComp.getLayout()).marginWidth = 5;
// ((GridLayout)profileComp.getLayout()).verticalSpacing = 5;
profileComp.setFont(font);
profileComp.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
profileComp.setLayout(new TabFolderLayout());
// Must set the composite parent to super class.
setCompositeParent(profileComp);
// fire a change event, to quick start.
handleDiscoveryProfileChanged();
// enable controls depending on the state of auto discovery
enableAllControls();
}
parent.layout(true);
}
private boolean createScannerConfigControls(Composite parent, int numColumns) {
// Check if it is an old project
IProject project = getContainer().getProject();
boolean showMissingBuilder = false;
try {
if (project != null && project.hasNature(MakeProjectNature.NATURE_ID)
&& !project.hasNature(ScannerConfigNature.NATURE_ID)) {
needsSCNature = true; // legacy project
}
} catch (CoreException e) {
showMissingBuilder = true;
}
if (showMissingBuilder || (!needsSCNature && !isInitialized())) {
ControlFactory.createEmptySpace(parent);
ControlFactory.createLabel(parent, MakeUIPlugin.getResourceString(MISSING_BUILDER_MSG));
return false;
}
Group scGroup = ControlFactory.createGroup(parent,
MakeUIPlugin.getResourceString(SC_GROUP_LABEL), numColumns);
scGroup.setFont(parent.getFont());
((GridData)scGroup.getLayoutData()).grabExcessHorizontalSpace = true;
((GridData)scGroup.getLayoutData()).horizontalSpan = numColumns;
((GridData)scGroup.getLayoutData()).horizontalAlignment = GridData.FILL;
// Add main SCD checkbox
scEnabledButton = ControlFactory.createCheckBox(scGroup,
MakeUIPlugin.getResourceString(SC_ENABLED_BUTTON));
scEnabledButton.setFont(parent.getFont());
((GridData)scEnabledButton.getLayoutData()).horizontalSpan = numColumns;
((GridData)scEnabledButton.getLayoutData()).grabExcessHorizontalSpace = true;
// VMIR* old projects will have discovery disabled by default
scEnabledButton.setSelection(needsSCNature ? false
: (getBuildInfo().isAutoDiscoveryEnabled()
&& !getBuildInfo().getSelectedProfileId().equals(ScannerConfigProfileManager.NULL_PROFILE_ID)));
scEnabledButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
enableAllControls();
}
});
// handleScannerConfigEnable(); Only if true in VMIR*
// Add problem reporting checkbox
scProblemReportingEnabledButton = ControlFactory.createCheckBox(scGroup,
MakeUIPlugin.getResourceString(SC_PROBLEM_REPORTING_ENABLED_BUTTON));
scProblemReportingEnabledButton.setFont(parent.getFont());
((GridData)scProblemReportingEnabledButton.getLayoutData()).horizontalSpan = numColumns;
((GridData)scProblemReportingEnabledButton.getLayoutData()).grabExcessHorizontalSpace = true;
scProblemReportingEnabledButton.setSelection(getBuildInfo().isProblemReportingEnabled());
// Add profile combo box
Label label = ControlFactory.createLabel(scGroup,
MakeUIPlugin.getResourceString(SC_SELECTED_PROFILE_COMBO));
((GridData)label.getLayoutData()).grabExcessHorizontalSpace = false;
profileComboBox = new Combo(scGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
profileComboBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
getBuildInfo().setSelectedProfileId(getCurrentProfileId());
handleDiscoveryProfileChanged();
}
});
// fill the combobox and set the initial value
for (Iterator<String> items = getDiscoveryProfileIdList().iterator(); items.hasNext();) {
String profileId = items.next();
String pageName = getDiscoveryProfileName(profileId);
if (pageName != null) {
profileComboBox.add(pageName);
if (profileId.equals(getBuildInfo().getSelectedProfileId())) {
profileComboBox.setText(pageName);
}
}
}
profileComboBox.setEnabled(scEnabledButton.getSelection());
return true;
}
/**
*
*/
private void enableAllControls() {
boolean isSCDEnabled = scEnabledButton.getSelection();
scProblemReportingEnabledButton.setEnabled(isSCDEnabled);
profileComboBox.setEnabled(isSCDEnabled);
profileComp.setVisible(isSCDEnabled);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
*/
@Override
public void setVisible(boolean visible) {
if (!visible) {
if (!checkDialogForChanges()) {
createBuildInfo();
restoreFromBuildinfo(getBuildInfo());
enableAllControls();
handleDiscoveryProfileChanged();
getCurrentPage().performDefaults();
}
}
super.setVisible(visible);
enableAllControls();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.ui.dialogs.AbstractDiscoveryOptionsBlock#getCurrentProfileId()
*/
@Override
protected String getCurrentProfileId() {
int pos = profileComboBox.getSelectionIndex();
if (pos >= 0) {
String selectedProfileName = profileComboBox.getItem(pos);
return getDiscoveryProfileId(selectedProfileName);
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask(MakeUIPlugin.getResourceString(SC_APPLY_PROGRESS_MESSAGE), 3);
// init buildInfo
final IProject project = getContainer().getProject();
// Create new build info in case of new C++ project wizard
createBuildInfo();
if (getBuildInfo() != null) {
populateBuildInfo(getBuildInfo());
monitor.worked(1);
if (scEnabledButton.getSelection()) {
getCurrentPage().performApply();
}
monitor.worked(1);
if (project != null) {
configureProject(project, monitor);
}
getBuildInfo().save();
if (isProfileDifferentThenPersisted()) {
if (project != null) {
changeDiscoveryContainer(project);
}
updatePersistedProfile();
}
}
monitor.done();
}
private void configureProject(IProject project, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask(MakeUIPlugin.getResourceString(SC_APPLY_PROGRESS_MESSAGE), 3);
if (needsSCNature) {
ScannerConfigNature.addScannerConfigNature(project);
needsSCNature = false;
fCreatePathContainer = true;
}
if (fCreatePathContainer) {
createDiscoveredPathContainer(project, monitor);
fCreatePathContainer = false;
}
}
private void createDiscoveredPathContainer(IProject project, IProgressMonitor monitor) throws CModelException {
IPathEntry container = CoreModel.newContainerEntry(DiscoveredPathContainer.CONTAINER_ID);
ICProject cProject = CoreModel.getDefault().create(project);
if (cProject != null) {
IPathEntry[] entries = cProject.getRawPathEntries();
List<IPathEntry> newEntries = new ArrayList<IPathEntry>(Arrays.asList(entries));
if (!newEntries.contains(container)) {
newEntries.add(container);
cProject.setRawPathEntries(newEntries.toArray(new IPathEntry[newEntries.size()]), monitor);
}
}
// create a new discovered scanner config store
MakeCorePlugin.getDefault().getDiscoveryManager().removeDiscoveredInfo(project);
}
private void changeDiscoveryContainer(IProject project) {
String profileId = getBuildInfo().getSelectedProfileId();
ScannerConfigScope profileScope = ScannerConfigProfileManager.getInstance().
getSCProfileConfiguration(profileId).getProfileScope();
List<IResource> changedResources = new ArrayList<IResource>();
// changedResources.add(project.getFullPath());
changedResources.add(project);
MakeCorePlugin.getDefault().getDiscoveryManager().changeDiscoveredContainer(
project, profileScope, changedResources);
}
private void populateBuildInfo(IScannerConfigBuilderInfo2 buildInfo) {
if (buildInfo != null) {
buildInfo.setAutoDiscoveryEnabled(scEnabledButton.getSelection());
String profileName = profileComboBox.getItem(profileComboBox.getSelectionIndex());
buildInfo.setSelectedProfileId(getDiscoveryProfileId(profileName));
buildInfo.setProblemReportingEnabled(scProblemReportingEnabledButton.getSelection());
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
*/
@Override
public void performDefaults() {
if (!isInitialized() && !needsSCNature) {
// Missing builder info on a non-legacy project
return;
}
createDefaultBuildInfo();
restoreFromBuildinfo(getBuildInfo());
enableAllControls();
getCurrentPage().performDefaults();
handleDiscoveryProfileChanged();
}
private void restoreFromBuildinfo(IScannerConfigBuilderInfo2 buildInfo) {
if (buildInfo != null) {
scEnabledButton.setSelection(buildInfo.isAutoDiscoveryEnabled() && !buildInfo.getSelectedProfileId().equals(ScannerConfigProfileManager.NULL_PROFILE_ID));
String profileId = buildInfo.getSelectedProfileId();
profileComboBox.setText(getDiscoveryProfileName(profileId));
scProblemReportingEnabledButton.setSelection(buildInfo.isProblemReportingEnabled());
}
}
}