/*******************************************************************************
* Copyright (c) 2004, 2016 BitMethods Inc 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:
* BitMethods Inc - Initial API and implementation
* ARM Ltd. - basic tooltip support
* Miwako Tokugawa (Intel Corporation) - Fixed-location tooltip support
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.ui.properties;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IHoldsOptions;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.internal.macros.OptionContextData;
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
import org.eclipse.cdt.utils.ui.controls.FileListControl;
import org.eclipse.cdt.utils.ui.controls.IFileListChangeListener;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.PlatformUI;
/**
* Field editor that uses FileListControl for user input.
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class FileListControlFieldEditor extends FieldEditor {
// file list control
private FileListControl list;
private int browseType;
private Composite topLayout;
private static final String DEFAULT_SEPARATOR = ";"; //$NON-NLS-1$
//values
// private String[] values = null;
/**
* Creates a file list control field editor.
* @param name the name of the preference this field editor works on
* @param labelText the label text of the field editor
* @param parent the parent of the field editor's control
* @param type the browseType of the file list control
*/
public FileListControlFieldEditor(
String name,
String labelText,
Composite parent,
int type) {
super(name, labelText, parent);
browseType = type;
// Set the browse strategy for the list editor
list.setType(type);
}
/**
* Creates a file list control field editor.
* @param name the name of the preference this field editor works on
* @param labelText the label text of the field editor
* @param tooltip the tooltip text of the field editor
* @param contextId
* @param parent the parent of the field editor's control
* @param type the browseType of the file list control
*/
public FileListControlFieldEditor(
String name,
String labelText,
String tooltip,
String contextId,
Composite parent,
int type) {
this(name, labelText, parent, type);
// can't use setToolTip(tooltip) as label not created yet
getLabelControl(parent).setToolTipText(tooltip);
if (!contextId.isEmpty()) PlatformUI.getWorkbench().getHelpSystem().setHelp(list.getListControl(), contextId);
}
/**
* Sets the field editor's tool tip text to the argument, which
* may be null indicating that no tool tip text should be shown.
*
* @param tooltip the new tool tip text (or null)
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the field editor has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the field editor</li>
* </ul>
*/
public void setToolTip(String tooltip) {
// Currently just the label has the tooltip
getLabelControl().setToolTipText(tooltip);
}
/**
* Returns the field editor's tool tip text, or null if it has
* not been set.
*
* @return the field editor's tool tip text
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the field editor has been disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the field editor</li>
* </ul>
*/
public String getToolTipText() {
return getLabelControl().getToolTipText();
}
/**
* Creates a file list control field editor.
* @param name the name of the preference this field editor works on
* @param labelText the label text of the field editor
* @param parent the parent of the field editor's control
* @param value the field editor's value
* @param type the browseType of the file list control
*/
public FileListControlFieldEditor(
String name,
String labelText,
Composite parent,
String value,
int type) {
this(name, labelText, parent, type);
browseType = type;
// this.values = parseString(value);
}
/**
* Sets the filter-path for the underlying Browse dialog. Only applies when browseType is 'file' or 'dir'.
* @param filterPath
*
* @since 7.0
*/
public void setFilterPath(String filterPath) {
list.setFilterPath(filterPath);
}
/**
* Sets the filter-extensions for the underlying Browse dialog. Only applies when browseType is 'file'.
* @param filterExtensions
*
* @since 7.0
*/
public void setFilterExtensions(String[] filterExtensions) {
list.setFilterExtensions(filterExtensions);
}
/**
* Fills this field editor's basic controls into the given parent.
*/
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
topLayout = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.makeColumnsEqualWidth = false;
topLayout.setLayout(layout);
GridData gddata = new GridData(GridData.FILL_BOTH);
gddata.horizontalSpan = 2;
topLayout.setLayoutData(gddata);
// file list control
list = new FileListControl(topLayout, getLabelText(), getType(), false);
list.addChangeListener(new IFileListChangeListener(){
@Override
public void fileListChanged(FileListControl fileList, String oldValue[], String newValue[]) {
handleFileListChange(fileList,oldValue,newValue);
}
});
topLayout.setLayout(layout);
}
private void handleFileListChange(FileListControl fileList, String oldValue[], String newValue[]){
// values = fileList.getItems();
fireValueChanged(
VALUE,
createList(oldValue),
createList(newValue));
}
/**
* Returns the browseType of this field editor's file list control
* @return
*/
private int getType() {
return browseType;
}
/**
* @return the file list control
*/
protected List getListControl() {
return list.getListControl();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoad()
*/
@Override
protected void doLoad() {
if (list != null) {
IPreferenceStore store = getPreferenceStore();
if (store != null) {
String s = store.getString(getPreferenceName());
String[] array = parseString(s);
list.setList(array);
list.setSelection(0);
// Set the resource the editor works for
if (store instanceof ToolSettingsPrefStore) {
IConfiguration config = ((ToolSettingsPrefStore)store).getSelectedConfig();
if (config != null) {
IResource project = config.getOwner();
if (project != null) {
/* Enable workspace support for list and set project */
list.setWorkspaceSupport(true);
if (store instanceof ToolSettingsPrefStore){
ToolSettingsPrefStore btsStore = ((ToolSettingsPrefStore)store);
Object[] option = btsStore.getOption(getPreferenceName());
if(option != null){
list.setContext(
btsStore.obtainMacroProvider().getMacroContextInfo(
IBuildMacroProvider.CONTEXT_OPTION,
new OptionContextData((IOption)option[1],
(IHoldsOptions)option[0])));
}
}
}
}
}
}
}
list.selectionChanged();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
*/
@Override
protected void doLoadDefault() {
if (list != null) {
list.removeAll();
String s =
getPreferenceStore().getDefaultString(getPreferenceName());
String[] array = parseString(s);
list.setList(array);
list.selectionChanged();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
@Override
protected void doStore() {
String s = createList(list.getItems());
if (s != null)
getPreferenceStore().setValue(getPreferenceName(), s);
}
public String[] getStringListValue(){
return list.getItems();
}
/**
* Returns the number of basic controls this field editor consists of.
*
* @return the number of controls
*/
@Override
public int getNumberOfControls() {
return 1;
}
/**
* Answers a <code>String</code> containing the strings passed in the
* argument separated by the DEFAULT_SEPERATOR
*
* @param items An array of strings
* @return
*/
private String createList(String[] items) {
StringBuilder path = new StringBuilder();
for (int i = 0; i < items.length; i++) {
path.append(items[i]);
if (i < (items.length - 1)) {
path.append(DEFAULT_SEPARATOR);
}
}
return path.toString();
}
/**
* Parse the string with the separator and returns the string array.
* @param stringList
* @return
*/
private String[] parseString(String stringList) {
StringTokenizer tokenizer =
new StringTokenizer(stringList, DEFAULT_SEPARATOR);
ArrayList<String> list = new ArrayList<String>();
while (tokenizer.hasMoreElements()) {
list.add((String)tokenizer.nextElement());
}
return list.toArray(new String[list.size()]);
}
/**
* Set style
*/
public void setStyle() {
((GridLayout)topLayout.getLayout()).marginWidth = 0;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
*/
@Override
protected void adjustForNumColumns(int numColumns) {
((GridData)topLayout.getLayoutData()).horizontalSpan = numColumns;
}
@Override
public Label getLabelControl(Composite parent) {
return list.getLabelControl();
}
@Override
public void setEnabled(boolean enabled, Composite parent) {
list.setEnabled(enabled);
}
}