В данном руководстве будут рассмотрены стандартные шаги необходимые для создания дерева. Информацию о классах вы сможете получить здесь.
Сперва наперво то, что вам необходимо сделать - это создать обьект TreeModel. Для чего он вам нужен ? Всё очень просто, он будет хранить в себе вашу информацию в древовидной форме. Ну что приступим.
/*
создаём основной обьект TreeModel, параметр new TreeNode(-1, -1, "Root", "") - корневой узел
*/
TreeModel tm = new TreeModel(new TreeNode(-1, -1, "Root", ""));
/*
далее заполняем его нужным нам содержим (обычно, но не всегда, это делается рекурсивно)
в данном примере заполним его достаточно тривиально (вручную)
Обратите внимание на переменную k !
*/
int k = 0; // она отвечает за уникальные значения id узлов (это важно !)
for (int i = 0; i < 5; i++) {
k++; // item_0 будет иметь id = 1
tm.addNode(k, -1, "Item_" + i, ""); // k - id, -1 - parentId
int parentId1 = k; // сохраняем id будущего родителя, ведь k изменяется
for (int j = 0; j < i*2; j++) {
// снова повторяем тот же процесс
k++;
tm.addNode(k, parentId1, "Item_" + i + "_" + j, "");
int parentId2 = k;
for (int l = 0; l < i; l++) {
k++;
tm.addNode(k, parentId2, "Item_" + i + "_" + j + "_" + l, "");
}
}
}
/*
В итоге если воспользоваться метом tm.draw(String toFile) - получим:
Item_1
Item_1_0
Item_1_0_0
Item_1_1
Item_1_1_0
Item_2
Item_2_0
Item_2_0_0
Item_2_0_1
Item_2_1
Item_2_1_0
Item_2_1_1
Item_2_2
Item_2_2_0
Item_2_2_1
Item_2_3
Item_2_3_0
Item_2_3_1
Item_3
Item_3_0
Item_3_0_0
Item_3_0_1
Item_3_0_2
Item_3_1
Item_3_1_0
Item_3_1_1
Item_3_1_2
Item_3_2
Item_3_2_0
Item_3_2_1
Item_3_2_2
Item_3_3
Item_3_3_0
Item_3_3_1
Item_3_3_2
Item_3_4
Item_3_4_0
Item_3_4_1
Item_3_4_2
Item_3_5
Item_3_5_0
Item_3_5_1
Item_3_5_2
*/
// теперь вы можете судить о том, как дерево будет отображено на экране
Прежде чем приступить к созданию обьекта TreeVisualModel, необходимо рассказать вам о его параметрах, которые (некоторые из них) по совместительству являются и настройками дерева.
Самый важный параметр. Он отвечает за возможности поиска и настройки, за возможность использования дерева как форму, за использование cookies, за отображение (шрифт, размер) и за многое другое. Однако всё по порядку ;)
По умолчанию поиск не используется. Вам следует помнить, что если Вы захотите использовать возможности поиска,
Вы должны добавить в сессию созданный обьект TreeVisualModel, причем только после вызова метода draw (это важно) следующим образом:
session.setAttribute("treeX", your_TreeVisualModel_Object);
где X - id вашего дерева, указанного Вами при создании
обьекта TreeVisualModel.
Поиск включается методом setUseSearch(String redirectUrl), где redirectUrl - та страница, которая будет отображаться после поиска. Обычно это та страница, где расположено дерево, вам же нужно увидеть результаты поиска. Выключить поиск можно методом disableSearch().
По умолчанию настройки не используются. Для того, чтобы их выключить (включить) можно воспользоваться методом setUseSettings(boolean settings).
Как бы вам обьяснить, что это такое. Это такое дерево, где напротив каждого узла отображается check box. Давайте лучше рассмотрим данное свойство на ПРИМЕРЕ.
Не волнуйтесь ниже будет рассмотрено, как данное дерево создать, сейчас же необходимо, чтобы вы уяснили, что есть что.
Переходим к cookies-ам. Cookies используются всегда. От вас только зависит только название cookies-а. По умолчанию используется имя "common" для созданного дерева и "search" для поиска. У Вас нету возможности изменить имя cookie-поиска. Однако Вы можете задать другое имя для хранения состояния дерева отличного от "common". Изменить поведение cookies вы можете методом setUseCookies(TreeCookies tc), а выключить соответственно методом disableCookies().
Класс TreeCookies tc - имеет всего один конструктор с параметром String name, новое имя cookie вместо "common".
Вы не забыли о чём мы тут разговариваем ? Напомню, о параметрах TreeVisualModel.
Итак, locationWindowName - всё просто, это название той страницы, где вы создали дерево и точка.
Это лишь актуально для тех страниц, которые уже имеют имя. Т.е. те, которым в javascript коде или ещё где либо было прописано
window.name = "some_name"
, тогда в качестве LocationWindowName Вы должны указать это самое "some_name", иначе пользуйтесь второй
версией конструктора без данного параметра (проще и удобнее :))
treeId - id дерева. Если вы не используете поиск и настройки, то вам не очем волноваться [и мне тоже ;)]. Если же вы используете или поиск, или настройки, то treeId - играет очень большую роль при этом. Поясню: по этому id уникально должно идентифицироваться дерево. К примеру у вашего дерева treeId = 5, у моего дерева treeId также 5. Что получается ? А получается то, что при обращении к поиску по своему дереву, результат отображается как результат поиска по моему дереву. Уяснили ? То дерево, которое было последним обновлено (F5), имеет приоритет перед другим. Аналогично и с настройками, только тут все интереснее. Изменяя настройки как бы вашего дерева - на самом деле изменяете внешний вид моего, аналогично с моей стороны. Поэтому прежде чем присваивать своему дереву treeId, необходимо узнать какие id свободны ! Получить свободные id можно здесь.
Наконец-то перешли к долгожданной части. Помните первый пример с TreeModel ? Если нет, советую просмотреть ещё раз. Для отображения дерева на странице jsp необходимо:
/*
настраиваем TreeSettings
*/
TreeSettings ts = TreeSettings.getInstance(1); // получаем экземпляр класса
ts.setUseSearch("example.jsp"); // используем поиск, обратите внимание на redirectUrl
ts.setUseSettings();
/*
создаём обьект TreeModel
заметьте, что используется обьект TreeModel tm созданный в первом примере
TreeSettings ts - используем поиск в нашем дереве (вы ведь помните, что настройка не используется по умолчанию)
treeId = 77 (выбрано мною произвольно, хотя вы должны предварительно уточнить свободен ли данный id,
77 - уже как вы видите занят)
*/
TreeVisualModel tvm = new TreeVisualModel(tm.getRootNode(), ts, "example.jsp", 77);
// выводим дерево на экран
tvm.draw(out); // out - JspWriter (ну Вы знаете что это)
Посмотреть, что же мы получили можно ЗДЕСЬ.
Процесс создания основного дерева точно такой же как описывалось ранее. Только вместо метода draw() необходимо вызвать метод drawToAsp(String path), где path - путь к файлу, в котором будет храниться дерево. Затем делаете redirect на необходимую Вам asp страницу, подключаете <!--#include file="TreeModel.inc"--> и в необходимом Вам месте делаете вызов: Call TreeModel(path), где в качестве path - путь к файлу, содержащему код дерева.
Для того, чтобы дерево отображалось вместе с checkbox-ами, необходимо указать в TreeSettings, что мы собственно собираемся увидеть дерево с checkbox-ами. Это делается следующим образом:
TreeSettings ts = TreeSettings.getInstance(1);
ts.setUseAsForm(true);
//В ts как вы уже знаете, можно указать ещё и другие настройки.
Каждый checkbox создаётся следующим образом:
<input type="checkbox" name="box#uid#" id="box#uid#">
Строка запроса, если там содержится только информация о checkbox-ах, будет выглядеть следующим образом:
box%23274%23=on&box%23320%23=on&box%2360%23=on&box%23196%23=on&box%23303%23=on&box%23262%23=on&box%23189%23=on
, где %23 - шестнадцатиричное представление (код) символа #. Именно на этой информации и основывается метод выделения
uid из строки.
String uri = request.getQueryString();
ArrayList boxes = new ArrayList(0);
if (uri != null)
while (uri.indexOf("box%23") != -1) {
int k = uri.indexOf("box%23");
String id = uri.substring(k+6, uri.indexOf("%23", k+6));
boxes.add(id);
uri = uri.substring(uri.indexOf("%23", k+6)+2, uri.length());
}
/* После отработки этого кода, у вас в boxes будут содержаться все id (String) выбранных вами элементов.
Затем уж делайте с ними, все что вам нужно */