public void execute() {
      if (!isEditable() || !isEnabled()) {
        return;
      }
      int position = lastClickPoint != null ? viewToModel(lastClickPoint) : getCaretPosition();
      lastClickPoint = null;
      Document document = getDocument();
      String selectedText = getSelectedText();

      try {
        if (selectedText != null && !CommonUtil.isEmpty(selectedText)) {
          String trimmed = selectedText.trim();
          if (trimmed.startsWith("<!--") && trimmed.endsWith("-->")) {
            StringBuffer buffer = new StringBuffer(selectedText);
            int pos = buffer.indexOf("<!--");
            buffer.delete(pos, pos + 4);
            pos = buffer.lastIndexOf("-->");
            buffer.delete(pos, pos + 3);
            replaceSelection(buffer.toString());
          } else {
            String newSelection = "<!--" + selectedText + "-->";
            replaceSelection(newSelection);
          }
        } else {
          final int docLen = document.getLength();
          int fromIndex = Math.max(0, getText(0, position).lastIndexOf('\n'));
          int toIndex = getText(fromIndex + 1, docLen - position).indexOf('\n');
          toIndex = toIndex < 0 ? docLen : fromIndex + toIndex;
          String textToComment = getText(fromIndex, toIndex - fromIndex + 1);

          if (textToComment.startsWith("\n")) {
            textToComment = textToComment.substring(1);
            fromIndex++;
          }
          if (textToComment.endsWith("\n")) {
            textToComment = textToComment.substring(0, textToComment.length() - 1);
            toIndex--;
          }
          String trimmed = textToComment.trim();
          if (trimmed.startsWith("<!--") && trimmed.endsWith("-->")) {
            int pos = textToComment.lastIndexOf("-->");
            document.remove(fromIndex + pos, 3);
            pos = textToComment.indexOf("<!--");
            document.remove(fromIndex + pos, 4);
          } else {
            document.insertString(Math.min(toIndex + 1, docLen), "-->", null);
            document.insertString(fromIndex, "<!--", null);
          }
        }
      } catch (BadLocationException e1) {
        e1.printStackTrace();
      }
    }
  /**
   * Makes the label clickable or makes it unclickable. Clickable label features bold and underlined
   * text
   *
   * @param clickable Is the label clickable
   * @param action Action to be performed on click
   * @param rolloverIcon Icon to display on rollover
   * @since Jun 13, 2006 2:00:57 AM
   */
  public void setClickable(
      final boolean clickable, final ActionListener action, final Icon rolloverIcon) {
    if (clickable) {
      //  Set the action
      this.action = action;

      //  Set the offIcon;
      this.offIcon = getIcon();
      setIcon(offIcon);

      //  Add a Mouse Listener
      addMouseListener(this);

      //  Set the text (Undelined and Bolded)
      setText(
          new StringBuffer("<html><b><u>").append(getText()).append("</u></b></html>").toString());

      //  Set the rollover icon
      this.rolloverIcon = rolloverIcon;

      //  Init the Color and Mouse Cursor
      setForeground(offColor);
    } else {
      // Set the action to null
      this.action = null;

      // Remove the Mouse Listener
      removeMouseListener(this);

      //  Change the text back to normal
      final StringBuffer textBuffer = new StringBuffer(getText());
      final int msgEnd = textBuffer.indexOf("</u></b></html>");
      setText(textBuffer.substring(12, msgEnd));

      //  Set the rollover icon
      this.rolloverIcon = null;
    }

    // Repaint the Label
    repaint();
  }