Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
TextCanvas.java
1 package ij.text;
2 import java.awt.*;
3 import java.awt.event.*;
4 
5 class TextCanvas extends Canvas {
6 
7  TextPanel tp;
8  Font fFont;
9  FontMetrics fMetrics;
10  Graphics gImage;
11  Image iImage;
12 
13  TextCanvas(TextPanel tp) {
14  this.tp = tp;
15  addMouseListener(tp);
16  addMouseMotionListener(tp);
17  addKeyListener(tp);
18  }
19 
20  public void setBounds(int x, int y, int width, int height) {
21  super.setBounds(x, y, width, height);
22  tp.adjustVScroll();
23  tp.adjustHScroll();
24  iImage = null;
25  }
26 
27  public void update(Graphics g) {
28  paint(g);
29  }
30 
31  public void paint(Graphics g) {
32  if(tp==null || g==null) return;
33  Dimension d = getSize();
34  int iWidth = d.width;
35  int iHeight = d.height;
36 
37  if(iWidth<=0 || iHeight<=0) return;
38  g.setColor(Color.lightGray);
39  if(iImage==null)
40  makeImage(iWidth,iHeight);
41  if(tp.iRowHeight==0 || (tp.iColWidth[0]==0&&tp.iRowCount>0)) {
42  tp.iRowHeight=fMetrics.getHeight()+2;
43  for(int i=0;i<tp.iColCount;i++)
44  calcAutoWidth(i);
45  tp.adjustHScroll();
46  tp.adjustVScroll();
47  }
48  gImage.setColor(Color.white);
49  gImage.fillRect(0,0,iWidth,iHeight);
50  if (tp.headings)
51  drawColumnLabels(iWidth);
52  int y=tp.iRowHeight+1-tp.iY;
53  int j=0;
54  while(y<tp.iRowHeight+1) {
55  j++;
56  y+=tp.iRowHeight;
57  }
58  tp.iFirstRow=j;
59  y=tp.iRowHeight+1;
60  for(;y<iHeight && j<tp.iRowCount;j++,y+=tp.iRowHeight) {
61  int x=-tp.iX;
62  for(int i=0;i<tp.iColCount;i++) {
63  int w=tp.iColWidth[i];
64  Color b=Color.white,t=Color.black;
65  if(j>=tp.selStart && j<=tp.selEnd) {
66  b=Color.black;
67  t=Color.white;
68  gImage.setColor(b);
69  gImage.fillRect(x,y,w-1,tp.iRowHeight);
70  }
71  gImage.setColor(t);
72  char[] chars = getChars(i,j);
73  if (chars!=null)
74  gImage.drawChars(chars,0,chars.length,x+2,y+tp.iRowHeight-5);
75  x+=w;
76  }
77  }
78  if (iImage!=null)
79  g.drawImage(iImage,0,0,null);
80  }
81 
82  void makeImage(int iWidth, int iHeight) {
83  iImage=createImage(iWidth,iHeight);
84  if (gImage!=null)
85  gImage.dispose();
86  gImage=iImage.getGraphics();
87  if (fFont==null)
88  fFont=new Font("Dialog",Font.PLAIN,12);
89  gImage.setFont(fFont);
90  if(fMetrics==null)
91  fMetrics=gImage.getFontMetrics();
92  }
93 
94  void drawColumnLabels(int iWidth) {
95  gImage.setColor(Color.darkGray);
96  gImage.drawLine(0,tp.iRowHeight,iWidth,tp.iRowHeight);
97  int x=-tp.iX;
98  for(int i=0;i<tp.iColCount;i++) {
99  int w=tp.iColWidth[i];
100  gImage.setColor(Color.lightGray);
101  gImage.fillRect(x+1,0,w,tp.iRowHeight);
102  gImage.setColor(Color.black);
103  if (tp.sColHead[i]!=null)
104  gImage.drawString(tp.sColHead[i],x+2,tp.iRowHeight-5);
105  if (tp.iColCount>1) {
106  gImage.setColor(Color.darkGray);
107  gImage.drawLine(x+w-1,0,x+w-1,tp.iRowHeight-1);
108  gImage.setColor(Color.white);
109  gImage.drawLine(x+w,0,x+w,tp.iRowHeight-1);
110  }
111  x+=w;
112  }
113  gImage.setColor(Color.lightGray);
114  gImage.fillRect(0,0,1,tp.iRowHeight);
115  gImage.fillRect(x+1,0,iWidth-x,tp.iRowHeight);
116  //gImage.drawLine(0,0,0,iRowHeight-1);
117  gImage.setColor(Color.darkGray);
118  gImage.drawLine(0,0,iWidth,0);
119  }
120 
121  char[] getChars(int column, int row) {
122  if (row>=tp.vData.size())
123  return null;
124  char[] chars = (char[])(tp.vData.elementAt(row));
125  if (chars.length==0)
126  return null;
127 
128  if (tp.iColCount==1) {
129  for (int i=0; i<chars.length; i++) {
130  if (chars[i]<' ')
131  chars[i] = ' ';
132  }
133  return chars;
134  }
135 
136  int start = 0;
137  int tabs = 0;
138  int length = chars.length;
139 
140  while (column>tabs) {
141  if (chars[start]=='\t')
142  tabs++;
143  start++;
144  if (start>=length)
145  return null;
146  };
147  if (start<0 || start>=chars.length) {
148  System.out.println("start="+start+", chars.length="+chars.length);
149  return null;
150  }
151  if (chars[start]=='\t')
152  return null;
153 
154  int end = start;
155  while (chars[end]!='\t' && end<(length-1))
156  end++;
157  if (chars[end]=='\t')
158  end--;
159 
160  char[] chars2 = new char[end-start+1];
161  for (int i=0,j=start; i<chars2.length; i++,j++) {
162  chars2[i] = chars[j];
163  }
164  //System.out.println(row+" "+column+" "+start+" "+end);
165  return chars2;
166  }
167 
168  void calcAutoWidth(int column) {
169  if (tp.sColHead==null || column>=tp.iColWidth.length)
170  return;
171  if(fMetrics==null)
172  fMetrics=gImage.getFontMetrics();
173  int w=15;
174  int maxRows;
175  if (tp.iColCount==1)
176  maxRows = 100;
177  else {
178  maxRows = 20;
179  if (column==0 && tp.sColHead[0].equals(" "))
180  w += 5;
181  else {
182  char[] chars = tp.sColHead[column].toCharArray();
183  w = Math.max(w,fMetrics.charsWidth(chars,0,chars.length));
184  }
185  }
186  int rowCount = Math.min(tp.iRowCount, maxRows);
187  for(int row=0; row<rowCount; row++) {
188  char[] chars = getChars(column,row);
189  if (chars!=null)
190  w = Math.max(w,fMetrics.charsWidth(chars,0,chars.length));
191  }
192  tp.iColWidth[column] = w+15;
193  }
194 
195 }