Эта глава охватывает следующие темы:
Класс 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()
- Вызывает метод Состояния Элемента Дерева суперкласса.