/******************************************************************************* * Copyright (c) 2014 Rohde & Schwarz GmbH & Co. KG 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: * Martin Runge - initial implementation of cmake support *******************************************************************************/ package org.eclipse.cdt.cmake.ui; import java.io.File; import org.eclipse.cdt.cmake.Activator; import org.eclipse.cdt.cmake.CMakeInfo; import org.eclipse.cdt.cmake.CMakeInfoRetriever; import org.eclipse.cdt.cmake.CMakeOutputPath; import org.eclipse.cdt.cmake.IAcceptsCMakeInfo; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.preference.ListEditor; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; public class CMakePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IAcceptsCMakeInfo { private BooleanFieldEditor cmakeViaPathEditor = null; private DestdirFieldEditor cmakePathEditor = null; private Label cmakeVersionLabel2 = null; private ComboFieldEditor cmakeGeneratorsEditor = null; private CMakeInfoRetriever cmakeInfoRetriever; public CMakePreferencePage() { super(GRID); setPreferenceStore(Activator.getDefault().getPreferenceStore()); setDescription("Workspace wide settings for CMake. These values can be overridden per project in the project properties.\n"); cmakeInfoRetriever = new CMakeInfoRetriever(this); } /* (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditorPreferencePage#performOk() */ @Override public boolean performOk() { //TODO get project and build condif //CMakeOutputPath.getPath(project, configName); return super.performOk(); } @Override public void init(IWorkbench workbench) { } @Override protected void createFieldEditors() { //addField( new ArchTable(PreferenceConstants.P_AVAIL_TARGET_ARCHS, "Available Architectures: ", getFieldEditorParent())); //addField( new TargetDevicesEditor(PreferenceConstants.P_AVAIL_TARGET_DEVICES, "target devices: ", getFieldEditorParent())); cmakeViaPathEditor = new BooleanFieldEditor( PreferenceConstants.P_CMAKE_VIA_PATH, "Find cmake via &Path", getFieldEditorParent()) { public void valueChanged(boolean oldValue, boolean newValue) { adjustVisibility(newValue); validateForm(); super.valueChanged(oldValue, newValue); } }; addField(cmakeViaPathEditor); cmakePathEditor = new DestdirFieldEditor( PreferenceConstants.P_CMAKE_EXE, "&CMake installation dir:", getFieldEditorParent()) { public void valueChanged() { validateForm(); super.valueChanged(); } }; addField( cmakePathEditor ); Label cmakeVersionLabel1 = new Label(getFieldEditorParent(), SWT.NONE); GridData gd = new GridData(); cmakeVersionLabel1.setLayoutData(gd); cmakeVersionLabel1.setText("CMake version:"); cmakeVersionLabel2 = new Label(getFieldEditorParent(), SWT.NONE); gd = new GridData(SWT.LEFT, SWT.CENTER, true, false); gd.horizontalSpan = cmakePathEditor.getNumberOfControls() - 1; cmakeVersionLabel2.setLayoutData(gd); cmakeVersionLabel2.setText("<CMake version>"); cmakeGeneratorsEditor = new ComboFieldEditor(PreferenceConstants.P_CMAKE_GENERATOR, "Generator (-G):", CMakeInfo.getKnownGenerators(), getFieldEditorParent()); addField(cmakeGeneratorsEditor); addField( new StringFieldEditor("addArgs", "Additional CMake arguments", getFieldEditorParent()) ); addField( new DestdirFieldEditor( PreferenceConstants.P_BUILDDIR, "&Build in dir:", getFieldEditorParent())); addField( new DestdirFieldEditor( PreferenceConstants.P_DESTDIR, "&DESTDIR:", getFieldEditorParent())); } protected void initialize() { super.initialize(); adjustVisibility(getPreferenceStore().getBoolean(PreferenceConstants.P_CMAKE_VIA_PATH)); validateForm(); } protected void adjustVisibility(boolean newValue) { if(newValue == true) { cmakePathEditor.setEnabled(false, getFieldEditorParent()); } else { cmakePathEditor.setEnabled(true, getFieldEditorParent()); } } private void validateForm() { boolean isValid = false; boolean cmakeViaPath = cmakeViaPathEditor.getBooleanValue(); if(cmakeViaPath) { isValid = true; String currentCMakePath = "cmake"; IPath p = new Path(currentCMakePath); cmakeInfoRetriever.tryExecCMake(p); } else { String currentCMakePath = cmakePathEditor.getStringValue(); IPath p = new Path(currentCMakePath); File f = p.toFile(); if(f.canExecute()) { cmakeInfoRetriever.tryExecCMake(p); } } setValid(isValid); } /* (non-Javadoc) * @see org.eclipse.cdt.cmake.IAcceptsCMakeInfo#setCMakeInfo(org.eclipse.cdt.cmake.CMakeInfo) */ @Override public void setCMakeInfo(CMakeInfo info) { cmakeVersionLabel2.setText(info.getCMakeVersion() ); String generators[] = info.keySet().toArray(new String[info.size()]); } }