1
4
5 import org.aswing.Component;
6 import org.aswing.geom.Dimension;
7 import org.aswing.geom.Point;
8 import org.aswing.geom.Rectangle;
9 import org.aswing.JTextComponent;
10 import org.aswing.plaf.TextUI;
11 import org.aswing.UIManager;
12 import org.aswing.Viewportable;
13
14
29 class org.aswing.JTextArea extends JTextComponent implements Viewportable {
30
35 public static var ON_STATE_CHANGED:String = "onStateChanged";
36
37 private var columns:Number;
38 private var rows:Number;
39
40 private var viewPos:Point;
41
42 private var wordWrap:Boolean;
43 private var multiline:Boolean;
44 private var viewportSizeTesting:Boolean;
45
46
55 public function JTextArea(text:String, rows:Number, columns:Number) {
56 super();
57 setName("JTextArea");
58 this.text = (text == undefined ? "" : text);
59
60 viewPos = new Point();
61 setRows(rows);
62 setColumns(columns);
63 wordWrap = false;
64 multiline = true;
65 viewportSizeTesting = false;
66
67 updateUI();
68 }
69
70 public function updateUI():Void{
71 setUI(TextUI(UIManager.getUI(this)));
72 }
73
74 public function getUIClassID():String{
75 return "TextAreaUI";
76 }
77
78 public function setWordWrap(wrap:Boolean):Void{
79 if(wordWrap != wrap){
80 wordWrap = wrap;
81 if(getTextField()!= null){
82 getTextField().wordWrap = wrap;
83 }else{
84 repaint();
85 }
86 invalidateTextFieldAutoSizeToCountPrefferedSize();
87 revalidate();
88 }
89 }
90
91 public function isWordWrap():Boolean{
92 return wordWrap;
93 }
94
95
101 public function setColumns(columns:Number):Void{
102 if(columns == undefined) columns = 0;
103 if(columns < 0) columns = 0;
104 if(this.columns != columns){
105 this.columns = columns;
106 if(isWordWrap()){
107 invalidateTextFieldAutoSizeToCountPrefferedSize();
108 }
109 if(displayable){
110 revalidate();
111 }
112 }
113 }
114
115
118 public function getColumns():Number{
119 return columns;
120 }
121
122
128 public function setRows(rows:Number):Void{
129 if(rows == undefined) rows = 0;
130 if(rows < 0) rows = 0;
131 if(this.rows != rows){
132 this.rows = rows;
133 if(isWordWrap()){
134 invalidateTextFieldAutoSizeToCountPrefferedSize();
135 }
136 if(displayable){
137 revalidate();
138 }
139 }
140 }
141
142
145 public function getRows():Number{
146 return rows;
147 }
148
149 private function size():Void{
150 super.size();
151 if(isWordWrap()){
152
153 }
154 if(getTextField() != null){
155
156 applyPropertiesToText(getTextField(), false);
157 applyBoundsToText(getTextField(), getPaintBounds());
158
159 var t:TextField = getTextField();
160 if(isHtml()){
161 t.htmlText = text;
162 }else{
163 t.text = text;
164 }
165 t.background = false;
166 }
167 }
168
169 private function countPreferredSize():Dimension{
170 var size:Dimension;
171 if(columns > 0 && rows > 0){
172 var width:Number = getColumnWidth() * columns + getWidthMargin();
173 var height:Number = getRowHeight() * rows + getHeightMargin();
174 size = new Dimension(width, height);
175 }else if(rows <=0 && columns <=0 ){
176 size = getTextFieldAutoSizedSize();
177 }else if(rows > 0){
178 size = getTextFieldAutoSizedSize();
179 size.height = getRowHeight() * rows + getHeightMargin();
180 }else{
181 size = getTextFieldAutoSizedSize();
182 }
183 return getInsets().roundsSize(size);
184 }
185
186 private function getWordWrapWidth():Number{
187 if(columns > 0){
188 return getColumnWidth() * columns + getWidthMargin();
189 }else{
190 return getPaintBounds().width;
191 }
192 }
193
194
198 public function setMultiline(b:Boolean):Void{
199 if(multiline != b){
200 multiline = b;
201 if(getTextField() != null){
202 getTextField().multiline = b;
203 }else{
204 repaint();
205 }
206 revalidate();
207 }
208 }
209
210
213 public function isMultiline():Boolean{
214 return multiline;
215 }
216
217
218 private function __uiTextChanged():Void{
219 if(viewportSizeTesting){
220 return;
221 }
222 super.__uiTextChanged();
223 revalidate();
224 }
225
226 private function __uiTextScrolled():Void{
227 if(viewportSizeTesting){
228 return;
229 }
230 var t:TextField = getTextField();
231 var newViewPos:Point = new Point(t.hscroll, t.scroll-1);
232 var isDiff:Boolean = Math.abs(viewPos.y-newViewPos.y)>=1 || Math.abs(viewPos.x - newViewPos.x) >= 1;
233 if(isDiff){
234 viewPos.setLocation(newViewPos);
235
236 fireStateChanged();
237 }
238 super.__uiTextScrolled();
239 }
240
241
242
243
246 public function addChangeListener(func:Function, obj:Object):Object{
247 return addEventListener(ON_STATE_CHANGED, func, obj);
248 }
249
250
253 public function getVerticalUnitIncrement():Number{
254 return 1;
255 }
256
257
260 public function getVerticalBlockIncrement():Number{
261 return 10;
262 }
263
264
267 public function getHorizontalUnitIncrement():Number{
268 return getColumnWidth();
269 }
270
271
274 public function getHorizontalBlockIncrement():Number{
275 return getColumnWidth()*10;
276 }
277
278 public function setViewportTestSize(s:Dimension):Void{
279 viewportSizeTesting = true;
280 setSize(s);
281 validateScroll();
282 viewportSizeTesting = false;
283 }
284
285
286
291 public function getExtentSize():Dimension{
292 var t:TextField = getTextField();
293 if(t == null){
294 return new Dimension(1, 1);
295 }
296 var wSize:Number, hSize:Number;
297 wSize = t._width;
298 var bottomscroll:Number = t.bottomScroll;
299 var scroll:Number = t.scroll;
300 var extent:Number = bottomscroll - scroll + 1;
301 hSize = extent;
302 return new Dimension(wSize, hSize);
303 }
304
305
309 public function getViewSize():Dimension{
310 var t:TextField = getTextField();
311 if(t == null){
312 return new Dimension(0, 0);
313 }
314 var wRange:Number, hRange:Number;
315 if(isWordWrap()){
316 wRange = t._width;
317 t.hscroll = 0;
318 }else{
319 if(t.textWidth + 5 > t._width){
320 wRange = t._width + t.maxhscroll;
321 }else{
322 wRange = t._width;
323 t.hscroll = 0;
324 t.background = false;
325 }
326 }
327 var bottomscroll:Number = t.bottomScroll;
328 var maxscroll:Number = t.maxscroll;
329 var scroll:Number = t.scroll;
330 var extent:Number = bottomscroll - scroll + 1;
331 var maxValue:Number = maxscroll + extent;
332 var minValue:Number = 1;
333 hRange = maxValue - minValue;
334 return new Dimension(wRange, hRange);
335 }
336
337
343 public function getViewPosition():Point{
344 return new Point(viewPos);
345 }
346
347
353 public function setViewPosition(p:Point):Void{
354 restrictionViewPos(p);
355 if(!viewPos.equals(p)){
356 viewPos.setLocation(p);
357 validateScroll();
358 fireStateChanged();
359 }
360 }
361
362 private function validateScroll():Void{
363 var xS:Number = Math.round(viewPos.x);
364 var yS:Number = Math.round(viewPos.y)+1;
365 var t:TextField = getTextField();
366 if(t.hscroll != xS){
367 t.hscroll = xS;
368 }
369 if(t.scroll != yS){
370 t.scroll = yS;
371 }
372 t.background = false;
373 }
374
375
379 public function getVisibleRows():Number{
380 if(getTextField() != null){
381 return getExtentSize().height;
382 }else{
383 return Math.floor(getHeight()/getRowHeight());
384 }
385 }
386
387
397 public function scrollRectToVisible(contentRect : Rectangle) : Void {
398 setViewPosition(new Point(contentRect.x, contentRect.y));
399 }
400
401
406 public function scrollToBottomLeft():Void{
407 setViewPosition(new Point(0, Number.MAX_VALUE));
408 }
409
414 public function scrollToBottomRight():Void{
415 setViewPosition(new Point(Number.MAX_VALUE, Number.MAX_VALUE));
416 }
417
422 public function scrollToTopLeft():Void{
423 setViewPosition(new Point(0, 0));
424 }
425
430 public function scrollToTopRight():Void{
431 setViewPosition(new Point(Number.MAX_VALUE, 0));
432 }
433
434 private function restrictionViewPos(p:Point):Point{
435 var maxPos:Point = getViewMaxPos();
436 p.x = Math.max(0, Math.min(maxPos.x, p.x));
437 p.y = Math.max(0, Math.min(maxPos.y, p.y));
438 return p;
439 }
440
441 private function getViewMaxPos():Point{
442 var showSize:Dimension = getExtentSize();
443 var viewSize:Dimension = getViewSize();
444 var p:Point = new Point(viewSize.width-showSize.width, viewSize.height-showSize.height);
445 if(p.x < 0) p.x = 0;
446 if(p.y < 0) p.y = 0;
447 return p;
448 }
449
450
454 public function getViewportPane():Component{
455 return this;
456 }
457 }
458