/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.internal.ui.preferences; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import tern.eclipse.ide.internal.ui.TernUIMessages; import tern.eclipse.ide.ui.ImageResource; import tern.eclipse.ide.ui.TernUIPlugin; import tern.eclipse.ide.ui.preferences.PropertyPreferencePage; /** * Tern content assist preferences page used for global and project preferences. * */ public class TernContentAssistPreferencesPage extends PropertyPreferencePage { public static final String PROPERTY_PAGE_ID = "tern.eclipse.ide.ui.properties.contentassist"; public static final String PREFERENCE_PAGE_ID = "tern.eclipse.ide.ui.preferences.contentassist"; private final IPreferencesService fPreferencesService; private Button generateAnonymousFunctionCheckbox; private Button expandFunctionCheckbox; private Button omitObjectPrototype; private Button guess; private Text indentSizeText; private Button indentTabsButton; public TernContentAssistPreferencesPage() { setImageDescriptor(ImageResource .getImageDescriptor(ImageResource.IMG_LOGO)); fPreferencesService = Platform.getPreferencesService(); } @Override protected Control createCommonContents(Composite parent) { final Composite page = new Composite(parent, SWT.NULL); page.setLayout(new GridLayout()); IScopeContext[] preferenceScopes = createPreferenceScopes(); // Insertion panel createInsertionContents(page, preferenceScopes); // Filtering panel createFilteringContents(page, preferenceScopes); return page; } /** * Create "Filtering" contents panel. * * @param parent * @param preferenceScopes */ private void createFilteringContents(final Composite parent, IScopeContext[] preferenceScopes) { Group filteringGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); filteringGroup .setText(TernUIMessages.TernContentAssistPreferencesPage_filteringGroup_label); filteringGroup.setLayout(new GridLayout()); filteringGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); expandFunctionCheckbox = createCheckbox( filteringGroup, TernUIPreferenceConstants.EXPAND_FUNCTION_CONTENT_ASSIST, preferenceScopes, TernUIMessages.TernContentAssistPreferencesPage_expandFunction_label); omitObjectPrototype = createCheckbox( filteringGroup, TernUIPreferenceConstants.OMIT_OBJECT_PROTOTYPE_CONTENT_ASSIST, preferenceScopes, TernUIMessages.TernContentAssistPreferencesPage_omitObjectPrototype_label); guess = createCheckbox(filteringGroup, TernUIPreferenceConstants.GUESS_CONTENT_ASSIST, preferenceScopes, TernUIMessages.TernContentAssistPreferencesPage_guess_label); } /** * Create "Insertion" contents panel. * * @param parent * @param preferenceScopes */ private void createInsertionContents(final Composite parent, IScopeContext[] preferenceScopes) { Group insertionGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); insertionGroup .setText(TernUIMessages.TernContentAssistPreferencesPage_insertionGroup_label); insertionGroup.setLayout(new GridLayout()); insertionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createIndentContent(insertionGroup, preferenceScopes); // Function Insertion createFunctionInsertionContents(insertionGroup, preferenceScopes); // Object literal Insertion createObjLitInsertionContents(insertionGroup, preferenceScopes); } private void createIndentContent(Composite ancestor, IScopeContext[] preferenceScopes) { Composite parent = new Composite(ancestor, SWT.NONE); parent.setLayout(new GridLayout(4, false)); parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label indentLabel = new Label(parent, SWT.NONE); indentLabel .setText(TernUIMessages.TernContentAssistPreferencesPage_indentation_label); indentSizeText = new Text(parent, SWT.BORDER); updateTextInt(indentSizeText, TernUIPreferenceConstants.INDENT_SIZE_CONTENT_ASSIST, preferenceScopes); Button indentSpacesButton = new Button(parent, SWT.RADIO); indentSpacesButton.setText("Spaces"); indentTabsButton = new Button(parent, SWT.RADIO); indentTabsButton.setText("Tabs"); updateCheckbox(indentTabsButton, TernUIPreferenceConstants.INDENT_TABS_CONTENT_ASSIST, preferenceScopes); indentSpacesButton.setSelection(!indentTabsButton.getSelection()); /* * ComboViewer indentationCombo = createComboViewer( insertionGroup, * TernUIPreferenceConstants.INDENTATION_CONTENT_ASSIST, * preferenceScopes, * TernUIMessages.TernContentAssistPreferencesPage_indentation_label); */ } private void createFunctionInsertionContents(Composite parent, IScopeContext[] preferenceScopes) { Group insertionGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); insertionGroup .setText(TernUIMessages.TernContentAssistPreferencesPage_functionInsertionGroup_label); insertionGroup.setLayout(new GridLayout()); insertionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); generateAnonymousFunctionCheckbox = createCheckbox( insertionGroup, TernUIPreferenceConstants.GENERATE_ANONYMOUS_FUNCTION_CONTENT_ASSIST, preferenceScopes, TernUIMessages.TernContentAssistPreferencesPage_generateAnonymousFunction_label); } private void createObjLitInsertionContents(Composite parent, IScopeContext[] preferenceScopes) { Group insertionGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); insertionGroup .setText(TernUIMessages.TernContentAssistPreferencesPage_objLitInsertionGroup_label); insertionGroup.setLayout(new GridLayout()); insertionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } private ComboViewer createComboViewer(Composite ancestor, String preferenceName, IScopeContext[] preferenceScopes, String label) { Composite parent = new Composite(ancestor, SWT.NONE); parent.setLayout(new GridLayout(2, false)); parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label comboLabel = new Label(parent, SWT.NONE); comboLabel.setText(label); ComboViewer viewer = new ComboViewer(parent); return viewer; } private Button createCheckbox(Composite parent, String preferenceName, IScopeContext[] preferenceScopes, String label) { Button checkbox = new Button(parent, SWT.CHECK); checkbox.setText(label); //$NON-NLS-1$ checkbox.setLayoutData(new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_END, false, false, 1, 1)); updateCheckbox(checkbox, preferenceName, preferenceScopes); return checkbox; } private void updateCheckbox(Button checkbox, String preferenceName, IScopeContext[] preferenceScopes) { boolean checked = fPreferencesService.getBoolean( getPreferenceNodeQualifier(), preferenceName, true, preferenceScopes); checkbox.setSelection(checked); } private void updateCheckbox(Button checkbox, String preferenceName, IEclipsePreferences defaultPreferences) { boolean checked = defaultPreferences.getBoolean(preferenceName, false); checkbox.setSelection(checked); } private void updateTextInt(Text text, String preferenceName, IScopeContext[] preferenceScopes) { int value = fPreferencesService.getInt(getPreferenceNodeQualifier(), preferenceName, 1, preferenceScopes); text.setText(String.valueOf(value)); } private void updateTextAsInt(Text text, String preferenceName, IEclipsePreferences defaultPreferences) { int value = defaultPreferences.getInt(preferenceName, 1); text.setText(String.valueOf(value)); } @Override protected void performDefaults() { super.performDefaults(); IEclipsePreferences defaultPreferences = createPreferenceScopes()[1] .getNode(getPreferenceNodeQualifier()); updateCheckbox( generateAnonymousFunctionCheckbox, TernUIPreferenceConstants.GENERATE_ANONYMOUS_FUNCTION_CONTENT_ASSIST, defaultPreferences); updateTextAsInt(indentSizeText, TernUIPreferenceConstants.INDENT_SIZE_CONTENT_ASSIST, defaultPreferences); updateCheckbox(indentTabsButton, TernUIPreferenceConstants.INDENT_TABS_CONTENT_ASSIST, defaultPreferences); updateCheckbox(expandFunctionCheckbox, TernUIPreferenceConstants.EXPAND_FUNCTION_CONTENT_ASSIST, defaultPreferences); updateCheckbox(omitObjectPrototype, TernUIPreferenceConstants.OMIT_OBJECT_PROTOTYPE_CONTENT_ASSIST, defaultPreferences); updateCheckbox(guess, TernUIPreferenceConstants.GUESS_CONTENT_ASSIST, defaultPreferences); } @Override public boolean performOk() { boolean ok = super.performOk(); IScopeContext[] contexts = createPreferenceScopes(); // remove project-specific information if it's not enabled boolean remove = getProject() != null && !isElementSettingsEnabled(); updateContexts( generateAnonymousFunctionCheckbox, TernUIPreferenceConstants.GENERATE_ANONYMOUS_FUNCTION_CONTENT_ASSIST, contexts, remove); updateContextsAsInt(indentSizeText, TernUIPreferenceConstants.INDENT_SIZE_CONTENT_ASSIST, contexts, remove); updateContexts(indentTabsButton, TernUIPreferenceConstants.INDENT_TABS_CONTENT_ASSIST, contexts, remove); updateContexts(expandFunctionCheckbox, TernUIPreferenceConstants.EXPAND_FUNCTION_CONTENT_ASSIST, contexts, remove); updateContexts(omitObjectPrototype, TernUIPreferenceConstants.OMIT_OBJECT_PROTOTYPE_CONTENT_ASSIST, contexts, remove); updateContexts(guess, TernUIPreferenceConstants.GUESS_CONTENT_ASSIST, contexts, remove); flushContexts(contexts); return ok; } private void updateContexts(Button checkbox, String preferenceName, IScopeContext[] contexts, boolean remove) { if (remove) { contexts[0].getNode(getPreferenceNodeQualifier()).remove( preferenceName); } else { contexts[0].getNode(getPreferenceNodeQualifier()).putBoolean( preferenceName, checkbox.getSelection()); } } private void updateContextsAsInt(Text text, String preferenceName, IScopeContext[] contexts, boolean remove) { if (remove) { contexts[0].getNode(getPreferenceNodeQualifier()).remove( preferenceName); } else { try { contexts[0].getNode(getPreferenceNodeQualifier()).putInt( preferenceName, Integer.parseInt(text.getText())); } catch (Throwable e) { } } } @Override protected String getPreferenceNodeQualifier() { return TernUIPlugin.getDefault().getBundle().getSymbolicName(); } @Override protected String getPreferencePageID() { return PREFERENCE_PAGE_ID; } @Override protected String getProjectSettingsKey() { return TernUIPreferenceConstants.CONTENT_ASSIST_USE_PROJECT_SETTINGS; } @Override protected String getPropertyPageID() { return PROPERTY_PAGE_ID; } @Override public void init(IWorkbench workbencsh) { } }