@Test
  public void createEmptyProject() {
    RPGBuilder rpgBuilder = Mockito.mock(RPGBuilder.class);
    EditorController controller = new EditorController(rpgBuilder);

    controller.createRPG();

    verify(rpgBuilder).createRPG();
  }
        @Override
        public void mouseClicked(MouseEvent e) {
          if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
            controller.goToSegmentAtLocation(getCaretPosition());
          }
          if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3) {
            PopupMenuConstructorInfo[] cons;
            synchronized (popupConstructors) {
              /** Copy constructors - for disable blocking in the procesing time. */
              cons =
                  popupConstructors.toArray(new PopupMenuConstructorInfo[popupConstructors.size()]);
            }

            // where is the mouse
            int mousepos = viewToModel(e.getPoint());
            boolean isInActiveTranslation =
                mousepos >= getOmDocument().getTranslationStart()
                    && mousepos <= getOmDocument().getTranslationEnd();
            boolean isInActiveEntry;
            int ae = controller.displayedEntryIndex;
            SegmentBuilder sb = controller.m_docSegList[ae];
            if (sb.isActive()) {
              isInActiveEntry =
                  mousepos >= sb.getStartPosition() && mousepos <= sb.getEndPosition();
            } else {
              isInActiveEntry = false;
            }

            JPopupMenu popup = new JPopupMenu();
            for (PopupMenuConstructorInfo c : cons) {
              // call each constructor
              c.constructor.addItems(
                  popup,
                  EditorTextArea3.this,
                  mousepos,
                  isInActiveEntry,
                  isInActiveTranslation,
                  sb);
            }

            DockingUI.removeUnusedMenuSeparators(popup);

            if (popup.getComponentCount() > 0) {
              popup.show(
                  EditorTextArea3.this, (int) e.getPoint().getX(), (int) e.getPoint().getY());
            }
          }
        }
 @Override
 public String getToolTipText(MouseEvent event) {
   int pos = viewToModel(event.getPoint());
   int s = controller.getSegmentIndexAtLocation(pos);
   return controller.markerController.getToolTips(s, pos);
 }
  /**
   * Redefine some keys behavior. We can't use key listeners, because we have to make something
   * AFTER standard keys processing.
   */
  @Override
  protected void processKeyEvent(KeyEvent e) {
    if (e.getID() != KeyEvent.KEY_PRESSED) {
      // key released
      super.processKeyEvent(e);
      return;
    }

    boolean processed = false;

    boolean mac = StaticUtils.onMacOSX();

    Document3 doc = getOmDocument();

    // non-standard processing
    if (isKey(e, KeyEvent.VK_TAB, 0)) {
      // press TAB when 'Use TAB to advance'
      if (controller.settings.isUseTabForAdvance()) {
        controller.nextEntry();
        processed = true;
      }
    } else if (isKey(e, KeyEvent.VK_TAB, KeyEvent.SHIFT_MASK)) {
      // press Shift+TAB when 'Use TAB to advance'
      if (controller.settings.isUseTabForAdvance()) {
        controller.prevEntry();
        processed = true;
      }
    } else if (isKey(e, KeyEvent.VK_ENTER, 0)) {
      // press ENTER
      if (!controller.settings.isUseTabForAdvance()) {
        controller.nextEntry();
        processed = true;
      } else {
        processed = true;
      }
    } else if ((!mac && isKey(e, KeyEvent.VK_ENTER, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_ENTER, KeyEvent.META_MASK))) {
      // press Ctrl+ENTER (Cmd+Enter for MacOS)
      if (!controller.settings.isUseTabForAdvance()) {
        controller.prevEntry();
        processed = true;
      }
    } else if (isKey(e, KeyEvent.VK_ENTER, KeyEvent.SHIFT_MASK)) {
      // convert Shift+Enter event to straight enter key
      KeyEvent ke =
          new KeyEvent(e.getComponent(), e.getID(), e.getWhen(), 0, KeyEvent.VK_ENTER, '\n');
      super.processKeyEvent(ke);
      processed = true;
    } else if ((!mac && isKey(e, KeyEvent.VK_A, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_A, KeyEvent.META_MASK))) {
      // handling Ctrl+A manually (Cmd+A for MacOS)
      setSelectionStart(doc.getTranslationStart());
      setSelectionEnd(doc.getTranslationEnd());
      processed = true;
    } else if (isKey(e, KeyEvent.VK_O, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK)) {
      // handle Ctrl+Shift+O - toggle orientation LTR-RTL
      controller.toggleOrientation();
      processed = true;
    } else if ((!mac && isKey(e, KeyEvent.VK_BACK_SPACE, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_BACK_SPACE, KeyEvent.ALT_MASK))) {
      // handle Ctrl+Backspace (Alt+Backspace for MacOS)
      try {
        int offset = getCaretPosition();
        int prevWord = Utilities.getPreviousWord(this, offset);
        int c = Math.max(prevWord, doc.getTranslationStart());
        setSelectionStart(c);
        setSelectionEnd(offset);
        replaceSelection("");

        processed = true;
      } catch (BadLocationException ex) {
        // do nothing
      }
    } else if ((!mac && isKey(e, KeyEvent.VK_DELETE, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_DELETE, KeyEvent.ALT_MASK))) {
      // handle Ctrl+Backspace (Alt+Delete for MacOS)
      try {
        int offset = getCaretPosition();
        int nextWord = Utilities.getNextWord(this, offset);
        int c = Math.min(nextWord, doc.getTranslationEnd());
        setSelectionStart(offset);
        setSelectionEnd(c);
        replaceSelection("");

        processed = true;
      } catch (BadLocationException ex) {
        // do nothing
      }
    } else if ((!mac && isKey(e, KeyEvent.VK_PAGE_UP, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_PAGE_UP, KeyEvent.META_MASK))) {
      // Ctrl+PgUp - to the begin of document(Cmd+PgUp for MacOS)
      setCaretPosition(0);
      processed = true;
    } else if ((!mac && isKey(e, KeyEvent.VK_PAGE_DOWN, KeyEvent.CTRL_MASK))
        || (mac && isKey(e, KeyEvent.VK_PAGE_DOWN, KeyEvent.META_MASK))) {
      // Ctrl+PgDn - to the end of document(Cmd+PgDn for MacOS)
      setCaretPosition(getOmDocument().getLength());
      processed = true;
    }

    // leave standard processing if need
    if (processed) {
      e.consume();
    } else {
      if ((e.getModifiers() & (KeyEvent.CTRL_MASK | KeyEvent.META_MASK | KeyEvent.ALT_MASK)) == 0) {
        // there is no Alt,Ctrl,Cmd keys, i.e. it's char
        if (e.getKeyCode() != KeyEvent.VK_SHIFT) {
          // it's not a single 'shift' press
          checkAndFixCaret();
        }
      }
      super.processKeyEvent(e);
    }

    controller.showLengthMessage();

    // some after-processing catches
    if (!processed && e.getKeyChar() != 0) {
      switch (e.getKeyCode()) {
        case KeyEvent.VK_HOME:
        case KeyEvent.VK_END:
        case KeyEvent.VK_LEFT:
        case KeyEvent.VK_RIGHT:
        case KeyEvent.VK_UP:
        case KeyEvent.VK_DOWN:
          checkAndFixCaret();
      }
    }
  }