root/as3/gunyarapaint/trunk/gunyarapaint/src/org/libspark/gunyarapaint/controls/GPCanvasWindowControl.as

リビジョン 1576, 8.2 kB (コミッタ: tasuku, コミット時期: 5 年 前)

- change shortcut key without ctrl key
- added background color random change
- canvas centering

Line 
1 package org.libspark.gunyarapaint.controls
2 {
3   import flash.events.Event;
4   import flash.events.MouseEvent;
5   import flash.geom.Point;
6  
7   import mx.containers.HBox;
8   import mx.containers.TitleWindow;
9   import mx.containers.VBox;
10   import mx.controls.HScrollBar;
11   import mx.controls.VScrollBar;
12   import mx.controls.scrollClasses.ScrollBar;
13   import mx.core.Container;
14   import mx.events.MoveEvent;
15   import mx.events.ResizeEvent;
16   import mx.events.ScrollEvent;
17   import mx.utils.ColorUtil;
18  
19   import org.libspark.gunyarapaint.entities.GPLogger;
20   import org.libspark.gunyarapaint.utils.ComponentResizer;
21
22   public class GPCanvasWindowControl extends TitleWindow
23   {
24     private var _canvasContainer:Container; // GPCanvasを直接格納するコンテナ
25     private var _contentContainer:Container; // GPCanvasとその周りの背景を格納するコンテナ
26    
27     private var _hbox:HBox; // canvasと縦スクロールバー
28     private var _vbox:VBox; // _hboxと横スクロールバー
29    
30     private var hScrollBar:HScrollBar; // 横スクロールバー
31     private var vScrollBar:VScrollBar; // 縦スクロールバー
32     private var canvasX:Number, canvasY:Number; // キャンバスのスクロール位置
33     private var _canvasScale:Number; // キャンバスの倍率
34
35     private var _logger:GPLogger;
36
37     public function GPCanvasWindowControl() {
38       super();
39      
40       this.backgroundColor = 0x000000;
41
42       // this.setStyle('backgroundAlpha', 0);
43       this.horizontalScrollPolicy = 'off';
44       this.verticalScrollPolicy = 'off';
45
46       this.addEventListener(ResizeEvent.RESIZE, resizeHandler);
47       this.addEventListener(MoveEvent.MOVE, moveHandler);
48
49       ComponentResizer.addResize(this, new Point(100, 100));
50     }
51
52     private function set backgroundColor(c:uint):void {
53       this.setStyle('backgroundColor', c);     
54     }
55
56     private function contentContainerClickHandler(e:MouseEvent):void {
57       if (e.eventPhase == flash.events.EventPhase.AT_TARGET) {
58         this.backgroundColor = Math.random() * 0xffffff;
59       }
60     }
61
62     private function resizeContainer():void {
63       if (_logger && _canvasContainer && _contentContainer) {
64         // 仮にサイズを狭める
65         _canvasContainer.width = _canvasContainer.height =
66           _contentContainer.width = _contentContainer.height =
67           hScrollBar.width = vScrollBar.height = 0;
68        
69         this.validateNow(); // _vbox/_hboxのサイズを更新
70  
71         // それを使って再設定
72         var clientWidth:Number = _hbox.width - vScrollBar.width;
73         var clientHeight:Number = _vbox.height - hScrollBar.height;
74         var frameWidth:Number = this.width - _hbox.width;
75         var frameHeight:Number = this.height - _vbox.height;
76
77         _contentContainer.width = _contentContainer.maxWidth = clientWidth;
78         _contentContainer.height = _contentContainer.maxHeight = clientHeight;
79         this.width = clientWidth + vScrollBar.width + frameWidth;
80         this.height = clientHeight + hScrollBar.height + frameHeight;
81         hScrollBar.width = clientWidth;
82         vScrollBar.height = clientHeight;
83         // TODO: minでいいやん
84         if (_logger.canvasWidth * _canvasScale < clientWidth) {
85           _canvasContainer.width = _logger.canvasWidth * _canvasScale;
86         } else {
87           _canvasContainer.width = clientWidth;
88         }
89         if (_logger.canvasHeight * _canvasScale < clientHeight) {
90           _canvasContainer.height = _logger.canvasHeight * _canvasScale;
91         } else {
92           _canvasContainer.height = clientHeight;         
93         }
94         _canvasContainer.move((_contentContainer.width - _canvasContainer.width) / 2,
95                               (_contentContainer.height - _canvasContainer.height) / 2);
96       }
97     }
98    
99     private function resizeHandler(evt:ResizeEvent):void {
100       resizeContainer();
101       moveCanvas();
102     }
103    
104     private function moveHandler(evt:MoveEvent):void {
105       // 整数化して、shape->bitmapのズレをなくす
106       this.x = int(x);
107       this.y = int(y);
108     }
109    
110     private var scrollDragStartPoint:Point;
111    
112     public function set logger(log:GPLogger):void {   
113       if (!_logger) {
114         _logger = log;
115         //_canvas.setStyle('borderColor', 0x000000);
116         //_canvas.setStyle('borderStyle', 'solid');
117         //_canvas.setStyle('borderThickness', 1);       
118
119         _vbox = new VBox();
120         _vbox.percentWidth = 100;
121         _vbox.percentHeight = 100;
122         _vbox.setStyle('verticalGap', 0);
123         _hbox = new HBox();
124         _hbox.percentWidth = 100;
125         _hbox.percentHeight = 100;
126         _hbox.setStyle('horizontalGap', 0);
127         _vbox.addChild(_hbox);
128         this.addChild(_vbox);
129        
130         this.validateNow(); // percentWidth/Height -> width/heightに更新
131
132         _contentContainer = new Container();
133         _contentContainer.setStyle('borderStyle', 'none');
134         _contentContainer.horizontalScrollPolicy = 'off';
135         _contentContainer.verticalScrollPolicy = 'off';
136
137         _canvasContainer = new Container();
138         _canvasContainer.setStyle('borderStyle', 'none');
139         _canvasContainer.horizontalScrollPolicy = 'off';
140         _canvasContainer.verticalScrollPolicy = 'off';
141
142         hScrollBar = new HScrollBar();
143         vScrollBar = new VScrollBar();
144         hScrollBar.height = ScrollBar.THICKNESS;
145         vScrollBar.width = ScrollBar.THICKNESS;
146         hScrollBar.move(0, height);
147         vScrollBar.move(width, 0);
148         hScrollBar.addEventListener(ScrollEvent.SCROLL, hScrollHandler);
149         vScrollBar.addEventListener(ScrollEvent.SCROLL, vScrollHandler);
150         hScrollBar.lineScrollSize = 1;
151         vScrollBar.lineScrollSize = 1;
152        
153         _canvasContainer.addChild(log.canvas);
154         _contentContainer.addChild(_canvasContainer);
155         _hbox.addChild(_contentContainer);
156         _hbox.addChild(vScrollBar);
157         _vbox.addChild(hScrollBar);
158
159         _contentContainer.addEventListener(MouseEvent.CLICK, contentContainerClickHandler);
160
161         canvasX = 0; canvasY = 0; _canvasScale = 1;
162         resizeContainer();
163         moveCanvas();
164       }
165     }
166
167     private function moveCanvas():void {
168       if (_logger && _canvasContainer && _contentContainer) {
169         var maxX:Number = _logger.canvasWidth * _canvasScale - _canvasContainer.width;
170         var maxY:Number = _logger.canvasHeight * _canvasScale - _canvasContainer.height;
171         canvasX = canvasX * _canvasScale;
172         canvasY = canvasY * _canvasScale;
173         if (maxX <= 0) maxX = 0;
174         if (maxY <= 0) maxY = 0;
175         if (canvasX < 0) { canvasX = 0; }
176         if (canvasY < 0) { canvasY = 0; }
177         if (canvasX > maxX) { canvasX = maxX; }
178         if (canvasY > maxY) { canvasY = maxY; }
179         hScrollBar.scrollPosition = canvasX;
180         vScrollBar.scrollPosition = canvasY;
181         hScrollBar.setScrollProperties(_canvasContainer.width, 0, maxX);
182         vScrollBar.setScrollProperties(_canvasContainer.height, 0, maxY);
183         _logger.eventCanvasMove(-canvasX, -canvasY);
184       }
185     }
186    
187     private function hScrollHandler(evt:ScrollEvent):void {
188       canvasX = hScrollBar.scrollPosition;
189       moveCanvas();
190     }
191
192     private function vScrollHandler(evt:ScrollEvent):void {
193       canvasY = vScrollBar.scrollPosition;
194       moveCanvas();
195     }
196     public function scrollCanvas(x:Number, y:Number):void {
197       canvasX = x; canvasY = y;
198       moveCanvas();
199     }
200    
201     public function get canvasScrollPosition():Point {
202       return new Point(canvasX, canvasY);
203     }
204    
205     public function get canvasScale():Number {
206       return _canvasScale;
207     }
208
209     public function set statusText(value:String):void {
210       this.status = value;
211     }
212
213     public function zoomCanvas(m:Number):void {
214       var rm:Number;
215       if (m >= 1) {
216         rm = m;
217       } else {
218         rm = 1.0 / (-m + 2);
219       }
220       _canvasScale = rm;
221       _logger.eventCanvasScale(rm);
222       resizeContainer();
223       moveCanvas();
224     }
225    
226     public function rotateCanvas(deg:int):void {
227       this.rotation = deg;
228     }
229  }
230 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。