org.eclipse.tm4e.ui.internal.preferences.ThemePreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.tm4e.ui.internal.preferences.ThemePreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2017 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
 *     Nicolaj Hoess <nicohoess@gmail.com> - Editor templates pref page: Allow to sort by column - https://bugs.eclipse.org/203722
 *     Angelo Zerr <angelo.zerr@gmail.com> - Adapt org.eclipse.ui.texteditor.templates.TemplatePreferencePage for TextMate theme
 *******************************************************************************/
package org.eclipse.tm4e.ui.internal.preferences;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.BidiUtils;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.tm4e.core.grammar.IGrammar;
import org.eclipse.tm4e.registry.IGrammarDefinition;
import org.eclipse.tm4e.registry.IGrammarRegistryManager;
import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin;
import org.eclipse.tm4e.ui.TMUIPlugin;
import org.eclipse.tm4e.ui.internal.TMUIMessages;
import org.eclipse.tm4e.ui.internal.widgets.ColumnSelectionAdapter;
import org.eclipse.tm4e.ui.internal.widgets.ColumnViewerComparator;
import org.eclipse.tm4e.ui.internal.widgets.GrammarDefinitionContentProvider;
import org.eclipse.tm4e.ui.internal.widgets.GrammarDefinitionLabelProvider;
import org.eclipse.tm4e.ui.internal.widgets.TMViewer;
import org.eclipse.tm4e.ui.internal.widgets.ThemeContentProvider;
import org.eclipse.tm4e.ui.internal.widgets.ThemeLabelProvider;
import org.eclipse.tm4e.ui.themes.ITheme;
import org.eclipse.tm4e.ui.themes.IThemeManager;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

/**
 * A theme preference page allows configuration of the TextMate themes It
 * provides controls for adding, removing and changing theme as well as
 * enablement, default management.
 */
