org.eclipse.cdt.internal.ui.preferences.formatter.CustomCodeFormatterBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.internal.ui.preferences.formatter.CustomCodeFormatterBlock.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2008 QNX Software Systems 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
 *     Sergey Prigogin, Google
 *     Anton Leherbauer (Wind River Systems)
 *******************************************************************************/

package org.eclipse.cdt.internal.ui.preferences.formatter;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Observable;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.jface.resource.JFaceResources;
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.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PlatformUI;

import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;

import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.preferences.PreferencesAccess;

/**
 * Allows to choose the formatter in a combo box.
 * If no formatter is contributed, nothing is shown.
 */
public class CustomCodeFormatterBlock extends Observable {

    private HashMap<String, String> idMap = new HashMap<String, String>();
    private IEclipsePreferences fPrefs;
    private String fDefaultFormatterId;
    private Combo fFormatterCombo;
    private static final String ATTR_NAME = "name"; //$NON-NLS-1$
    private static final String ATTR_ID = "id"; //$NON-NLS-1$
    private static final String DEFAULT = FormatterMessages.CustomCodeFormatterBlock_default_formatter;

    public CustomCodeFormatterBlock(IProject project, PreferencesAccess access) {
        final IScopeContext scope;
        final IEclipsePreferences defaults;
        if (project != null) {
            scope = access.getProjectScope(project);
            defaults = access.getInstanceScope().getNode(CCorePlugin.PLUGIN_ID);
        } else {
            scope = access.getInstanceScope();
            defaults = access.getDefaultScope().getNode(CCorePlugin.PLUGIN_ID);
        }
        fPrefs = scope.getNode(CCorePlugin.PLUGIN_ID);
        fDefaultFormatterId = defaults.get(CCorePreferenceConstants.CODE_FORMATTER, null);
        if (fDefaultFormatterId == null) {
            // backward compatibility: use UI prefs
            IEclipsePreferences instance = access.getInstanceScope().getNode(CUIPlugin.PLUGIN_ID);
            fDefaultFormatterId = instance.get(CCorePreferenceConstants.CODE_FORMATTER, null);
            if (fDefaultFormatterId != null) {
                instance.remove(CCorePreferenceConstants.CODE_FORMATTER);
                if (project != null) {
                    defaults.put(CCorePreferenceConstants.CODE_FORMATTER, fDefaultFormatterId);
                }
            }
        }
        initializeFormatters();
    }

    public void performOk() {
        if (fFormatterCombo == null) {
            return;
        }
        String text = fFormatterCombo.getText();
        String formatterId = idMap.get(text);
        if (formatterId != null && !formatterId.equals(fDefaultFormatterId)) {
            fPrefs.put(CCorePreferenceConstants.CODE_FORMATTER, formatterId);
        } else {
            // simply reset to the default one.
            performDefaults();
        }
    }

    public void performDefaults() {
        fPrefs.remove(CCorePreferenceConstants.CODE_FORMATTER);

        if (fFormatterCombo == null) {
            return;
        }
        fFormatterCombo.clearSelection();
        fFormatterCombo.setText(DEFAULT);
        Iterator<Map.Entry<String, String>> iterator = idMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String val = entry.getValue();
            if (val != null && val.equals(fDefaultFormatterId)) {
                fFormatterCombo.setText(entry.getKey());
            }
        }
        handleFormatterChanged();
    }

    /**
     * Get the currently selected formatter id.
     * 
     * @return the selected formatter id or <code>null</code> if the default is selected.
     */
    public String getFormatterId() {
        if (fFormatterCombo == null) {
            return fPrefs.get(CCorePreferenceConstants.CODE_FORMATTER, fDefaultFormatterId);
        }
        String formatterId = idMap.get(fFormatterCombo.getText());
        return formatterId;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public Control createContents(Composite parent) {
        if (getNumberOfAvailableFormatters() == 0) {
            return parent;
        }
        Composite composite = ControlFactory.createGroup(parent,
                FormatterMessages.CustomCodeFormatterBlock_formatter_name, 1);
        ((GridData) composite.getLayoutData()).horizontalSpan = 5;

        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
                ICHelpContextIds.CODEFORMATTER_PREFERENCE_PAGE);

        fFormatterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
        fFormatterCombo.setFont(parent.getFont());
        fFormatterCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fFormatterCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleFormatterChanged();
            }
        });
        Iterator<String> items = idMap.keySet().iterator();
        while (items.hasNext()) {
            fFormatterCombo.add(items.next());
        }

        final String noteTitle = FormatterMessages.CustomCodeFormatterBlock_formatter_note;
        final String noteMessage = FormatterMessages.CustomCodeFormatterBlock_contributed_formatter_warning;
        ControlFactory.createNoteComposite(JFaceResources.getDialogFont(), composite, noteTitle, noteMessage);

        initDefault();

        return composite;
    }

    private void handleFormatterChanged() {
        setChanged();
        String formatterId = getFormatterId();
        notifyObservers(formatterId);
    }

    private void initDefault() {
        boolean init = false;
        String formatterID = fPrefs.get(CCorePreferenceConstants.CODE_FORMATTER, fDefaultFormatterId);
        if (formatterID != null) {
            Iterator<Map.Entry<String, String>> iterator = idMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, String> entry = iterator.next();
                String val = entry.getValue();
                if (val != null && val.equals(formatterID)) {
                    fFormatterCombo.setText(entry.getKey());
                    init = true;
                }
            }
        }
        if (!init) {
            formatterID = null;
            fFormatterCombo.setText(DEFAULT);
        }
    }

    private void initializeFormatters() {
        idMap = new HashMap<String, String>();
        idMap.put(DEFAULT, CCorePreferenceConstants.DEFAULT_CODE_FORMATTER);
        IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID,
                CCorePlugin.FORMATTER_EXTPOINT_ID);
        if (point != null) {
            IExtension[] exts = point.getExtensions();
            for (IExtension ext : exts) {
                IConfigurationElement[] elements = ext.getConfigurationElements();
                for (int j = 0; j < elements.length; ++j) {
                    String name = elements[j].getAttribute(ATTR_NAME);
                    String id = elements[j].getAttribute(ATTR_ID);
                    idMap.put(name, id);
                }
            }
        }
    }

    private final int getNumberOfAvailableFormatters() {
        return idMap.size() - 1;
    }
}