Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
TextPanel.java
1 package ij.text;
2 
3 import java.awt.*;
4 import java.io.*;
5 import java.awt.event.*;
6 import java.util.*;
7 import java.awt.datatransfer.*;
8 import ij.*;
9 import ij.plugin.filter.Analyzer;
10 import javax.swing.*;
11 
12 
19 public class TextPanel extends JPanel implements AdjustmentListener,
20  MouseListener, MouseMotionListener, KeyListener, ClipboardOwner,
21  ActionListener {
22 
23  // height / width
24  int iGridWidth,iGridHeight;
25  int iX,iY;
26  // data
27  String sColHead[];
28  Vector vData;
29  int iColWidth[];
30  int iColCount,iRowCount;
31  int iRowHeight,iFirstRow;
32  // scrolling
33  Scrollbar sbHoriz,sbVert;
34  int iSbWidth,iSbHeight;
35  boolean bDrag;
36  int iXDrag,iColDrag;
37 
38  boolean headings = true;
39  String title = "";
40  String labels;
41  KeyListener keyListener;
42  Cursor resizeCursor = new Cursor(Cursor.E_RESIZE_CURSOR);
43  Cursor defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR);
44  int selStart=-1, selEnd=-1,selOrigin=-1, selLine=-1;
45  TextCanvas tc;
46  JPopupMenu pm;
47  boolean columnsManuallyAdjusted;
48 
50  public TextPanel() {
51  tc = new TextCanvas(this);
52  setLayout(new BorderLayout());
53  add("Center",tc);
54  sbHoriz=new Scrollbar(Scrollbar.HORIZONTAL);
55  sbHoriz.addAdjustmentListener(this);
56  add("South", sbHoriz);
57  sbVert=new Scrollbar(Scrollbar.VERTICAL);
58  sbVert.addAdjustmentListener(this);
59  ImageJ ij = IJ.getInstance();
60  if (ij!=null) {
61  sbHoriz.addKeyListener(ij);
62  sbVert.addKeyListener(ij);
63  }
64  add("East", sbVert);
65  addPopupMenu();
66  }
67 
69  public TextPanel(String title) {
70  this();
71  if (title.equals("Results")) {
72  pm.addSeparator();
73  addPopupItem("Clear Results");
74  addPopupItem("Summarize");
75  addPopupItem("Set Measurements...");
76  }
77  }
78 
79  void addPopupMenu() {
80  pm=new JPopupMenu();
81  addPopupItem("Save As...");
82  pm.addSeparator();
83  addPopupItem("Cut");
84  addPopupItem("Copy");
85  addPopupItem("Clear");
86  addPopupItem("Select All");
87  addPopupItem("Copy All");
88  add(pm);
89  }
90 
91  void addPopupItem(String s) {
92  JMenuItem mi=new JMenuItem(s);
93  mi.addActionListener(this);
94  pm.add(mi);
95  }
96 
102  public synchronized void setColumnHeadings(String labels) {
103  boolean sameLabels = labels.equals(this.labels);
104  this.labels = labels;
105  if (labels.equals("")) {
106  iColCount = 1;
107  sColHead=new String[1];
108  sColHead[0] = "";
109  } else {
110  StringTokenizer t = new StringTokenizer(labels, "\t");
111  iColCount = t.countTokens();
112  sColHead=new String[iColCount];
113  for(int i=0; i<iColCount; i++)
114  sColHead[i] = t.nextToken();
115  }
116  flush();
117  vData=new Vector();
118  if (!(iColWidth!=null && iColWidth.length==iColCount && sameLabels && iColCount!=1)) {
119  iColWidth=new int[iColCount];
120  columnsManuallyAdjusted = false;
121  }
122  iRowCount=0;
123  resetSelection();
124  adjustHScroll();
125  tc.repaint();
126  }
127 
129  public String getColumnHeadings() {
130  return labels==null?"":labels;
131  }
132 
133  public void setFont(Font font) {
134 
135  }
136 
138  public void appendLine(String data) {
139  if (vData==null)
140  setColumnHeadings("");
141  char[] chars = data.toCharArray();
142  vData.addElement(chars);
143  iRowCount++;
144  if (isShowing()) {
145  if (iColCount==1 && tc.fMetrics!=null) {
146  iColWidth[0] = Math.max(iColWidth[0], tc.fMetrics.charsWidth(chars,0,chars.length));
147  adjustHScroll();
148  }
149  updateDisplay();
150  }
151  }
152 
154  public void append(String data) {
155  if (data==null) data="null";
156  if (vData==null)
157  setColumnHeadings("");
158  while (true) {
159  int p=data.indexOf('\n');
160  if (p<0) {
161  appendWithoutUpdate(data);
162  break;
163  }
164  appendWithoutUpdate(data.substring(0,p));
165  data = data.substring(p+1);
166  if (data.equals(""))
167  break;
168  }
169  if (isShowing())
170  updateDisplay();
171  }
172 
174  void appendWithoutUpdate(String data) {
175  char[] chars = data.toCharArray();
176  vData.addElement(chars);
177  iRowCount++;
178  }
179 
180  void updateDisplay() {
181  iY=iRowHeight*(iRowCount+1);
182  adjustVScroll();
183  if (iColCount>1 && iRowCount<=10 && !columnsManuallyAdjusted)
184  iColWidth[0] = 0; // forces column width calculation
185  tc.repaint();
186  }
187 
188  String getCell(int column, int row) {
189  if (column<0||column>=iColCount||row<0||row>=iRowCount)
190  return null;
191  return new String(tc.getChars(column, row));
192  }
193 
194  synchronized void adjustVScroll() {
195  if(iRowHeight==0) return;
196  Dimension d = tc.getSize();
197  int value = iY/iRowHeight;
198  int visible = d.height/iRowHeight;
199  int maximum = iRowCount+1;
200  if (visible<0) visible=0;
201  if (visible>maximum) visible=maximum;
202  if (value>(maximum-visible)) value=maximum-visible;
203  sbVert.setValues(value,visible,0,maximum);
204  iY=iRowHeight*value;
205  }
206 
207  synchronized void adjustHScroll() {
208  if(iRowHeight==0) return;
209  Dimension d = tc.getSize();
210  int w=0;
211  for(int i=0;i<iColCount;i++)
212  w+=iColWidth[i];
213  iGridWidth=w;
214  sbHoriz.setValues(iX,d.width,0,iGridWidth);
215  iX=sbHoriz.getValue();
216  }
217 
218  public void adjustmentValueChanged (AdjustmentEvent e) {
219  iX=sbHoriz.getValue();
220  iY=iRowHeight*sbVert.getValue();
221  tc.repaint();
222  }
223 
224  public void mousePressed (MouseEvent e) {
225  int x=e.getX(), y=e.getY();
226  if (e.isPopupTrigger() || e.isMetaDown())
227  pm.show(e.getComponent(),x,y);
228  else if (e.isShiftDown())
229  extendSelection(x, y);
230  else
231  select(x, y);
232  }
233 
234  public void mouseExited (MouseEvent e) {
235  if(bDrag) {
236  setCursor(defaultCursor);
237  bDrag=false;
238  }
239  }
240 
241  public void mouseMoved (MouseEvent e) {
242  int x=e.getX(), y=e.getY();
243  if(y<=iRowHeight) {
244  int xb=x;
245  x=x+iX-iGridWidth;
246  int i=iColCount-1;
247  for(;i>=0;i--) {
248  if(x>-7 && x<7) break;
249  x+=iColWidth[i];
250  }
251  if(i>=0) {
252  if(!bDrag) {
253  setCursor(resizeCursor);
254  bDrag=true;
255  iXDrag=xb-iColWidth[i];
256  iColDrag=i;
257  }
258  return;
259  }
260  }
261  if(bDrag) {
262  setCursor(defaultCursor);
263  bDrag=false;
264  }
265  }
266 
267  public void mouseDragged (MouseEvent e) {
268  if (e.isPopupTrigger() || e.isMetaDown())
269  return;
270  int x=e.getX(), y=e.getY();
271  if(bDrag && x<tc.getSize().width) {
272  int w=x-iXDrag;
273  if(w<0) w=0;
274  iColWidth[iColDrag]=w;
275  columnsManuallyAdjusted = true;
276  adjustHScroll();
277  tc.repaint();
278  } else {
279  extendSelection(x, y);
280  }
281  }
282 
283  public void mouseReleased (MouseEvent e) {}
284  public void mouseClicked (MouseEvent e) {}
285  public void mouseEntered (MouseEvent e) {}
286 
288  public void addKeyListener(KeyListener listener) {
289  keyListener = listener;
290  }
291 
292  public void keyPressed (KeyEvent e) {
293  boolean cutCopyOK = (e.isControlDown()||e.isMetaDown())
294  && selStart!=-1 && selEnd!=-1;
295  if (cutCopyOK && e.getKeyCode()==KeyEvent.VK_C)
296  copySelection();
297  else if (cutCopyOK && e.getKeyCode()==KeyEvent.VK_X)
298  {if (copySelection()>0) clearSelection();}
299  else if (keyListener!=null)
300  keyListener.keyPressed(e);
301  }
302 
303  public void keyReleased (KeyEvent e) {}
304  public void keyTyped (KeyEvent e) {}
305 
306  public void actionPerformed (ActionEvent e) {
307  String cmd=e.getActionCommand();
308  doCommand(cmd);
309  }
310 
311  void doCommand(String cmd) {
312  if (cmd==null)
313  return;
314  if (cmd.equals("Save As..."))
315  saveAs("");
316  else if (cmd.equals("Cut"))
318  else if (cmd.equals("Copy"))
319  copySelection();
320  else if (cmd.equals("Clear"))
321  clearSelection();
322  else if (cmd.equals("Select All"))
323  selectAll();
324  else if (cmd.equals("Copy All")) {
325  selectAll();
326  copySelection();
327  resetSelection();
328  } else if (cmd.equals("Summarize"))
329  IJ.doCommand("Summarize");
330  else if (cmd.equals("Clear Results"))
331  IJ.doCommand("Clear Results");
332  else if (cmd.equals("Set Measurements..."))
333  IJ.doCommand("Set Measurements...");
334  }
335 
336  public void lostOwnership (Clipboard clip, Transferable cont) {}
337 
338  void select(int x,int y) {
339  Dimension d = tc.getSize();
340  if(iRowHeight==0 || x>d.width || y>d.height)
341  return;
342  int r=(y/iRowHeight)-1+iFirstRow;
343  if(r>=0 && r<iRowCount && x<iGridWidth) {
344  selOrigin = r;
345  selStart = r;
346  selEnd = r;
347  } else {
348  resetSelection();
349  selOrigin = r;
350  if (r>=iRowCount)
351  selOrigin = iRowCount-1;
352  //System.out.println("select: "+selOrigin);
353  }
354  tc.repaint();
355  selLine=r;
356  }
357 
358  void extendSelection(int x,int y) {
359  Dimension d = tc.getSize();
360  if(iRowHeight==0 || x>d.width || y>d.height)
361  return;
362  int r=(y/iRowHeight)-1+iFirstRow;
363  //System.out.println(r+" "+selOrigin);
364  if(r>=0 && r<iRowCount) {
365  if (r<selOrigin) {
366  selStart = r;
367  selEnd = selOrigin;
368 
369  } else {
370  selStart = selOrigin;
371  selEnd = r;
372  }
373  }
374  tc.repaint();
375  selLine=r;
376  }
377 
382  public int copySelection() {
383  if (selStart==-1 || selEnd==-1) return 0;
384  StringBuffer sb = new StringBuffer();
385  for (int i=selStart; i<=selEnd; i++) {
386  char[] chars = (char[])(vData.elementAt(i));
387  sb.append(chars);
388  sb.append('\n');
389  }
390  String s = new String(sb);
391  Clipboard clip = getToolkit().getSystemClipboard();
392  if (clip==null) return 0;
393  StringSelection cont = new StringSelection(s);
394  clip.setContents(cont,this);
395  if (s.length()>0) {
396  IJ.showStatus((selEnd-selStart+1)+" lines copied to clipboard");
397  if (this.getParent() instanceof ImageJ)
398  Analyzer.setSaved();
399  }
400  return s.length();
401  }
402 
404  public void clearSelection() {
405  if (selStart==-1 || selEnd==-1)
406  return;
407  if (selStart==0 && selEnd==(iRowCount-1)) {
408  vData.removeAllElements();
409  iRowCount = 0;
410  if (IJ.isResultsWindow() && IJ.getTextPanel()==this) {
411  Analyzer.setSaved();
413  }
414  } else {
415  int count = selEnd-selStart+1;
416  for (int i=0; i<count; i++) {
417  vData.removeElementAt(selStart);
418  iRowCount--;
419  }
420  }
421  selStart=-1; selEnd=-1; selOrigin=-1; selLine=-1;
422  adjustVScroll();
423  tc.repaint();
424  }
425 
427  public void selectAll() {
428  selStart = 0;
429  selEnd = iRowCount-1;
430  selOrigin = 0;
431  tc.repaint();
432  selLine=-1;
433  }
434 
436  public void resetSelection() {
437  selStart=-1;
438  selEnd=-1;
439  selOrigin=-1;
440  selLine=-1;
441  if (iRowCount>0)
442  tc.repaint();
443  }
444 
446  public void save(PrintWriter pw) {
447  resetSelection();
448  if (labels!=null && !labels.equals(""))
449  pw.println(labels);
450  for (int i=0; i<iRowCount; i++) {
451  char[] chars = (char[])(vData.elementAt(i));
452  pw.println(new String(chars));
453  }
454  }
455 
458  public void saveAs(String path) {
459  }
460 
461  public void setTitle(String title) {
462  this.title = title;
463  }
464 
466  public int getLineCount() {
467  return iRowCount;
468  }
469 
473  public String getLine(int index) {
474  if (index<0 || index>=iRowCount)
475  throw new IllegalArgumentException("index out of range: "+index);
476  return new String((char[])(vData.elementAt(index)));
477  }
478 
479  void flush() {
480  if (vData!=null)
481  vData.removeAllElements();
482  vData = null;
483  }
484 
485 }
486 
487 
488 
489