[Предыдущая] [Содержание] [Индекс] [Следующая]

Создание Виджета Дерева

Эта глава охватывает следующие темы:

Краткий обзор

Класс PtGenTree это подкласс PtGenList. Вы можете использовать виджет PtGenTree, чтобы отобразить иерархию элементов как списки в дереве.

Когда элемент в иерархии имеет элемент или список элементов ниже себя, то он может быть развернут. Раскрытый элемент открывает список, чтобы показать все элементы в следующем уровне ниже себя. Раскрытый элемент может быть свернут. Когда раскрываемый элемент свернут, список тоже свернут и его элементы скрыты. Элемент может быть отмечен как раскрываемый, даже если он не имеет списка элементов ниже себя - Вы можете добавлять список элементов непосредственно перед тем, как раскрываемый элемент будет раскрыт.

Любой виджет PtGenTree может содержать множество элементов в корневом уровне, который содержит первый уровень элементов для отображения. Элементы с корневым уровнем не имеют других элементов/уровней выше себя - они представляют вершину иерархии.

Дочерний класс PtGenTree, как предполагается, не определяет метод Рисования Списка. Вместо этого, он должен определить метод Рисования Элемента Дерева, который будет вызываться методом Рисования Списка PtGenTree.


Обратите внимание: Метод Рисования Списка PtGenTree предполагает, что флаг Pt_GEN_LIST_SHOW_DAMAGED установлен. Дочерний класс никогда не должен очистить этот флаг.

Класс PtGenTree не использует рекурсивные функции. Размер стека, необходимого любой функции PtGenTree*(), не зависит от размера или глубины дерева.

Структура элемента

Структура элемента, используемого PtGenTree, определена следующим образом:

typedef struct Pt_gentree_item {
    PtGenListItem_t list;
    struct Pt_gentree_item *father, *son, *brother;
    PhDim_t dim;
    }
        PtGenTreeItem_t;
list
Структура элемента, типа PtGenListItem_t (смотрите Справочник по Виджетам - Widget Reference Фотона) используется суперклассом PtGenList. Класс PtGenTree определяет некоторые новые флаги, которые могут быть установлены в item->list.flags:
Pt_TREE_ITEM_EXPANDABLE
Установите этот флаг, чтобы отметить элемент как раскрываемый. Когда Вы добавляете ветвь к элементу, PtGenTreeAddFirst() (смотрите Справочник по Виджетам - Widget Reference Фотона) этот флаг устанавливается в родительском элементе автоматически.
Pt_TREE_ITEM_EXPANDED
Ветви этого элемента в настоящее время отображаются.
father, son, brother
Ссылки дерева. Вы можете использовать их, чтобы перемещаться по структуре дерева, но не изменяйте их непосредственно - для изменения структуры дерева более безопасно использовать полезные функции.
dim
Структура PhDim_t (смотрите Справочное Руководство по Библиотеке - Library Reference Фотона), которая определяет размер элемента, исключая украшения дерева (строки и кнопки).

Когда элемент добавлен к виджету, виджет вычисляет item->list.size основываясь на размере, указанном в item->dim, минимальной высоте элемента и позиции элемента в дереве. Высота элемента в виджете дереве всегда четное число пикселов - если Вы определите нечетное число для высоты в поле dim, между текущим элементом и любым другим элементом непосредственно ниже этого будет отображен промежуток по крайней мере в один пиксел.

Методы

Метод Рисования Элемента Дерева

Метод рисования Списка вызывает метод Рисования Элемента Дерева со следующими параметрами:

PtGenTreeWidget_t *widget
Указатель на виджет.
PtGenTreeItem_t *item
Указатель на структуру PtGenTreeItem_t элемента, который должен быть перерисован.
PhRect_t const *where
Указатель на структуру PhRect_t (смотрите Справочное Руководство по Библиотеке - Library Reference Фотона), которая определяет размеры элемента.
int lmargin
Если положительное, дополнительное левое поле, которое должно быть добавлено к первому столбцу.
int rmargin
Если положительное, дополнительное правое поле, которое должно быть добавлено к последнему столбцу.

Метод Рисования Списка PtGenTree ответствен за рисование линий и рамок, представляющих древовидную структуру. Метод Рисования Элемента Дерева должен рисовать только элемент. Например, метод Рисования Элемента Дерева PtTree рисует только изображение и строку.

Метод Состояния Элемента Дерева

