de.itemis.tooling.terminology.ui.preferences.TerminologyBuilderPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for de.itemis.tooling.terminology.ui.preferences.TerminologyBuilderPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2013 itemis AG (http://www.itemis.eu).
 * 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
 ******************************************************************************/
package de.itemis.tooling.terminology.ui.preferences;

import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.xtext.builder.preferences.BuilderPreferencePage;
import org.eclipse.xtext.ui.editor.preferences.PreferenceStoreAccessImpl;
import org.eclipse.xtext.xbase.lib.Pair;

import com.google.common.collect.Maps;
import com.google.inject.Inject;

import de.itemis.tooling.terminology.generator.TerminologyGeneratorParticipant;
import de.itemis.tooling.terminology.ui.generator.TerminologyGenerators;

@SuppressWarnings("restriction")
public class TerminologyBuilderPreferencePage extends BuilderPreferencePage {

    private PreferenceStoreAccessImpl preferenceStoreAccess;
    private TerminologyGenerators generators;
    private Map<TerminologyGeneratorParticipant, Pair<Button, Text>> controls = Maps.newHashMap();

    @Inject
    public TerminologyBuilderPreferencePage(PreferenceStoreAccessImpl prefStoreAccess,
            TerminologyGenerators generators) {
        preferenceStoreAccess = prefStoreAccess;
        this.generators = generators;
    }

    @Override
    protected Control createPreferenceContent(Composite parent, IPreferencePageContainer preferencePageContainer) {
        if (generators.getGenerators(getProject()).size() > 0) {

            ExpandableComposite exComposite = createStyleSection(parent, "Terminology generators", 3);
            Composite composite = new Composite(exComposite, SWT.NONE);
            exComposite.setClient(composite);
            composite.setLayout(new GridLayout(3, false));

            new Label(composite, SWT.NONE).setText("Generator");
            new Label(composite, SWT.NONE).setText("active");
            new Label(composite, SWT.NONE).setText("subfolder");

            for (final TerminologyGeneratorParticipant generator : generators.getGenerators(getProject())) {
                new Label(composite, SWT.NONE).setText(generator.getDisplayName());
                final Button active = new Button(composite, SWT.CHECK);
                active.setData(generator);
                active.addSelectionListener(new SelectionAdapter() {
                    public void widgetSelected(SelectionEvent e) {
                        generator.setActive(active.getSelection());
                    }
                });
                final Text directory = new Text(composite, SWT.BORDER | SWT.SINGLE);
                GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
                textData.widthHint = 150;
                directory.setLayoutData(textData);
                directory.setData(generator);
                directory.addModifyListener(new ModifyListener() {
                    public void modifyText(ModifyEvent e) {
                        generator.setFolder(directory.getText());
                    }
                });
                controls.put(generator, Pair.of(active, directory));
            }
            updateControls(useProjectSettings());
        }
        Control result = super.createPreferenceContent(parent, preferencePageContainer);
        return result;
    }

    protected ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
        ExpandableComposite excomposite = new ExpandableComposite(parent, SWT.NONE,
                ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
        excomposite.setText(label);
        excomposite.setExpanded(false);
        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
        excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
        excomposite.addExpansionListener(new ExpansionAdapter() {
            @Override
            public void expansionStateChanged(ExpansionEvent e) {
                getShell().layout(true, true);
            }
        });
        return excomposite;
    }

    @Override
    public void performApply() {
        super.performApply();
        generators.apply(getPreferenceStore());

    }

    @Override
    public boolean performOk() {
        boolean result = super.performOk();
        generators.apply(getPreferenceStore());
        return result;
    }

    @Override
    protected void performDefaults() {
        super.performDefaults();
        generators.applyDefaults(getPreferenceStore());
        updateControls(useProjectSettings());
    }

    @Override
    protected void enableProjectSpecificSettings(boolean useProjectSpecificSettings) {
        super.enableProjectSpecificSettings(useProjectSpecificSettings);
        updateControls(useProjectSpecificSettings);
    }

    private void updateControls(boolean useProjectSpecificSettings) {
        boolean activated = !isProjectPreferencePage() || useProjectSpecificSettings;
        for (TerminologyGeneratorParticipant generator : generators.getGenerators(getProject())) {
            Pair<Button, Text> pair = controls.get(generator);
            if (pair != null) {
                pair.getKey().setSelection(generator.isActive());
                pair.getValue().setText(generator.getFolder());
                pair.getKey().setEnabled(activated);
                pair.getValue().setEnabled(activated);
            }
        }
    }

    @Override
    protected boolean hasProjectSpecificOptions(IProject project) {
        return super.hasProjectSpecificOptions(project)
                || preferenceStoreAccess.getContextPreferenceStore(project).getBoolean("is_project_specific");
    }

    @Override
    protected IPreferenceStore doGetPreferenceStore() {
        return preferenceStoreAccess.getWritablePreferenceStore(getProject());
    }
}