import mx events EventDispatcher class Navigator private var __MainXML

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import mx.events.EventDispatcher;
class Navigator {
private var __MainXML:XML;
private var __curNode:XMLNode;
private var __curID:String;
private var __depth:Number;
public var dispatchEvent:Function; //Данный метод будет вещать события
public var addEventListener,removeEventListener:Function; //Данные два метода будут подписывать и удалять слушатели
public var onIDChanged:Function; // А это наше будущее событие
function Navigator() {
report("Я с вами");
EventDispatcher.initialize(this); //данный метод класса EventDispatcher передает нам методы для вещания и добавления листенеров
this.addEventListener('onIDChanged',this); // подписываем себя на событие
}
function report(txt:String) { trace("# Navigator: "+txt); }
/* Загрузка XML со структурой презентации */
function loadXML(url:String) {
report("Загрузка XML "+url);
var th = this;
__MainXML = new XML();
__MainXML.ignoreWhite = true;
__MainXML.load(url);
__MainXML.onLoad = function(success) {
th.loadXMLComplete(success);
}
}
/* XML загрузился */
function loadXMLComplete(success) {
if (success) {
report("XML загружен");
parseXML();
__MainXML.parseXML(__MainXML.toString());
__curNode = __MainXML.firstChild;
_root.curScreenTitle = __curNode.attributes.title;
} else {
report("ОШИБКА!!! XML загрузить не удалось");
}
}
function getNodeByName(node:XMLNode, name:String):XMLNode {
report("Поиск тега " + name);
report(node.toString());
for (var i = 0; i < node.childNodes.length; i++ ) {
if (node.childNodes[i].nodeName == name) {
return node.childNodes[i];
}
}
}
/* Парсинг и расстановка идентификаторов */
function parseXML() {
var th = this;
report("Парсинг и расстановка id");
var n = 0;
var parse = function (node) {
var child = node.firstChild;
while (child != null) {
if (child.nodeName == "screen") {
if (!child.attributes.id) { child.attributes.id = n; n += 1; }
else { th.report("\t обнаружен id="+child.attributes.id); }
this.parse(child);
}
child = child.nextSibling;
}
}
parse (__MainXML.firstChild);
}
/* Получить список разделов из определенной ветки*/
function getScreensList(ID:String):Array {
if (!ID) { ID = __curID; }
report("Выдаю массив подразделов id="+ID);
var list = new Array();
var item:Object = new Object();
var node = __MainXML.idMap[ID];
for (var i = 0; i < node.childNodes.length; i++ ) {
if (node.childNodes[i].nodeName == "screen") {
item = new Object();
item.title = node.childNodes[i].attributes.title;
item.id = node.childNodes[i].attributes.id;
list.push(item);
}
}
return list;
}
function get curScreenTitle():String {
return __curNode.attributes.title;
}
function getTitleByID(ID:String) {
return __MainXML.idMap[ID].attributes.title;
}
/* Переход к экрану по ID */
function goToScreen(ID) {
report("Перемещение в ветку по id="+ID);
__curNode = __MainXML.idMap[ID];
_root.curScreenTitle = __curNode.attributes.title;
dispatchEvent({type:'onIDChanged',ID:ID,title:__curNode.attributes.title,depth:depth});
var n = depth;
}
function get depth():Number {
var node:XMLNode = __curNode;
var n:Number = 0;
while (node) {
node = node.parentNode;
n ++;
}
n = n - 2;
report("Уровень вложенности "+n);
return n;
}
function getContent(ID:String):XMLNode {
if (ID == "curent") { ID = __curID; }
var node:XMLNode;
node = getNodeByName(__MainXML.idMap[ID], "pages");
if (!node) {
node = new XMLNode(1, "pages");
__MainXML.createElement();
}
return node;
}
}