public class ThemePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    public final static String PAGE_ID = "org.eclipse.tm4e.ui.preferences.ThemePreferencePage";

    // Theme content
    private TableViewer themeViewer;
    private Button themeNewButton;
    private Button themeRemoveButton;

    // Preview content
    private ComboViewer grammarViewer;
    private TMViewer previewViewer;

    private IGrammarRegistryManager grammarRegistryManager;
    private IThemeManager themeManager;

    private Button darkThemeButton;

    private Button defaultThemeButton;

    public ThemePreferencePage() {
        super();
        setDescription(TMUIMessages.ThemePreferencePage_description);
        setGrammarRegistryManager(TMEclipseRegistryPlugin.getGrammarRegistryManager());
        setThemeManager(TMUIPlugin.getThemeManager());
    }

    /**
     * Returns the grammar registry manager.
     * 
     * @return the grammar registry manager.
     */
    public IGrammarRegistryManager getGrammarRegistryManager() {
        return grammarRegistryManager;
    }

    /**
     * Set the grammar registry manager.
     * 
     * @param grammarRegistryManager
     */
    public void setGrammarRegistryManager(IGrammarRegistryManager grammarRegistryManager) {
        this.grammarRegistryManager = grammarRegistryManager;
    }

    /**
     * Returns the theme manager.
     * 
     * @return the theme manager.
     */
    public IThemeManager getThemeManager() {
        return themeManager;
    }

    /**
     * Set the theme manager.
     * 
     * @param themeManager
     */
    public void setThemeManager(IThemeManager themeManager) {
        this.themeManager = themeManager;
    }

    @Override
    protected Control createContents(Composite ancestor) {
        Composite parent = new Composite(ancestor, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);

        Composite innerParent = new Composite(parent, SWT.NONE);
        GridLayout innerLayout = new GridLayout();
        innerLayout.numColumns = 2;
        innerLayout.marginHeight = 0;
        innerLayout.marginWidth = 0;
        innerParent.setLayout(innerLayout);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 2;
        innerParent.setLayoutData(gd);

        createThemesContent(innerParent);
        createThemeDetailContent(innerParent);
        createPreviewContent(innerParent);

        grammarViewer.setInput(grammarRegistryManager);
        if (grammarViewer.getCombo().getItemCount() > 0) {
            grammarViewer.getCombo().select(0);
        }
        themeViewer.setInput(themeManager);

        updateButtons();
        Dialog.applyDialogFont(parent);
        innerParent.layout();

        return parent;
    }

    /**
     * Create the theme list content.
     * 
     * @param parent
     */
    private void createThemesContent(Composite parent) {
        GridLayout layout;
        Composite tableComposite = new Composite(parent, SWT.NONE);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = 360;
        data.heightHint = convertHeightInCharsToPixels(10);
        tableComposite.setLayoutData(data);

        TableColumnLayout columnLayout = new TableColumnLayout();
        tableComposite.setLayout(columnLayout);
        Table table = new Table(tableComposite,
                SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);

        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        GC gc = new GC(getShell());
        gc.setFont(JFaceResources.getDialogFont());

        ColumnViewerComparator viewerComparator = new ColumnViewerComparator();

        themeViewer = new TableViewer(table);

        TableColumn column1 = new TableColumn(table, SWT.NONE);
        column1.setText(TMUIMessages.ThemePreferencePage_column_name);
        int minWidth = computeMinimumColumnWidth(gc, TMUIMessages.ThemePreferencePage_column_name);
        columnLayout.setColumnData(column1, new ColumnWeightData(2, minWidth, true));
        column1.addSelectionListener(new ColumnSelectionAdapter(column1, themeViewer, 0, viewerComparator));

        TableColumn column2 = new TableColumn(table, SWT.NONE);
        column2.setText(TMUIMessages.ThemePreferencePage_column_path);
        minWidth = computeMinimumColumnWidth(gc, TMUIMessages.ThemePreferencePage_column_path);
        columnLayout.setColumnData(column2, new ColumnWeightData(2, minWidth, true));
        column2.addSelectionListener(new ColumnSelectionAdapter(column2, themeViewer, 1, viewerComparator));

        TableColumn column3 = new TableColumn(table, SWT.NONE);
        column3.setText(TMUIMessages.ThemePreferencePage_column_pluginId);
        minWidth = computeMinimumColumnWidth(gc, TMUIMessages.ThemePreferencePage_column_pluginId);
        columnLayout.setColumnData(column3, new ColumnWeightData(2, minWidth, true));
        column3.addSelectionListener(new ColumnSelectionAdapter(column3, themeViewer, 2, viewerComparator));

        gc.dispose();

        themeViewer.setLabelProvider(new ThemeLabelProvider());
        themeViewer.setContentProvider(new ThemeContentProvider());
        themeViewer.setComparator(viewerComparator);
        themeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent e) {
                // Fill Theme details
                ITheme theme = ((ITheme) ((IStructuredSelection) themeViewer.getSelection()).getFirstElement());
                darkThemeButton.setSelection(theme.isDark());
                defaultThemeButton.setSelection(theme.isDefault());
                preview();
            }
        });

        // Specify default sorting
        table.setSortColumn(column1);
        table.setSortDirection(viewerComparator.getDirection());

        BidiUtils.applyTextDirection(themeViewer.getControl(), BidiUtils.BTD_DEFAULT);

        Composite buttons = new Composite(parent, SWT.NONE);
        buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        buttons.setLayout(layout);

        themeNewButton = new Button(buttons, SWT.PUSH);
        themeNewButton.setText(TMUIMessages.Button_new);
        themeNewButton.setLayoutData(getButtonGridData(themeNewButton));
        themeNewButton.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event e) {
                // add();
            }
        });

        themeRemoveButton = new Button(buttons, SWT.PUSH);
        themeRemoveButton.setText(TMUIMessages.Button_remove);
        themeRemoveButton.setLayoutData(getButtonGridData(themeRemoveButton));
        themeRemoveButton.addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event e) {
                // remove();
            }
        });
    }

    /**
     * Create theme detail content.
     * 
     * @param parent
     */
    private void createThemeDetailContent(Composite ancestor) {
        Composite parent = new Composite(ancestor, SWT.NONE);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 2;
        parent.setLayoutData(data);

        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.marginLeft = 0;
        layout.marginRight = 0;
        parent.setLayout(layout);

        darkThemeButton = new Button(parent, SWT.CHECK);
        darkThemeButton.setText(TMUIMessages.ThemePreferencePage_darkThemeButton_label);
        darkThemeButton.setEnabled(false);

        defaultThemeButton = new Button(parent, SWT.CHECK);
        defaultThemeButton.setText(TMUIMessages.ThemePreferencePage_defaultThemeButton_label);
        defaultThemeButton.setEnabled(false);
    }

    /**
     * Create theme associations content.
     * 
     * @param parent
     */
    private void createPreviewContent(Composite ancestor) {
        Composite parent = new Composite(ancestor, SWT.NONE);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 2;
        parent.setLayoutData(data);

        GridLayout layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        parent.setLayout(layout);

        previewViewer = doCreateViewer(parent);
    }

    private int computeMinimumColumnWidth(GC gc, String string) {
        return gc.stringExtent(string).x + 10; // pad 10 to accommodate table
        // header trimmings
    }

    /**
     * Return the grid data for the button.
     *
     * @param button
     *            the button
     * @return the grid data
     */
    private static GridData getButtonGridData(Button button) {
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        // TODO replace SWTUtil
        // data.widthHint= SWTUtil.getButtonWidthHint(button);
        // data.heightHint= SWTUtil.getButtonHeightHint(button);

        return data;
    }

    private void updateButtons() {
        themeNewButton.setEnabled(false);
        themeRemoveButton.setEnabled(false);
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible)
            setTitle(TMUIMessages.ThemePreferencePage_title);
    }

    @Override
    public void init(IWorkbench workbench) {
    }

    private void preview() {
        IStructuredSelection selection = (IStructuredSelection) themeViewer.getSelection();
        if (selection.isEmpty()) {
            return;
        }
        ITheme theme = (ITheme) selection.getFirstElement();

        selection = (IStructuredSelection) grammarViewer.getSelection();
        if (selection.isEmpty()) {
            return;
        }

        IGrammarDefinition definition = (IGrammarDefinition) selection.getFirstElement();

        // Preview the grammar
        IGrammar grammar = grammarRegistryManager.getGrammarForScope(definition.getScopeName());
        previewViewer.setTheme(theme);
        previewViewer.setGrammar(grammar);
    }

    private TMViewer doCreateViewer(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(TMUIMessages.ThemePreferencePage_preview);
        GridData data = new GridData();
        label.setLayoutData(data);

        grammarViewer = new ComboViewer(parent);
        grammarViewer.setContentProvider(new GrammarDefinitionContentProvider());
        grammarViewer.setLabelProvider(new GrammarDefinitionLabelProvider());
        grammarViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent e) {
                preview();
            }
        });
        grammarViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        TMViewer viewer = createViewer(parent);

        // Don't set caret to 'null' as this causes
        // https://bugs.eclipse.org/293263
        // viewer.getTextWidget().setCaret(null);

        Control control = viewer.getControl();
        data = new GridData(GridData.FILL_BOTH);
        data.horizontalSpan = 2;
        data.heightHint = convertHeightInCharsToPixels(5);
        control.setLayoutData(data);

        return viewer;
    }

    /**
     * Creates, configures and returns a source viewer to present the template
     * pattern on the preference page. Clients may override to provide a custom
     * source viewer featuring e.g. syntax coloring.
     *
     * @param parent
     *            the parent control
     * @return a configured source viewer
     */
    protected TMViewer createViewer(Composite parent) {
        return new TMViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
    }

}