PtGenTreeExpand() и PtGenTreeCollapse() (смотрите Справочник по Виджетам - Widget Reference Фотона) вызывают метод Состояния Элемента Дерева со следующими параметрами:

PtGenTreeWidget_t *widget
Указатель на виджет.
PtGenTreeItem_t *item
Указатель на структуру PtGenTreeItem_t элемента, который свертывается или разворачивается.
PhEvent_t *event
Параметр event для PtGenTreeExpand() или PtGenTreeCollapse(). Смотрите PhEvent_t в Справочном Руководство по Библиотеке - Library Reference Фотона.
int reason
Или Pt_TREE_EXPANDING или Pt_TREE_COLLAPSING.

Если reason Pt_TREE_EXPANDING, элемент собирается развернуться. Метод Состояния Элемента Дерева может модифицировать ветви элементов перед фактическим разворачиванием. После того, как функция возвратится, виджет отобразит список элементов в развернутой ветви.

Если элемент в списке имеет флаг Pt_TREE_ITEM_EXPANDED установленным, элементы ниже будут также отображены. Метод Состояния Элемента Дерева возвращает ноль, чтобы разрешить развертывание, или ненулевое значение, чтобы предотвратить его -- PtGenTreeExpand() возвращает это значение (смотрите Справочник по Виджетам - Widget Reference Фотона).

Если reason Pt_TREE_COLLAPSING, элемент был свернут. Его ветви скрываются, и метод Состояния Элемента Дерева может освободить связанные элементы. Метод Состояния Элемента Дерева возвращает ненулевое значение, если элемент разрушен, или ноль, если элемент все еще существует -- PtGenTreeCollapse() возвращают это значение (смотрите Справочник по Виджетам - Widget Reference Фотона).

Полезные функции

Класс PtGenTree определяет следующие полезные функции (смотрите Справочник по Виджетам - Widget Reference Фотона):

PtGenTreeAddAfter()
Добавляет элементы после данного элемента.
PtGenTreeAddFirst()
Добавляет элементы перед любыми существующими элементами.
PtGenTreeAllItems()
Получает указатели на все элементы в дереве.
PtGenTreeClearSelection()
Очищает выбор.
PtGenTreeCollapse()
Сворачивает поддерево.
PtGenTreeDamageItem()
Перерисовывает элемент, когда его данные изменились.
PtGenTreeExpand()
Разворачивает данное поддерево.
PtGenTreeExpandParents()
Разворачивает любых свернутых предков данного элемента.
PtGenTreeFreeAllItems()
Очищает все элементы в дереве.
PtGenTreeFreeItems()
Очищает элементы в поддереве.
PtGenTreeGetCurrent()
Дает указатель на текущий элемент.
PtGenTreeGetSelIndexes()
Дает индексы выбранных элементов.
PtGenTreeGoto()
Устанавливает текущий элемент и позицию так, чтобы данный элемент был видим.
PtGenTreeItemIndex()
Вычисляет индекс данного элемента.
PtGenTreeItemRealloc()
Перераспределяет элемент.
PtGenTreeItemResize()
Изменяет размер элемента.
PtGenTreeRemoveChildren()
Разединяет все дочерние элементы данного элемента.
PtGenTreeRemoveItem()
Удаляет данный элемент и его дочерние элементы из его родителей и элементов одного уровня.
PtGenTreeRemoveList()
Удаляет данные элементы и их элементы одного уровня из их родителя.
PtGenTreeResize()
Изменяет размеры многих элементов.
PtGenTreeRootItem()
Дает указатель на первый корневой элемент.
PtGenTreeSelect()
Выбирает данный элемент.
PtGenTreeSelectedItems()
Дает указатели на выбранные элементы.
PtGenTreeSetSelIndexes()
Устанавливает индексы выбора.
PtGenTreeShow()
Устанавливает текущую позицию так, чтобы данный элемент был видим.
PtGenTreeUnselect()
Снимает выбор с данного элемента.
PtGenTreeUnselectNonBrothers()
Снимает выбор со всех элементов, которые не являются элементами одного уровня данного элемента.
PtSuperClassGenTreeDrawItem()
Вызывает метод Рисования Элемента Дерева данного суперкласса.
PtSuperClassGenTreeItemState()
Вызывает метод Состояния Элемента Дерева суперкласса.

[Предыдущая] [Содержание] [Индекс] [Следующая]


Все мессаги сюда:yanich@inbox.ru
Hosted by uCoz