/** * <copyright> * </copyright> * * */ package org.dresdenocl.language.ocl.resource.ocl.ui; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.eclipse.jface.preference.ColorSelector; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; /** * <p> * The preference page for the bracket setting with following features: * </p> * <p> * <ul> * </p> * <p> * <li>enables bracket matching</li> * </p> * <p> * <li>chooses matching highlight color</li> * </p> * <p> * <li>customizes bracket set</li> * </p> * <p> * </ul> * </p> */ public class OclBracketPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private static final String[] ALL_LEFT_BRACKETS = new String[] { "{", "(", "[", "<", "\"", "'", }; private static final String[] ALL_RIGHT_BRACKETS = new String[] { "}", ")", "]", ">", "\"", "'", }; private String BRACKETS_COLOR = org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR; private Set<String> languageIDs = new LinkedHashSet<String>(); private ColorSelector matchingBracketsColorEditor; private Label colorEditorLabel; private Button enableCheckbox; private Button enableClosingInside; private Button enableCloseAfterEnter; private Button matchingBracketsColorButton; private Label bracketTokensLabel; private Combo leftBracketTokensCombo; private Combo rightBracketTokensCombo; private List bracketsList; private Button addBracketButton; private Button removeBracketButton; private Map<String, String> bracketSetTemp = new LinkedHashMap<String, String>(); private String language = new org.dresdenocl.language.ocl.resource.ocl.mopp.OclMetaInformation().getSyntaxName(); private org.dresdenocl.language.ocl.resource.ocl.ui.OclBracketSet bracketsTmp; /** * Creates a preference page for bracket setting. */ public OclBracketPreferencePage() { super(); org.dresdenocl.language.ocl.resource.ocl.IOclMetaInformation metaInformation = new org.dresdenocl.language.ocl.resource.ocl.mopp.OclMetaInformation(); String languageId = metaInformation.getSyntaxName(); languageIDs.add(languageId); } /** * * @see IWorkbenchPreferencePage#init(IWorkbench) */ public void init(IWorkbench workbench) { setPreferenceStore(org.dresdenocl.language.ocl.resource.ocl.ui.OclUIPlugin.getDefault().getPreferenceStore()); setDescription("Define the coloring of matching brackets."); bracketsTmp = new org.dresdenocl.language.ocl.resource.ocl.ui.OclBracketSet(); for (String languageID : languageIDs) { bracketSetTemp.put(languageID, getPreferenceStore().getString(languageID + org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_BRACKETS_SUFFIX)); } } @Override protected Control createContents(Composite parent) { // outer Composite Composite settingComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); GridData gd; layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; gd = new GridData(GridData.BEGINNING); settingComposite.setLayout(layout); settingComposite.setLayoutData(gd); enableCheckbox = new Button(settingComposite, SWT.CHECK); enableCheckbox.setText("Enable"); gd = new GridData(GridData.BEGINNING); gd.horizontalAlignment = GridData.BEGINNING; gd.horizontalSpan = 2; enableCheckbox.setLayoutData(gd); colorEditorLabel = new Label(settingComposite, SWT.LEFT); colorEditorLabel.setText("Color:"); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = 20; colorEditorLabel.setLayoutData(gd); matchingBracketsColorEditor = new ColorSelector(settingComposite); matchingBracketsColorButton = matchingBracketsColorEditor.getButton(); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); matchingBracketsColorButton.setLayoutData(gd); Composite tokenSelectionComposite = new Composite(settingComposite, SWT.NONE); layout = new GridLayout(); layout.numColumns = 3; layout.marginHeight = 0; layout.marginWidth = 0; gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.verticalIndent = 20; tokenSelectionComposite.setLayout(layout); tokenSelectionComposite.setLayoutData(gd); bracketTokensLabel = new Label(tokenSelectionComposite, SWT.LEFT); gd = new GridData(GridData.BEGINNING); gd.horizontalSpan = 3; bracketTokensLabel.setText("Add new bracket pair"); bracketTokensLabel.setLayoutData(gd); leftBracketTokensCombo = new Combo(tokenSelectionComposite,SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(GridData.BEGINNING); leftBracketTokensCombo.setLayoutData(gd); rightBracketTokensCombo = new Combo(tokenSelectionComposite,SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(GridData.FILL); rightBracketTokensCombo.setLayoutData(gd); addBracketButton = new Button(tokenSelectionComposite, SWT.PUSH); addBracketButton.setText("Add"); addBracketButton.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); Label configurePairsLabel = new Label(tokenSelectionComposite, SWT.LEFT); gd = new GridData(GridData.BEGINNING); gd.horizontalSpan = 3; gd.verticalIndent = 20; configurePairsLabel.setText("Configure bracket pairs"); configurePairsLabel.setLayoutData(gd); bracketsList = new List(tokenSelectionComposite, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.CENTER, GridData.FILL, false, true); gd.horizontalSpan = 2; gd.verticalSpan = 4; gd.widthHint = 100; gd.heightHint = 300; bracketsList.setLayoutData(gd); enableClosingInside = new Button(tokenSelectionComposite, SWT.CHECK); enableClosingInside.setText("Enable closing inside"); enableClosingInside.setToolTipText("If this option is enabled, other bracket pair can close inside this pair automatically."); enableClosingInside.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); enableClosingInside.setEnabled(false); enableCloseAfterEnter = new Button(tokenSelectionComposite, SWT.CHECK); enableCloseAfterEnter.setText("Enable close after enter"); enableCloseAfterEnter.setToolTipText("If this option is enabled the closing bracket is only inserted when the enter key is pressed."); enableCloseAfterEnter.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); enableCloseAfterEnter.setEnabled(false); removeBracketButton = new Button(tokenSelectionComposite, SWT.PUSH); removeBracketButton.setText("Remove"); removeBracketButton.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); addListenersToStyleButtons(); settingComposite.layout(false); handleMatchingBracketsSelection(); return settingComposite; } /** * Initialize and handle the values of this preference page. */ private void handleMatchingBracketsSelection() { // not for the case of none existing language enableCheckbox.setSelection(getPreferenceStore().getBoolean(org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_MATCHING_BRACKETS_CHECKBOX)); enableClosingInside.setSelection(false); matchingBracketsColorButton.setEnabled(getPreferenceStore().getBoolean( org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_MATCHING_BRACKETS_CHECKBOX)); RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), BRACKETS_COLOR); matchingBracketsColorEditor.setColorValue(rgb); removeBracketButton.setEnabled(false); initializeLanguage(); bracketsTmp.deserialize(getPreferenceStore().getString(language + org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_BRACKETS_SUFFIX)); String[] brackets = bracketsTmp.getBracketArray(); if (brackets != null) { bracketsList.setItems(brackets); } } public void initializeLanguage() { bracketSetTemp.put(language, bracketsTmp.serialize()); bracketsTmp.deserialize(bracketSetTemp.get(language)); leftBracketTokensCombo.setItems(ALL_LEFT_BRACKETS); leftBracketTokensCombo.select(0); rightBracketTokensCombo.setItems(ALL_RIGHT_BRACKETS); rightBracketTokensCombo.select(0); bracketsList.setItems(bracketsTmp.getBracketArray()); } private void addListenersToStyleButtons() { enableCheckbox.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { matchingBracketsColorButton.setEnabled(enableCheckbox.getSelection()); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); addBracketButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { String open = leftBracketTokensCombo.getText(); String close = rightBracketTokensCombo.getText(); if (bracketsTmp.isBracket(open) || bracketsTmp.isBracket(close)) { setErrorMessage("One or both bracket parts are set!"); } else { bracketsTmp.addBracketPair(open, close, enableClosingInside.getSelection(), enableCloseAfterEnter.getSelection()); bracketsList.setItems(bracketsTmp.getBracketArray()); setErrorMessage(null); bracketSetTemp.put(language, bracketsTmp.serialize()); } } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); removeBracketButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { bracketsTmp.removeBracketPairs(bracketsList.getSelection()); setErrorMessage(null); bracketsList.setItems(bracketsTmp.getBracketArray()); bracketSetTemp.put(language, bracketsTmp.serialize()); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); bracketsList.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { org.dresdenocl.language.ocl.resource.ocl.IOclBracketPair bracketPair = getSelectedBracketPair(); if (bracketPair == null) { removeBracketButton.setEnabled(false); return; } enableClosingInside.setEnabled(true); enableCloseAfterEnter.setEnabled(true); enableClosingInside.setSelection(bracketPair.isClosingEnabledInside()); enableCloseAfterEnter.setSelection(bracketPair.isCloseAfterEnter()); removeBracketButton.setEnabled(true); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); enableClosingInside.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { org.dresdenocl.language.ocl.resource.ocl.IOclBracketPair bracketPair = getSelectedBracketPair(); if (bracketPair != null) { boolean closingEnabledInside = enableClosingInside.getSelection(); bracketPair.setClosingEnabledInside(closingEnabledInside); } bracketSetTemp.put(language, bracketsTmp.serialize()); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); enableCloseAfterEnter.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { org.dresdenocl.language.ocl.resource.ocl.IOclBracketPair bracketPair = getSelectedBracketPair(); if (bracketPair != null) { boolean closeAfterEnter = enableCloseAfterEnter.getSelection(); bracketPair.setCloseAfterEnter(closeAfterEnter); } bracketSetTemp.put(language, bracketsTmp.serialize()); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); } /** * Sets the default values for this preference page. */ protected void performDefaults() { IPreferenceStore preferenceStore = getPreferenceStore(); enableCheckbox.setSelection(preferenceStore.getDefaultBoolean(org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_MATCHING_BRACKETS_CHECKBOX)); matchingBracketsColorButton.setEnabled(enableCheckbox.getSelection()); matchingBracketsColorEditor.setColorValue(PreferenceConverter.getDefaultColor(preferenceStore, BRACKETS_COLOR)); String defaultBrackets = preferenceStore.getDefaultString(language + org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_BRACKETS_SUFFIX); bracketSetTemp.put(language, defaultBrackets); bracketsTmp.deserialize(bracketSetTemp.get(language)); bracketsList.setItems(bracketsTmp.getBracketArray()); // Reset check boxes and disable them because no item is selected in the // bracketsList component. enableClosingInside.setSelection(false); enableCloseAfterEnter.setSelection(false); enableClosingInside.setEnabled(false); enableCloseAfterEnter.setEnabled(false); } public boolean performOk() { if (!super.performOk()) { return false; } updateActiveEditor(); return true; } protected void performApply() { updateActiveEditor(); } /** * Sets the chosen options to the preference store and refreshes it in the editor. */ private void updateActiveEditor() { // set the values after ok or apply IPreferenceStore preferenceStore = getPreferenceStore(); PreferenceConverter.setValue(preferenceStore, BRACKETS_COLOR, matchingBracketsColorEditor.getColorValue()); preferenceStore.setValue(org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_MATCHING_BRACKETS_CHECKBOX, enableCheckbox.getSelection()); preferenceStore.setValue(language + org.dresdenocl.language.ocl.resource.ocl.ui.OclPreferenceConstants.EDITOR_BRACKETS_SUFFIX, bracketSetTemp.get(language)); IWorkbench workbench = org.eclipse.ui.PlatformUI.getWorkbench(); IEditorPart editor = workbench.getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if (editor != null && editor instanceof org.dresdenocl.language.ocl.resource.ocl.ui.OclEditor) { ((org.dresdenocl.language.ocl.resource.ocl.ui.OclEditor) editor).invalidateTextRepresentation(); } } protected org.dresdenocl.language.ocl.resource.ocl.IOclBracketPair getSelectedBracketPair() { int[] itemIndices = bracketsList.getSelectionIndices(); if (itemIndices == null || itemIndices.length != 1) { // The bracketsList component is set to single selection. Thus, we expect exactly // one selected item. return null; } int index = itemIndices[0]; return bracketsTmp.getBracketPair(index); } }