core/com.nokia.carbide.cpp.codescanner/src/com/nokia/carbide/cpp/internal/codescanner/ui/CSPreferencePage.java
/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.carbide.cpp.internal.codescanner.ui;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import com.nokia.carbide.cpp.internal.codescanner.CSPlugin;
import com.nokia.carbide.cpp.internal.codescanner.Messages;
import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;
/**
* A class to create and control the CodeScanner preference page.
*/
public class CSPreferencePage extends PreferencePage
implements IWorkbenchPreferencePage{
// private members for various controls of this property page
private Composite settingsGroup = null;
private Link projectSettingsLink = null;
private Button importButton = null;
private Button exportButton = null;
private TabFolder optionsTabFolder = null;
private CSGeneralTabPage generalTabPage = null;
private CSFileFiltersTabPage fileFiltersTabPage = null;
private CSRulesTabPage rulesTabPage = null;
private TabItem generalTab = null;
private TabItem fileFiltersTab = null;
private TabItem rulesTab = null;
@SuppressWarnings("unchecked")
private Map pageData = null;
private static String dialogFilterPath = null;
private final int generalTabIndex = 0;
private final int fileFiltersTabIndex = 1;
private final int rulesTabIndex = 2;
/**
* Create an instance of CSPreferencePage.
*/
public CSPreferencePage() {
super();
}
/**
* Create contents of this preference page.
* @param parent - the parent composite
*/
protected Control createContents(Composite parent) {
final Composite content = new Composite(parent, SWT.NONE);
content.setLayout(new GridLayout());
content.setLayoutData(new GridData(GridData.FILL_BOTH));
settingsGroup = new Composite(content, SWT.NONE);
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
gridData.widthHint = 460;
settingsGroup.setLayoutData(gridData);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
settingsGroup.setLayout(gridLayout);
// place holder label(s) to fill up unused columns in the layout
Label label = new Label(settingsGroup, SWT.NONE);
gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
gridData.widthHint = 460;
label.setLayoutData(gridData);
// link to CodeScanner project property page
if (offerLink()) {
projectSettingsLink = new Link(settingsGroup, SWT.NONE);
projectSettingsLink.setText(Messages.getString("CSPreferencPage.ProjectSettingsLabel"));
projectSettingsLink.addSelectionListener(new SelectionAdapter() {
@SuppressWarnings("unchecked")
public void widgetSelected(SelectionEvent arg0) {
Map data= new HashMap();
data.put(CSPreferenceConstants.NO_LINK, Boolean.TRUE);
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
CSProjectSelectionDialog dialog = new CSProjectSelectionDialog(content.getShell(), projects);
if (dialog.open() == Window.OK) {
IProject project = (IProject)dialog.getFirstResult();
PreferencesUtil.createPropertyDialogOn(content.getShell(), project, CSPreferenceConstants.PROPERTY_PAGE_ID, null, data).open();
}
}
});
}
Label horizontalLine= new Label(content, SWT.SEPARATOR | SWT.HORIZONTAL);
horizontalLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
// tab folder for various CodeScanner options
optionsTabFolder = new TabFolder(content, SWT.TOP);
gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.heightHint = 360;
gridData.widthHint = 460;
optionsTabFolder.setLayoutData(gridData);
optionsTabFolder.setLayout(new GridLayout());
// general CodeScanner options
generalTabPage = new CSGeneralTabPage(optionsTabFolder);
generalTab = new TabItem(optionsTabFolder, SWT.NONE, generalTabIndex);
generalTab.setText(Messages.getString("CSPreferencPage.GeneralTabLabel"));
generalTab.setToolTipText(Messages.getString("CSPreferencPage.GeneralTabMessage"));
generalTab.setControl(generalTabPage);
// CodeScanner file filters
fileFiltersTabPage = new CSFileFiltersTabPage(optionsTabFolder);
fileFiltersTab = new TabItem(optionsTabFolder, SWT.NONE, fileFiltersTabIndex);
fileFiltersTab.setText(Messages.getString("CSPreferencPage.FileFiltersTabLabel"));
fileFiltersTab.setToolTipText(Messages.getString("CSPreferencPage.FileFiltersTabMessage"));
fileFiltersTab.setControl(fileFiltersTabPage);
// CodeScanner rules
rulesTabPage = new CSRulesTabPage(optionsTabFolder);
rulesTab = new TabItem(optionsTabFolder, SWT.NONE, rulesTabIndex);
rulesTab.setText(Messages.getString("CSPreferencPage.RulesTabLabel"));
rulesTab.setToolTipText(Messages.getString("CSPreferencPage.RulesTabMessage"));
rulesTab.setControl(rulesTabPage);
getPageStoredValues();
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, CSUIHelpIds.CODESCANNER_PREFERENCE_PAGE);
generalTabPage.setFocus();
return content;
}
/**
* Add buttons to the property page.
* @param parent - the parent composite
*/
protected void contributeButtons(Composite parent) {
// import configuration settings
importButton = new Button(parent, SWT.NONE);
importButton.setText(Messages.getString("CSPreferencPage.ImportSettingsLabel"));
importButton.setToolTipText(Messages.getString("CSPreferencPage.ImportSettingsMessage"));
importButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
handleImport();
}
});
// export configuration settings
exportButton = new Button(parent, SWT.NONE);
exportButton.setText(Messages.getString("CSPreferencPage.ExportSettingsLabel"));
exportButton.setToolTipText(Messages.getString("CSPreferencPage.ExportSettingsMessage"));
exportButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
handleExport();
}
});
// add two columns to the parent's layout
((GridLayout) parent.getLayout()).numColumns += 2;
}
/**
* Initialize this preference page for the given workbench.
* @param workbench - the workbench
*/
public void init(IWorkbench workbench) {
if (dialogFilterPath == null) {
dialogFilterPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
}
}
/**
* Apply the data to the receiver.
* @param data - incoming data
*/
@SuppressWarnings("unchecked")
public void applyData(Object data) {
if (data instanceof Map) {
pageData = (Map)data;
}
if (projectSettingsLink != null) {
if (!offerLink()) {
projectSettingsLink.setVisible(false);
}
}
}
/**
* Things to do when user hit the "OK" button.
*/
public boolean performOk() {
boolean result = setPageStoredValues();
if (result) {
return super.performOk();
}
else {
return result;
}
}
/**
* Things to do when user hit the "Default" button.
*/
protected void performDefaults() {
int selection = optionsTabFolder.getSelectionIndex();
switch (selection) {
case generalTabIndex:
generalTabPage.setDefaults();
break;
case fileFiltersTabIndex:
fileFiltersTabPage.setDefaults();
break;
case rulesTabIndex:
rulesTabPage.setDefaults();
break;
};
super.performDefaults();
}
/**
* Retrieve the stored values for this preference page.
*/
private void getPageStoredValues() {
generalTabPage.getStoredPreferenceValues();
fileFiltersTabPage.getStoredPreferenceValues();
rulesTabPage.getStoredPreferenceValues();
}
/**
* Store the values for this preference page.
*/
private boolean setPageStoredValues() {
if (!generalTabPage.setStoredPreferenceValues()) {
return false;
}
if (!fileFiltersTabPage.setStoredPreferenceValues()) {
return false;
}
if (!rulesTabPage.setStoredPreferenceValues()) {
return false;
}
return true;
}
/**
* Things to do when user hit the "Import Settings" button.
*/
private void handleImport() {
String filePath = selectConfigFile(importButton, false);
if (filePath != null && filePath.length() > 0) {
File configFile = new File(filePath);
if (configFile.exists()) {
CSPlugin.getConfigManager().loadGlobalConfigFile(filePath);
// import CodeScanner file filters and rules only
fileFiltersTabPage.getStoredPreferenceValues();
rulesTabPage.getStoredPreferenceValues();
}
else {
importConfigFileError(filePath);
}
}
}
/**
* Things to do when user hit the "Export Settings" button.
*/
private void handleExport() {
String filePath = selectConfigFile(exportButton, true);
if (filePath != null && filePath.length() > 0) {
// export CodeScanner file filters and rules only
fileFiltersTabPage.setStoredPreferenceValues();
rulesTabPage.setStoredPreferenceValues();
CSPlugin.getConfigManager().createGlobalConfigFile(null, filePath);
}
}
/**
* Create and open a dialog to allow selection of a configuration settings file
* for import/export.
* @param button - the button widget associated with this dialog
* @param export - indicate whether the dialog is used to export a file
* @return the path of the selected file
*/
private String selectConfigFile(Button button, boolean export) {
FileDialog dialog;
if (export) {
dialog = new FileDialog(button.getShell(), SWT.SAVE);
dialog.setText(Messages.getString("CSPreferencPage.SelectExportSettingsMessage"));
dialog.setFileName(Messages.getString("CSPreferencPage.ExportDefaultFilename"));
}
else {
dialog = new FileDialog(button.getShell(), SWT.OPEN);
dialog.setText(Messages.getString("CSPreferencPage.SelectImportSettingsMessage"));
}
String[] extensions = new String[] {"*.xml"};
dialog.setFilterExtensions(extensions);
BrowseDialogUtils.initializeFrom(dialog, dialogFilterPath != null ? dialogFilterPath + File.separator : null);
String configFilePath = dialog.open();
dialogFilterPath = dialog.getFilterPath();
return configFilePath;
}
/**
* Generate error if an import config file cannot be found.
* @param fileName - impoert Config file name
*/
private void importConfigFileError(String fileName) {
IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (workbenchWindow != null) {
MessageDialog.openError(workbenchWindow.getShell(),
Messages.getString("CSPreferencPage.ImportConfigFileErrorTitle"),
Messages.getString("CSPreferencPage.ImportConfigFileErrorMessage") + fileName);
}
}
/**
* Determine whether to create a link to CodeScanner project property page.
* @return true if a link to CodeScanner project property page is to be created
*/
private boolean offerLink() {
return pageData == null || !Boolean.TRUE.equals(pageData.get(CSPreferenceConstants.NO_LINK));
}
}