PDA

Просмотр полной версии : ContextMenuEvent и Tree


Azy
09.02.2007, 10:21
Возможно ли отследить на каком конкретно элементе дерева был вызван ContextMenuEvent? Повешал так:
private function initContextMenu():void
{
this.contextMenu = new ContextMenu();
this.contextMenu.hideBuiltInItems();
this.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, this.contextMenuAddEvent);

contextMenuAdd = new ContextMenuItem("Добавить подкатегорию");
this.contextMenu.customItems.push(contextMenuAdd);
//contextMenuAdd.addEventListener(ContextMenuEvent.MENU_SELECT, contextMenuAddEvent);
}

public function contextMenuAddEvent(event:ContextMenuEvent):void
{
trace(event.mouseTarget);
}
На все он мне выдает Editor0.Panel4.HBox6.VBox7.tree.ListBaseContentHolder11.
Или придется инициализировать контекстное меню для ItemRenderer-a?

Azy
09.02.2007, 11:51
Написал рендерер:
package CellRenderers
{

import mx.controls.treeClasses.*;
import mx.collections.*;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.ui.ContextMenuBuiltInItems;
import flash.events.ContextMenuEvent;
import flash.events.ContextMenuEvent;

public class ETreeItemRenderer extends TreeItemRenderer
{
private var contextMenuAdd:ContextMenuItem;

public function ETreeItemRenderer()
{
super();
mouseEnabled = false;
initContextMenu();
}

public function contextMenuAddEvent(event:ContextMenuEvent):void
{
trace(1);
}

private function initContextMenu():void
{
this.contextMenu = new ContextMenu();
this.contextMenu.hideBuiltInItems();
this.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, this.contextMenuAddEvent);

contextMenuAdd = new ContextMenuItem("Добавить подкатегорию");
this.contextMenu.customItems.push(contextMenuAdd);
contextMenuAdd.addEventListener(ContextMenuEvent.MENU_SELECT, this.contextMenuAddEvent);
}
}
}
Сволотч не пашет =(((( Контекстное меню не поменялось.

Nirth
09.02.2007, 13:50
Azy мы за тебя проект будем делать?

Azy
09.02.2007, 14:07
Неа. Где могу - сам ищу. Если не получается найти здесь спрашиваю.

etc
09.02.2007, 14:27
Везде не получается :)

Nirth
09.02.2007, 14:58
Ну мне ужо надоело =)
Передаю эстафету кому нить другому.

Pablo4d
14.02.2007, 17:29
m = new ContextMenu();
m.hideBuiltInItems();
var customItemsArr:Array = new Array();
var buy:ContextMenuItem = new ContextMenuItem("Detailed");
buy.addEventListener("menuItemSelect", buyHandler);
customItemsArr.push(buy);
m.customItems = customItemsArr;
callTree.contextMenu=m;

Вроде как вот это забыл добавить callTree.contextMenu=m; (callTree просто id дерева )

JabbyPanda
14.02.2007, 18:10
Используй ContextMenuManager, написанный by Nirth - http://orangeflash.eu/?p=90, хорошая вещь

Pablo4d
14.02.2007, 20:55
Ну и причем тут контекст меню манагер??? И Нирт тоже молодца, как что ничего-непонятно-делай-приятель-сам-свой-проект или форум-для-того-чтобы-общаться-а-не-решать-проблемы :)

Сабж топика злой - приходиться повторить - люди кто знает как отловить возможно отследить на каком конкретно элементе дерева был вызван ContextMenuEvent? Потому как полный писец.

Azy
15.02.2007, 08:57
Решил проблему.
1. Пишем свой итемрендерер.
2. Отлавливаем маусовер и записываем в какею-либо переменную дерева данный элемент.
3. В дереве при вызове контекстного меню проверяем эту переменную

Код итемрендерера:
package CellRenderers.Classes
{
import mx.controls.treeClasses.*;
import mx.collections.*;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.ui.ContextMenuBuiltInItems;
import flash.events.ContextMenuEvent;
import flash.events.ContextMenuEvent;
import flash.events.MouseEvent;
import editor.ETree;

public class ETreeItemRenderer extends TreeItemRenderer
{
public function ETreeItemRenderer()
{
super();
this.addEventListener(MouseEvent.MOUSE_OVER, mouseOverEvent);
}

public function mouseOverEvent(event:MouseEvent):void
{
var myListData:TreeListData = TreeListData(listData);
var eTree:ETree = ETree(this.listData.owner);
eTree.setOverItem(myListData);
}
}
}]
Обработка в дереве:
public class ETree extends Tree
{
...
public var overItem:TreeListData;
...
public function treeContextMenuEvent(event:ContextMenuEvent):void
{
selectedItem = overItem.item;
//If toplevel category then disable first menu item
if (TreeListData(overItem).depth==1)
{
contextMenu.customItems[0].enabled = false;
}
}
}

Pablo4d
15.02.2007, 14:59
Решил проблему.
ПО ходу не только я на flexcoders подписан )) ТОлько можно и без своего итемрендерера ) http://michael.omnicypher.com/2007/02/flex-trees-with-context-menu_14.html