Архив

Powered by mod LCA

Разработка

Контекстное меню в AdvancedDataGrid

Во флексе есть удобный по своей задумке компонент AdvancedDataGrid. Для пользователя это очень удобный компонент, который может делать приятные вещи. Но для разработчиков этот компонент сущая головная боль. Одним из вопросов часто бывает, а как вставить контекстное меню в таблицу, ведь нажатие правой клавиши мыши не приводит к выделению компонента, да из самого события нельзя понять куда же пользователь кликнул мышкой. Следовательно нет возможности правильно отобразить контекстное меню.

Для корректного отображения контекстного меню в таблице есть следующий вариант. Для столбцов, где должно быть контекстное меню надо создать свой ItemRenderer. Это хорошая практика для отображения и редактирования данных. Помимо корректной обработки и отображения данных этот ItemRenderer должен делать следующее:
1. Сформировать нужное меню
2. При появлении мышки над компонентом запомнить старое контекстное меню таблицы и вставить для таблицы нужное контекстное меню.
3. При выходе мышки с компонента надо убрать наше меню и вернуть старое на место.
Вот как это будет выглядеть в коде:
override public function set data(value:Object):void {
    removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
    super.data = value;
....
    createMenu();// {1}
    addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
}

//{2}
private function onMouseOver(ev:MouseEvent):void {
    createMenu();
    prevMenu = AdvancedDataGrid(treeDataItem.owner).contextMenu;
    AdvancedDataGrid(treeDataItem.owner).contextMenu = treeNodeMenu;
    removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
    addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
}

//{3}
private function onMouseOut(ev:MouseEvent):void {
    AdvancedDataGrid(treeDataItem.owner).contextMenu = prevMenu;
    addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
    removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
}
На сколько я знаю этот вариант создания контекстного меню так же будет работать и с вариантом обычной таблицы.

Добавить комментарий