blob: ec63b0f5be218fe2570d8942df150cde186f94dc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.taverna.lang.ui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
/*
* Track the movement of the Caret by painting a background line at the
* current caret position.
*
* Copied from http://www.camick.com/java/source/LinePainter.java
*
* Written by Rob Camick
*/
public class LinePainter
implements Highlighter.HighlightPainter, CaretListener, MouseListener, MouseMotionListener
{
private JTextComponent component;
private Color color;
private Rectangle lastView;
/*
* The line color will be calculated automatically by attempting
* to make the current selection lighter by a factor of 1.2.
*
* @param component text component that requires background line painting
*/
public LinePainter(JTextComponent component)
{
this(component, null);
setLighter(component.getSelectionColor());
}
/*
* Manually control the line color
*
* @param component text component that requires background line painting
* @param color the color of the background line
*/
public LinePainter(JTextComponent component, Color color)
{
this.component = component;
setColor( color );
// Add listeners so we know when to change highlighting
component.addCaretListener( this );
component.addMouseListener( this );
component.addMouseMotionListener( this );
// Turn highlighting on by adding a dummy highlight
try
{
component.getHighlighter().addHighlight(0, 0, this);
}
catch(BadLocationException ble) {}
}
/*
* You can reset the line color at any time
*
* @param color the color of the background line
*/
public void setColor(Color color)
{
this.color = color;
}
/*
* Calculate the line color by making the selection color lighter
*
* @return the color of the background line
*/
public void setLighter(Color color)
{
int red = Math.min(255, (int)(color.getRed() * 1.2));
int green = Math.min(255, (int)(color.getGreen() * 1.2));
int blue = Math.min(255, (int)(color.getBlue() * 1.2));
setColor(new Color(red, green, blue));
}
// Paint the background highlight
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c)
{
try
{
Rectangle r = c.modelToView(c.getCaretPosition());
g.setColor( color );
g.fillRect(0, r.y, c.getWidth(), r.height);
if (lastView == null)
lastView = r;
}
catch(BadLocationException ble) {System.out.println(ble);}
}
/*
* Caret position has changed, remove the highlight
*/
private void resetHighlight()
{
// Use invokeLater to make sure updates to the Document are completed,
// otherwise Undo processing causes the modelToView method to loop.
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
int offset = component.getCaretPosition();
Rectangle currentView = component.modelToView(offset);
if (lastView == null) {
lastView = currentView;
} else {
// Remove the highlighting from the previously highlighted line
if (lastView.y != currentView.y)
{
component.repaint(0, lastView.y, component.getWidth(), lastView.height);
lastView = currentView;
}
}
}
catch(BadLocationException ble) {}
}
});
}
// Implement CaretListener
public void caretUpdate(CaretEvent e)
{
resetHighlight();
}
// Implement MouseListener
public void mousePressed(MouseEvent e)
{
resetHighlight();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// Implement MouseMotionListener
public void mouseDragged(MouseEvent e)
{
resetHighlight();
}
public void mouseMoved(MouseEvent e) {}
}