/******************************************************************************* * Copyright (c) 2003, 2008 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui.dialogs; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.ErrorParserManager; 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.LayoutUtil; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; 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.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; public abstract class AbstractErrorParserBlock extends AbstractCOptionPage { private static final String PREFIX = "ErrorParserBlock"; //$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 String[] EMPTY = new String[0]; private Preferences fPrefs; protected HashMap<String, String> mapParsers = new HashMap<String, String>(); private CheckedListDialogField<String> fErrorParserList; protected boolean listDirty = false; class FieldListenerAdapter implements IDialogFieldListener { /* * (non-Javadoc) * * @see org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField) */ public void dialogFieldChanged(DialogField field) { listDirty = true; } } /** * @deprecated - use AbstractErrorParserBlock(), preferences setting should * now be handled by extending classes, use * setErrorParserIDs(boolean)/saveErrorParserIDs() to handle * getting/setting of values. * * @param prefs */ @Deprecated public AbstractErrorParserBlock(Preferences prefs) { this(); // usingDeprecatedContructor = true; fPrefs = prefs; } public AbstractErrorParserBlock() { super(CUIPlugin.getResourceString(LABEL)); setDescription(CUIPlugin.getResourceString(DESC)); } @Override public Image getImage() { return null; } public void updateValues() { fErrorParserList.removeAllElements(); setValues(); } /** * Returns a label provider for the error parsers * * @return the content provider */ protected ILabelProvider getLabelProvider() { return new LabelProvider() { /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { String name = mapParsers.get(element.toString()); return name != null ? name : element.toString(); } }; } protected FieldListenerAdapter getFieldListenerAdapter() { return new FieldListenerAdapter(); } protected String[] getErrorParserIDs(boolean defaults) { String parserIDs = null; if (fPrefs != null) { if (defaults == true) { parserIDs = fPrefs.getDefaultString(ErrorParserManager.PREF_ERROR_PARSER); } else { parserIDs = fPrefs.getString(ErrorParserManager.PREF_ERROR_PARSER); } } else { return getErrorParserIDs(); } String[] empty = new String[0]; if (parserIDs != null && parserIDs.length() > 0) { StringTokenizer tok = new StringTokenizer(parserIDs, ";"); //$NON-NLS-1$ List<String> list = new ArrayList<String>(tok.countTokens()); while (tok.hasMoreElements()) { list.add(tok.nextToken()); } return list.toArray(empty); } return empty; } /** * To be implemented, abstract method. * * @param project * @return String[] */ protected abstract String[] getErrorParserIDs(IProject project); /** * To be overloaded by subclasses with another method of getting the error * parsers. For example, the managed builder new project wizard uses the * selected Target. * @deprecated - use getErrorParserIDs(boolean defaults) * @return String[] */ @Deprecated protected String[] getErrorParserIDs() { return new String[0]; } /** * To be implemented. abstract method. */ protected abstract void saveErrorParsers(IProject project, String[] parserIDs) throws CoreException; /** * @deprecated - use saveErrorParser(String[]) * @param prefs * @param parserIDs */ @Deprecated protected void saveErrorParsers(Preferences prefs, String[] parserIDs) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < parserIDs.length; i++) { buf.append(parserIDs[i]).append(';'); } prefs.setValue(ErrorParserManager.PREF_ERROR_PARSER, buf.toString()); } protected void saveErrorParsers(String[] parserIDs) throws CoreException { saveErrorParsers(fPrefs, parserIDs); } protected void initMapParsers() { mapParsers.clear(); IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, CCorePlugin.ERROR_PARSER_SIMPLE_ID); if (point != null) { IExtension[] exts = point.getExtensions(); for (int i = 0; i < exts.length; i++) { if (exts[i].getConfigurationElements().length > 0) { mapParsers.put(exts[i].getUniqueIdentifier(), exts[i].getLabel()); } } } } protected void initializeValues() { initMapParsers(); setValues(); } protected void setDefaults() { String[] parserIDs; IProject project = getContainer().getProject(); if (project == null) { // From a Preference. parserIDs = getErrorParserIDs(true); } else { parserIDs = getErrorParserIDs(false); } updateListControl(parserIDs); } protected void setValues() { String[] parserIDs; IProject project = getContainer().getProject(); if (project == null) { parserIDs = getErrorParserIDs(false); } else { // From the Project. parserIDs = getErrorParserIDs(project); } updateListControl(parserIDs); } protected void updateListControl(String[] parserIDs) { List<String> checkedList = Arrays.asList(parserIDs); fErrorParserList.setElements(checkedList); fErrorParserList.setCheckedElements(checkedList); if (checkedList.size() > 0) { fErrorParserList.getTableViewer().setSelection(new StructuredSelection(checkedList.get(0)), true); } Iterator<String> items = mapParsers.keySet().iterator(); while (items.hasNext()) { String item = items.next(); boolean found = false; for (int i = 0; i < parserIDs.length; i++) { if (item.equals(parserIDs[i])) { found = true; break; } } if (!found) { fErrorParserList.addElement(item); } } } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); setControl(composite); PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.ERROR_PARSERS_PAGE); String[] buttonLabels = new String[]{ CUIMessages.AbstractErrorParserBlock_label_up, CUIMessages.AbstractErrorParserBlock_label_down, /* 2 */ null, CUIMessages.AbstractErrorParserBlock_label_selectAll, CUIMessages.AbstractErrorParserBlock_label_unselectAll }; fErrorParserList = new CheckedListDialogField<String>(null, buttonLabels, getLabelProvider()); fErrorParserList.setDialogFieldListener(getFieldListenerAdapter()); fErrorParserList.setLabelText(CUIMessages.AbstractErrorParserBlock_label_errorParsers); fErrorParserList.setUpButtonIndex(0); fErrorParserList.setDownButtonIndex(1); fErrorParserList.setCheckAllButtonIndex(3); fErrorParserList.setUncheckAllButtonIndex(4); LayoutUtil.doDefaultLayout(composite, new DialogField[]{fErrorParserList}, true); LayoutUtil.setHorizontalGrabbing(fErrorParserList.getListControl(null), true); initializeValues(); } @Override public void performApply(IProgressMonitor monitor) throws CoreException { if (listDirty) { IProject project = getContainer().getProject(); if (monitor == null) { monitor = new NullProgressMonitor(); } monitor.beginTask(CUIMessages.AbstractErrorParserBlock_task_setErrorParser, 1); List<String> elements = fErrorParserList.getElements(); int count = elements.size(); List<Object> list = new ArrayList<Object>(count); for (int i = 0; i < count; i++) { Object obj = elements.get(i); if (fErrorParserList.isChecked(obj)) { list.add(obj); } } String[] parserIDs = list.toArray(EMPTY); if (project == null) { // Save to preferences saveErrorParsers(parserIDs); } else { saveErrorParsers(project, parserIDs); } monitor.worked(1); monitor.done(); } } @Override public void performDefaults() { setDefaults(); } }