|
From: Matthias K <mat...@us...> - 2006-07-08 17:35:09
|
Update of /cvsroot/jcommander/plugins/org.jcommander.ui.editor/src/org/jcommander/ui/editor/xml In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv2671/src/org/jcommander/ui/editor/xml Added Files: IXMLColorConstants.java XMLEditor.java ColorManager.java XMLDocumentProvider.java XMLScanner.java XMLTagScanner.java TagRule.java XMLConfiguration.java XMLDoubleClickStrategy.java XMLPartitionScanner.java NonRuleBasedDamagerRepairer.java XMLWhitespaceDetector.java Log Message: - [Feature Requests-1105827]: First implementation of simple build in editor, currently capable of highlighting html and xml - removed compare perspective, now using edit instead - All Editors can be closed with Esc --- NEW FILE: ColorManager.java --- package org.jcommander.ui.editor.xml; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; class ColorManager { protected Map fColorTable = new HashMap(10); public void dispose() { Iterator e = fColorTable.values().iterator(); while (e.hasNext()) ((Color) e.next()).dispose(); } public Color getColor(RGB rgb) { Color color = (Color) fColorTable.get(rgb); if (color == null) { color = new Color(Display.getCurrent(), rgb); fColorTable.put(rgb, color); } return color; } } --- NEW FILE: XMLDocumentProvider.java --- package org.jcommander.ui.editor.xml; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.rules.FastPartitioner; import org.eclipse.jface.text.source.IAnnotationModel; import org.jcommander.ui.editor.JCmdDocumentProvider; public class XMLDocumentProvider extends JCmdDocumentProvider { protected void setupDocument(IDocument document) { if (document != null) { IDocumentPartitioner partitioner = new FastPartitioner( new XMLPartitionScanner(), new String[] { XMLPartitionScanner.XML_TAG, XMLPartitionScanner.XML_COMMENT }); partitioner.connect(document); document.setDocumentPartitioner(partitioner); } } protected IAnnotationModel createAnnotationModel(Object element) throws CoreException { return null; } } --- NEW FILE: XMLDoubleClickStrategy.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextDoubleClickStrategy; import org.eclipse.jface.text.ITextViewer; public class XMLDoubleClickStrategy implements ITextDoubleClickStrategy { protected ITextViewer fText; public void doubleClicked(ITextViewer part) { int pos = part.getSelectedRange().x; if (pos < 0) return; fText = part; if (!selectComment(pos)) { selectWord(pos); } } protected boolean selectComment(int caretPos) { IDocument doc = fText.getDocument(); int startPos, endPos; try { int pos = caretPos; char c = ' '; while (pos >= 0) { c = doc.getChar(pos); if (c == '\\') { pos -= 2; continue; } if (c == Character.LINE_SEPARATOR || c == '\"') break; --pos; } if (c != '\"') return false; startPos = pos; pos = caretPos; int length = doc.getLength(); c = ' '; while (pos < length) { c = doc.getChar(pos); if (c == Character.LINE_SEPARATOR || c == '\"') break; ++pos; } if (c != '\"') return false; endPos = pos; int offset = startPos + 1; int len = endPos - offset; fText.setSelectedRange(offset, len); return true; } catch (BadLocationException x) { } return false; } protected boolean selectWord(int caretPos) { IDocument doc = fText.getDocument(); int startPos, endPos; try { int pos = caretPos; char c; while (pos >= 0) { c = doc.getChar(pos); if (!Character.isJavaIdentifierPart(c)) break; --pos; } startPos = pos; pos = caretPos; int length = doc.getLength(); while (pos < length) { c = doc.getChar(pos); if (!Character.isJavaIdentifierPart(c)) break; ++pos; } endPos = pos; selectRange(startPos, endPos); return true; } catch (BadLocationException x) { } return false; } private void selectRange(int startPos, int stopPos) { int offset = startPos + 1; int length = stopPos - offset; fText.setSelectedRange(offset, length); } } --- NEW FILE: XMLConfiguration.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextDoubleClickStrategy; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.presentation.IPresentationReconciler; import org.eclipse.jface.text.presentation.PresentationReconciler; import org.eclipse.jface.text.rules.DefaultDamagerRepairer; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; public class XMLConfiguration extends SourceViewerConfiguration { private XMLDoubleClickStrategy doubleClickStrategy; private XMLTagScanner tagScanner; private XMLScanner scanner; private ColorManager colorManager; public XMLConfiguration(ColorManager colorManager) { this.colorManager = colorManager; } public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { return new String[] { IDocument.DEFAULT_CONTENT_TYPE, XMLPartitionScanner.XML_COMMENT, XMLPartitionScanner.XML_TAG }; } public ITextDoubleClickStrategy getDoubleClickStrategy( ISourceViewer sourceViewer, String contentType) { if (doubleClickStrategy == null) doubleClickStrategy = new XMLDoubleClickStrategy(); return doubleClickStrategy; } protected XMLScanner getXMLScanner() { if (scanner == null) { scanner = new XMLScanner(colorManager); scanner.setDefaultReturnToken( new Token( new TextAttribute( colorManager.getColor(IXMLColorConstants.DEFAULT)))); } return scanner; } protected XMLTagScanner getXMLTagScanner() { if (tagScanner == null) { tagScanner = new XMLTagScanner(colorManager); tagScanner.setDefaultReturnToken( new Token( new TextAttribute( colorManager.getColor(IXMLColorConstants.TAG)))); } return tagScanner; } public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler = new PresentationReconciler(); DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getXMLTagScanner()); reconciler.setDamager(dr, XMLPartitionScanner.XML_TAG); reconciler.setRepairer(dr, XMLPartitionScanner.XML_TAG); dr = new DefaultDamagerRepairer(getXMLScanner()); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); NonRuleBasedDamagerRepairer ndr = new NonRuleBasedDamagerRepairer( new TextAttribute( colorManager.getColor(IXMLColorConstants.XML_COMMENT))); reconciler.setDamager(ndr, XMLPartitionScanner.XML_COMMENT); reconciler.setRepairer(ndr, XMLPartitionScanner.XML_COMMENT); return reconciler; } } --- NEW FILE: IXMLColorConstants.java --- package org.jcommander.ui.editor.xml; import org.eclipse.swt.graphics.RGB; public interface IXMLColorConstants { RGB XML_COMMENT = new RGB(128, 0, 0); RGB PROC_INSTR = new RGB(128, 128, 128); RGB STRING = new RGB(0, 128, 0); RGB DEFAULT = new RGB(0, 0, 0); RGB TAG = new RGB(0, 0, 128); } --- NEW FILE: XMLPartitionScanner.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.rules.IPredicateRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.RuleBasedPartitionScanner; import org.eclipse.jface.text.rules.Token; public class XMLPartitionScanner extends RuleBasedPartitionScanner { public final static String XML_DEFAULT = "__xml_default"; //$NON-NLS-1$ public final static String XML_COMMENT = "__xml_comment"; //$NON-NLS-1$ public final static String XML_TAG = "__xml_tag"; //$NON-NLS-1$ public XMLPartitionScanner() { IToken xmlComment = new Token(XML_COMMENT); IToken tag = new Token(XML_TAG); IPredicateRule[] rules = new IPredicateRule[2]; rules[0] = new MultiLineRule("<!--", "-->", xmlComment); //$NON-NLS-1$//$NON-NLS-2$ rules[1] = new TagRule(tag); setPredicateRules(rules); } } --- NEW FILE: TagRule.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.MultiLineRule; public class TagRule extends MultiLineRule { public TagRule(IToken token) { super("<", ">", token); //$NON-NLS-1$//$NON-NLS-2$ } protected boolean sequenceDetected( ICharacterScanner scanner, char[] sequence, boolean eofAllowed) { int c = scanner.read(); if (sequence[0] == '<') { if (c == '?') { // processing instruction - abort scanner.unread(); return false; } if (c == '!') { scanner.unread(); // comment - abort return false; } } else if (sequence[0] == '>') { scanner.unread(); } return super.sequenceDetected(scanner, sequence, eofAllowed); } } --- NEW FILE: XMLEditor.java --- package org.jcommander.ui.editor.xml; import org.jcommander.ui.editor.JCmdEditor; public class XMLEditor extends JCmdEditor { private ColorManager colorManager; protected void internal_init() { configureInsertMode(SMART_INSERT, false); colorManager = new ColorManager(); setSourceViewerConfiguration(new XMLConfiguration(colorManager)); setDocumentProvider(new XMLDocumentProvider()); } public void dispose() { colorManager.dispose(); super.dispose(); } } --- NEW FILE: NonRuleBasedDamagerRepairer.java --- package org.jcommander.ui.editor.xml; import org.eclipse.swt.custom.StyleRange; import org.eclipse.jface.util.Assert; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.TextPresentation; import org.eclipse.jface.text.presentation.IPresentationDamager; import org.eclipse.jface.text.presentation.IPresentationRepairer; public class NonRuleBasedDamagerRepairer implements IPresentationDamager, IPresentationRepairer { /** The document this object works on */ protected IDocument fDocument; /** The default text attribute if non is returned as data by the current token */ protected TextAttribute fDefaultTextAttribute; /** * Constructor for NonRuleBasedDamagerRepairer. * @param defaultTextAttribute */ public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) { Assert.isNotNull(defaultTextAttribute); fDefaultTextAttribute = defaultTextAttribute; } /** * @see IPresentationRepairer#setDocument(IDocument) */ public void setDocument(IDocument document) { fDocument = document; } /** * Returns the end offset of the line that contains the specified offset or * if the offset is inside a line delimiter, the end offset of the next line. * * @param offset the offset whose line end offset must be computed * @return the line end offset for the given offset * @exception BadLocationException if offset is invalid in the current document */ protected int endOfLineOf(int offset) throws BadLocationException { IRegion info = fDocument.getLineInformationOfOffset(offset); if (offset <= info.getOffset() + info.getLength()) return info.getOffset() + info.getLength(); int line = fDocument.getLineOfOffset(offset); try { info = fDocument.getLineInformation(line + 1); return info.getOffset() + info.getLength(); } catch (BadLocationException x) { return fDocument.getLength(); } } /** * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean) */ public IRegion getDamageRegion( ITypedRegion partition, DocumentEvent event, boolean documentPartitioningChanged) { if (!documentPartitioningChanged) { try { IRegion info = fDocument.getLineInformationOfOffset(event.getOffset()); int start = Math.max(partition.getOffset(), info.getOffset()); int end = event.getOffset() + (event.getText() == null ? event.getLength() : event.getText().length()); if (info.getOffset() <= end && end <= info.getOffset() + info.getLength()) { // optimize the case of the same line end = info.getOffset() + info.getLength(); } else end = endOfLineOf(end); end = Math.min( partition.getOffset() + partition.getLength(), end); return new Region(start, end - start); } catch (BadLocationException x) { } } return partition; } /** * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion) */ public void createPresentation( TextPresentation presentation, ITypedRegion region) { addRange( presentation, region.getOffset(), region.getLength(), fDefaultTextAttribute); } /** * Adds style information to the given text presentation. * * @param presentation the text presentation to be extended * @param offset the offset of the range to be styled * @param length the length of the range to be styled * @param attr the attribute describing the style of the range to be styled */ protected void addRange( TextPresentation presentation, int offset, int length, TextAttribute attr) { if (attr != null) presentation.addStyleRange( new StyleRange( offset, length, attr.getForeground(), attr.getBackground(), attr.getStyle())); } } --- NEW FILE: XMLWhitespaceDetector.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.rules.IWhitespaceDetector; public class XMLWhitespaceDetector implements IWhitespaceDetector { public boolean isWhitespace(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); } } --- NEW FILE: XMLScanner.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; public class XMLScanner extends RuleBasedScanner { public XMLScanner(ColorManager manager) { IToken procInstr = new Token( new TextAttribute( manager.getColor(IXMLColorConstants.PROC_INSTR))); IRule[] rules = new IRule[2]; //Add rule for processing instructions rules[0] = new SingleLineRule("<?", "?>", procInstr); //$NON-NLS-1$ //$NON-NLS-2$ // Add generic whitespace rule. rules[1] = new WhitespaceRule(new XMLWhitespaceDetector()); setRules(rules); } } --- NEW FILE: XMLTagScanner.java --- package org.jcommander.ui.editor.xml; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; public class XMLTagScanner extends RuleBasedScanner { public XMLTagScanner(ColorManager manager) { IToken string = new Token( new TextAttribute(manager.getColor(IXMLColorConstants.STRING))); IRule[] rules = new IRule[3]; // Add rule for double quotes rules[0] = new SingleLineRule("\"", "\"", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$ // Add a rule for single quotes rules[1] = new SingleLineRule("'", "'", string, '\\'); //$NON-NLS-1$ //$NON-NLS-2$ // Add generic whitespace rule. rules[2] = new WhitespaceRule(new XMLWhitespaceDetector()); setRules(rules); } } |