CoverityFix-CID:1350648 Dropped or ignored exception
[scilab.git] / scilab / modules / commons / src / java / org / scilab / modules / commons / gui / ScilabCaret.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 package org.scilab.modules.commons.gui;
17
18 import java.awt.Color;
19 import java.awt.Graphics;
20 import java.awt.Rectangle;
21 import java.awt.event.FocusEvent;
22 import java.awt.event.MouseEvent;
23
24 import javax.swing.UIManager;
25 import javax.swing.text.BadLocationException;
26 import javax.swing.text.DefaultCaret;
27 import javax.swing.text.JTextComponent;
28
29 /**
30  * This class handles the tabulation
31  * @author Calixte DENIZET
32  */
33 public class ScilabCaret extends DefaultCaret {
34
35     private static final long serialVersionUID = 8230195712653828841L;
36
37     private static Color selectionColor;
38     private static Color inactiveSelectionColor;
39
40     private JTextComponent editor;
41
42     private boolean overwriteMode;
43     private boolean mustAdjustVisibility = true;
44
45     /**
46      * Constructor
47      * @param editor the editor where the caret lives
48      */
49     public ScilabCaret(JTextComponent editor) {
50         super();
51         this.editor = editor;
52         setSelectionColor(editor.getSelectionColor(), UIManager.getColor("TextComponent.selectionBackgroundInactive"));
53     }
54
55     /**
56      * {@inheritDoc}
57      */
58     protected void adjustVisibility(Rectangle nloc) {
59         if (mustAdjustVisibility) {
60             super.adjustVisibility(nloc);
61         }
62     }
63
64     public void setMustAdjustVisibility(boolean mustAdjustVisibility) {
65         this.mustAdjustVisibility = mustAdjustVisibility;
66     }
67
68     public boolean getMustAdjustVisibility() {
69         return this.mustAdjustVisibility;
70     }
71
72     /**
73      * @param active the color of the selection when it is active
74      * @param inactive the color of the selection when it is inactive
75      */
76     public void setSelectionColor(Color active, Color inactive) {
77         selectionColor = active;
78         inactiveSelectionColor = inactive;
79         if (inactiveSelectionColor == null) {
80             float r = 0.6f * selectionColor.getRed() / 255f + 0.4f * Color.LIGHT_GRAY.getRed() / 255f;
81             float g = 0.6f * selectionColor.getGreen() / 255f + 0.4f * Color.LIGHT_GRAY.getGreen() / 255f;
82             float b = 0.6f * selectionColor.getBlue() / 255f + 0.4f * Color.LIGHT_GRAY.getBlue() / 255f;
83             inactiveSelectionColor = new Color(r, g, b);
84         }
85     }
86
87     /**
88      * @return the color of the selection
89      */
90     public Color getSelectionColor() {
91         return selectionColor;
92     }
93
94     /**
95      * @return the color of the inactive selection
96      */
97     public Color getInactiveSelectionColor() {
98         return inactiveSelectionColor;
99     }
100
101     /**
102      * {@inheritDoc}
103      */
104     public void setSelectionVisible(boolean vis) {
105         super.setSelectionVisible(true);
106     }
107
108     /**
109      * {@inheritDoc}
110      */
111     public void focusGained(FocusEvent e) {
112         editor.setSelectionColor(selectionColor);
113         editor.repaint();
114         super.focusGained(e);
115     }
116
117     /**
118      * {@inheritDoc}
119      */
120     public void focusLost(FocusEvent e) {
121         editor.setSelectionColor(inactiveSelectionColor);
122         editor.repaint();
123         super.focusLost(e);
124     }
125
126     /**
127      * {@inheritDoc}
128      */
129     public void mouseDragged(MouseEvent e) {
130         editor.setSelectionColor(selectionColor);
131         super.mouseDragged(e);
132     }
133
134     /**
135      * @param overwriteMode if true, the caret will be drawn as solid rectangle
136      */
137     public void setOverwriteMode(boolean overwriteMode) {
138         this.overwriteMode = overwriteMode;
139     }
140
141     /**
142      * {@inheritDoc}
143      */
144     public void paint(Graphics g) {
145         if (isVisible() && overwriteMode) {
146             Rectangle r = null;
147             int pos = editor.getCaretPosition();
148             try {
149                 r = editor.modelToView(pos);
150             } catch (BadLocationException e) {
151                 System.err.println(e);
152             }
153             if (r != null && (r.width != 0 || r.height != 0)) {
154                 if ( (x != r.x) || (y != r.y) ) {
155                     repaint();
156                     x = r.x;
157                     y = r.y;
158                     height = r.height;
159                     width = editor.getFontMetrics(editor.getFont()).charWidth('W') + 1;
160                 } else {
161                     g.setColor(editor.getCaretColor());
162                     g.setXORMode(editor.getBackground());
163                     g.fillRect(x, y, width, height);
164                 }
165             }
166         } else {
167             super.paint(g);
168         }
169     }
170
171     /**
172      * {@inheritDoc}
173      */
174     protected synchronized void damage(Rectangle r) {
175         if (overwriteMode) {
176             if (r == null) {
177                 return;
178             }
179
180             x = r.x;
181             y = r.y;
182             height = r.height;
183             repaint();
184         } else {
185             super.damage(r);
186         }
187     }
188 }