/*******************************************************************************
* Copyright (c) 2016 QNX Software Systems 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
*******************************************************************************/
package org.eclipse.cdt.internal.qt.ui.launch;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.build.IToolChainManager;
import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate;
import org.eclipse.cdt.internal.qt.core.build.QtBuildConfiguration;
import org.eclipse.cdt.internal.qt.ui.Activator;
import org.eclipse.cdt.internal.qt.ui.Messages;
import org.eclipse.cdt.launch.ui.corebuild.CommonBuildTab;
import org.eclipse.cdt.qt.core.IQtInstall;
import org.eclipse.cdt.qt.core.IQtInstallManager;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class QtBuildTab extends CommonBuildTab {
Combo qmakeCombo;
Text qmakeArgsText;
Text buildCmdText;
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
setControl(comp);
Label label = new Label(comp, SWT.NONE);
label.setText(Messages.QtBuildTab_qmakeCommand);
qmakeCombo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
qmakeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label = new Label(comp, SWT.NONE);
label.setText(Messages.QtBuildTab_qmakeArgs);
qmakeArgsText = new Text(comp, SWT.BORDER);
qmakeArgsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label = new Label(comp, SWT.NONE);
label.setText(Messages.QtBuildTab_buildCommand);
buildCmdText = new Text(comp, SWT.BORDER);
buildCmdText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
try {
String mode = getLaunchConfigurationDialog().getMode();
configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode),
getBuildConfiguration(configuration).getDefaultProperties());
} catch (CoreException e) {
Activator.log(e);
}
}
private Map<String, String> getProperties(ILaunchConfiguration configuration) throws CoreException {
String mode = getLaunchConfigurationDialog().getMode();
Map<String, String> properties = configuration
.getAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), new HashMap<>());
if (properties.isEmpty()) {
properties = getBuildConfiguration(configuration).getProperties();
}
return properties;
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
try {
Map<String, String> properties = getProperties(configuration);
// qmake command
IToolChainManager tcManager = Activator.getService(IToolChainManager.class);
IQtInstallManager qtManager = Activator.getService(IQtInstallManager.class);
ILaunchTarget target = getLaunchTarget();
String qmakeCmd = properties.get(QtBuildConfiguration.QMAKE_COMMAND);
qmakeCombo.removeAll();
Collection<IToolChain> toolChains = tcManager.getToolChainsMatching(target.getAttributes());
int select = -1;
for (IQtInstall qtInstall : qtManager.getInstalls()) {
for (IToolChain toolChain : toolChains) {
if (qtManager.supports(qtInstall, toolChain)) {
qmakeCombo.add(qtInstall.getQmakePath().toString());
if (qmakeCmd != null && qmakeCmd.equals(qtInstall.getQmakePath().toString())) {
select = qmakeCombo.getItemCount() - 1;
}
break;
}
}
}
if (select != -1) {
qmakeCombo.select(select);
}
// qmake args
String qmakeArgs = properties.get(QtBuildConfiguration.QMAKE_ARGS);
if (qmakeArgs != null) {
qmakeArgsText.setText(qmakeArgs);
}
// build command
String buildCommand = properties.get(QtBuildConfiguration.BUILD_COMMAND);
if (buildCommand != null) {
buildCmdText.setText(buildCommand);
}
} catch (CoreException e) {
Activator.log(e);
}
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
try {
Map<String, String> properties = new HashMap<>(getProperties(configuration));
properties.put(QtBuildConfiguration.QMAKE_COMMAND, qmakeCombo.getItem(qmakeCombo.getSelectionIndex()));
properties.put(QtBuildConfiguration.QMAKE_ARGS, qmakeArgsText.getText().trim());
properties.put(QtBuildConfiguration.BUILD_COMMAND, buildCmdText.getText().trim());
String mode = getLaunchBarLaunchConfigDialog().getMode();
configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), properties);
} catch (CoreException e) {
Activator.log(e);
}
}
@Override
public String getName() {
return Messages.QtBuildTab_Name;
}
}