⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeview.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************
 * 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 + -