OSDN Git Service

2004-11-30 Thomas Fitzsimmons <fitzsim@redhat.com>
[pf3gnuchains/gcc-fork.git] / libjava / javax / swing / text / DefaultHighlighter.java
1 /* DefaultHighlighter.java --
2    Copyright (C) 2004  Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
20
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37
38
39 package javax.swing.text;
40
41 import java.awt.Color;
42 import java.awt.Graphics;
43 import java.awt.Rectangle;
44 import java.awt.Shape;
45 import java.util.Vector;
46
47 public class DefaultHighlighter extends LayeredHighlighter
48 {
49   public static class DefaultHighlightPainter
50     extends LayerPainter
51   {
52     private Color color;
53     
54     public DefaultHighlightPainter(Color c)
55     {
56       super();
57       color = c;
58     }
59
60     public Color getColor()
61     {
62       return color;
63     }
64
65     private void paintHighlight(Graphics g, Rectangle rect)
66     {
67       g.fillRect(rect.x, rect.y, rect.width, rect.height);
68     }
69     
70     public void paint(Graphics g, int p0, int p1, Shape bounds,
71                       JTextComponent c)
72     {
73       Rectangle r0 = null;
74       Rectangle r1 = null;
75       Rectangle rect = bounds.getBounds();
76       
77       try
78         {
79           r0 = c.modelToView(p0);
80           r1 = c.modelToView(p1);
81         }
82       catch (BadLocationException e)
83         {
84           // This should never occur.
85           return;
86         }
87
88       if (r0 == null || r1 == null)
89         return;
90
91       if (color == null)
92         g.setColor(c.getSelectionColor());
93       else
94         g.setColor(color);
95
96       // Check if only one line to highlight.
97       if (r0.y == r1.y)
98         {
99           r0.width = r1.x - r0.x;
100           paintHighlight(g, r0);
101           return;
102         }
103
104       // First line, from p0 to end-of-line.
105       r0.width = rect.x + rect.width - r0.x;
106       paintHighlight(g, r0);
107       
108       // FIXME: All the full lines in between, if any (assumes that all lines
109       // have the same height -- not a good assumption with JEditorPane/JTextPane).
110       r0.y += r0.height;
111       r0.x = rect.x;
112
113       while (r0.y < r1.y)
114         {
115           paintHighlight(g, r0);
116           r0.y += r0.height;
117         }
118
119       // Last line, from beginnin-of-line to p1.
120       paintHighlight(g, r1);
121     }
122
123     public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds,
124                             JTextComponent c, View view)
125     {
126       throw new InternalError();
127     }
128   }
129   
130   private class HighlightEntry
131   {
132     int p0;
133     int p1;
134     Highlighter.HighlightPainter painter;
135
136     public HighlightEntry(int p0, int p1, Highlighter.HighlightPainter painter)
137     {
138       this.p0 = p0;
139       this.p1 = p1;
140       this.painter = painter;
141     }
142
143     public int getStartPosition()
144     {
145       return p0;
146     }
147
148     public int getEndPosition()
149     {
150       return p1;
151     }
152
153     public Highlighter.HighlightPainter getPainter()
154     {
155       return painter;
156     }
157   }
158
159   /**
160    * @specnote final as of 1.4
161    */
162   public static final LayeredHighlighter.LayerPainter DefaultPainter =
163     new DefaultHighlightPainter(null);
164   
165   private JTextComponent textComponent;
166   private Vector highlights = new Vector();
167   private boolean drawsLayeredHighlights = true;
168   
169   public DefaultHighlighter()
170   {
171   }
172
173   public boolean getDrawsLayeredHighlights()
174   {
175     return drawsLayeredHighlights;
176   }
177
178   public void setDrawsLayeredHighlights(boolean newValue)
179   {
180     drawsLayeredHighlights = newValue;
181   }
182   
183   private void checkPositions(int p0, int p1)
184     throws BadLocationException
185   {
186     if (p0 < 0)
187       throw new BadLocationException("DefaultHighlighter", p0);
188     
189     if (p1 < p0)
190       throw new BadLocationException("DefaultHighlighter", p1);
191   }
192
193   public void install(JTextComponent c)
194   {
195     textComponent = c;
196     removeAllHighlights();
197   }
198
199   public void deinstall(JTextComponent c)
200   {
201     textComponent = null;
202   }
203
204   public Object addHighlight(int p0, int p1, Highlighter.HighlightPainter painter)
205     throws BadLocationException
206   {
207     checkPositions(p0, p1);
208     HighlightEntry entry = new HighlightEntry(p0, p1, painter);
209     highlights.add(entry);
210     return entry;
211   }
212
213   public void removeHighlight(Object tag)
214   {
215     highlights.remove(tag);
216   }
217
218   public void removeAllHighlights()
219   {
220     highlights.clear();
221   }
222
223   public Highlighter.Highlight[] getHighlights()
224   {
225     return null;
226   }
227
228   public void changeHighlight(Object tag, int p0, int p1)
229     throws BadLocationException
230   {
231     checkPositions(p0, p1);
232     HighlightEntry entry = (HighlightEntry) tag;
233     entry.p0 = p0;
234     entry.p1 = p1;
235   }
236
237   public void paintLayeredHighlights(Graphics g, int p0, int p1,
238                                      Shape viewBounds, JTextComponent editor,
239                                      View view)
240   {
241   }
242
243   public void paint(Graphics g)
244   {
245     // Check if there are any highlights.
246     if (highlights.size() == 0)
247       return;
248     
249     Shape bounds = textComponent.getBounds();
250     
251     for (int index = 0; index < highlights.size(); ++index)
252       {
253         HighlightEntry entry = (HighlightEntry) highlights.get(index);
254         entry.painter.paint(g, entry.p0, entry.p1, bounds, textComponent);
255       }
256   }
257 }