📄 fl_type.cxx
字号:
// turn a click at x,y on this into the actual picked object:Fl_Type* Fl_Type::click_test(int,int) {return 0;}void Fl_Type::add_child(Fl_Type*, Fl_Type*) {}void Fl_Type::move_child(Fl_Type*, Fl_Type*) {}void Fl_Type::remove_child(Fl_Type*) {}// add a list of widgets as a new child of p:void Fl_Type::add(Fl_Type *p) { parent = p; Fl_Type *end = this; while (end->next) end = end->next; Fl_Type *q; int newlevel; if (p) { for (q = p->next; q && q->level > p->level; q = q->next); newlevel = p->level+1; } else { q = 0; newlevel = 0; } for (Fl_Type *t = this->next; t; t = t->next) t->level += (newlevel-level); level = newlevel; if (q) { prev = q->prev; prev->next = this; q->prev = end; end->next = q; } else if (first) { prev = last; prev->next = this; end->next = 0; last = end; } else { first = this; last = end; prev = end->next = 0; } if (p) p->add_child(this,0); open_ = 1; fixvisible(this); modflag = 1; widget_browser->redraw();}// add to a parent before another widget:void Fl_Type::insert(Fl_Type *g) { Fl_Type *end = this; while (end->next) end = end->next; parent = g->parent; int newlevel = g->level; visible = g->visible; for (Fl_Type *t = this->next; t; t = t->next) t->level += newlevel-level; level = newlevel; prev = g->prev; if (prev) prev->next = this; else first = this; end->next = g; g->prev = end; fixvisible(this); if (parent) parent->add_child(this, g); widget_browser->redraw();}// delete from parent:Fl_Type *Fl_Type::remove() { Fl_Type *end = this; for (;;) { if (!end->next || end->next->level <= level) break; end = end->next; } if (prev) prev->next = end->next; else first = end->next; if (end->next) end->next->prev = prev; else last = prev; Fl_Type *r = end->next; prev = end->next = 0; if (parent) parent->remove_child(this); parent = 0; widget_browser->redraw(); selection_changed(0); return r;}// update a string member:int storestring(const char *n, const char * & p, int nostrip) { if (n == p) return 0; int length = 0; if (n) { // see if blank, strip leading & trailing blanks if (!nostrip) while (isspace(*n)) n++; const char *e = n + strlen(n); if (!nostrip) while (e > n && isspace(*(e-1))) e--; length = e-n; if (!length) n = 0; } if (n == p) return 0; if (n && p && !strncmp(n,p,length) && !p[length]) return 0; if (p) free((void *)p); if (!n || !*n) { p = 0; } else { char *q = (char *)malloc(length+1); strncpy(q,n,length); q[length] = 0; p = q; } modflag = 1; return 1;}void Fl_Type::name(const char *n) { if (storestring(n,name_)) { if (visible) widget_browser->redraw(); }}void Fl_Type::label(const char *n) { if (storestring(n,label_,1)) { setlabel(label_); if (visible && !name_) widget_browser->redraw(); }}void Fl_Type::callback(const char *n) { storestring(n,callback_);}void Fl_Type::user_data(const char *n) { storestring(n,user_data_);}void Fl_Type::user_data_type(const char *n) { storestring(n,user_data_type_);}void Fl_Type::open() { printf("Open of '%s' is not yet implemented\n",type_name());}void Fl_Type::setlabel(const char *) {}Fl_Type::~Fl_Type() { // warning: destructor only works for widgets that have been add()ed. if (widget_browser) widget_browser->deleting(this); if (prev) prev->next = next; else first = next; if (next) next->prev = prev; else last = prev; if (current == this) current = 0; modflag = 1; if (parent) parent->remove_child(this);}int Fl_Type::is_parent() const {return 0;}int Fl_Type::is_widget() const {return 0;}int Fl_Type::is_valuator() const {return 0;}int Fl_Type::is_button() const {return 0;}int Fl_Type::is_menu_item() const {return 0;}int Fl_Type::is_menu_button() const {return 0;}int Fl_Type::is_group() const {return 0;}int Fl_Type::is_window() const {return 0;}int Fl_Type::is_code_block() const {return 0;}int Fl_Type::is_decl_block() const {return 0;}int Fl_Type::is_class() const {return 0;}////////////////////////////////////////////////////////////////Fl_Type *in_this_only; // set if menu popped-up in windowvoid select_all_cb(Fl_Widget *,void *) { Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0; if (in_this_only) { Fl_Type *t = p; for (; t && t != in_this_only; t = t->parent); if (t != in_this_only) p = in_this_only; } for (;;) { if (p) { int foundany = 0; for (Fl_Type *t = p->next; t && t->level>p->level; t = t->next) { if (!t->new_selected) {widget_browser->select(t,1,0); foundany = 1;} } if (foundany) break; p = p->parent; } else { for (Fl_Type *t = Fl_Type::first; t; t = t->next) widget_browser->select(t,1,0); break; } } selection_changed(p);}static void delete_children(Fl_Type *p) { Fl_Type *f; for (f = p; f && f->next && f->next->level > p->level; f = f->next); for (; f != p; ) { Fl_Type *g = f->prev; delete f; f = g; }}void delete_all(int selected_only) { for (Fl_Type *f = Fl_Type::first; f;) { if (f->selected || !selected_only) { delete_children(f); Fl_Type *g = f->next; delete f; f = g; } else f = f->next; } if(!selected_only) include_H_from_C=1; selection_changed(0);}// move f (and it's children) into list before g:// returns pointer to whatever is after f & childrenvoid Fl_Type::move_before(Fl_Type* g) { if (level != g->level) printf("move_before levels don't match! %d %d\n", level, g->level); Fl_Type* n; for (n = next; n && n->level > level; n = n->next); if (n == g) return; Fl_Type *l = n ? n->prev : Fl_Type::last; prev->next = n; if (n) n->prev = prev; else Fl_Type::last = prev; prev = g->prev; l->next = g; if (prev) prev->next = this; else Fl_Type::first = this; g->prev = l; if (parent) parent->move_child(this,g); widget_browser->redraw();}// move selected widgets in their parent's list:void earlier_cb(Fl_Widget*,void*) { Fl_Type *f; for (f = Fl_Type::first; f; ) { Fl_Type* nxt = f->next; if (f->selected) { Fl_Type* g; for (g = f->prev; g && g->level > f->level; g = g->prev); if (g && g->level == f->level && !g->selected) f->move_before(g); } f = nxt; }}void later_cb(Fl_Widget*,void*) { Fl_Type *f; for (f = Fl_Type::last; f; ) { Fl_Type* prv = f->prev; if (f->selected) { Fl_Type* g; for (g = f->next; g && g->level > f->level; g = g->next); if (g && g->level == f->level && !g->selected) g->move_before(f); } f = prv; }}////////////////////////////////////////////////////////////////// write a widget and all it's children:void Fl_Type::write() { write_indent(level); write_word(type_name()); write_word(name()); write_open(level); write_properties(); write_close(level); if (!is_parent()) return; // now do children: write_open(level); Fl_Type *child; for (child = next; child && child->level > level; child = child->next) if (child->level == level+1) child->write(); write_close(level);}void Fl_Type::write_properties() { // repeat this for each attribute: if (label()) { write_indent(level+1); write_word("label"); write_word(label()); } if (user_data()) { write_indent(level+1); write_word("user_data"); write_word(user_data()); if (user_data_type()) { write_word("user_data_type"); write_word(user_data_type()); } } if (callback()) { write_indent(level+1); write_word("callback"); write_word(callback()); } if (is_parent() && open_) write_word("open"); if (selected) write_word("selected");}void Fl_Type::read_property(const char *c) { if (!strcmp(c,"label")) label(read_word()); else if (!strcmp(c,"user_data")) user_data(read_word()); else if (!strcmp(c,"user_data_type")) user_data_type(read_word()); else if (!strcmp(c,"callback")) callback(read_word()); else if (!strcmp(c,"open")) open_ = 1; else if (!strcmp(c,"selected")) select(this,1); else read_error("Unknown property \"%s\"", c);}int Fl_Type::read_fdesign(const char*, const char*) {return 0;}//// End of "$Id: Fl_Type.cxx,v 1.1.1.1 2003/08/07 21:18:39 jasonk Exp $".//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -