📄 treeview.c
字号:
/******************************************************************
* SEAL 2.0 *
* Copyright (c) 1999-2002 SEAL Developers. All Rights Reserved. *
* *
* Web site: http://sealsystem.sourceforge.net/ *
* E-mail (current maintainer): orudge@users.sourceforge.net *
******************************************************************/
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <seal.h>
#include <treeview.h>
p_treeview (*treeview_init) ( p_treeview o, t_rect r ) = &_treeview_init;
void treeitem_set_data_from ( p_treeitem a, p_treeitem b ) {
a->extended = b->extended;
a->caption = b->caption;
a->name = b->name;
a->bmp = b->bmp;
//a->first = b->first;
a->last = b->last;
a->load_subs = b->load_subs;
a->level = b->level;
};
////////////////////////////////////////////////////////////////////////////////
l_bool treeitem_collect_by_name_from ( p_treeitem parent, p_treeitem from ) {
p_treeitem f = (parent->last)?parent->last->next:NULL;//parent->first;
p_treeitem m = from;
if ( !from ) from = m = f;
else from = m = from->next;
if( from == from->next ) return false;
if ( from && m )
do {
from = m;
do {
l_text str1 = from->caption;
l_text str2 = m->caption;
if ( str1 && str2 && stricmp(str1, str2) < 0 ) {
t_treeitem old;
treeitem_set_data_from(&old,m);
treeitem_set_data_from(m,from);
treeitem_set_data_from(from,&old);
};
from = from->next;
} while ( from != f );
m = m->next;
} while ( m != f );
return true;
};
////////////////////////////////////////////////////////////////////////////////
p_treeitem treeitem_init ( p_treeview t, l_bool extended, l_text caption, l_text name, BITMAP *bmp, p_treeitem next, p_treeitem prev, p_treeitem parent, p_treeitem first, p_treeitem last,void(*load_subs) ( p_treeview o, p_treeitem m ) ) {
p_treeitem o = treeitem( _malloc(sizeof(t_treeitem)));
o->extended = extended;
o->caption = caption;
o->name = name;
o->bmp = bmp;
o->next = next;
o->prev = prev;
o->parent = parent;
//o->first = first;
o->last = last;
o->load_subs = load_subs;
if ( parent )
o->level= parent->level + 1;
else
o->level = 0;
return o;
};
////////////////////////////////////////////////////////////////////////////////
void all_treeitem ( p_list list, p_treeitem it, l_bool ex ) {
if ( list && it && it->last ) {
p_treeitem p = it->last->next;
p_treeitem f = p;
if ( p )
do {
list->insert(list,p);
if ( ex || ( !ex && p->extended ) )
if ( p->last )
all_treeitem( list, p , ex);
p = p->next;
} while( p && f != p ) ;
};
};
////////////////////////////////////////////////////////////////////////////////
p_treeitem get_treeitem ( p_treeview o, l_text name ) {
if ( !o || !name ) return NULL;
if ( stricmp( name, "root" ) ) {
if ( o->llist && o->llist->last ) {
p_item x = o->llist->last;
p_item f = x;
if ( x )
do {
if ( !stricmp( treeitem(x->rec)->name, name ) ) return x->rec;
x = x->next;
} while ( x != f );
};
return NULL;
} else return o->root;
};
////////////////////////////////////////////////////////////////////////////////
void update_tree ( p_treeview o ) {
if ( o && o->root && o->root->last ) {
while ( o->visiblelist->last ) {
o->visiblelist->remove_item(o->visiblelist,o->visiblelist->last);
};
o->all_treeitem( o->visiblelist, o->root ,false );
};
};
////////////////////////////////////////////////////////////////////////////////
p_treeitem add_treeitem_ex ( p_treeview o, p_treeitem m , l_text name, l_text caption, BITMAP *bmp, l_bool extended, void(*load_subs) ( p_treeview o, p_treeitem m ) ) {
if ( o && m ) {
p_treeitem me = o->treeitem_init(o,extended,caption,name,bmp,(m->last)?m->last->next:NULL,m->last,m,NULL,NULL,load_subs);
if ( m->last ) {
m->last->next->prev = me;
m->last->next = me;
m->last = me;
} else {
m->last = me;
//m->first = me;
me->next=me;
me->prev=me;
};
o->llist->insert(o->llist,me);
return me;
};
return NULL;
};
////////////////////////////////////////////////////////////////////////////////
void delete_treeitem ( p_treeview o, p_treeitem it );
////////////////////////////////////////////////////////////////////////////////
void delete_treeitem ( p_treeview o, p_treeitem it ) {
if ( o && it ) {
DEBUG_printf("Treeview :: Del ''%s''\n",it->name);
if ( o->selected == it ) o->selected = NULL;
if ( o->root == it ) o->root = NULL;
while ( it->last ) delete_treeitem(o,it->last);
if ( it->parent ) {
p_treeitem m = it->parent;
if ( m->last == it ) m->last = it->prev;
if ( m->last == it ) m->last = NULL;
};
if ( it->next ) {
p_treeitem x = it->prev;
x->next = it->next;
it->next->prev = x;
it->next = NULL;
it->prev = NULL;
};
};
};
////////////////////////////////////////////////////////////////////////////////
p_treeitem add_treeitem ( p_treeview o, l_text parent, l_text name, l_text caption, BITMAP *bmp, l_bool extended,void(*load_subs) ( p_treeview o, p_treeitem m ) ) {
p_treeitem mm = NULL;
if ( parent ) {
p_treeitem m = get_treeitem ( o, parent );
if ( !m ) return NULL;
mm = o->add_ex( o, m , name, caption, bmp, extended,load_subs );
o->update(o);
VIEW(o)->draw_me(VIEW(o));
draw_scroller_bars(o);
};
return mm;
};
////////////////////////////////////////////////////////////////////////////////
void load_subs_reg ( p_treeview o, p_treeitem m ) {
load_treeitem_from_reg_ex(o,m,_strdup(m->name));
};
////////////////////////////////////////////////////////////////////////////////
void load_treeitem_from_reg_ex ( p_treeview o, p_treeitem m, l_text rootkey ) {
p_registry_search inf = (p_registry_search) malloc(sizeof(t_registry_search));
if ( reg_find_first(rootkey, inf) ) do {
l_text name = _strdup(inf->name);
l_text caption = _strdup(inf->key->name);
p_treeitem it = o->add_ex(o,m,name,caption,IMG_DIR16,false,&load_subs_reg);
} while (reg_find_next(inf));
_free(inf);
};
////////////////////////////////////////////////////////////////////////////////
void load_treeitem_from_reg ( p_treeview o,l_text m, l_text rootkey ) {
o->working = 1;
VIEW(o)->draw_me(VIEW(o));
load_treeitem_from_reg_ex(o, get_treeitem ( o, m ),rootkey);
update_tree(o);
o->working = 0;
VIEW(o)->draw_me(VIEW(o));
draw_scroller_bars(o);
};
////////////////////////////////////////////////////////////////////////////////
void load_subs_dir ( p_treeview o, p_treeitem m ) {
load_treeitem_from_dir_ex(o,m,_strdup(m->name));
};
////////////////////////////////////////////////////////////////////////////////
void load_treeitem_from_dir_ex ( p_treeview o, p_treeitem m, l_text path ) {
struct t_ffblk f;
l_int done = 0;
l_text fi = io_realpath(path, "*.*");
done = io_findfirst(fi, &f, FA_DIREC);
while ( !done ) {
if ( (f.info.ff_attrib & FA_DIREC) && io_isfilename(f.info.ff_name) ) {
l_text alld = io_realpath(path, f.info.ff_name);
o->add_ex(o,m,_strdup(alld),_strdup(f.info.ff_name),IMG_DIR16,false,&load_subs_dir);
_free(alld);
};
done = io_findnext(&f);
};
_free(fi);
treeitem_collect_by_name_from(m,NULL);
};
////////////////////////////////////////////////////////////////////////////////
void load_treeitem_from_dir ( p_treeview o,l_text m, l_text path ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -