NonRuleBasedDamagerRepairer.java
上传用户:fanxing
上传日期:2017-01-19
资源大小:36k
文件大小:4k
源码类别:

PlugIns编程

开发平台:

Java

  1. /*******************************************************************************
  2.  * Copyright (c) 2005 Prashant Deva.
  3.  
  4.  * All rights reserved. This program and the accompanying materials 
  5.  * are made available under the terms of the Eclipse Public License - v 1.0
  6.  * which is available at http://www.eclipse.org/legal/epl-v10.html
  7. *******************************************************************************/
  8. package projection_test.editors;
  9. import org.eclipse.jface.text.BadLocationException;
  10. import org.eclipse.jface.text.DocumentEvent;
  11. import org.eclipse.jface.text.IDocument;
  12. import org.eclipse.jface.text.IRegion;
  13. import org.eclipse.jface.text.ITypedRegion;
  14. import org.eclipse.jface.text.Region;
  15. import org.eclipse.jface.text.TextAttribute;
  16. import org.eclipse.jface.text.TextPresentation;
  17. import org.eclipse.jface.text.presentation.IPresentationDamager;
  18. import org.eclipse.jface.text.presentation.IPresentationRepairer;
  19. import org.eclipse.jface.util.Assert;
  20. import org.eclipse.swt.custom.StyleRange;
  21. public class NonRuleBasedDamagerRepairer
  22. implements IPresentationDamager, IPresentationRepairer {
  23. /** The document this object works on */
  24. protected IDocument fDocument;
  25. /** The default text attribute if non is returned as data by the current token */
  26. protected TextAttribute fDefaultTextAttribute;
  27. /**
  28.  * Constructor for NonRuleBasedDamagerRepairer.
  29.  */
  30. public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) {
  31. Assert.isNotNull(defaultTextAttribute);
  32. fDefaultTextAttribute = defaultTextAttribute;
  33. }
  34. /**
  35.  * @see IPresentationRepairer#setDocument(IDocument)
  36.  */
  37. public void setDocument(IDocument document) {
  38. fDocument = document;
  39. }
  40. /**
  41.  * Returns the end offset of the line that contains the specified offset or
  42.  * if the offset is inside a line delimiter, the end offset of the next line.
  43.  *
  44.  * @param offset the offset whose line end offset must be computed
  45.  * @return the line end offset for the given offset
  46.  * @exception BadLocationException if offset is invalid in the current document
  47.  */
  48. protected int endOfLineOf(int offset) throws BadLocationException {
  49. IRegion info = fDocument.getLineInformationOfOffset(offset);
  50. if (offset <= info.getOffset() + info.getLength())
  51. return info.getOffset() + info.getLength();
  52. int line = fDocument.getLineOfOffset(offset);
  53. try {
  54. info = fDocument.getLineInformation(line + 1);
  55. return info.getOffset() + info.getLength();
  56. } catch (BadLocationException x) {
  57. return fDocument.getLength();
  58. }
  59. }
  60. /**
  61.  * @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean)
  62.  */
  63. public IRegion getDamageRegion(
  64. ITypedRegion partition,
  65. DocumentEvent event,
  66. boolean documentPartitioningChanged) {
  67. if (!documentPartitioningChanged) {
  68. try {
  69. IRegion info =
  70. fDocument.getLineInformationOfOffset(event.getOffset());
  71. int start = Math.max(partition.getOffset(), info.getOffset());
  72. int end =
  73. event.getOffset()
  74. + (event.getText() == null
  75. ? event.getLength()
  76. : event.getText().length());
  77. if (info.getOffset() <= end
  78. && end <= info.getOffset() + info.getLength()) {
  79. // optimize the case of the same line
  80. end = info.getOffset() + info.getLength();
  81. } else
  82. end = endOfLineOf(end);
  83. end =
  84. Math.min(
  85. partition.getOffset() + partition.getLength(),
  86. end);
  87. return new Region(start, end - start);
  88. } catch (BadLocationException x) {
  89. }
  90. }
  91. return partition;
  92. }
  93. /**
  94.  * @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion)
  95.  */
  96. public void createPresentation(
  97. TextPresentation presentation,
  98. ITypedRegion region) {
  99. addRange(
  100. presentation,
  101. region.getOffset(),
  102. region.getLength(),
  103. fDefaultTextAttribute);
  104. }
  105. /**
  106.  * Adds style information to the given text presentation.
  107.  *
  108.  * @param presentation the text presentation to be extended
  109.  * @param offset the offset of the range to be styled
  110.  * @param length the length of the range to be styled
  111.  * @param attr the attribute describing the style of the range to be styled
  112.  */
  113. protected void addRange(
  114. TextPresentation presentation,
  115. int offset,
  116. int length,
  117. TextAttribute attr) {
  118. if (attr != null)
  119. presentation.addStyleRange(
  120. new StyleRange(
  121. offset,
  122. length,
  123. attr.getForeground(),
  124. attr.getBackground(),
  125. attr.getStyle()));
  126. }
  127. }