defaultcaret.java

来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 1,104 行 · 第 1/2 页

JAVA
1,104
字号
   * <code>MouseEvent</code>.   *   * @param event the <code>MouseEvent</code> from which to fetch the position   */  protected void positionCaret(MouseEvent event)  {    int newDot = getComponent().viewToModel(event.getPoint());    setDot(newDot);  }  /**   * Deinstalls this <code>Caret</code> from the specified   * <code>JTextComponent</code>. This removes any listeners that have been   * registered by this <code>Caret</code>.   *   * @param c the text component from which to install this caret   */  public void deinstall(JTextComponent c)  {    textComponent.removeFocusListener(this);    textComponent.removeMouseListener(this);    textComponent.removeMouseMotionListener(this);    textComponent.getDocument().removeDocumentListener(documentListener);    documentListener = null;    textComponent.removePropertyChangeListener(propertyChangeListener);    propertyChangeListener = null;    textComponent = null;    // Deinstall blink timer if present.    if (blinkTimer != null)      blinkTimer.stop();    blinkTimer = null;  }  /**   * Installs this <code>Caret</code> on the specified   * <code>JTextComponent</code>. This registers a couple of listeners   * on the text component.   *   * @param c the text component on which to install this caret   */  public void install(JTextComponent c)  {    textComponent = c;    textComponent.addFocusListener(this);    textComponent.addMouseListener(this);    textComponent.addMouseMotionListener(this);    propertyChangeListener = new PropertyChangeHandler();    textComponent.addPropertyChangeListener(propertyChangeListener);    documentListener = new DocumentHandler();    textComponent.getDocument().addDocumentListener(documentListener);    repaint();  }  /**   * Sets the current visual position of this <code>Caret</code>.   *   * @param p the Point to use for the saved location. May be <code>null</code>   *        to indicate that there is no visual location   */  public void setMagicCaretPosition(Point p)  {    magicCaretPosition = p;  }  /**   * Returns the current visual position of this <code>Caret</code>.   *   * @return the current visual position of this <code>Caret</code>   *   * @see #setMagicCaretPosition   */  public Point getMagicCaretPosition()  {    return magicCaretPosition;  }  /**   * Returns the current position of the <code>mark</code>. The   * <code>mark</code> marks the location in the <code>Document</code> that   * is the end of a selection. If there is no selection, the <code>mark</code>   * is the same as the <code>dot</code>.   *   * @return the current position of the mark   */  public int getMark()  {    return mark;  }    private void clearHighlight()  {    Highlighter highlighter = textComponent.getHighlighter();        if (highlighter == null)      return;        if (selectionVisible)      {    try      {        if (highlightEntry == null)          highlightEntry = highlighter.addHighlight(0, 0, getSelectionPainter());        else          highlighter.changeHighlight(highlightEntry, 0, 0);                // Free the global variable which stores the text component with an active        // selection.        if (componentWithSelection == textComponent)          componentWithSelection = null;      }    catch (BadLocationException e)      {        // This should never happen.        throw new InternalError();      }      }    else      {    if (highlightEntry != null)      {        highlighter.removeHighlight(highlightEntry);        highlightEntry = null;      }      }  }    private void handleHighlight()  {    Highlighter highlighter = textComponent.getHighlighter();        if (highlighter == null)      return;        int p0 = Math.min(dot, mark);    int p1 = Math.max(dot, mark);        if (selectionVisible)      {	try	  {	    if (highlightEntry == null)	      highlightEntry = highlighter.addHighlight(p0, p1, getSelectionPainter());	    else	      highlighter.changeHighlight(highlightEntry, p0, p1);                        // If another component currently has a text selection clear that selection            // first.            if (componentWithSelection != null)              if (componentWithSelection != textComponent)                {                  Caret c = componentWithSelection.getCaret();                  c.setDot(c.getDot());                }            componentWithSelection = textComponent;            	  }	catch (BadLocationException e)	  {	    // This should never happen.	    throw new InternalError();	  }      }    else      {	if (highlightEntry != null)	  {	    highlighter.removeHighlight(highlightEntry);	    highlightEntry = null;	  }      }  }  /**   * Sets the visiblity state of the selection.   *   * @param v <code>true</code> if the selection should be visible,   *        <code>false</code> otherwise   */  public void setSelectionVisible(boolean v)  {    if (selectionVisible == v)      return;        selectionVisible = v;    handleHighlight();    repaint();  }  /**   * Returns <code>true</code> if the selection is currently visible,   * <code>false</code> otherwise.   *   * @return <code>true</code> if the selection is currently visible,   *         <code>false</code> otherwise   */  public boolean isSelectionVisible()  {    return selectionVisible;  }  /**   * Causes the <code>Caret</code> to repaint itself.   */  protected final void repaint()  {    getComponent().repaint(x, y, width, height);  }  /**   * Paints this <code>Caret</code> using the specified <code>Graphics</code>   * context.   *   * @param g the graphics context to use   */  public void paint(Graphics g)  {    JTextComponent comp = getComponent();    if (comp == null)      return;    // Make sure the dot has a sane position.    dot = Math.min(dot, textComponent.getDocument().getLength());    dot = Math.max(dot, 0);    Rectangle rect = null;    try      {        rect = textComponent.modelToView(dot);      }    catch (BadLocationException e)      {    	AssertionError ae;    	ae = new AssertionError("Unexpected bad caret location: " + dot);    	ae.initCause(e);    	throw ae;      }    if (rect == null)      return;    // Check if paint has possibly been called directly, without a previous    // call to damage(). In this case we need to do some cleanup first.    if ((x != rect.x) || (y != rect.y))      {        repaint(); // Erase previous location of caret.        x = rect.x;        y = rect.y;        width = 1;        height = rect.height;      }    // Now draw the caret on the new position if visible.    if (visible)      {        g.setColor(textComponent.getCaretColor());        g.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height);      }  }  /**   * Returns all registered event listeners of the specified type.   *   * @param listenerType the type of listener to return   *   * @return all registered event listeners of the specified type   */  public EventListener[] getListeners(Class listenerType)  {    return listenerList.getListeners(listenerType);  }  /**   * Registers a {@link ChangeListener} that is notified whenever that state   * of this <code>Caret</code> changes.   *   * @param listener the listener to register to this caret   */  public void addChangeListener(ChangeListener listener)  {    listenerList.add(ChangeListener.class, listener);  }  /**   * Removes a {@link ChangeListener} from the list of registered listeners.   *   * @param listener the listener to remove   */  public void removeChangeListener(ChangeListener listener)  {    listenerList.remove(ChangeListener.class, listener);  }  /**   * Returns all registered {@link ChangeListener}s of this <code>Caret</code>.   *   * @return all registered {@link ChangeListener}s of this <code>Caret</code>   */  public ChangeListener[] getChangeListeners()  {    return (ChangeListener[]) getListeners(ChangeListener.class);  }  /**   * Notifies all registered {@link ChangeListener}s that the state   * of this <code>Caret</code> has changed.   */  protected void fireStateChanged()  {    ChangeListener[] listeners = getChangeListeners();    for (int index = 0; index < listeners.length; ++index)      listeners[index].stateChanged(changeEvent);  }  /**   * Returns the <code>JTextComponent</code> on which this <code>Caret</code>   * is installed.   *   * @return the <code>JTextComponent</code> on which this <code>Caret</code>   *         is installed   */  protected final JTextComponent getComponent()  {    return textComponent;  }  /**   * Returns the blink rate of this <code>Caret</code> in milliseconds.   * A value of <code>0</code> means that the caret does not blink.   *   * @return the blink rate of this <code>Caret</code> or <code>0</code> if   *         this caret does not blink   */  public int getBlinkRate()  {    return blinkRate;  }  /**   * Sets the blink rate of this <code>Caret</code> in milliseconds.   * A value of <code>0</code> means that the caret does not blink.   *   * @param rate the new blink rate to set   */  public void setBlinkRate(int rate)  {    if (blinkTimer != null)      blinkTimer.setDelay(rate);    blinkRate = rate;  }  /**   * Returns the current position of this <code>Caret</code> within the   * <code>Document</code>.   *   * @return the current position of this <code>Caret</code> within the   *         <code>Document</code>   */  public int getDot()  {    return dot;  }  /**   * Moves the <code>dot</code> location without touching the   * <code>mark</code>. This is used when making a selection.   *   * @param dot the location where to move the dot   *   * @see #setDot(int)   */  public void moveDot(int dot)  {    if (dot >= 0)      {        Document doc = textComponent.getDocument();        if (doc != null)          this.dot = Math.min(dot, doc.getLength());        this.dot = Math.max(this.dot, 0);                handleHighlight();        adjustVisibility(this);        appear();      }  }  /**   * Sets the current position of this <code>Caret</code> within the   * <code>Document</code>. This also sets the <code>mark</code> to the new   * location.   *    * @param dot   *          the new position to be set   * @see #moveDot(int)   */  public void setDot(int dot)  {    if (dot >= 0)      {                Document doc = textComponent.getDocument();        if (doc != null)          this.dot = Math.min(dot, doc.getLength());        this.dot = Math.max(this.dot, 0);        this.mark = this.dot;                clearHighlight();        adjustVisibility(this);        appear();      }  }    /**   * Show the caret (may be hidden due blinking) and adjust the timer not to   * hide it (possibly immediately).   *    * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)   */  void appear()  {    // All machinery is only required if the carret is blinking.    if (blinkListener != null)      {        blinkListener.ignoreNextEvent = true;        // If the caret is visible, erase the current position by repainting        // over.        if (visible)          repaint();        // Draw the caret in the new position.        visible = true;        Rectangle area = null;	int dot = getDot();        try          {            area = getComponent().modelToView(dot);          }        catch (BadLocationException e)          {	    AssertionError ae;	    ae = new AssertionError("Unexpected bad caret location: " + dot);	    ae.initCause(e);	    throw ae;          }        if (area != null)          damage(area);      }    repaint();  }    /**   * Returns <code>true</code> if this <code>Caret</code> is currently visible,   * and <code>false</code> if it is not.   *   * @return <code>true</code> if this <code>Caret</code> is currently visible,   *         and <code>false</code> if it is not   */  public boolean isVisible()  {    return visible;  }  /**   * Sets the visibility state of the caret. <code>true</code> shows the   * <code>Caret</code>, <code>false</code> hides it.   *   * @param v the visibility to set   */    public void setVisible(boolean v)  {    if (v != visible)      {        visible = v;        updateTimerStatus();        Rectangle area = null;	int dot = getDot();        try          {                        area = getComponent().modelToView(dot);          }        catch (BadLocationException e)          {	    AssertionError ae;	    ae = new AssertionError("Unexpected bad caret location: " + dot);	    ae.initCause(e);	    throw ae;          }        if (area != null)          damage(area);      }  }  /**   * Returns the {@link Highlighter.HighlightPainter} that should be used   * to paint the selection.   *   * @return the {@link Highlighter.HighlightPainter} that should be used   *         to paint the selection   */  protected Highlighter.HighlightPainter getSelectionPainter()  {    return DefaultHighlighter.DefaultPainter;  }  /**   * Updates the carets rectangle properties to the specified rectangle and   * repaints the caret.   *   * @param r the rectangle to set as the caret rectangle   */  protected void damage(Rectangle r)  {    if (r == null)      return;    x = r.x;    y = r.y;    width = 1;    // height is normally set in paint and we leave it untouched. However, we    // must set a valid value here, since otherwise the painting mechanism    // sets a zero clip and never calls paint.    if (height <= 0)      height = getComponent().getHeight();    repaint();  }  /**   * Adjusts the text component so that the caret is visible. This default   * implementation simply calls   * {@link JComponent#scrollRectToVisible(Rectangle)} on the text component.   * Subclasses may wish to change this.   */  protected void adjustVisibility(Rectangle rect)  {    getComponent().scrollRectToVisible(rect);  }  /**   * Initializes the blink timer.   */  private void initBlinkTimer()  {    // Setup the blink timer.    blinkListener = new BlinkTimerListener();    blinkTimer = new Timer(getBlinkRate(), blinkListener);    blinkTimer.setRepeats(true);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?