Пример создания дерева

  В данном руководстве будут рассмотрены стандартные шаги необходимые для создания дерева.
  Информацию о классах вы сможете получить здесь.
Содержание в виде дерева !
  1. Создания обьекта TreeModel
  2. Получение необходимых вами настроек
    1. TreeSettings
    2. locationWindowName (String)
    3. treeId (int)
  3. Отображение дерева на jsp странице
  4. Отображение дерева на asp странице
  5. Руководство по checkbox-ам
  6. Приложение
    1. Пример обычного дерева
    2. Пример дерева с check box-ами

Используйте пакет (package) TreeModel._modify.*

1. Создания обьекта TreeModel

Сперва наперво то, что вам необходимо сделать - это создать обьект 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

    */
    // теперь вы можете судить о том, как дерево будет отображено на экране
    

2. Получение необходимых вами настроек

Прежде чем приступить к созданию обьекта TreeVisualModel, необходимо рассказать вам о его параметрах, которые (некоторые из них) по совместительству являются и настройками дерева.

2.1 TreeSettings

Самый важный параметр. Он отвечает за возможности поиска и настройки, за возможность использования дерева как форму, за использование 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 используются всегда. От вас только зависит только название cookies-а. По умолчанию используется имя "common" для созданного дерева и "search" для поиска. У Вас нету возможности изменить имя cookie-поиска. Однако Вы можете задать другое имя для хранения состояния дерева отличного от "common". Изменить поведение cookies вы можете методом setUseCookies(TreeCookies tc), а выключить соответственно методом disableCookies().

Класс TreeCookies tc - имеет всего один конструктор с параметром String name, новое имя cookie вместо "common".

2.2 locationWindowName

Вы не забыли о чём мы тут разговариваем ? Напомню, о параметрах TreeVisualModel.

Итак, locationWindowName - всё просто, это название той страницы, где вы создали дерево и точка.

Это лишь актуально для тех страниц, которые уже имеют имя. Т.е. те, которым в javascript коде или ещё где либо было прописано window.name = "some_name", тогда в качестве LocationWindowName Вы должны указать это самое "some_name", иначе пользуйтесь второй версией конструктора без данного параметра (проще и удобнее :))

2.3 treeId ( Прочитать обязательно ! )

treeId - id дерева. Если вы не используете поиск и настройки, то вам не очем волноваться [и мне тоже ;)]. Если же вы используете или поиск, или настройки, то treeId - играет очень большую роль при этом. Поясню: по этому id уникально должно идентифицироваться дерево. К примеру у вашего дерева treeId = 5, у моего дерева treeId также 5. Что получается ? А получается то, что при обращении к поиску по своему дереву, результат отображается как результат поиска по моему дереву. Уяснили ? То дерево, которое было последним обновлено (F5), имеет приоритет перед другим. Аналогично и с настройками, только тут все интереснее. Изменяя настройки как бы вашего дерева - на самом деле изменяете внешний вид моего, аналогично с моей стороны. Поэтому прежде чем присваивать своему дереву treeId, необходимо узнать какие id свободны ! Получить свободные id можно здесь.

3. Отображение дерева на jsp странице

Наконец-то перешли к долгожданной части. Помните первый пример с 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 (ну Вы знаете что это)

Посмотреть, что же мы получили можно ЗДЕСЬ.

4. Отображение дерева на asp странице

Процесс создания основного дерева точно такой же как описывалось ранее. Только вместо метода draw() необходимо вызвать метод drawToAsp(String path), где path - путь к файлу, в котором будет храниться дерево. Затем делаете redirect на необходимую Вам asp страницу, подключаете <!--#include file="TreeModel.inc"--> и в необходимом Вам месте делаете вызов: Call TreeModel(path), где в качестве path - путь к файлу, содержащему код дерева.

5. Руководство по checkbox-ам.

Для того, чтобы дерево отображалось вместе с checkbox-ами, необходимо указать в TreeSettings, что мы собственно собираемся увидеть дерево с checkbox-ами. Это делается следующим образом:

  
      TreeSettings ts = TreeSettings.getInstance(1);
      ts.setUseAsForm(true);
      //В ts как вы уже знаете, можно указать ещё и другие настройки.
  

Каждый checkbox создаётся следующим образом:

<input type="checkbox" name="box#uid#" id="box#uid#">

, где uid - уникальный id элемента дерева, именно тот, который вы указали данной ветви при создании. При использовании дерева с checkbox-ами, вам по всей видимости понадобится передать информацию о выбранных элементах на обработку. Поэтому вам самим стоит позаботиться о том, чтобы перед методом draw указать <form>, и где форма заканчивается - </form>. Также у вас по всей видимости будет кнопка submit или button с onclick. И вас, конечно же, интересует как в конце концов получить 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) выбранных вами элементов.
        Затем уж делайте с ними, все что вам нужно */