[7849] | 1 | package charts.series.dots {
|
---|
| 2 |
|
---|
| 3 | import flash.display.Sprite;
|
---|
| 4 | import flash.display.Graphics;
|
---|
| 5 | import flash.display.BlendMode;
|
---|
| 6 | import charts.series.Element;
|
---|
| 7 | import caurina.transitions.Tweener;
|
---|
| 8 | import caurina.transitions.Equations;
|
---|
| 9 | import string.Utils;
|
---|
| 10 |
|
---|
| 11 | public class scat extends PointDotBase {
|
---|
| 12 |
|
---|
| 13 | public function scat( style:Object ) {
|
---|
| 14 |
|
---|
| 15 | // scatter charts have x, y (not value):
|
---|
| 16 | style.value = style.y;
|
---|
| 17 |
|
---|
| 18 | super( -99, new Properties({}) );// style );
|
---|
| 19 |
|
---|
| 20 | // override the basics in PointDotBase:
|
---|
| 21 | this._x = style.x;
|
---|
| 22 | this._y = style.y;
|
---|
| 23 | this.visible = true;
|
---|
| 24 |
|
---|
| 25 | if (style.alpha == null)
|
---|
| 26 | style.alpha = 1;
|
---|
| 27 |
|
---|
| 28 | this.tooltip = this.replace_magic_values( style.tip );
|
---|
| 29 | this.attach_events();
|
---|
| 30 |
|
---|
| 31 | // if style.x is null then user wants a gap in the line
|
---|
| 32 | if (style.x == null)
|
---|
| 33 | {
|
---|
| 34 | this.visible = false;
|
---|
| 35 | }
|
---|
| 36 | else
|
---|
| 37 | {
|
---|
| 38 | var haloSize:Number = isNaN(style['halo-size']) ? 0 : style['halo-size'];
|
---|
| 39 | var isHollow:Boolean = style['hollow'];
|
---|
| 40 |
|
---|
| 41 | if (isHollow)
|
---|
| 42 | {
|
---|
| 43 | // Hollow - set the fill to the background color/alpha
|
---|
| 44 | if (style['background-colour'] != null)
|
---|
| 45 | {
|
---|
| 46 | var bgColor:Number = string.Utils.get_colour( style['background-colour'] );
|
---|
| 47 | }
|
---|
| 48 | else
|
---|
| 49 | {
|
---|
| 50 | bgColor = style.colour;
|
---|
| 51 | }
|
---|
| 52 | var bgAlpha:Number = isNaN(style['background-alpha']) ? 0 : style['background-alpha'];
|
---|
| 53 |
|
---|
| 54 | this.graphics.beginFill(bgColor, bgAlpha);
|
---|
| 55 | }
|
---|
| 56 | else
|
---|
| 57 | {
|
---|
| 58 | // set the fill to be the same color and alpha as the line
|
---|
| 59 | this.graphics.beginFill( style.colour, style.alpha );
|
---|
| 60 | }
|
---|
| 61 |
|
---|
| 62 | switch (style['type'])
|
---|
| 63 | {
|
---|
| 64 | case 'dot':
|
---|
| 65 | this.graphics.lineStyle( 0, 0, 0 );
|
---|
| 66 | this.graphics.beginFill( style.colour, style.alpha );
|
---|
| 67 | this.graphics.drawCircle( 0, 0, style['dot-size'] );
|
---|
| 68 | this.graphics.endFill();
|
---|
| 69 |
|
---|
| 70 | var s:Sprite = new Sprite();
|
---|
| 71 | s.graphics.lineStyle( 0, 0, 0 );
|
---|
| 72 | s.graphics.beginFill( 0, 1 );
|
---|
| 73 | s.graphics.drawCircle( 0, 0, style['dot-size'] + haloSize );
|
---|
| 74 | s.blendMode = BlendMode.ERASE;
|
---|
| 75 |
|
---|
| 76 | this.line_mask = s;
|
---|
| 77 | break;
|
---|
| 78 |
|
---|
| 79 | case 'anchor':
|
---|
| 80 | this.graphics.lineStyle( style.width, style.colour, style.alpha );
|
---|
| 81 | var rotation:Number = isNaN(style['rotation']) ? 0 : style['rotation'];
|
---|
| 82 | var sides:Number = Math.max(3, isNaN(style['sides']) ? 3 : style['sides']);
|
---|
| 83 | this.drawAnchor(this.graphics, this.radius, sides, rotation);
|
---|
| 84 | // Check to see if part of the line needs to be erased
|
---|
| 85 | //trace("haloSize = ", haloSize);
|
---|
| 86 | if (haloSize > 0)
|
---|
| 87 | {
|
---|
| 88 | haloSize += this.radius;
|
---|
| 89 | s = new Sprite();
|
---|
| 90 | s.graphics.lineStyle( 0, 0, 0 );
|
---|
| 91 | s.graphics.beginFill( 0, 1 );
|
---|
| 92 | this.drawAnchor(s.graphics, haloSize, sides, rotation);
|
---|
| 93 | s.blendMode = BlendMode.ERASE;
|
---|
| 94 | s.graphics.endFill();
|
---|
| 95 | this.line_mask = s;
|
---|
| 96 | }
|
---|
| 97 | break;
|
---|
| 98 |
|
---|
| 99 | case 'bow':
|
---|
| 100 | this.graphics.lineStyle( style.width, style.colour, style.alpha );
|
---|
| 101 | rotation = isNaN(style['rotation']) ? 0 : style['rotation'];
|
---|
| 102 |
|
---|
| 103 | this.drawBow(this.graphics, this.radius, rotation);
|
---|
| 104 | // Check to see if part of the line needs to be erased
|
---|
| 105 | if (haloSize > 0)
|
---|
| 106 | {
|
---|
| 107 | haloSize += this.radius;
|
---|
| 108 | s = new Sprite();
|
---|
| 109 | s.graphics.lineStyle( 0, 0, 0 );
|
---|
| 110 | s.graphics.beginFill( 0, 1 );
|
---|
| 111 | this.drawBow(s.graphics, haloSize, rotation);
|
---|
| 112 | s.blendMode = BlendMode.ERASE;
|
---|
| 113 | s.graphics.endFill();
|
---|
| 114 | this.line_mask = s;
|
---|
| 115 | }
|
---|
| 116 | break;
|
---|
| 117 |
|
---|
| 118 | case 'star':
|
---|
| 119 | this.graphics.lineStyle( style.width, style.colour, style.alpha );
|
---|
| 120 | rotation = isNaN(style['rotation']) ? 0 : style['rotation'];
|
---|
| 121 |
|
---|
| 122 | this.drawStar_2(this.graphics, this.radius, rotation);
|
---|
| 123 | // Check to see if part of the line needs to be erased
|
---|
| 124 | if (haloSize > 0)
|
---|
| 125 | {
|
---|
| 126 | haloSize += this.radius;
|
---|
| 127 | s = new Sprite();
|
---|
| 128 | s.graphics.lineStyle( 0, 0, 0 );
|
---|
| 129 | s.graphics.beginFill( 0, 1 );
|
---|
| 130 | this.drawStar_2(s.graphics, haloSize, rotation);
|
---|
| 131 | s.blendMode = BlendMode.ERASE;
|
---|
| 132 | s.graphics.endFill();
|
---|
| 133 | this.line_mask = s;
|
---|
| 134 | }
|
---|
| 135 | break;
|
---|
| 136 |
|
---|
| 137 | default:
|
---|
| 138 | this.graphics.drawCircle( 0, 0, this.radius );
|
---|
| 139 | this.graphics.drawCircle( 0, 0, this.radius - 1 );
|
---|
| 140 | this.graphics.endFill();
|
---|
| 141 | }
|
---|
| 142 | }
|
---|
| 143 |
|
---|
| 144 | }
|
---|
| 145 | /*
|
---|
| 146 | protected function replace_magic_values( t:String ): String {
|
---|
| 147 |
|
---|
| 148 | t = t.replace('#x#', NumberUtils.formatNumber(this._x));
|
---|
| 149 | t = t.replace('#y#', NumberUtils.formatNumber(this._y));
|
---|
| 150 | t = t.replace('#size#', NumberUtils.formatNumber(this.radius));
|
---|
| 151 | return t;
|
---|
| 152 | }
|
---|
| 153 | */
|
---|
| 154 | public override function set_tip( b:Boolean ):void {
|
---|
| 155 | if ( b )
|
---|
| 156 | {
|
---|
| 157 | if ( !this.is_tip )
|
---|
| 158 | {
|
---|
| 159 | Tweener.addTween(this, {scaleX:1.3, time:0.4, transition:"easeoutbounce"} );
|
---|
| 160 | Tweener.addTween(this, {scaleY:1.3, time:0.4, transition:"easeoutbounce" } );
|
---|
| 161 | if (this.line_mask != null)
|
---|
| 162 | {
|
---|
| 163 | Tweener.addTween(this.line_mask, {scaleX:1.3, time:0.4, transition:"easeoutbounce"} );
|
---|
| 164 | Tweener.addTween(this.line_mask, {scaleY:1.3, time:0.4, transition:"easeoutbounce" } );
|
---|
| 165 | }
|
---|
| 166 | }
|
---|
| 167 | this.is_tip = true;
|
---|
| 168 | }
|
---|
| 169 | else
|
---|
| 170 | {
|
---|
| 171 | Tweener.removeTweens(this);
|
---|
| 172 | Tweener.removeTweens(this.line_mask);
|
---|
| 173 | this.scaleX = 1;
|
---|
| 174 | this.scaleY = 1;
|
---|
| 175 | if (this.line_mask != null)
|
---|
| 176 | {
|
---|
| 177 | this.line_mask.scaleX = 1;
|
---|
| 178 | this.line_mask.scaleY = 1;
|
---|
| 179 | }
|
---|
| 180 | this.is_tip = false;
|
---|
| 181 | }
|
---|
| 182 | }
|
---|
| 183 |
|
---|
| 184 | public override function resize( sc:ScreenCoordsBase ): void {
|
---|
| 185 |
|
---|
| 186 | //
|
---|
| 187 | // Look: we have a real X value, so get its screen location:
|
---|
| 188 | //
|
---|
| 189 | this.x = sc.get_x_from_val( this._x );
|
---|
| 190 | this.y = sc.get_y_from_val( this._y, this.right_axis );
|
---|
| 191 |
|
---|
| 192 | // Move the mask so it is in the proper place also
|
---|
| 193 | // this all needs to be moved into the base class
|
---|
| 194 | if (this.line_mask != null)
|
---|
| 195 | {
|
---|
| 196 | this.line_mask.x = this.x;
|
---|
| 197 | this.line_mask.y = this.y;
|
---|
| 198 | }
|
---|
| 199 | }
|
---|
| 200 |
|
---|
| 201 |
|
---|
| 202 | private function drawAnchor( aGraphics:Graphics, aRadius:Number,
|
---|
| 203 | aSides:Number, aRotation:Number ):void
|
---|
| 204 | {
|
---|
| 205 | if (aSides < 3) aSides = 3;
|
---|
| 206 | if (aSides > 360) aSides = 360;
|
---|
| 207 | var angle:Number = 360 / aSides;
|
---|
| 208 | for (var ix:int = 0; ix <= aSides; ix++)
|
---|
| 209 | {
|
---|
| 210 | // Move start point to vertical axis (-90 degrees)
|
---|
| 211 | var degrees:Number = -90 + aRotation + (ix % aSides) * angle;
|
---|
| 212 | var xVal:Number = calcXOnCircle(aRadius, degrees);
|
---|
| 213 | var yVal:Number = calcYOnCircle(aRadius, degrees);
|
---|
| 214 |
|
---|
| 215 | if (ix == 0)
|
---|
| 216 | {
|
---|
| 217 | aGraphics.moveTo(xVal, yVal);
|
---|
| 218 | }
|
---|
| 219 | else
|
---|
| 220 | {
|
---|
| 221 | aGraphics.lineTo(xVal, yVal);
|
---|
| 222 | }
|
---|
| 223 | }
|
---|
| 224 | }
|
---|
| 225 |
|
---|
| 226 | private function drawBow( aGraphics:Graphics, aRadius:Number,
|
---|
| 227 | aRotation:Number ):void
|
---|
| 228 | {
|
---|
| 229 | var angle:Number = 60;
|
---|
| 230 |
|
---|
| 231 | // Start at center point
|
---|
| 232 | aGraphics.moveTo(0, 0);
|
---|
| 233 |
|
---|
| 234 | // Upper right side point (unrotated)
|
---|
| 235 | var degrees:Number = -90 + aRotation + angle;
|
---|
| 236 | var xVal:Number = calcXOnCircle(aRadius, degrees);
|
---|
| 237 | var yVal:Number = calcYOnCircle(aRadius, degrees);
|
---|
| 238 | aGraphics.lineTo(xVal, yVal);
|
---|
| 239 |
|
---|
| 240 | // Lower right side point (unrotated)
|
---|
| 241 | degrees += angle;
|
---|
| 242 | xVal = calcXOnCircle(aRadius, degrees);
|
---|
| 243 | yVal = calcYOnCircle(aRadius, degrees);
|
---|
| 244 | aGraphics.lineTo(xVal, yVal);
|
---|
| 245 |
|
---|
| 246 | // Back to the center
|
---|
| 247 | aGraphics.lineTo(xVal, yVal);
|
---|
| 248 |
|
---|
| 249 | // Upper left side point (unrotated)
|
---|
| 250 | degrees = -90 + aRotation - angle;
|
---|
| 251 | xVal = calcXOnCircle(aRadius, degrees);
|
---|
| 252 | yVal = calcYOnCircle(aRadius, degrees);
|
---|
| 253 | aGraphics.lineTo(xVal, yVal);
|
---|
| 254 |
|
---|
| 255 | // Lower Left side point (unrotated)
|
---|
| 256 | degrees -= angle;
|
---|
| 257 | xVal = calcXOnCircle(aRadius, degrees);
|
---|
| 258 | yVal = calcYOnCircle(aRadius, degrees);
|
---|
| 259 | aGraphics.lineTo(xVal, yVal);
|
---|
| 260 |
|
---|
| 261 | // Back to the center
|
---|
| 262 | aGraphics.lineTo(xVal, yVal);
|
---|
| 263 | }
|
---|
| 264 |
|
---|
| 265 | private function drawStar_2( aGraphics:Graphics, aRadius:Number,
|
---|
| 266 | aRotation:Number ):void
|
---|
| 267 | {
|
---|
| 268 | var angle:Number = 360 / 10;
|
---|
| 269 |
|
---|
| 270 | // Start at top point (unrotated)
|
---|
| 271 | var degrees:Number = -90 + aRotation;
|
---|
| 272 | for (var ix:int = 0; ix < 11; ix++)
|
---|
| 273 | {
|
---|
| 274 | var rad:Number;
|
---|
| 275 | rad = (ix % 2 == 0) ? aRadius : aRadius/2;
|
---|
| 276 | var xVal:Number = calcXOnCircle(rad, degrees);
|
---|
| 277 | var yVal:Number = calcYOnCircle(rad, degrees);
|
---|
| 278 | if(ix == 0)
|
---|
| 279 | {
|
---|
| 280 | aGraphics.moveTo(xVal, yVal);
|
---|
| 281 | }
|
---|
| 282 | else
|
---|
| 283 | {
|
---|
| 284 | aGraphics.lineTo(xVal, yVal);
|
---|
| 285 | }
|
---|
| 286 | degrees += angle;
|
---|
| 287 | }
|
---|
| 288 | }
|
---|
| 289 |
|
---|
| 290 | private function drawStar( aGraphics:Graphics, aRadius:Number,
|
---|
| 291 | aRotation:Number ):void
|
---|
| 292 | {
|
---|
| 293 | var angle:Number = 360 / 5;
|
---|
| 294 |
|
---|
| 295 | // Start at top point (unrotated)
|
---|
| 296 | var degrees:Number = -90 + aRotation;
|
---|
| 297 | for (var ix:int = 0; ix <= 5; ix++)
|
---|
| 298 | {
|
---|
| 299 | var xVal:Number = calcXOnCircle(aRadius, degrees);
|
---|
| 300 | var yVal:Number = calcYOnCircle(aRadius, degrees);
|
---|
| 301 | if (ix == 0)
|
---|
| 302 | {
|
---|
| 303 | aGraphics.moveTo(xVal, yVal);
|
---|
| 304 | }
|
---|
| 305 | else
|
---|
| 306 | {
|
---|
| 307 | aGraphics.lineTo(xVal, yVal);
|
---|
| 308 | }
|
---|
| 309 | // Move 2 points clockwise
|
---|
| 310 | degrees += (2 * angle);
|
---|
| 311 | }
|
---|
| 312 | }
|
---|
| 313 | }
|
---|
| 314 | }
|
---|