1 19 20 package org.netbeans.modules.web.core.syntax.formatting; 21 22 import org.netbeans.modules.web.core.syntax.deprecated.JspMultiSyntax; 23 import org.netbeans.modules.web.core.syntax.deprecated.JspTagTokenContext; 24 import org.netbeans.modules.web.core.syntax.*; 25 import java.io.IOException ; 26 import java.io.Writer ; 27 import java.util.LinkedList ; 28 import java.util.List ; 29 import javax.swing.text.BadLocationException ; 30 import javax.swing.text.JTextComponent ; 31 import javax.swing.text.Position ; 32 import org.netbeans.editor.BaseDocument; 33 import org.netbeans.editor.Syntax; 34 import org.netbeans.editor.TokenContextPath; 35 import org.netbeans.editor.TokenItem; 36 import org.netbeans.editor.Utilities; 37 import org.netbeans.editor.ext.AbstractFormatLayer; 38 import org.netbeans.editor.ext.ExtSyntaxSupport; 39 import org.netbeans.editor.ext.FormatWriter; 40 import org.netbeans.editor.ext.html.HTMLFormatter; 41 import org.netbeans.editor.ext.java.JavaFormatter; 42 import org.netbeans.editor.ext.java.JavaTokenContext; 43 import org.netbeans.modules.editor.java.JavaKit; 44 45 49 50 public class JspFormatter extends HTMLFormatter { 51 private JavaFormatter jFormatter; 52 53 54 public JspFormatter(Class kitClass) { 55 super(kitClass); 56 jFormatter = new JspJavaFormatter(JavaKit.class); 57 } 58 59 @Override public Writer reformat(final BaseDocument doc, final int startOffset, final int endOffset, 60 final boolean indentOnly) throws BadLocationException , IOException { 61 super.reformat(doc, startOffset, endOffset, indentOnly); 62 63 List <ScriptletBlock> scripletBlocks = new LinkedList <ScriptletBlock>(); 64 ExtSyntaxSupport sup = getSyntaxSupport(doc); 65 TokenItem token = sup.getTokenChain(startOffset, startOffset + 1); 66 67 if (token == null){ 68 return null; 69 } 70 71 TokenItem lastNonWhiteScriptletToken = null; 72 int scripletBlockStart = -1; 73 int scripletBlockEnd = -1; 74 75 do{ 76 if (token.getOffset() >= endOffset){ 77 break; 78 } 79 80 if (token.getTokenContextPath().contains(JavaTokenContext.contextPath)){ 81 82 if (token.getTokenID() != JavaTokenContext.WHITESPACE){ 83 if (scripletBlockStart == -1){ 84 scripletBlockStart = token.getOffset(); 85 } 86 87 lastNonWhiteScriptletToken = token; 88 } 89 } else{ 90 if (scripletBlockStart != -1){ 91 92 scripletBlockEnd = lastNonWhiteScriptletToken.getOffset() 93 + lastNonWhiteScriptletToken.getImage().length(); 94 95 scripletBlocks.add(new ScriptletBlock(doc, scripletBlockStart, scripletBlockEnd)); 96 scripletBlockStart = -1; 97 } 98 } 99 100 token = token.getNext(); 101 } 102 while (token != null); 103 104 for (ScriptletBlock sb : scripletBlocks){ 105 extFormatterReformat(doc, sb.getStart(), Math.min(sb.getEnd(), endOffset), indentOnly); 106 } 107 108 return null; 109 } 110 111 @Override protected void enterPressed(JTextComponent txtComponent, int dotPos) throws BadLocationException { 112 BaseDocument doc = Utilities.getDocument(txtComponent); 113 JspSyntaxSupport sup = new JspSyntaxSupport(doc); 114 TokenItem token = sup.getItemAtOrBefore(dotPos); 115 116 if (token.getTokenContextPath().contains(JavaTokenContext.contextPath)){ 117 try { 118 extFormatterReformat(doc, dotPos, dotPos + 1, true); 119 120 } catch (IOException ex) { 121 ex.printStackTrace(); 122 } 123 } else{ 124 super.enterPressed(txtComponent, dotPos); 125 } 126 } 127 128 @Override protected boolean isClosingTag(TokenItem token){ 129 return token != null && isJSPTag(token) 130 && token.getPrevious().getImage().equals("</") 131 || super.isClosingTag(token); 132 } 133 134 @Override protected boolean isOpeningTag(TokenItem token){ 135 return token != null && isJSPTag(token) 136 && token.getPrevious().getImage().equals("<") 137 || super.isOpeningTag(token); 138 } 139 140 @Override protected TokenItem getTagTokenEndingAtPosition(BaseDocument doc, int position) throws BadLocationException { 141 TokenItem htmlEndingToken = super.getTagTokenEndingAtPosition(doc, position); 142 143 if (htmlEndingToken != null){ 144 return htmlEndingToken; 145 } 146 147 if (position >= 0) { 148 JspSyntaxSupport sup = (JspSyntaxSupport)doc.getSyntaxSupport().get(JspSyntaxSupport.class); 149 TokenItem token = sup.getTokenChain(position, position + 1); 150 151 if (token.getTokenID() == JspTagTokenContext.SYMBOL && 152 token.getImage().equals(">")){ do { 154 token = token.getPrevious(); 155 } 156 while (token != null && token.getTokenID() != JspTagTokenContext.TAG); 157 158 return token; 159 } 160 } 161 return null; 162 } 163 164 @Override protected int getTagEndOffset(TokenItem token){ 165 166 if (!isJSPTag(token)){ 167 return super.getTagEndOffset(token); 168 } 169 170 TokenItem t = token.getNext(); 171 172 while (t != null && !(t.getTokenID() == JspTagTokenContext.SYMBOL 173 && (">".equals(t.getImage()) || "/>".equals(t.getImage())))){ t = t.getNext(); 175 } 176 177 return t == null ? -1 : t.getOffset(); 178 } 179 180 @Override protected int getOpeningSymbolOffset(TokenItem tknTag){ 181 if (!isJSPTag(tknTag)){ 182 return super.getOpeningSymbolOffset(tknTag); 183 } 184 185 TokenItem tkn = tknTag; 186 187 do{ 188 tkn = tkn.getPrevious(); 189 } 190 while(tkn != null && tkn.getTokenID() != JspTagTokenContext.SYMBOL); 191 192 if (tkn != null){ 193 return tkn.getOffset(); 194 } 195 196 return -1; 197 } 198 199 private boolean isJSPTag(TokenItem tagToken){ 200 return tagToken.getTokenID() == JspTagTokenContext.TAG; 201 } 202 203 @Override protected boolean acceptSyntax(Syntax syntax) { 204 return (syntax instanceof JspMultiSyntax); 205 } 206 207 @Override protected void initFormatLayers() { 208 addFormatLayer(new SwitchLayer()); 209 } 210 211 @Override protected boolean isUnformattableToken(TokenItem token) { 212 if (token.getTokenID() == JspTagTokenContext.COMMENT 213 || token.getTokenID() == JspTagTokenContext.EOL){ 214 return true; 215 } 216 217 return super.isUnformattableToken(token); 218 } 219 220 private class SwitchLayer extends AbstractFormatLayer { 221 222 public SwitchLayer() { 223 super("Switch-line"); } 225 226 public void format(FormatWriter fw) { 227 int offset = fw.getOffset(); 228 229 JspSyntaxSupport sup = new JspSyntaxSupport( (BaseDocument)fw.getDocument() ); 230 try{ 231 TokenItem item = sup.getItemAtOrBefore(offset); 232 233 if (item == null){ 234 return; 235 } 236 237 TokenContextPath tcp = item.getTokenContextPath(); 238 if(tcp.contains(JavaTokenContext.contextPath)) { 239 if (JspUtils.getScriptingLanguage().equals("text/x-java")) { jFormatter.format(fw); 241 } 242 } 243 244 }catch(BadLocationException e) { 245 e.printStackTrace(System.err); 246 } 247 } 248 } 249 250 private class ScriptletBlock{ 251 private Position posStart; 252 private Position posEnd; 253 254 public ScriptletBlock(BaseDocument doc, int start, int end) throws BadLocationException { 255 posStart = doc.createPosition(start); 256 posEnd = doc.createPosition(end); 257 } 258 259 public int getStart() { 260 return posStart.getOffset(); 261 } 262 263 public int getEnd() { 264 return posEnd.getOffset(); 265 } 266 } 267 } 268 | Popular Tags |