| /* |
| * 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) {} |
| } |