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

📄 fl_toggle_tree_base.cxx

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CXX
字号:
#include <stdio.h>		// printf#include <stdlib.h>		// qsort#include <Flek/Fl_Toggle_Node_Base.H>#include <Flek/Fl_Toggle_Tree_Base.H>Fl_Toggle_Tree_Base::Fl_Toggle_Tree_Base(int x, int y, int w, int h):Fl_Widget(x, y, w, h){    first_ = 0;    t_current_ = 0;    top_ = 0;    top_depth_ = 0;    damaged_ = 0;}voidFl_Toggle_Tree_Base::draw_node(int depth, int cy, Fl_Toggle_Node_Base *){    fl_color(FL_BLACK);    fl_rectf(x(), cy, depth * 16, 16);    fl_color(FL_WHITE);    fl_rectf(x() + depth * 16, cy, w() - depth * 16, 16);}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::find(int fy, int &depth, int &ry){    int cy = parent()->y() + top_yoffset_;    int ey = parent()->y() + parent()->h();    if (fy < cy)	return 0;    depth = top_depth_;    Fl_Toggle_Node_Base *node = top_;    traverse_start(top_);    while (cy < ey && node) {	ry = cy;	cy += height(node);	if (cy > fy)	    return node;	node = traverse_forward(1, depth);    }    return 0;}voidFl_Toggle_Tree_Base::update_height(void){    resize(x(), y(), w(), total_height(first_));}voidFl_Toggle_Tree_Base::draw(void){    //  printf("Fl_Toggle_Tree_Base::draw %d %d\n",x(),y());    update_top();    int cy = parent()->y() + top_yoffset_;    int ey = parent()->y() + parent()->h();    int depth = top_depth_;    Fl_Toggle_Node_Base *node = top_;    int drawing = 0;    //printf("DAMAGE %d %d %d\n",damage(),FL_DAMAGE_ALL,FL_DAMAGE_CHILD);    if (damage() == FL_DAMAGE_ALL)	drawing = 1;    if (damage() == FL_DAMAGE_CHILD && damaged_ == 0)	drawing = 1;    while (cy < ey && node) {	if (damaged_ == node) {	    if (damage() == FL_DAMAGE_CHILD) {		draw_node(depth, cy, node);		return;	    }	    drawing = 1;	}	//printf("%s %d\n",(char*) node->data(),drawing);	if (drawing)	    draw_node(depth, cy, node);	cy += height(node);	if (node->vsub_) {	    //printf("has sub\n");	    node = node->vsub_;	    depth++;	} else if (node->next_) {	    //printf("has no sub\n");	    node = node->next_;	} else {	    while (node && !node->next_) {		node = node->up_;		depth--;	    }	    if (node)		node = node->next_;	}    }    fl_color(parent()->color());    fl_rectf(x(), cy, w(), ey - cy);}int (*s_node_compare_) (Fl_Toggle_Node_Base *, Fl_Toggle_Node_Base *) = 0;intFl_Toggle_Tree_Base::s_compare_(void *a, void *b){    Fl_Toggle_Node_Base *nodeA = *(Fl_Toggle_Node_Base **) a;    Fl_Toggle_Node_Base *nodeB = *(Fl_Toggle_Node_Base **) b;    return s_node_compare_(nodeA, nodeB);}intFl_Toggle_Tree_Base::s_compare_reverse_(void *a, void *b){    Fl_Toggle_Node_Base *nodeA = *(Fl_Toggle_Node_Base **) a;    Fl_Toggle_Node_Base *nodeB = *(Fl_Toggle_Node_Base **) b;    return -s_node_compare_(nodeA, nodeB);}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::sort_(Fl_Toggle_Node_Base * start,			   int (*compar) (Fl_Toggle_Node_Base *,					  Fl_Toggle_Node_Base *), int down,			   sort_order order){    int i;    Fl_Toggle_Node_Base *node;    i = 0;    node = start;    while (node) {	node = node->next_;	i++;    }    Fl_Toggle_Node_Base **array = new Fl_Toggle_Node_Base *[i];    i = 0;    node = start;    while (node) {	array[i] = node;	node = node->next_;	i++;    }    s_node_compare_ = compar;    if (order == REVERSE_SORT) {	qsort(array, i, sizeof(Fl_Toggle_Node_Base *),	      (int (*)(const void *, const void *)) s_compare_reverse_);    } else {	qsort(array, i, sizeof(Fl_Toggle_Node_Base *),	      (int (*)(const void *, const void *)) s_compare_);    }    start = array[0];    int j = 1;    node = start;    node->prev_ = 0;		//james    while (j < i) {	node->next_ = array[j];	node->next_->prev_ = node;	node = node->next_;	j++;    }    node->next_ = 0;    if (down) {	node = start;	while (node) {	    if (node->sub_)		node->sub_ = sort_tree(node->sub_, compar, order);	    if (node->vsub_)		node->vsub_ = node->sub_;	    node = node->next_;	}    }    delete[]array;    return start;}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::sort(Fl_Toggle_Node_Base * start,			  int (*compar) (Fl_Toggle_Node_Base *,					 Fl_Toggle_Node_Base *),			  sort_order order){    if (first_)	return sort_(start, compar, 0, order);    return 0;}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::sort_tree(Fl_Toggle_Node_Base * start,			       int (*compar) (Fl_Toggle_Node_Base *,					      Fl_Toggle_Node_Base *),			       sort_order order){    if (first_)	return sort_(start, compar, 1, order);    return 0;}voidFl_Toggle_Tree_Base::sort(int (*compar) (Fl_Toggle_Node_Base *, Fl_Toggle_Node_Base *),     sort_order order){    if (first_)	first_ = top_ = sort(first_, compar, order);}voidFl_Toggle_Tree_Base::sort_tree(int (*compar) (Fl_Toggle_Node_Base *, Fl_Toggle_Node_Base *),	  sort_order order){    if (first_)	first_ = top_ = sort_tree(first_, compar, order);}voidFl_Toggle_Tree_Base::update_top(void){    Fl_Toggle_Node_Base *node = first_;    int py = parent()->y();    int ly = y();    int h = 0;    int depth = 0;    while (node && ly + (h = height(node)) <= py) {	ly += h;	if (node->vsub_) {	    node = node->vsub_;	    depth++;	} else if (node->next_) {	    node = node->next_;	} else {	    while (node && !node->next_) {		node = node->up_;		depth--;	    }	    if (node)		node = node->next_;	}    }    top_ = node;    top_depth_ = depth;    top_yoffset_ = ly - py;}intFl_Toggle_Tree_Base::total_height(Fl_Toggle_Node_Base * node){    int ret = 0;    int depth = 1;    while (node) {	ret += height(node);	if (node->vsub_) {	    node = node->vsub_;	    depth++;	} else if (node->next_) {	    node = node->next_;	} else {	    while (node && !node->next_) {		node = node->up_;		depth--;		if (depth <= 0)		    node = 0;	    }	    if (node)		node = node->next_;	}    }    return ret;}intFl_Toggle_Tree_Base::height(Fl_Toggle_Node_Base *){    return 17;}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::traverse_start(){    t_current_ = first_;    return t_current_;}voidFl_Toggle_Tree_Base::traverse_start(Fl_Toggle_Node_Base * a){    t_current_ = a;}voidFl_Toggle_Tree_Base::traverse_up(void){    if (t_current_ && t_current_->up_)	t_current_ = t_current_->up_;}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::traverse_forward(int visible, int &depth){    if (visible) {	if (t_current_ && t_current_->vsub_ != 0) {	    t_current_ = t_current_->vsub_;	    depth++;	    return t_current_;	}    } else {	if (t_current_ && t_current_->sub_ != 0) {	    t_current_ = t_current_->sub_;	    depth++;	    return t_current_;	}    }    if (t_current_ && t_current_->next_ != 0) {	t_current_ = t_current_->next_;	return t_current_;    }    while (t_current_ && !t_current_->next_) {	t_current_ = t_current_->up_;	depth--;    }    if (t_current_)	t_current_ = t_current_->next_;    return t_current_;}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::traverse_forward(){    int d;    return traverse_forward(0, d);}Fl_Toggle_Node_Base *Fl_Toggle_Tree_Base::traverse_backward(){    if (t_current_ && t_current_->prev_) {	t_current_ = t_current_->prev_;	while (t_current_->sub_) {	    t_current_ = t_current_->sub_;	    while (t_current_->next_) {		t_current_ = t_current_->next_;		if (t_current_->next_ == 0 && t_current_->sub_) {		    t_current_ = t_current_->sub_;		}	    }	}    } else {	t_current_ = t_current_->up_;    }    return t_current_;}voidFl_Toggle_Tree_Base::add_next(Fl_Toggle_Node_Base * node){    if (!first_) {	first_ = node;	t_current_ = node;    } else {	if (t_current_ == 0)	    t_current_ = first_;	node->next_ = t_current_->next_;	if (t_current_->next_) {	    t_current_->next_->prev_ = node;	}	t_current_->next_ = node;	node->prev_ = t_current_;	node->up_ = t_current_->up_;	t_current_ = node;    }    update_height();    parent()->damage(FL_DAMAGE_CHILD);    redraw();}voidFl_Toggle_Tree_Base::add_sub(Fl_Toggle_Node_Base * node){    if (!first_) {	first_ = node;	t_current_ = node;    } else {	if (t_current_ == 0)	    t_current_ = first_;	node->next_ = t_current_->sub_;	if (t_current_->sub_)	    t_current_->sub_->prev_ = node;	node->prev_ = 0;	t_current_->sub_ = node;	if (t_current_->opened_)	    t_current_->vsub_ = node;	node->up_ = t_current_;	t_current_ = node;    }    update_height();    parent()->damage(FL_DAMAGE_CHILD);    redraw();}intFl_Toggle_Tree_Base::remove(Fl_Toggle_Node_Base * a){    Fl_Toggle_Node_Base *temp = a->sub_;    while (temp != 0) {		// Remove all children	remove(temp);	temp = a->sub_;    }    if (a->prev_) {	a->prev_->next_ = a->next_;	if (a->next_)	    a->next_->prev_ = a->prev_;    } else if (a->up_) {	Fl_Toggle_Node_Base *o = a->up_;	o->sub_ = a->next_;	if (o->opened_)	    o->vsub_ = a->next_;	else	    o->vsub_ = 0;	if (a->next_) {	    a->next_->up_ = o;	    a->next_->prev_ = a->prev_;	}    }    if (a == first_) {	if (a->next_) {	    first_ = a->next_;	    first_->up_ = 0;	    first_->prev_ = 0;	} else {	    first_ = 0;	    top_ = 0;	}    }    if (a == current_) {	if (a->up_)	    current_ = a->up_;	else if (a->prev_)	    current_ = a->prev_;	else	    current_ = 0;    }    if (a == t_current_) {	if (a->up_)	    t_current_ = a->up_;	else if (a->prev_)	    t_current_ = a->prev_;	else	    t_current_ = 0;    }    update_height();    parent()->damage(FL_DAMAGE_CHILD);    redraw();    delete a;    a = 0;    return 1;}intFl_Toggle_Tree_Base::clear(){    while (first_)	remove(first_);    return 1;}intFl_Toggle_Tree_Base::close(Fl_Toggle_Node_Base * node){    int th = total_height(node->vsub_);    node->opened_ = 0;    node->vsub_ = 0;    return th;}intFl_Toggle_Tree_Base::open(Fl_Toggle_Node_Base * node){    node->vsub_ = node->sub_;    int th = total_height(node->vsub_);    node->opened_ = 1;    return th;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -