private boolean isTypeUsed(String strType) {
   String strRelativeName = TypePopup.getRelativeTypeName(strType);
   try {
     return _gsEditor.getParser().getTypeUsesMap().resolveType(strRelativeName) != null
         || TypeSystem.parseType(strRelativeName, _gsEditor.getParser().getTypeUsesMap().copy())
             != null;
   } catch (Exception e) {
     return false;
   }
 }
  public void addToUses(String strType, boolean bTemplate, boolean bProgram) {
    if (isTypeUsed(strType)) {
      return;
    }

    Document doc = _gsEditor.getEditor().getDocument();
    int iPos = findUsesInsertionPosition(bProgram);
    int iIndex = doc.getDefaultRootElement().getElementIndex(iPos);
    int iInsertionPt;
    String strUsesStmt = Keyword.KW_uses + " " + strType;
    if (bTemplate) {
      strUsesStmt = "<% " + strUsesStmt + " %>";
    }
    strUsesStmt += "\n";

    if (iPos == 0) {
      iInsertionPt = iPos;
      if (!bTemplate) {
        strUsesStmt = strUsesStmt + "\n";
      }
    } else {
      iInsertionPt = doc.getDefaultRootElement().getElement(iIndex).getEndOffset();
    }

    try {
      doc.insertString(iInsertionPt, strUsesStmt, null);
    } catch (BadLocationException e) {
      throw new RuntimeException(e);
    }
  }
 private int findClasspathLocation() {
   List<IParseTree> locations = _gsEditor.getParser().getLocations();
   List<IClasspathStatement> listOut = new ArrayList<IClasspathStatement>();
   IParseTree.Search.getContainedParsedElementsByType(
       locations, IClasspathStatement.class, listOut);
   if (listOut.size() > 0) {
     return listOut.get(0).getLocation().getOffset();
   }
   return -1;
 }
 private int findUsesInsertionPosition(boolean bProgram) {
   Set usesStmts = _gsEditor.getParser().getTypeUsesMap().getUsesStatements();
   int iPos = -1;
   for (Iterator iterator = usesStmts.iterator(); iterator.hasNext(); ) {
     IUsesStatement usesStmt = (IUsesStatement) iterator.next();
     iPos = Math.max(usesStmt.getLocation().getOffset(), iPos);
   }
   if (iPos < 0) // No uses-stmts exists, check for a package-stmt
   {
     iPos = findPackageLocation();
     if (iPos < 0) {
       if (bProgram) {
         // No uses-stms or package-stmt, check for a classpath-stmt
         iPos = findClasspathLocation();
         if (iPos < 0) {
           // No uses-stmts, package-stmt, or classpath-stmt, insert the new uses-stmt at beginning
           // of source
           iPos = 0;
         } else {
           // Insert after the classpath-stmt
           iPos++;
         }
       } else {
         // No uses-stmts or package-stmt, insert the new uses-stmt at beginning of source
         iPos = 0;
       }
     } else {
       // Insert after the package-stmt, that's why we increment the position
       iPos++;
     }
   } else if (iPos == 0) // Implies there exists at least one uses-stmt
   {
     // Append the new uses-statement instead of inserting it (adding 1 ensures this)
     iPos = 1;
   }
   return iPos;
 }
  private void moveSelectionNow(boolean up) {
    int start = _gsEditor.getEditor().getSelectionStart();
    int end = _gsEditor.getEditor().getSelectionEnd();
    String script = _gsEditor.getEditor().getText();

    // If the caret is positioned at the first point in a new line, treat it as if it is on the
    // previous line only
    if (start != end && end > 0 && script.charAt(end - 1) == '\n') {
      end = end - 1;
    }

    // Handle raw whitespace moves
    int rawStart = TextComponentUtil.getLineStart(script, start);
    int rawEnd = TextComponentUtil.getLineEnd(script, end);
    String line = script.substring(rawStart, rawEnd);
    if (GosuStringUtil.isWhitespace(line) || line.trim().startsWith("//")) {
      if (up) {
        if (rawStart == 0) {
          return;
        }
        int lineStartBefore = TextComponentUtil.getLineStart(script, rawStart - 1);
        GosuRefactorUtil.MoveInstruction moveInstruction =
            new GosuRefactorUtil.MoveInstruction(false, false, lineStartBefore);
        handleMoveInstruction(script, moveInstruction, rawStart, rawEnd, up);
        return;
      } else {
        if (rawEnd >= script.length()) {
          return;
        }
        int lineStartBefore = rawEnd + 1;
        GosuRefactorUtil.MoveInstruction moveInstruction =
            new GosuRefactorUtil.MoveInstruction(false, false, lineStartBefore);
        handleMoveInstruction(script, moveInstruction, rawStart, rawEnd, up);
        return;
      }
    }

    int peStart = TextComponentUtil.findNonWhitespacePositionAfter(script, rawStart);
    int peEnd = TextComponentUtil.findNonWhitespacePositionBefore(script, rawEnd);

    peStart = Math.min(peStart, script.length() - 1);
    peEnd = Math.min(peEnd, script.length() - 1);

    // Find the first statement at the selection start
    IParseTree firstStatement =
        GosuRefactorUtil.findFirstStatementAtLine(
            TextComponentUtil.getLineAtPosition(_gsEditor.getEditor(), peStart),
            peStart,
            _gsEditor.getParser().getLocations());

    // Find the last statement at the selection end
    IParseTree lastStatement =
        GosuRefactorUtil.findLastStatementAtLine(
            TextComponentUtil.getLineAtPosition(_gsEditor.getEditor(), peEnd),
            peEnd,
            _gsEditor.getParser().getLocations());

    // Find the spanning range of those two statements
    IParseTree[] boundingPair =
        GosuRefactorUtil.findSpanningLogicalRange(firstStatement, lastStatement);

    // If a bounding pair exists, do the move
    if (boundingPair != null) {
      int clipStart =
          Math.min(rawStart, TextComponentUtil.getLineStart(script, boundingPair[0].getOffset()));
      int clipEnd =
          Math.max(rawEnd, TextComponentUtil.getLineEnd(script, boundingPair[1].getExtent()));

      // if this is not a class element (that is, we are in an impl), handle moving into a white
      // space line
      if (!GosuRefactorUtil.isClassElement(boundingPair[0])) {
        int lineStart =
            up
                ? TextComponentUtil.getWhiteSpaceOrCommentLineStartBefore(script, clipStart)
                : TextComponentUtil.getWhiteSpaceOrCommentLineStartAfter(script, clipEnd);
        if (lineStart != -1) {
          GosuRefactorUtil.MoveInstruction moveInstruction =
              new GosuRefactorUtil.MoveInstruction(false, false, lineStart);
          handleMoveInstruction(script, moveInstruction, clipStart, clipEnd, up);
          return;
        }
      }

      // Not handling an into whitespace move, so do a syntax aware move
      GosuRefactorUtil.MoveInstruction moveInstruction =
          up
              ? GosuRefactorUtil.getMoveUpInstruction(boundingPair[0])
              : GosuRefactorUtil.getMoveDownInstruction(boundingPair[1]);

      if (moveInstruction != null) {
        if (GosuRefactorUtil.isClassElement(boundingPair[1])) {
          IParseTree nextSibling = boundingPair[1].getNextSibling();
          if (nextSibling != null) {
            clipEnd = TextComponentUtil.getLineStart(script, nextSibling.getOffset()) - 1;
            if (!up) {
              moveInstruction.position =
                  TextComponentUtil.getDeepestWhiteSpaceLineStartAfter(
                      script, moveInstruction.position);
            }
          }
        }

        handleMoveInstruction(script, moveInstruction, clipStart, clipEnd, up);
      }
    }
  }
 private void moveSelection(final boolean up) {
   _gsEditor.waitForParser();
   moveSelectionNow(up);
 }
  private void handleMoveInstruction(
      String script,
      GosuRefactorUtil.MoveInstruction moveInstruction,
      int startClip,
      int endClip,
      boolean up) {
    // Do nothing if we are moving down beyond the last position in the script
    if (endClip == script.length() - 1 && !up) {
      return;
    }

    if (endClip < script.length()) {
      endClip = endClip + 1;
    }

    String movedCodeAsString = script.substring(startClip, endClip);
    if (!movedCodeAsString.endsWith("\n")) {
      movedCodeAsString += "\n";
    }
    int offset = moveInstruction.position;

    if (up) {
      offset = TextComponentUtil.getLineStart(script, offset);
    } else {
      offset = TextComponentUtil.getLineEnd(script, offset) + 1 - movedCodeAsString.length();
    }

    StringBuilder movedCode = new StringBuilder();

    int caretPosition = _gsEditor.getEditor().getCaretPosition();
    int selectionStart = _gsEditor.getEditor().getSelectionStart();
    int selectionEnd = _gsEditor.getEditor().getSelectionEnd();

    int currentPosition = startClip;

    if (moveInstruction.indent) {
      String[] strings = movedCodeAsString.split("\n");
      for (String str : strings) {

        if (caretPosition > currentPosition) {
          caretPosition += 2;
        }
        if (selectionStart > currentPosition) {
          selectionStart += 2;
        }
        if (selectionEnd > currentPosition) {
          selectionEnd += 2;
        }

        movedCode.append("  ");
        movedCode.append(str);
        movedCode.append("\n");
        currentPosition += str.length() + 1;
      }
    } else if (moveInstruction.outdent && movedCodeAsString.startsWith("  ")) {
      String[] strings = movedCodeAsString.split("\n");
      for (String str : strings) {
        if (str.startsWith("  ")) {
          if (caretPosition > currentPosition) {
            caretPosition -= 2;
          }
          if (selectionStart > currentPosition) {
            selectionStart -= 2;
          }
          if (selectionEnd > currentPosition) {
            selectionEnd -= 2;
          }
          str = str.substring(2, str.length());
        }

        movedCode.append(str);
        movedCode.append("\n");
        currentPosition += str.length() + 1;
      }
    } else {
      movedCode.append(movedCodeAsString);
    }

    CompoundEdit undoAtom = _gsEditor.getUndoManager().getUndoAtom();
    if (undoAtom != null && undoAtom.getPresentationName().equals("Script Change")) {
      _gsEditor.getUndoManager().endUndoAtom();
    }
    _gsEditor.getUndoManager().beginUndoAtom("moveLine");
    try {

      _gsEditor.getEditor().getDocument().remove(startClip, endClip - startClip);
      _gsEditor.getEditor().getDocument().insertString(offset, movedCode.toString(), null);

      _gsEditor.getEditor().setSelectionStart(selectionStart - (startClip - offset));
      _gsEditor.getEditor().setSelectionEnd(selectionEnd - (startClip - offset));
      _gsEditor.getEditor().getCaret().moveDot(caretPosition - (startClip - offset));

    } catch (BadLocationException e) {
      throw new RuntimeException(e);
    } finally {
      _gsEditor.getUndoManager().endUndoAtom();
    }
  }