dfae138ffdadec259213cff14674c825749f5a65
[debian/jabref.git] / src / java / net / sf / jabref / FieldTextArea.java
1 /*
2  Copyright (C) 2003 Nizar N. Batada, Morten O. Alver
3
4  All programs in this directory and
5  subdirectories are published under the GNU General Public License as
6  described below.
7
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or (at
11  your option) any later version.
12
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21  USA
22
23  Further information about the GNU GPL is available at:
24  http://www.gnu.org/copyleft/gpl.ja.html
25
26  */
27 package net.sf.jabref;
28
29 import java.awt.*;
30 import java.util.regex.Pattern;
31
32 import javax.swing.JComponent;
33 import javax.swing.JLabel;
34 import javax.swing.JScrollPane;
35 import javax.swing.JTextArea;
36
37 /**
38  * An implementation of the FieldEditor backed by a JTextArea. Used for
39  * multi-line input.
40  * 
41  * @author $Author: mortenalver $
42  * @version $Revision: 2291 $ ($Date: 2007-08-23 23:18:12 +0200 (Thu, 23 Aug 2007) $)
43  * 
44  */
45 public class FieldTextArea extends JTextArea implements FieldEditor {
46
47         Dimension PREFERRED_SIZE;
48
49         JScrollPane sp;
50
51         FieldNameLabel label;
52
53         String fieldName;
54
55         final static Pattern bull = Pattern.compile("\\s*[-\\*]+.*");
56
57         final static Pattern indent = Pattern.compile("\\s+.*");
58
59         final boolean antialias = Globals.prefs.getBoolean("antialias");
60
61         public FieldTextArea(String fieldName_, String content) {
62                 super(content);
63
64         updateFont();
65                 
66                 // Add the global focus listener, so a menu item can see if this field
67                 // was focused when an action was called.
68                 addFocusListener(Globals.focusListener);
69                 addFocusListener(new FieldEditorFocusListener());
70                 sp = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
71                         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
72                 sp.setMinimumSize(new Dimension(200, 1));
73
74                 setLineWrap(true);
75                 setWrapStyleWord(true);
76                 fieldName = fieldName_;
77
78                 label = new FieldNameLabel(" " + Util.nCase(fieldName) + " ");
79                 setBackground(GUIGlobals.validFieldBackground);
80
81                 FieldTextMenu popMenu = new FieldTextMenu(this);
82                 this.addMouseListener(popMenu);
83                 label.addMouseListener(popMenu);
84         }
85
86         public Dimension getPreferredScrollableViewportSize() {
87                 return getPreferredSize();
88         }
89
90         /*public void paint(Graphics g) {
91                 Graphics2D g2 = (Graphics2D) g;
92                 if (antialias)
93                         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
94                 super.paint(g2);
95         }*/
96
97         public String getFieldName() {
98                 return fieldName;
99         }
100
101         public void setFieldName(String newName) {
102                 fieldName = newName;
103         }
104
105         public JLabel getLabel() {
106                 return label;
107         }
108
109         public void setLabelColor(Color c) {
110                 label.setForeground(c);
111         }
112
113         public JComponent getPane() {
114                 return sp;
115         }
116
117         public JComponent getTextComponent() {
118                 return this;
119         }
120
121
122     public void updateFont() {
123         setFont(GUIGlobals.CURRENTFONT);
124     }
125
126     public void paste(String textToInsert) {
127                 int sel = getSelectionEnd() - getSelectionStart();
128                 if (sel > 0) // selected text available
129                         replaceSelection(textToInsert);
130                 else {
131                         int cPos = this.getCaretPosition();
132                         this.insert(textToInsert, cPos);
133                 }
134         }
135
136         // public void keyPressed(KeyEvent event) {
137         // int keyCode = event.getKeyCode();
138         // if (keyCode == KeyEvent.VK_ENTER) {
139         // // Consume; we will handle this ourselves:
140         // event.consume();
141         // autoWrap();
142         //
143         // }
144         //
145         // }
146         //
147         // private void autoWrap() {
148         // int pos = getCaretPosition();
149         // int posAfter = pos + 1;
150         // StringBuffer sb = new StringBuffer(getText());
151         // // First insert the line break:
152         // sb.insert(pos, '\n');
153         //
154         // // We want to investigate the beginning of the last line:
155         // // int end = sb.length();
156         //
157         // // System.out.println("."+sb.substring(0, pos)+".");
158         //
159         // // Find 0 or the last line break before our current position:
160         // int idx = sb.substring(0, pos).lastIndexOf("\n") + 1;
161         // String prevLine = sb.substring(idx, pos);
162         // if (bull.matcher(prevLine).matches()) {
163         // int id = findFirstNonWhitespace(prevLine);
164         // if (id >= 0) {
165         // sb.insert(posAfter, prevLine.substring(0, id));
166         // posAfter += id;
167         // }
168         // } else if (indent.matcher(prevLine).matches()) {
169         // int id = findFirstNonWhitespace(prevLine);
170         // if (id >= 0) {
171         // sb.insert(posAfter, prevLine.substring(0, id));
172         // posAfter += id;
173         // }
174         // }
175         // /*
176         // * if (prevLine.startsWith(" ")) { sb.insert(posAfter, " "); posAfter++; }
177         // */
178         //
179         // setText(sb.toString());
180         // setCaretPosition(posAfter);
181         // }
182         //
183         // private int findFirstNonWhitespace(String s) {
184         // for (int i = 0; i < s.length(); i++) {
185         // if (!Character.isWhitespace(s.charAt(i)))
186         // return i;
187         // }
188         // return -1;
189         // }
190         //
191         // public void keyReleased(KeyEvent event) {
192         //
193         // }
194         //
195         // public void keyTyped(KeyEvent event) {
196         // }
197 }