X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/preferences/XMLSyntaxPreferencePage.java b/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/preferences/XMLSyntaxPreferencePage.java new file mode 100644 index 0000000..d55505a --- /dev/null +++ b/net.sourceforge.phpeclipse.xml.ui/src/net/sourceforge/phpeclipse/xml/ui/internal/preferences/XMLSyntaxPreferencePage.java @@ -0,0 +1,498 @@ +/* + * Copyright (c) 2002-2004 Roberto Gonzalez Rocha and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Roberto Gonzalez Rocha - Initial version + * Igor Malinin - refactoring, minor changes + * + * $Id: XMLSyntaxPreferencePage.java,v 1.1 2004-09-02 18:28:03 jsurfer Exp $ + */ + +package net.sourceforge.phpeclipse.xml.ui.internal.preferences; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.jface.text.source.SourceViewer; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.List; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; +import org.eclipse.ui.texteditor.AbstractTextEditor; + +import net.sourceforge.phpeclipse.ui.ColorEditor; +import net.sourceforge.phpeclipse.ui.preferences.ITextStylePreferences; +import net.sourceforge.phpeclipse.ui.preferences.OverlayPreferenceStore; +import net.sourceforge.phpeclipse.ui.preferences.PreferenceDescriptor; +import net.sourceforge.phpeclipse.xml.ui.XMLPlugin; +import net.sourceforge.phpeclipse.xml.ui.internal.text.XMLConfiguration; +import net.sourceforge.phpeclipse.xml.ui.text.IXMLSyntaxConstants; +import net.sourceforge.phpeclipse.xml.ui.text.XMLTextTools; + +/** + * The XMLSyntaxPreferencePage is a preference page that handles setting the colors used by the XML editors. + */ +public class XMLSyntaxPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { + + public final PreferenceDescriptor[] fKeys = new PreferenceDescriptor[] { + new PreferenceDescriptor(PreferenceDescriptor.BOOLEAN, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT), + new PreferenceDescriptor(PreferenceDescriptor.STRING, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_DEFAULT + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_DEFAULT + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_TAG + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_TAG + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ATT_NAME + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ATT_NAME + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ATT_VALUE + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ATT_VALUE + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ENTITY + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_ENTITY + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_CDATA + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_CDATA + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_PI + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_PI + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_COMMENT + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_COMMENT + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_DECL + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_DECL + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_SMARTY + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.XML_SMARTY + ITextStylePreferences.SUFFIX_STYLE), + + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.DTD_CONDITIONAL + + ITextStylePreferences.SUFFIX_FOREGROUND), + new PreferenceDescriptor(PreferenceDescriptor.STRING, IXMLSyntaxConstants.DTD_CONDITIONAL + + ITextStylePreferences.SUFFIX_STYLE),}; + + OverlayPreferenceStore overlay; + + final String[][] fSyntaxColorListModel = new String[][] { { + XMLPlugin.getResourceString("XmlSyntaxPreferencePage.others"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_DEFAULT }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.Tag"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_TAG }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.AttName"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_ATT_NAME }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.AttValue"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_ATT_VALUE }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.Entity"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_ENTITY }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.CDATA"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_CDATA }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.PI"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_PI }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.Comment"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_COMMENT }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.Declaration"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_DECL }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.Conditional"), //$NON-NLS-1$ + IXMLSyntaxConstants.XML_SMARTY }, { XMLPlugin.getResourceString("XmlSyntaxPreferencePage.SmartyTag"), //$NON-NLS-1$ + IXMLSyntaxConstants.DTD_CONDITIONAL }, + }; + + private XMLTextTools xmlTextTools; + + private Color bgColor; + + Button bgDefault; + + Button bgCustom; + + ColorEditor bgColorEditor; + + List colors; + + ColorEditor fgColorEditor; + + Button fgBold; + + SourceViewer preview; + + /** + * Constructor for XMLSyntaxPreferencePage. + */ + public XMLSyntaxPreferencePage() { + setDescription(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.description")); //$NON-NLS-1$ + + setPreferenceStore(XMLPlugin.getDefault().getPreferenceStore()); + + overlay = new OverlayPreferenceStore(getPreferenceStore(), fKeys); + } + + protected Control createContents(Composite parent) { + overlay.load(); + overlay.start(); + + Composite colorComposite = new Composite(parent, SWT.NULL); + colorComposite.setLayout(new GridLayout()); + + Group backgroundComposite = new Group(colorComposite, SWT.SHADOW_ETCHED_IN); + + backgroundComposite.setLayout(new RowLayout()); + backgroundComposite.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.backgroundColor")); //$NON-NLS-1$ + + SelectionListener backgroundSelectionListener = new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + boolean custom = bgCustom.getSelection(); + bgColorEditor.getButton().setEnabled(custom); + overlay.setValue(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT, !custom); + } + + public void widgetDefaultSelected(SelectionEvent e) { + } + }; + + bgDefault = new Button(backgroundComposite, SWT.RADIO | SWT.LEFT); + bgDefault.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.systemDefault")); //$NON-NLS-1$ + bgDefault.addSelectionListener(backgroundSelectionListener); + + bgCustom = new Button(backgroundComposite, SWT.RADIO | SWT.LEFT); + bgCustom.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.custom")); //$NON-NLS-1$ + bgCustom.addSelectionListener(backgroundSelectionListener); + + bgColorEditor = new ColorEditor(backgroundComposite); + + Label label = new Label(colorComposite, SWT.LEFT); + label.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.foreground")); //$NON-NLS-1$ + label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Composite editorComposite = new Composite(colorComposite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + layout.marginHeight = 0; + layout.marginWidth = 0; + editorComposite.setLayout(layout); + GridData gd = new GridData(GridData.FILL_BOTH); + editorComposite.setLayoutData(gd); + + colors = new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER); + gd = new GridData(GridData.FILL_BOTH); + gd.heightHint = convertHeightInCharsToPixels(5); + colors.setLayoutData(gd); + + 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 = new Label(stylesComposite, SWT.LEFT); + label.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.color")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalAlignment = GridData.BEGINNING; + label.setLayoutData(gd); + + fgColorEditor = new ColorEditor(stylesComposite); + + Button fgColorButton = fgColorEditor.getButton(); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalAlignment = GridData.BEGINNING; + fgColorButton.setLayoutData(gd); + + label = new Label(stylesComposite, SWT.LEFT); + label.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.bold")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalAlignment = GridData.BEGINNING; + label.setLayoutData(gd); + + fgBold = new Button(stylesComposite, SWT.CHECK); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalAlignment = GridData.BEGINNING; + fgBold.setLayoutData(gd); + + label = new Label(colorComposite, SWT.LEFT); + label.setText(XMLPlugin.getResourceString("XmlSyntaxPreferencePage.preview")); //$NON-NLS-1$ + label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Control previewer = createPreviewer(colorComposite); + gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = convertWidthInCharsToPixels(20); + gd.heightHint = convertHeightInCharsToPixels(5); + previewer.setLayoutData(gd); + + colors.addSelectionListener(new SelectionListener() { + + public void widgetDefaultSelected(SelectionEvent e) { + } + + public void widgetSelected(SelectionEvent e) { + handleSyntaxColorListSelection(); + } + }); + + bgColorEditor.getButton().addSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent e) { + } + + public void widgetSelected(SelectionEvent e) { + PreferenceConverter.setValue(overlay, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, bgColorEditor.getColorValue()); + } + }); + + fgColorButton.addSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent e) { + } + + public void widgetSelected(SelectionEvent e) { + int i = colors.getSelectionIndex(); + + String key = fSyntaxColorListModel[i][1]; + + PreferenceConverter.setValue(overlay, key + ITextStylePreferences.SUFFIX_FOREGROUND, fgColorEditor.getColorValue()); + } + }); + + fgBold.addSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent e) { + } + + public void widgetSelected(SelectionEvent e) { + int i = colors.getSelectionIndex(); + + String key = fSyntaxColorListModel[i][1]; + + String value = (fgBold.getSelection()) ? ITextStylePreferences.STYLE_BOLD : ITextStylePreferences.STYLE_NORMAL; + + overlay.setValue(key + ITextStylePreferences.SUFFIX_STYLE, value); + } + }); + + initialize(); + + return colorComposite; + } + + private Control createPreviewer(Composite parent) { + xmlTextTools = new XMLTextTools(overlay); // REVISIT: DTD + + preview = new SourceViewer(parent, null, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); + + preview.configure(new XMLConfiguration(xmlTextTools)); + preview.getTextWidget().setFont(JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT)); + preview.setEditable(false); + + initializeViewerColors(preview); + + String content = loadPreviewContentFromFile("preview.xml"); //$NON-NLS-1$ + IDocument document = new Document(content); + + // REVISIT: DTD + IDocumentPartitioner partitioner = xmlTextTools.createXMLPartitioner(); + + partitioner.connect(document); + document.setDocumentPartitioner(partitioner); + + preview.setDocument(document); + + overlay.addPropertyChangeListener(new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + String p = event.getProperty(); + if (p.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND) + || p.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { + initializeViewerColors(preview); + } + + preview.invalidateTextPresentation(); + } + }); + + return preview.getControl(); + } + + /** + * Initializes the given viewer's colors. + * + * @param viewer + * the viewer to be initialized + */ + void initializeViewerColors(ISourceViewer viewer) { + if (overlay != null) { + StyledText styledText = viewer.getTextWidget(); + + // ---------- background color ---------------------- + Color color = null; + if (!overlay.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { + color = createColor(overlay, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay()); + } + + styledText.setBackground(color); + + if (bgColor != null) { + bgColor.dispose(); + } + + bgColor = color; + } + } + + /** + * Creates a color from the information stored in the given preference store. Returns null if there is no such + * information available. + */ + private Color createColor(IPreferenceStore store, String key, Display display) { + RGB rgb = null; + + if (store.contains(key)) { + if (store.isDefault(key)) { + rgb = PreferenceConverter.getDefaultColor(store, key); + } else { + rgb = PreferenceConverter.getColor(store, key); + } + + if (rgb != null) { + return new Color(display, rgb); + } + } + + return null; + } + + void handleSyntaxColorListSelection() { + int i = colors.getSelectionIndex(); + + String key = fSyntaxColorListModel[i][1]; + + RGB rgb = PreferenceConverter.getColor(overlay, key + ITextStylePreferences.SUFFIX_FOREGROUND); + + fgColorEditor.setColorValue(rgb); + + // REVISIT + fgBold.setSelection(overlay.getString(key + ITextStylePreferences.SUFFIX_STYLE).indexOf(ITextStylePreferences.STYLE_BOLD) >= 0); + } + + private String loadPreviewContentFromFile(String filename) { + StringBuffer string = new StringBuffer(512); + + try { + char[] buf = new char[512]; + BufferedReader reader = new BufferedReader(new InputStreamReader(XMLSyntaxPreferencePage.class.getResourceAsStream(filename))); + + try { + while (true) { + int n = reader.read(buf); + if (n < 0) { + break; + } + + string.append(buf, 0, n); + } + } finally { + reader.close(); + } + } catch (IOException e) { + } + + return string.toString(); + } + + /** + * + */ + private void initialize() { + initializeFields(); + + for (int i = 0; i < fSyntaxColorListModel.length; i++) { + colors.add(fSyntaxColorListModel[i][0]); + } + + colors.getDisplay().asyncExec(new Runnable() { + + public void run() { + colors.select(0); + handleSyntaxColorListSelection(); + } + }); + } + + private void initializeFields() { + RGB rgb = PreferenceConverter.getColor(overlay, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND); + bgColorEditor.setColorValue(rgb); + + boolean def = overlay.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT); + bgDefault.setSelection(def); + bgCustom.setSelection(!def); + bgColorEditor.getButton().setEnabled(!def); + } + + /* + * @see IWorkbenchPreferencePage#init(IWorkbench) + */ + public void init(IWorkbench workbench) { + } + + /* + * @see PreferencePage#performDefaults() + */ + protected void performDefaults() { + overlay.loadDefaults(); + //initializeFields(); + handleSyntaxColorListSelection(); + + super.performDefaults(); + + preview.invalidateTextPresentation(); + } + + /* + * @see org.eclipse.jface.preference.IPreferencePage#performOk() + */ + public boolean performOk() { + overlay.propagate(); + XMLPlugin.getDefault().savePluginPreferences(); + + return true; + } + + /* + * @see org.eclipse.jface.dialogs.IDialogPage#dispose() + */ + public void dispose() { + if (xmlTextTools != null) { + xmlTextTools.dispose(); + xmlTextTools = null; + } + + if (overlay != null) { + overlay.stop(); + overlay = null; + } + + super.dispose(); + } +} \ No newline at end of file