1 11 12 package org.eclipse.jdt.internal.formatter.comment; 13 14 import java.util.LinkedList ; 15 16 import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; 17 18 23 public abstract class CommentLine implements IBorderAttributes { 24 25 26 protected static final String NON_FORMAT_START_PREFIX= "/*-"; 28 29 private int fAttributes= 0; 30 31 32 private final CommentRegion fParent; 33 34 35 private final LinkedList fRanges= new LinkedList (); 36 37 42 protected CommentLine(final CommentRegion parent) { 43 fParent= parent; 44 } 45 46 52 protected abstract void adapt(final CommentLine previous); 53 54 59 protected void append(final CommentRange range) { 60 fRanges.add(range); 61 } 62 63 72 protected CommentRange formatLine(final CommentLine predecessor, final CommentRange last, final String indentation, final int line) { 73 74 int offset= 0; 75 int length= 0; 76 77 CommentRange next= last; 78 CommentRange previous= null; 79 80 final int stop= fRanges.size() - 1; 81 final int end= fParent.getSize() - 1; 82 83 for (int index= stop; index >= 0; index--) { 84 85 previous= next; 86 next= (CommentRange)fRanges.get(index); 87 88 if (fParent.canFormat(previous, next)) { 89 90 offset= next.getOffset() + next.getLength(); 91 length= previous.getOffset() - offset; 92 93 if (index == stop && line != end) 94 fParent.logEdit(fParent.getDelimiter(predecessor, this, previous, next, indentation), offset, length); 95 else 96 fParent.logEdit(fParent.getDelimiter(previous, next), offset, length); 97 } 98 } 99 return next; 100 } 101 102 112 protected void formatLowerBorder(final CommentRange range, final String indentation, final int length) { 113 114 final int offset= range.getOffset() + range.getLength(); 115 116 final StringBuffer buffer= new StringBuffer (length); 117 final String end= getEndingPrefix(); 118 final String delimiter= fParent.getDelimiter(); 119 120 if (fParent.isSingleLine() && fParent.getSize() == 1) 121 buffer.append(end); 122 else { 123 124 final String filler= getContentPrefix().trim(); 125 126 buffer.append(delimiter); 127 buffer.append(indentation); 128 129 if (fParent.hasBorder(BORDER_LOWER)) { 130 131 buffer.append(' '); 132 for (int character= 0; character < length; character++) 133 buffer.append(filler); 134 135 buffer.append(end.trim()); 136 137 } else 138 buffer.append(end); 139 } 140 fParent.logEdit(buffer.toString(), offset, fParent.getLength() - offset); 141 } 142 143 152 protected void formatUpperBorder(final CommentRange range, final String indentation, final int length) { 153 154 final StringBuffer buffer= new StringBuffer (length); 155 final String start= getStartingPrefix(); 156 final String content= getContentPrefix(); 157 158 if (fParent.isSingleLine() && fParent.getSize() == 1) 159 buffer.append(start); 160 else { 161 162 final String trimmed= start.trim(); 163 final String filler= content.trim(); 164 165 buffer.append(trimmed); 166 167 if (fParent.hasBorder(BORDER_UPPER)) { 168 169 for (int character= 0; character < length - trimmed.length() + start.length(); character++) 170 buffer.append(filler); 171 } 172 173 buffer.append(fParent.getDelimiter()); 174 buffer.append(indentation); 175 buffer.append(content); 176 } 177 fParent.logEdit(buffer.toString(), 0, range.getOffset()); 178 } 179 180 185 protected abstract String getContentPrefix(); 186 187 192 protected abstract String getEndingPrefix(); 193 194 199 protected final CommentRange getFirst() { 200 return (CommentRange)fRanges.getFirst(); 201 } 202 203 208 protected String getIndentationReference() { 209 return ""; } 211 212 217 protected final CommentRange getLast() { 218 return (CommentRange)fRanges.getLast(); 219 } 220 221 226 protected final CommentRegion getParent() { 227 return fParent; 228 } 229 230 235 protected final int getSize() { 236 return fRanges.size(); 237 } 238 239 244 protected abstract String getStartingPrefix(); 245 246 253 protected final boolean hasAttribute(final int attribute) { 254 return (fAttributes & attribute) == attribute; 255 } 256 257 262 protected abstract void scanLine(final int line); 263 264 269 protected final void setAttribute(final int attribute) { 270 fAttributes |= attribute; 271 } 272 273 278 protected void tokenizeLine(final int line) { 279 280 int offset= 0; 281 int index= offset; 282 283 final CommentRange range= (CommentRange)fRanges.get(0); 284 final int begin= range.getOffset(); 285 286 final String content= fParent.getText(begin, range.getLength()); 287 final int length= content.length(); 288 289 while (offset < length) { 290 291 while (offset < length && ScannerHelper.isWhitespace(content.charAt(offset))) 292 offset++; 293 294 index= offset; 295 296 while (index < length && !ScannerHelper.isWhitespace(content.charAt(index))) 297 index++; 298 299 if (index - offset > 0) { 300 fParent.append(new CommentRange(begin + offset, index - offset)); 301 302 offset= index; 303 } 304 } 305 } 306 307 public String toString() { 308 final StringBuffer buffer = new StringBuffer (); 309 final int size = this.fRanges.size(); 310 for (int i = 0; i < size; i++) { 311 buffer.append(this.fRanges.get(i)).append("\n"); } 313 return String.valueOf(buffer); 314 } 315 } 316 | Popular Tags |