| /******************************************************************************* |
| * Copyright (c) 2000, 2011 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 |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.preferences; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Point; |
| 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.Link; |
| |
| import org.eclipse.core.runtime.Assert; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.layout.PixelConverter; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.util.IPropertyChangeListener; |
| import org.eclipse.jface.util.PropertyChangeEvent; |
| |
| import org.eclipse.ui.dialogs.PreferencesUtil; |
| |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; |
| |
| import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil; |
| import org.eclipse.jdt.internal.corext.util.Messages; |
| |
| import org.eclipse.jdt.ui.PreferenceConstants; |
| |
| import org.eclipse.jdt.internal.ui.JavaPlugin; |
| |
| |
| /** |
| * Configures Java Editor typing preferences. |
| * |
| * @since 3.1 |
| */ |
| class SmartTypingConfigurationBlock extends AbstractConfigurationBlock { |
| |
| public SmartTypingConfigurationBlock(OverlayPreferenceStore store) { |
| super(store); |
| |
| store.addKeys(createOverlayStoreKeys()); |
| } |
| |
| private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() { |
| |
| return new OverlayPreferenceStore.OverlayKey[] { |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SMART_PASTE), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_IMPORTS_ON_PASTE), |
| |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_CLOSE_STRINGS), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_CLOSE_BRACKETS), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_CLOSE_BRACES), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_CLOSE_JAVADOCS), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_WRAP_STRINGS), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_ESCAPE_STRINGS), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS), |
| |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SMART_SEMICOLON), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SMART_TAB), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SMART_OPENING_BRACE), |
| new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SMART_INDENT_AFTER_NEWLINE), |
| }; |
| } |
| |
| /** |
| * Creates page for mark occurrences preferences. |
| * |
| * @param parent the parent composite |
| * @return the control for the preference page |
| */ |
| public Control createControl(Composite parent) { |
| ScrolledPageContent scrolled= new ScrolledPageContent(parent, SWT.H_SCROLL | SWT.V_SCROLL); |
| scrolled.setExpandHorizontal(true); |
| scrolled.setExpandVertical(true); |
| |
| Composite control= new Composite(scrolled, SWT.NONE); |
| GridLayout layout= new GridLayout(); |
| layout.marginWidth= 0; |
| layout.marginHeight= 0; |
| control.setLayout(layout); |
| |
| addSmartInsertModeMessage(control); |
| |
| Composite composite; |
| |
| composite= createSubsection(control, null, PreferencesMessages.SmartTypingConfigurationBlock_autoclose_title); |
| addAutoclosingSection(composite); |
| |
| composite= createSubsection(control, null, PreferencesMessages.SmartTypingConfigurationBlock_automove_title); |
| addAutopositionSection(composite); |
| |
| composite= createSubsection(control, null, PreferencesMessages.SmartTypingConfigurationBlock_indentation_title); |
| addIndentationSection(composite); |
| |
| composite= createSubsection(control, null, PreferencesMessages.SmartTypingConfigurationBlock_pasting_title); |
| addPasteSection(composite); |
| |
| composite= createSubsection(control, null, PreferencesMessages.SmartTypingConfigurationBlock_strings_title); |
| addStringsSection(composite); |
| |
| scrolled.setContent(control); |
| final Point size= control.computeSize(SWT.DEFAULT, SWT.DEFAULT); |
| scrolled.setMinSize(size.x, size.y); |
| return scrolled; |
| } |
| |
| /** |
| * Adds the Smart Insert Mode note to the preference page. |
| * |
| * @param parent the parent composite |
| * @since 3.7 |
| */ |
| private void addSmartInsertModeMessage(Composite parent) { |
| Label label= new Label(parent, SWT.LEAD | SWT.WRAP); |
| label.setText(PreferencesMessages.JavaEditorPreferencePage_smartInsertMode_message); |
| |
| PixelConverter pixelConverter= new PixelConverter(parent); |
| Label fillerLabel= new Label(parent, SWT.LEFT); |
| GridData gridData= new GridData(GridData.HORIZONTAL_ALIGN_FILL); |
| gridData.horizontalSpan= 2; |
| gridData.heightHint= pixelConverter.convertHeightInCharsToPixels(1) / 2; |
| fillerLabel.setLayoutData(gridData); |
| } |
| |
| private void addStringsSection(Composite composite) { |
| GridLayout layout= new GridLayout(); |
| composite.setLayout(layout); |
| |
| String label; |
| label= PreferencesMessages.JavaEditorPreferencePage_wrapStrings; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_WRAP_STRINGS, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_escapeStrings; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_ESCAPE_STRINGS, 0); |
| } |
| |
| private void addPasteSection(Composite composite) { |
| GridLayout layout= new GridLayout(); |
| composite.setLayout(layout); |
| |
| String label; |
| label= PreferencesMessages.JavaEditorPreferencePage_smartPaste; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_SMART_PASTE, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_importsOnPaste; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_IMPORTS_ON_PASTE, 0); |
| } |
| |
| /** |
| * Adds Indentation section to the preference page. |
| * |
| * @param parent the parent composite |
| * @since 3.7 |
| */ |
| private void addIndentationSection(Composite parent) { |
| GridLayout layout= new GridLayout(); |
| parent.setLayout(layout); |
| |
| addCheckBox(parent, PreferencesMessages.JavaEditorPreferencePage_smartAutoIndentAfterNewLine, PreferenceConstants.EDITOR_SMART_INDENT_AFTER_NEWLINE, 0); |
| addCheckBox(parent, PreferencesMessages.JavaEditorPreferencePage_typing_smartTab, PreferenceConstants.EDITOR_SMART_TAB, 0); |
| |
| createMessage(parent); |
| } |
| |
| private void addAutopositionSection(Composite composite) { |
| |
| GridLayout layout= new GridLayout(); |
| composite.setLayout(layout); |
| |
| String label; |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_typing_smartSemicolon; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_SMART_SEMICOLON, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_typing_smartOpeningBrace; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_SMART_OPENING_BRACE, 0); |
| } |
| |
| private void addAutoclosingSection(Composite composite) { |
| |
| GridLayout layout= new GridLayout(); |
| layout.numColumns= 1; |
| composite.setLayout(layout); |
| |
| String label; |
| Button master, slave; |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_closeStrings; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_STRINGS, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_closeBrackets; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_BRACKETS, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_closeBraces; |
| addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_BRACES, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_closeJavaDocs; |
| master= addCheckBox(composite, label, PreferenceConstants.EDITOR_CLOSE_JAVADOCS, 0); |
| |
| label= PreferencesMessages.JavaEditorPreferencePage_addJavaDocTags; |
| slave= addCheckBox(composite, label, PreferenceConstants.EDITOR_ADD_JAVADOC_TAGS, 0); |
| createDependency(master, slave); |
| } |
| |
| private void createMessage(final Composite composite) { |
| // TODO create a link with an argument, so the formatter preference page can open the |
| // current profile automatically. |
| String linkTooltip= PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_tooltip; |
| String text; |
| String indentMode= JavaPlugin.getDefault().getCombinedPreferenceStore().getString(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR); |
| if (JavaCore.TAB.equals(indentMode)) |
| text= Messages.format(PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_tab_text, new String[] {Integer.toString(getTabDisplaySize())}); |
| else |
| text= Messages.format(PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_others_text, new String[] {Integer.toString(getTabDisplaySize()), Integer.toString(getIndentSize()), getIndentMode()}); |
| |
| final Link link= new Link(composite, SWT.NONE); |
| link.setText(text); |
| link.setToolTipText(linkTooltip); |
| GridData gd= new GridData(SWT.FILL, SWT.BEGINNING, true, false); |
| gd.widthHint= 300; // don't get wider initially |
| link.setLayoutData(gd); |
| link.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| PreferencesUtil.createPreferenceDialogOn(link.getShell(), "org.eclipse.jdt.ui.preferences.CodeFormatterPreferencePage", null, null); //$NON-NLS-1$ |
| } |
| }); |
| |
| final IPreferenceStore combinedStore= JavaPlugin.getDefault().getCombinedPreferenceStore(); |
| final IPropertyChangeListener propertyChangeListener= new IPropertyChangeListener() { |
| private boolean fHasRun= false; |
| public void propertyChange(PropertyChangeEvent event) { |
| if (fHasRun) |
| return; |
| if (composite.isDisposed()) |
| return; |
| String property= event.getProperty(); |
| if (DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR.equals(property) |
| || DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE.equals(property)) { |
| fHasRun= true; |
| link.dispose(); |
| createMessage(composite); |
| Dialog.applyDialogFont(composite); |
| composite.redraw(); |
| composite.layout(); |
| } |
| } |
| }; |
| combinedStore.addPropertyChangeListener(propertyChangeListener); |
| link.addDisposeListener(new DisposeListener() { |
| public void widgetDisposed(org.eclipse.swt.events.DisposeEvent e) { |
| combinedStore.removePropertyChangeListener(propertyChangeListener); |
| } |
| }); |
| } |
| |
| private String getIndentMode() { |
| String indentMode= JavaPlugin.getDefault().getCombinedPreferenceStore().getString(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR); |
| |
| if (JavaCore.SPACE.equals(indentMode)) |
| return PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_spaces; |
| |
| if (JavaCore.TAB.equals(indentMode)) |
| return PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_tabs; |
| |
| if (DefaultCodeFormatterConstants.MIXED.equals(indentMode)) |
| return PreferencesMessages.SmartTypingConfigurationBlock_tabs_message_tabsAndSpaces; |
| |
| Assert.isTrue(false, "Illegal indent mode - must not happen"); //$NON-NLS-1$ |
| return null; |
| } |
| |
| private int getIndentSize() { |
| return CodeFormatterUtil.getIndentWidth(null); |
| } |
| |
| private int getTabDisplaySize() { |
| return CodeFormatterUtil.getTabWidth(null); |
| } |
| |
| } |