Formatting problem when using multiple lines to create a view release701
authorSubhashini Sooriarachchi <subslk@netbeans.org>
Mon, 30 Jan 2012 15:25:42 +0530
branchrelease701
changeset 1457b981b53d2ab
parent 144 444c98606a05
child 146 db605e0a2e34
Formatting problem when using multiple lines to create a view
PLSQL/Formatter/src/org/netbeans/modules/plsql/format/PlsqlFormatter.java
     1.1 --- a/PLSQL/Formatter/src/org/netbeans/modules/plsql/format/PlsqlFormatter.java	Mon Jan 30 09:29:43 2012 +0530
     1.2 +++ b/PLSQL/Formatter/src/org/netbeans/modules/plsql/format/PlsqlFormatter.java	Mon Jan 30 15:25:42 2012 +0530
     1.3 @@ -996,6 +996,9 @@
     1.4                          }
     1.5                      }
     1.6                  }
     1.7 +                if (tokenImage.equalsIgnoreCase("DISTINCT")) {
     1.8 +	return getIndentForSelect(previousNWS);
     1.9 +                }
    1.10              } else if (tokenID == PlsqlTokenContext.LPAREN_ID) {
    1.11                  //keep tab after '(' e.x in procedure and function declarations
    1.12                  return getTabSize();
    1.13 @@ -1074,13 +1077,19 @@
    1.14                      //This will be useful for SELECT , UPDATE , INTO variables
    1.15                      TokenItem first = findLineFirstNonWhitespace(getPosition(previousNWS, 0)).getToken();
    1.16                      String previousKeyword = first.getImage().trim();
    1.17 +	TokenItem findStatementStart = findStatementStart(first);
    1.18 +	if (findStatementStart != null) {
    1.19 +	    previousKeyword = findStatementStart.getImage().trim();
    1.20 +	}
    1.21  
    1.22 -                    if ((previousKeyword.equalsIgnoreCase("SELECT"))
    1.23 -                            || (previousKeyword.equalsIgnoreCase("INTO"))
    1.24 -                            || (previousKeyword.equalsIgnoreCase("FROM"))
    1.25 -                            || (previousKeyword.equalsIgnoreCase("SET"))) {
    1.26 -                        return getTabSize();
    1.27 -                    }
    1.28 +	if (previousKeyword.equalsIgnoreCase("SELECT") || (previousKeyword.equalsIgnoreCase("FROM"))) {
    1.29 +	    return getIndentForSelect(previousNWS);
    1.30 +	}
    1.31 +
    1.32 +	if ((previousKeyword.equalsIgnoreCase("INTO"))
    1.33 +	        || (previousKeyword.equalsIgnoreCase("SET"))) {
    1.34 +	    return getTabSize();
    1.35 +	}
    1.36                  } else if (previousNWS.getImage().trim().equalsIgnoreCase("*")) {
    1.37                      //Used for a case like 'Select *'
    1.38                      if (getPreviousKeyword(previousNWS).getImage().trim().equalsIgnoreCase("SELECT")) {
    1.39 @@ -1419,6 +1428,32 @@
    1.40  
    1.41              return tokenRes;
    1.42          }
    1.43 +        
    1.44 +         /**
    1.45 +         * Get the correct indent for Select statements 
    1.46 +         * @param previousNWS
    1.47 +         * @return token item, null if not found
    1.48 +         */
    1.49 +        private int getIndentForSelect(TokenItem previousNWS) {
    1.50 +
    1.51 +            int indent = getTabSize();
    1.52 +            TokenItem first = findLineFirstNonWhitespace(getPosition(previousNWS, 0)).getToken();
    1.53 +
    1.54 +            int parent = getVisualColumnOffset(getPosition(first, 0));
    1.55 +            TokenItem findStatementStart = findStatementStart(first);
    1.56 +
    1.57 +            if (findStatementStart != null) {
    1.58 +                first = findStatementStart;
    1.59 +            }
    1.60 +            
    1.61 +            do {
    1.62 +                first = first.getNext();
    1.63 +                if ((first != null) && (first.getTokenID() != PlsqlTokenContext.WHITESPACE) && (first.getTokenID() != PlsqlTokenContext.BLOCK_COMMENT)  && (first.getTokenID() != PlsqlTokenContext.LINE_COMMENT)) {
    1.64 +	return getVisualColumnOffset(getPosition(first, 0)) - parent;
    1.65 +                }
    1.66 +            } while (first != null);
    1.67 +            return indent;
    1.68 +        }
    1.69  
    1.70          /**
    1.71           * Method to calculate indentation difference between two token items