Java tutorial
/******************************************************************************* * 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()); } }