2008年1月5日土曜日

ツリービュー2

Fujiさんのブログにあるモジュール変数でツリーを利用したスクリプト。
このモジュールで作成したツリーを渡すことで、ツリービューを作成するモジュールです。

ツリー作成モジュールは上記ブログからの引用(一部削除)です。
// 参考
//   http://yokohama.cool.ne.jp/chokuto/urawaza/treeview1.html
//   http://www.fujidig.com/2007/12/modvar-tree.html

#module m_tree children, content
#modfunc set_tree_content str _content
    content = _content
    return

#defcfunc getaptr@m_tree var p1, local hspctx, local vptr
    mref hspctx, 68
    dupptr vptr, hspctx.20784
    return vptr.1

#modinit str _content
    set_tree_content thismod, _content
    dimtype children, 51
    return getaptrthismod )

#deffunc _new_tree array tree, str _content
#define global new_tree%1%2 = "" ) _new_tree %1,%2
    newmod tree, m_tree, _content
    return stat

#defcfunc get_tree_content modvar m_tree@
    return content

#defcfunc get_tree_num_children modvar m_tree@
    return length( children )

#modfunc get_tree_child int index, var result
    if( index < 0 || index >= length( children ) ) : return 1
    ifvaruse( children.index ) == 0 ) : return 1
    result = children.index
    return 0

#modfunc add_tree_child var child
    new_tree children
    children.stat = child
    return

#modfunc _show_tree str indent
#define global show_tree%1%2 = "" ) _show_tree %1%2
    mes indent + content
    foreach children
        ifvaruse( children.cnt ) ) {
          show_tree children.cnt, indent + "  "
        }
    loop
    return

#global
// ここまで引用

#include "user32.as"
#include "comctl32.as"
#module m_treeview h_treeview
#const  TVIF_TEXT       0x00000001
#const  TVI_LAST        0xFFFF0002
#const  TVM_INSERTITEM  0x00001100

// ノードを再帰的に追加
#modfunc add_node@m_treeview var _node, int h_parent, local node, local h_node
    node = _node : dim tvins, 12
    bufText = get_tree_content(node)
    tvins = h_parent, TVI_LASTTVIF_TEXT
    tvins(6) = varptr(bufText), strlen(bufText)
    sendmsg h_treeview, TVM_INSERTITEM0varptr(tvins)
    h_node = stat

    // 子ノードの追加
    repeat get_tree_num_children(node)
        get_tree_child node, cnt, child
        if stat : continue
        add_node@m_treeview thismod, child, h_node
    loop
    return h_node

// ツリービューの作成
// statにはツリービューのハンドルが返る
#define global make_treeview(%1%2%3%4newmod %1, m_treeview, %2%3%4
#modinit var root, int _width, int _height
    // コモンコントロールライブラリ初期化(無くても動作する?)
    initCCEx = 80x00000002
    InitCommonControlsEx varptr(initCCEx)
    if stat == 0 : return -1

    // コントロールの作成
    style = 0x40000000 | 0x10000000 | 0x0001 | 0x0002 | 0x0200
    CreateWindowEx 0"SysTreeView32""", style, ginfo_cxginfo_cy, _width, _height, hwnd000
    h_treeview = stat
    if h_treeview == 0 : return -1

    add_node@m_treeview thismod, root, 0
    return h_treeview
#global

    // ツリーの作成(引用)
    new_tree tree, "root"

        new_tree tree_1, "1"
        add_tree_child tree, tree_1

        new_tree tree_2, "2"
        add_tree_child tree, tree_2

            new_tree tree_2_1, "2-1"
            add_tree_child tree_2, tree_2_1

                new_tree tree_2_1_1, "2-1-1"
                add_tree_child tree_2_1, tree_2_1_1

            new_tree tree_2_2, "2-2"
            add_tree_child tree_2, tree_2_2

    // ツリービューを作成
    cls 1
    make_treeview treeview, tree, 100ginfo_winy
    if stat == -1 {
        dialog "ツリービューの作成に失敗しました。"1
        end
    }
    // ツリーを表示
    pos 1000
    show_tree tree

    stop

0 件のコメント: