/* * Copyright (C) 2002-2004 Andrea Mazzolini andreamazzolini@users.sourceforge.net * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.sqlexplorer.preferences; import net.sourceforge.sqlexplorer.IConstants; import net.sourceforge.sqlexplorer.Messages; import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin; import net.sourceforge.sqlexplorer.preferences.OverlayPreferenceStore.OverlayKey; import net.sourceforge.sqlexplorer.sqleditor.SQLTextViewer; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FontFieldEditor; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.FontData; 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.List; import org.eclipse.ui.IWorkbenchPreferencePage; /** * Preferences for SQL Substantial reworking of the preferences page for bug fixing and simplicity; see * GeneralPreferencePage for more details. * * This page uses OverlayPreferenceStore (copied from the Eclipse source because it's package private) to act as a * buffer between the controls onscreen and the IPreferenceStore provided by Eclipse for us to keep the user's choices * in. When the user click's OK, the settings in the OverlayPreferenceStore are copied into the Eclipse-provided store. * * This allows us to feed the preference store to other code so that we can preview the settings before they are * commited. * * When adding new fields, add an entry into the PREFERENCES array for the new type of it will not be persisted. * * @modified John Spackman */ public class SQLPreferencePage extends OverlaidPreferencePage implements IWorkbenchPreferencePage { private static final String BOLD = "_bold"; /* * Class which models the syntax highlighting settings for a given aspect of syntax */ private class Highlight { // Preference ID private String id; // Caption - eg "Table name" private String caption; public Highlight(String caption, String id) { super(); this.id = id; this.caption = caption; } }; // This is a list of all the preferences and their types which available on this page; the OverlayPreferenceStore // uses // this to determine whether it should store updated values, and if so which method to invoke public static final OverlayPreferenceStore.OverlayKey[] PREFERENCES = new OverlayPreferenceStore.OverlayKey[] { new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.FONT), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_MULTILINE_COMMENT), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_MULTILINE_COMMENT + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_TABLE), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_TABLE + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_COLUMS), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_COLUMS + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_SINGLE_LINE_COMMENT), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_SINGLE_LINE_COMMENT + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_DEFAULT), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_DEFAULT + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_STRING), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_STRING + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.SQL_KEYWORD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.SQL_KEYWORD + BOLD), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IConstants.CLIP_EXPORT_COLUMNS), new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IConstants.CLIP_EXPORT_SEPARATOR) }; // Syntax highlighting private final Highlight[] highlights = new Highlight[] { new Highlight(Messages.getString("SQL_Table_1"), IConstants.SQL_TABLE), new Highlight(Messages.getString("SQL_Column_2"), IConstants.SQL_COLUMS), new Highlight(Messages.getString("SQL_Keyword_3"), IConstants.SQL_KEYWORD), new Highlight(Messages.getString("SQL_Single_Line_Comment_4"), IConstants.SQL_SINGLE_LINE_COMMENT), new Highlight(Messages.getString("SQL_Multi_Line_Comment_5"), IConstants.SQL_MULTILINE_COMMENT), new Highlight(Messages.getString("String_6"), IConstants.SQL_STRING), new Highlight(Messages.getString("Others_7"), IConstants.SQL_DEFAULT) }; // FieldEditor for fonts private FontFieldEditor fontFieldEditor; /** * Constructor */ public SQLPreferencePage() { super(Messages.getString("Sql_Editor_Preferences_2"), GRID); } protected OverlayKey[] getSupportedPreferences() { return PREFERENCES; } /* * (non-JavaDoc) * * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() */ protected void createFieldEditors() { try { // Font picker fontFieldEditor = new FontFieldEditor(IConstants.FONT, Messages.getString("Text_Font__3"), getFieldEditorParent()); // MOD by zshen for bug 12046,save the font size. fontFieldEditor.setPreferenceStore(getPreferenceStore()); addField(fontFieldEditor); // ~12046 /* * Text Properties group */ Group colorGroup = new Group(getFieldEditorParent(), SWT.NULL); colorGroup.setLayout(new GridLayout()); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan = 3; colorGroup.setLayoutData(gd); colorGroup.setText(Messages.getString("Text_Properties_6")); Composite editorComposite = new Composite(colorGroup, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; editorComposite.setLayout(layout); gd = new GridData(GridData.FILL_BOTH); editorComposite.setLayoutData(gd); final List syntaxColorList = new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER); gd = new GridData(GridData.FILL_BOTH); gd.heightHint = convertHeightInCharsToPixels(5); syntaxColorList.setLayoutData(gd); for (int i = 0; i < highlights.length; i++) syntaxColorList.add(highlights[i].caption); Composite stylesComposite = new Composite(editorComposite, SWT.NONE); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.numColumns = 2; stylesComposite.setLayout(layout); stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); Label label = new Label(stylesComposite, SWT.LEFT); label.setText(Messages.getString("Color_9")); gd = new GridData(); gd.horizontalAlignment = GridData.BEGINNING; label.setLayoutData(gd); final ColorEditor syntaxForegroundColorEditor = new ColorEditor(stylesComposite); Button foregroundColorButton = syntaxForegroundColorEditor.getButton(); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalAlignment = GridData.BEGINNING; foregroundColorButton.setLayoutData(gd); foregroundColorButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int i = syntaxColorList.getSelectionIndex(); if (i >= 0) {// text attribute List has been select. PreferenceConverter.setValue(getPreferenceStore(), highlights[i].id, syntaxForegroundColorEditor .getColorValue()); } } }); final Button boldCheckBox = new Button(stylesComposite, SWT.CHECK); boldCheckBox.setText(Messages.getString("Bold_10")); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalAlignment = GridData.BEGINNING; gd.horizontalSpan = 2; boldCheckBox.setLayoutData(gd); boldCheckBox.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int i = syntaxColorList.getSelectionIndex(); getPreferenceStore().setValue(highlights[i].id + BOLD, boldCheckBox.getSelection()); } }); syntaxColorList.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int i = syntaxColorList.getSelectionIndex(); if (i > -1) { boldCheckBox.setSelection(getPreferenceStore().getBoolean(highlights[i].id + BOLD)); syntaxForegroundColorEditor.setColorValue(PreferenceConverter.getColor(getPreferenceStore(), highlights[i].id)); } } }); /* * Preview group */ Group previewGroup = new Group(getFieldEditorParent(), SWT.NULL); previewGroup.setLayout(new GridLayout()); gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan = 3; previewGroup.setLayoutData(gd); previewGroup.setText(Messages.getString("Preview_7")); Control previewer = createPreviewer(previewGroup); gd = new GridData(GridData.FILL_BOTH); previewer.setLayoutData(gd); /* * Export To Clipboard group */ Group exportGroup = new Group(getFieldEditorParent(), SWT.NULL); exportGroup.setLayout(new GridLayout()); exportGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); exportGroup.setText(Messages.getString("Export_to_Clipboard_1")); Label lbt1 = new Label(exportGroup, SWT.NULL); lbt1.setText("Separator"); final Button semiColon = new Button(exportGroup, SWT.RADIO); semiColon.setText(";"); final Button pipe = new Button(exportGroup, SWT.RADIO); pipe.setText("|"); final Button tab = new Button(exportGroup, SWT.RADIO); tab.setText("\\t [TAB]"); addAccessor(new Accessor() { public void load() { String value = getPreferenceStore().getString(IConstants.CLIP_EXPORT_SEPARATOR); if (value == null || value.length() < 1) value = ";"; loadValue(value.charAt(0)); } public void loadDefaults() { String value = getPreferenceStore().getDefaultString(IConstants.CLIP_EXPORT_SEPARATOR); if (value == null || value.length() < 1) value = ";"; loadValue(value.charAt(0)); } private void loadValue(char c) { semiColon.setSelection(c == ';'); pipe.setSelection(c == '|'); tab.setSelection(c == '\t'); } public void store() { String separator; if (semiColon.getSelection()) separator = ";"; else if (semiColon.getSelection()) separator = "|"; else separator = "\t"; getPreferenceStore().setValue(IConstants.CLIP_EXPORT_SEPARATOR, separator); } }); addField(new BooleanFieldEditor(IConstants.CLIP_EXPORT_COLUMNS, "Export column names", exportGroup)); } catch (Exception e) { SQLExplorerPlugin.error("Could not create SQL preference page", e); throw new RuntimeException(e); } } /** * Creates the synatx highlighting previewer * * @param parent * @return */ private Control createPreviewer(Composite parent) { final String separator = System.getProperty("line.separator"); final String content = Messages.getString("select_*_from_MyTable_--_single_line_comment_12") + separator + Messages.getString("/*_multi_line_comment_13") + separator + //$NON-NLS-2$ Messages.getString("select_*_14") + separator + Messages.getString("end_multi_line_comment*/_15") + separator + Messages.getString("where_A___1___16"); //$NON-NLS-2$ // Get a text viewer and load our sample into it final SQLTextViewer fPreviewViewer = new SQLTextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER, getPreferenceStore(), null); fPreviewViewer.setEditable(false); IDocument document = new Document(content); fPreviewViewer.setDocument(document); getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { fPreviewViewer.invalidateTextPresentation(); // MOD by zshen for bug 12046,save the font size. FontData fd = PreferenceConverter.getFontData(fontFieldEditor.getPreferenceStore(), IConstants.FONT); getPreferenceStore().setValue(IConstants.FONT, fd.toString()); // ~12046 } }); return fPreviewViewer.getControl(); } }