Changeset 1143


Ignore:
Timestamp:
Jul 3, 2011, 1:55:32 PM (6 years ago)
Author:
stefan
Message:

moved template code from CodeHelperPane? to Template

Location:
trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/data/codehelper/liveTemplates.xml

    r1117 r1143  
    4343  </command>
    4444  <command name="sec" usage="\section{@name@}\label{sec:@label@}&nl;@|@" hint="section">
    45     <argument name="name"/>
     45    <argument name="name">
     46      <generate name="label" function="label"/>
     47    </argument>
    4648    <argument name="label"/>
    4749  </command>
  • trunk/src/sce/codehelper/CodeHelperPane.java

    r1141 r1143  
    4242  // the prefix
    4343
    44   // for working with templates
    45   private String template = null;
    46   private SCEDocumentPosition templateCaretPosition = null;
    47   // template argument values
    48   private ArrayList<CHCommandArgument> templateArguments = null;
    49   private int templateArgumentNr = -1;
    50 
    51   private static final String spaces = "                                                                                          ";
     44  private Template template;
     45
     46  static final String spaces = "                                                                                          ";
    5247
    5348  public CodeHelperPane(SCEPane pane) {
     
    201196  }
    202197
    203   /**
    204    * Starts the template execution.
    205    *
    206    * @param templateWithAt the template String
    207    * @param arguments      the arguments
    208    * @param row            the row
    209    * @param column         the column
    210    */
    211   private void startTemplate(String templateWithAt, ArrayList<CHCommandArgument> arguments, int row, int column) {
    212     String newTemplate = templateWithAt;
    213 
    214     // remove the caret mark
    215     int caretIndex = newTemplate.lastIndexOf("@|@");
    216     if (caretIndex != -1) newTemplate = newTemplate.substring(0, caretIndex) + newTemplate.substring(caretIndex + 3);
    217 
    218     // remember the template and arguments
    219     newTemplate = newTemplate.replaceAll("@", "");
    220     newTemplate = newTemplate.replaceAll("&at;", "@");
    221     templateWithAt = templateWithAt.replaceAll("&at;", "A");
    222 
    223     // insert the template in the document
    224     document.insert(newTemplate, row, column);
    225 
    226     // set the caret position and remove it from template
    227     Tuple<String, SCEDocumentPosition> pair = getTransformedTemplate(templateWithAt, arguments, row, column);
    228     templateWithAt = pair.first;
    229 
    230     if (arguments.size() == 0 && !templateWithAt.contains("\n")) {
    231       caret.moveTo(pair.second, false);
    232       return;
    233     }
    234 
    235     template = newTemplate;
    236     templateArguments = arguments;
    237     templateCaretPosition = pair.second;
    238 
    239     // initialize the argument values and occurrences
    240     for (CHCommandArgument argument : arguments) {
    241       // find occurrences
    242       ArrayList<SCEDocumentRange> occurrences = new ArrayList<SCEDocumentRange>();
    243       int index = -1;
    244       while ((index = templateWithAt.indexOf("@" + argument.getName() + "@", index + 1)) != -1) {
    245         // get the position in the document
    246         int occurrence_row = row;
    247         int occurrence_column = column;
    248 
    249         for (int char_nr = 0; char_nr < index; char_nr++) {
    250           char character = templateWithAt.charAt(char_nr);
    251 
    252           if (character != '@') occurrence_column++;
    253           if (character == '\n') {
    254             occurrence_row++;
    255             occurrence_column = 0;
    256           }
    257         }
    258 
    259         int rel = 0;
    260         if (argument.isOptional()) rel = 1;
    261 
    262         SCEDocumentPosition occurrenceStart = document.createDocumentPosition(occurrence_row, occurrence_column - 1 - rel, rel);
    263         SCEDocumentPosition occurrenceEnd = document.createDocumentPosition(occurrence_row, occurrence_column + argument.getName().length() + rel, -rel);
    264         occurrences.add(new SCEDocumentRange(occurrenceStart, occurrenceEnd));
    265       }
    266       argument.setOccurrences(occurrences);
    267     }
    268 
    269     for (CHCommandArgument argument : arguments) {
    270       if (!argument.getName().equals(argument.getValue())) {
    271         SCEDocumentRange range = argument.getOccurrences().get(0);
    272         SCEPosition start = range.getStartPosition().relative(0, 1);
    273         SCEDocumentPosition end = range.getEndPosition();
    274         document.replace(start, end, argument.getValue());
    275       }
    276     }
    277 
    278     // line breaks
    279     String indentation = getSpaceString(column);
    280     int lineBreakPos = -1;
    281     while ((lineBreakPos = template.indexOf('\n', lineBreakPos + 1)) != -1) {
    282       document.insert(indentation, ++row, 0);
    283     }
    284 
    285     // hide code helper
    286     setVisible(false);
    287 
    288     // start editing with argument number 0
    289     editTemplate(0);
    290   }
    291 
    292   /**
    293    * Returns a string with the given number of space characters.
    294    *
    295    * @param spaceCount number of space characters
    296    * @return string with the given number of space characters
    297    */
    298   private String getSpaceString(int spaceCount) {
    299     if (spaceCount < spaces.length())
    300       return spaces.substring(0, spaceCount);
    301     else
    302       return spaces;
    303   }
    304 
    305   private Tuple<String, SCEDocumentPosition> getTransformedTemplate(String templateWithAt, ArrayList<CHCommandArgument> arguments, int row, int column) {
    306     int cursorIndex = templateWithAt.lastIndexOf("@|@");
    307     if (cursorIndex != -1) {
    308       templateWithAt = templateWithAt.substring(0, cursorIndex) + templateWithAt.substring(cursorIndex + 1);
    309     } else {
    310       cursorIndex = templateWithAt.length();
    311     }
    312 
    313     // get the position in the document
    314     int caret_row = row;
    315     int caret_column = column;
    316 
    317     for (int char_nr = 0; char_nr < cursorIndex; char_nr++) {
    318       char character = templateWithAt.charAt(char_nr);
    319       if (character != '@') caret_column++;
    320       if (character == '\n') {
    321         caret_row++;
    322         caret_column = 0;
    323       }
    324     }
    325 
    326     return new Tuple<String,SCEDocumentPosition>(templateWithAt, document.createDocumentPosition(caret_row, caret_column));
    327   }
    328 
    329   /**
    330    * Edit the template argument with the given number.
    331    *
    332    * @param argument_nr the argument number
    333    */
    334   private void editTemplate(int argument_nr) {
    335     boolean noArgument = false;
    336     if (templateArguments == null || templateArguments.size() == 0) noArgument = true;
    337 
    338     if (!noArgument && templateArgumentNr >= 0 && templateArgumentNr < templateArguments.size()) {
    339       // leave current template argument
    340       CHCommandArgument oldArgument = templateArguments.get(templateArgumentNr);
    341 
    342       if (oldArgument.isOptional()) {
    343         SCEDocumentRange range = oldArgument.getOccurrences().get(0);
    344         SCEPosition start = range.getStartPosition().relative(0, 1);
    345         SCEDocumentPosition end = range.getEndPosition();
    346         String value = document.getText(start, end);
    347 
    348         if (value.equals("") || value.equals(oldArgument.getInitialValue())) {
    349           for (SCEDocumentRange argumentRange : oldArgument.getOccurrences()) {
    350             // check if char before range and after range is [ or ], respectively
    351             int colBefore = argumentRange.getStartPosition().getColumn();
    352             int colAfter  = argumentRange.getEndPosition().getColumn();
    353             int rowNr = argumentRange.getStartPosition().getRow();
    354             SCEDocumentRow row = document.getRowsModel().getRow(rowNr);
    355             if (colBefore >= 0 && colAfter < row.length &&
    356                 row.chars[colBefore].character == '[' && row.chars[colAfter].character == ']') {
    357               document.remove(rowNr, colBefore, rowNr, colAfter + 1, SCEDocumentEvent.EVENT_EDITRANGE, false);
    358             }
    359           }
    360         }
    361       }
    362     }
    363 
    364     if (noArgument || argument_nr >= templateArguments.size()) {
    365       // end template editing
    366       endTemplateEditing(false);
    367 
    368       // set the caret to the end position
    369       caret.moveTo(templateCaretPosition, false);
    370 
    371       return;
    372     }
    373     if (argument_nr < 0) argument_nr = templateArguments.size() - 1;
    374 
    375     templateArgumentNr = argument_nr;
    376 
    377     // set the document edit range
    378     CHCommandArgument argument = templateArguments.get(argument_nr);
    379 
    380     if (argument.isOptional()) {
    381       for (SCEDocumentRange argumentRange : argument.getOccurrences()) {
    382         // check if char before range and after range is [ or ], respectively
    383         int colBefore = argumentRange.getStartPosition().getColumn();
    384         int colAfter  = argumentRange.getEndPosition().getColumn();
    385         int rowNr = argumentRange.getStartPosition().getRow();
    386         SCEDocumentRow row = document.getRowsModel().getRow(rowNr);
    387         if (colBefore >= 0 && colAfter < row.length &&
    388             row.chars[colBefore].character != '[' || row.chars[colAfter].character != ']') {
    389           document.insert("[]", rowNr, colBefore, SCEDocumentEvent.EVENT_EDITRANGE, false);
    390         }
    391       }
    392     }
    393 
    394     SCEDocumentRange argumentRange = argument.getOccurrences().get(0);
    395     SCEDocumentPosition start = new SCEDocumentPosition(argumentRange.getStartPosition().getRow(), argumentRange.getStartPosition().getColumn() + 1);
    396     SCEDocumentPosition end = argumentRange.getEndPosition();
    397     document.setEditRange(start, end, false);
    398 
    399     // select the argument value
    400     caret.moveTo(start, false);
    401     caret.moveTo(end, true);
    402 
    403     if (argument.isCompletion()) {
    404       callCodeHelperWithCompletion();
    405     }
    406   }
    407 
    408198  public void endTemplateEditing(boolean undo) {
    409     templateArgumentNr = -1;
    410     document.setEditRange(null, null, undo);
    411     template = null;
     199    if (template != null) {
     200      document.setEditRange(null, null, undo);
     201      template = null;
     202    }
    412203  }
    413204
     
    471262            SCECaret caret = pane.getCaret();
    472263            document.remove(wordToReplace.getStartPos(), caret);
    473             startTemplate(command.getUsage(), command.getArguments(), wordToReplace.getStartRow(), wordToReplace.getStartCol());
     264
     265            Template newTemplate = Template.startTemplate(pane, command.getUsage(), command.getArguments(), wordToReplace.getStartRow(), wordToReplace.getStartCol());
     266            if (newTemplate != null) {
     267              template = newTemplate;
     268            }
    474269
    475270            e.consume();
     
    530325        SCECaret caret = pane.getCaret();
    531326        document.remove(oldWord.getStartPos(), caret);
    532         startTemplate(command.getUsage(), command.getArguments(), oldWord.getStartRow(), oldWord.getStartCol());
     327
     328        Template newTemplate = Template.startTemplate(pane, command.getUsage(), command.getArguments(), oldWord.getStartRow(), oldWord.getStartCol());
     329        if (newTemplate != null) {
     330          template = newTemplate;
     331        }
    533332
    534333        e.consume();
     
    546345        // end template editing
    547346        if (template != null) {
    548           document.setEditRange(null, null, false);
    549           template = null;
     347          endTemplateEditing(false);
    550348        }
    551349      }
     
    555353    if ((e.getKeyCode() == KeyEvent.VK_TAB || e.getKeyCode() == KeyEvent.VK_ENTER) && template != null) {
    556354      if (e.isShiftDown()) {
    557         editTemplate(templateArgumentNr - 1);
     355        if (!template.goToPreviousArgument())
     356          endTemplateEditing(false);
    558357      } else {
    559         editTemplate(templateArgumentNr + 1);
     358        if (!template.goToNextArgument())
     359          endTemplateEditing(false);
    560360      }
    561361
     
    564364  }
    565365
    566   private void callCodeHelperWithCompletion() {
     366  void callCodeHelperWithCompletion() {
    567367    if (popup.isVisible()) return;
    568368
     
    622422  public void documentChanged(SCEDocument sender, SCEDocumentEvent event) {
    623423    // if we edit a template -> update other positions
    624     if (template != null && templateArguments != null && templateArguments.size() > 0 && templateArgumentNr >= 0) {
    625       if (document.hasEditRange() &&
    626               event.getRangeStart().compareTo(document.getEditRangeStart()) >= 0 &&
    627               event.getRangeStart().compareTo(document.getEditRangeEnd()) <= 0 &&
    628               (event.isInsert() || event.isRemove())) {
    629         // get the argument value
    630         String argumentValue = document.getEditRangeText();
    631 
    632         // update all occurrences of the argument
    633         CHCommandArgument argument = templateArguments.get(templateArgumentNr);
    634 
    635         Iterator occurrencesIterator = argument.getOccurrences().iterator();
    636         occurrencesIterator.next(); // jump over the first occurrence
    637         while (occurrencesIterator.hasNext()) {
    638           SCEDocumentRange argumentRange = (SCEDocumentRange) occurrencesIterator.next();
    639           SCEDocumentPosition start = new SCEDocumentPosition(argumentRange.getStartPosition().getRow(), argumentRange.getStartPosition().getColumn() + 1);
    640           SCEDocumentPosition end = argumentRange.getEndPosition();
    641 
    642           pane.setFreezeCaret(true);
    643           document.remove(start.getRow(), start.getColumn(), end.getRow(), end.getColumn(), 0, false);
    644           document.insert(argumentValue, start.getRow(), start.getColumn(), 0, false);
    645           pane.setFreezeCaret(false);
    646         }
    647       }
     424    if (template != null) {
     425      template.documentChanged(sender, event);
    648426    }
    649427
     
    657435
    658436  public void editAsTemplate(ArrayList<CHCommandArgument> arguments, SCEDocumentPosition caretEndPosition) {
    659     template = "";
    660     templateArguments = arguments;
    661     templateCaretPosition = caretEndPosition;
    662     editTemplate(0);
     437    template = Template.editAsTemplate(arguments, caretEndPosition);
    663438  }
    664439
  • trunk/src/sce/component/SCEPaneUI.java

    r1139 r1143  
    525525  public void mouseMoved(MouseEvent e) {
    526526  }
     527
     528  public CodeHelperPane getCodeHelperPane() {
     529    return codeHelperPane;
     530  }
    527531}
Note: See TracChangeset for help on using the changeset viewer.