/*
* main.as
* demonstration of Flash application connecting to Drupal
*
* by joe turgeon (http://arithmetric.com)
*/
package {
import flash.display.*;
import flash.text.*;
import flash.events.Event;
import flash.net.Responder;
import drupal.Drupal;
public class main extends MovieClip {
private var drupal:Drupal;
private var gatewayUrl:String = "http://localhost/services/amfphp/gateway.php";
private var apiKey:String = "";
private var style:StyleSheet;
private var menu:Menu;
public function main() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.BEST;
setStyles();
menu = new Menu(stage.stageWidth/4, style);
menu.x = 16;
menu.y = 16;
addChild(menu);
// initialize drupal object and begin session
drupal = new Drupal();
drupal.gatewayUrl = gatewayUrl;
drupal.apiKey = apiKey;
drupal.connect(cbConnect);
}
private function setStyles() {
style = new StyleSheet();
var s1:Object = new Object();
s1.fontFamily = "sans-serif";
style.setStyle("BODY", s1);
style.setStyle("LI", s1);
var s2:Object = new Object();
s2.color = "#aa0000";
style.setStyle("A", s2);
}
private function cbConnect():void {
// send request
drupal.service(cbArticles, onFault, "views.getView", "articles");
}
private function cbArticles(result:Object):void {
for (var i = 0; i < result.length; i++) {
menu.addItem(result[i].nid, result[i].title, result[i].body);
}
}
private function onFault(error:Object):void {
trace('error: drupal services');
for each (var item in error) {
trace(item);
}
}
}
}
import flash.display.*;
import flash.text.*;
import flash.events.MouseEvent;
import flash.geom.Point;
import caurina.transitions.Tweener;
class Menu extends Sprite {
private var mTitle:Array;
private var mBody:Array;
private var mItem:Array;
private var mNum:Number;
private var mWidth:Number;
private var mStyle:StyleSheet;
private var body:Sprite;
private var bText:TextField;
private var bScroll:Scroller;
public function Menu(w:Number, style:StyleSheet) {
mTitle = new Array();
mBody = new Array();
mItem = new Array();
mNum = 0;
mWidth = w;
mStyle = style;
//
body = new Sprite();
bText = new TextField();
bText.multiline = true;
bText.wordWrap = true;
bText.selectable = false;
bText.styleSheet = style;
body.addChild(bText);
}
public function addItem(id:Number, title:String, body:String) {
mTitle[id] = title;
mBody[id] = body;
var obj:MenuItem = new MenuItem(id, title, mWidth, mStyle);
obj.x = 0;
obj.y = mNum * obj.previewHeight;
obj.addEventListener(MouseEvent.CLICK, onclick);
obj.addEventListener(MouseEvent.ROLL_OVER, onrollover);
obj.addEventListener(MouseEvent.ROLL_OUT, onrollout);
obj.buttonMode = true;
addChild(obj);
mItem[id] = obj;
mNum++;
}
private function onclick(ev:MouseEvent) {
var obj = getmenuitem(ev.target);
body.x = obj.x + obj.previewWidth + 16;
body.y = 0;
bText.width = stage.stageWidth - body.x - 48;
bText.height = stage.stageHeight - body.y - 32;
bText.htmlText = '
' + mTitle[obj.id] + '
' + mBody[obj.id] + '';
if (bScroll && body.contains(bScroll)) {
body.removeChild(bScroll);
}
if (bText.textHeight > bText.height) {
bScroll = new Scroller(bText, 12, bText.height);
bScroll.x = bText.x + bText.width + 8;
bScroll.y = bText.y;
body.addChild(bScroll);
}
addChild(body);
}
private function onrollover(ev:MouseEvent) {
var obj = getmenuitem(ev.target);
graphics.clear();
graphics.lineStyle(1, 0, 1);
graphics.drawRect(obj.x, obj.y, obj.previewWidth, obj.previewHeight);
}
private function onrollout(ev:MouseEvent) {
graphics.clear();
}
private function getmenuitem(obj) {
while (obj is DisplayObject) {
if (obj is MenuItem) {
break;
}
obj = obj.parent;
}
return obj;
}
}
class MenuItem extends Sprite {
public var id:Number;
private var txt:TextField;
private var smask:Sprite;
public var previewWidth:Number;
public var previewHeight:Number;
public function MenuItem(idx:Number, title:String, w:Number, style:StyleSheet) {
//
id = idx;
//
txt = new TextField();
txt.styleSheet = style;
txt.htmlText = '' + title + '';
txt.y = txt.textHeight / 4;
txt.width = w;
txt.selectable = false;
addChild(txt);
//
previewWidth = w;
previewHeight = txt.textHeight * 3/2;
//
smask = new Sprite();
smask.graphics.beginFill(0xffffff, 1);
smask.graphics.drawRect(0, 0, previewWidth, previewHeight);
smask.graphics.endFill();
addChild(smask);
mask = smask;
}
}
class Scroller extends Sprite {
private var pos:Number = 0;
private var spr:Sprite;
private var w:Number;
private var h:Number;
private var offx:Number;
private var offy:Number;
private var buttonh:Number;
private var txt:TextField;
public function Scroller(tf:TextField, wx:Number, hx:Number) {
//
txt = tf;
w = wx;
h = hx;
//
var per:Number = txt.height / txt.textHeight;
if (per > 1) {
per = 1;
}
buttonh = per * h;
spr = new Sprite();
spr.graphics.beginFill(0, .7);
spr.graphics.drawRect(w/4, 0, w/2, buttonh);
spr.graphics.endFill();
spr.buttonMode = true;
addChild(spr);
spr.addEventListener(MouseEvent.MOUSE_DOWN, onmousedown);
spr.addEventListener(MouseEvent.MOUSE_UP, onmouseup);
//
update();
}
public function set value(val:Number) {
if (val > 0 && val < 100) {
pos = val;
update();
}
}
public function get value() {
return pos;
}
private function update() {
graphics.clear();
graphics.lineStyle(1, 0, 1);
graphics.moveTo(w/2, 0);
graphics.lineTo(w/2, h);
}
private function onmousedown(Event:MouseEvent) {
offx = Event.localX;
offy = Event.localY;
stage.addEventListener(MouseEvent.MOUSE_MOVE, onmousemove);
stage.addEventListener(MouseEvent.MOUSE_UP, onmouseup);
Event.stopPropagation();
}
private function onmousemove(Event:MouseEvent) {
var p:Point = new Point(Event.stageX, Event.stageY);
p = globalToLocal(p);
spr.x = p.x - offx;
spr.y = p.y - offy;
if (spr.x != 0) {
spr.x = 0;
}
if (spr.y < 0) {
spr.y = 0;
}
if (spr.y + buttonh > h) {
spr.y = h - buttonh;
}
//
pos = Math.ceil(spr.y / (h - buttonh) * 100);
//
var newV:Number = pos / 100 * txt.maxScrollV;
Tweener.addTween(txt, {scrollV: newV, time:0.2, transition:"easeInOutCubic"});
//
Event.stopPropagation();
}
private function onmouseup(e:MouseEvent) {
//
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onmousemove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onmouseup);
}
}