/*******************************************************************************
* Copyright (c) 2003, 2011 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.dialogs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICDescriptorOperation;
import org.eclipse.cdt.core.settings.model.ICConfigExtensionReference;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.internal.ui.CUIMessages;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IListAdapter;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
/**
* @deprecated as of CDT 4.0. This tab was used to set preferences/properties
* for 3.X style projects.
*
* @noextend This class is not intended to be subclassed by clients.
*/
@Deprecated
public class BinaryParserBlock extends AbstractBinaryParserPage {
private static final int DEFAULT_HEIGHT = 160;
private static final String PREFIX = "BinaryParserBlock"; //$NON-NLS-1$
private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$
private static final String DESC = PREFIX + ".desc"; //$NON-NLS-1$
private static final String ATTR_FILTER = "filter"; //$NON-NLS-1$
private static final String ATTR_NAME = "name"; //$NON-NLS-1$
private static final String ATTR_NAME_VISIBILITY = "visibility"; //$NON-NLS-1$
private static final String ATTR_VALUE = "value"; //$NON-NLS-1$
private static final String ATTR_VALUE_PRIVATE = "private"; //$NON-NLS-1$
protected CheckedListDialogField<BinaryParserConfiguration> binaryList;
protected Map<String, BinaryParserConfiguration> configMap;
protected List<BinaryParserConfiguration> initialSelected;
protected class BinaryParserConfiguration {
IExtension fExtension;
public BinaryParserConfiguration(IExtension extension) {
fExtension = extension;
}
public String getID() {
return fExtension.getUniqueIdentifier();
}
public String getName() {
return fExtension.getLabel();
}
@Override
public String toString() {
return fExtension.getUniqueIdentifier();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BinaryParserConfiguration) {
return this.getID().equals(((BinaryParserConfiguration) obj).getID());
}
return super.equals(obj);
}
}
protected class BinaryParserLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
return ((BinaryParserConfiguration) element).getName();
}
}
public BinaryParserBlock() {
super(CUIPlugin.getResourceString(LABEL));
setDescription(CUIPlugin.getResourceString(DESC));
String[] buttonLabels = new String[]{
CUIMessages.BinaryParserBlock_button_up,
CUIMessages.BinaryParserBlock_button_down};
IListAdapter<BinaryParserConfiguration> listAdapter = new IListAdapter<BinaryParserConfiguration>() {
public void customButtonPressed(ListDialogField<BinaryParserConfiguration> field, int index) {
}
public void selectionChanged(ListDialogField<BinaryParserConfiguration> field) {
handleBinaryParserChanged();
}
public void doubleClicked(ListDialogField<BinaryParserConfiguration> field) {
}
};
binaryList = new CheckedListDialogField<BinaryParserConfiguration>(listAdapter, buttonLabels, new BinaryParserLabelProvider()) {
@Override
protected int getListStyle() {
int style = super.getListStyle();
return style & ~SWT.MULTI;
}
};
binaryList.setDialogFieldListener(new IDialogFieldListener() {
public void dialogFieldChanged(DialogField field) {
if (getContainer() != null) {
getContainer().updateContainer();
handleBinaryParserChanged();
}
}
});
binaryList.setLabelText(CUIMessages.BinaryParserBlock_binaryParser);
binaryList.setUpButtonIndex(0);
binaryList.setDownButtonIndex(1);
initializeParserList();
}
private void initializeParserList() {
IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, CCorePlugin.BINARY_PARSER_SIMPLE_ID);
if (point != null) {
IExtension[] exts = point.getExtensions();
configMap = new HashMap<String, BinaryParserConfiguration>(exts.length);
for (IExtension ext : exts) {
if (isExtensionVisible(ext)) {
configMap.put(ext.getUniqueIdentifier(), new BinaryParserConfiguration(ext));
}
}
}
}
private boolean isExtensionVisible(IExtension ext) {
IConfigurationElement[] elements = ext.getConfigurationElements();
for (IConfigurationElement element : elements) {
IConfigurationElement[] children = element.getChildren(ATTR_FILTER);
for (IConfigurationElement element2 : children) {
String name = element2.getAttribute(ATTR_NAME);
if (name != null && name.equals(ATTR_NAME_VISIBILITY)) {
String value = element2.getAttribute(ATTR_VALUE);
if (value != null && value.equals(ATTR_VALUE_PRIVATE)) {
return false;
}
}
}
return true;
}
return false; // invalid extension definition (must have at least cextension elements)
}
@Override
public void createControl(Composite parent) {
PixelConverter converter = new PixelConverter(parent);
Composite composite = ControlFactory.createComposite(parent, 1);
((GridData) (composite.getLayoutData())).horizontalAlignment = GridData.FILL_HORIZONTAL;
setControl(composite);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.BINARY_PARSER_PAGE);
Composite listComposite = ControlFactory.createComposite(composite, 1);
LayoutUtil.doDefaultLayout(listComposite, new DialogField[]{binaryList}, true);
LayoutUtil.setHorizontalGrabbing(binaryList.getListControl(null), true);
int buttonBarWidth = converter.convertWidthInCharsToPixels(15);
binaryList.setButtonsMinWidth(buttonBarWidth);
// Add the Parser UI contribution.
Composite parserGroup = new Composite(composite, SWT.NULL);
GridData gd = new GridData();
gd.heightHint = converter.convertHorizontalDLUsToPixels(DEFAULT_HEIGHT);
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
gd.grabExcessVerticalSpace = true;
parserGroup.setLayoutData(gd);
// Must set the composite parent to super class.
setCompositeParent(parserGroup);
// fire a change event, to quick start.
handleBinaryParserChanged();
parent.layout(true);
}
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask(CUIMessages.BinaryParserBlock_settingBinaryParser, 2);
List<BinaryParserConfiguration> parsers = binaryList.getElements();
final List<BinaryParserConfiguration> selected = new ArrayList<BinaryParserConfiguration>(); // must do this to get proper order.
for (int i = 0; i < parsers.size(); i++) {
if (binaryList.isChecked(parsers.get(i))) {
selected.add(parsers.get(i));
}
}
if (getContainer().getProject() != null) {
ICDescriptorOperation op = new ICDescriptorOperation() {
public void execute(ICDescriptor descriptor, IProgressMonitor monitor) throws CoreException {
if (initialSelected == null || !selected.equals(initialSelected)) {
descriptor.remove(CCorePlugin.BINARY_PARSER_UNIQ_ID);
for (int i = 0; i < selected.size(); i++) {
descriptor.create(CCorePlugin.BINARY_PARSER_UNIQ_ID,
selected.get(i).getID());
}
}
monitor.worked(1);
// Give a chance to the contributions to save.
// We have to do it last to make sure the parser id
// is save
// in .cdtproject
for (int i = 0; i < selected.size(); i++) {
ICOptionPage page = getBinaryParserPage(selected.get(i).getID());
if (page != null && page.getControl() != null) {
page.performApply(new SubProgressMonitor(monitor, 1));
}
}
}
};
CCorePlugin.getDefault().getCDescriptorManager().runDescriptorOperation(getContainer().getProject(), op, monitor);
} else {
if (initialSelected == null || !selected.equals(initialSelected)) {
Preferences store = getContainer().getPreferences();
if (store != null) {
store.setValue(CCorePlugin.PREF_BINARY_PARSER, arrayToString(selected.toArray()));
}
}
monitor.worked(1);
// Give a chance to the contributions to save.
for (int i = 0; i < selected.size(); i++) {
ICOptionPage page = getBinaryParserPage(selected.get(i).getID());
if (page != null && page.getControl() != null) {
page.performApply(new SubProgressMonitor(monitor, 1));
}
}
}
initialSelected = selected;
monitor.done();
}
@Override
public void setContainer(ICOptionContainer container) {
super.setContainer(container);
List<BinaryParserConfiguration> elements = new ArrayList<BinaryParserConfiguration>();
if (getContainer().getProject() != null) {
try {
ICConfigExtensionReference[] ref = CCorePlugin.getDefault().getDefaultBinaryParserExtensions(getContainer().getProject());
initialSelected = new ArrayList<BinaryParserConfiguration>(ref.length);
for (ICConfigExtensionReference element : ref) {
if (configMap.get(element.getID()) != null) {
initialSelected.add(configMap.get(element.getID()));
elements.add(configMap.get(element.getID()));
}
}
} catch (CoreException e) {
}
for (Entry<String, BinaryParserConfiguration> entry: configMap.entrySet()) {
if (!elements.contains(entry.getValue())) {
elements.add(entry.getValue());
}
}
binaryList.setElements(elements);
if (initialSelected != null)
binaryList.setCheckedElements(initialSelected);
}
if (initialSelected == null) {
Preferences store = getContainer().getPreferences();
String id = null;
if (store != null) {
id = store.getString(CCorePlugin.PREF_BINARY_PARSER);
}
if (id != null && id.length() > 0) {
String[] ids = parseStringToArray(id);
initialSelected = new ArrayList<BinaryParserConfiguration>(ids.length);
for (String id2 : ids) {
if (configMap.get(id2) != null) {
initialSelected.add(configMap.get(id2));
elements.add(configMap.get(id2));
}
}
}
for (Entry<String, BinaryParserConfiguration> entry: configMap.entrySet()) {
if (!elements.contains(entry.getValue())) {
elements.add(entry.getValue());
}
}
binaryList.setElements(elements);
if (initialSelected != null)
binaryList.setCheckedElements(initialSelected);
// reset this since we only want to prevent applying non-changed selections on the project
// and project creation we always want to apply selection.
initialSelected = null;
}
}
private String arrayToString(Object[] array) {
StringBuffer buf = new StringBuffer();
for (Object element : array) {
buf.append(element.toString()).append(';');
}
return buf.toString();
}
private String[] parseStringToArray(String syms) {
if (syms != null && syms.length() > 0) {
StringTokenizer tok = new StringTokenizer(syms, ";"); //$NON-NLS-1$
ArrayList<String> list = new ArrayList<String>(tok.countTokens());
while (tok.hasMoreElements()) {
list.add(tok.nextToken());
}
return list.toArray(new String[list.size()]);
}
return new String[0];
}
@Override
public void performDefaults() {
String id = null;
// default current pages.
List<BinaryParserConfiguration> selected = binaryList.getCheckedElements();
for (int i = 0; i < selected.size(); i++) {
ICOptionPage page = getBinaryParserPage(selected.get(i).getID());
if (page != null) {
page.performDefaults();
}
}
Preferences store = getContainer().getPreferences();
if (store != null) {
if (getContainer().getProject() != null) {
id = store.getString(CCorePlugin.PREF_BINARY_PARSER);
} else {
id = store.getDefaultString(CCorePlugin.PREF_BINARY_PARSER);
}
}
//default selection
selected.clear();
if (id != null) {
String[] ids = parseStringToArray(id);
for (String id2 : ids) {
if (configMap.get(id2) != null) {
selected.add(configMap.get(id2));
}
}
}
binaryList.setCheckedElements(selected);
binaryList.getTableViewer().setSelection(new StructuredSelection(selected.get(0)), true);
// Give a change to the UI contributors to react.
// But do it last after the comboBox is set.
handleBinaryParserChanged();
getContainer().updateContainer();
}
@Override
protected String getCurrentBinaryParserID() {
List<BinaryParserConfiguration> list = binaryList.getSelectedElements();
if (list.size() > 0) {
BinaryParserConfiguration selected = list.get(0);
//if (binaryList.isChecked(selected)) {
// return selected.getID();
//}
return selected.getID();
}
return null;
}
@Override
protected String[] getBinaryParserIDs() {
return configMap.keySet().toArray(new String[configMap.keySet().size()]);
}
}