3 * Copyright (C) 2007, Harbour, All rights reserved.
9 #include <F_Text_Symbol_Region.H>
11 #include <F_Text_Display.H>
15 typedef void (F_Callback)(F_Widget *, void *);
17 class F_Widget : public F_Text_Symbol_Region {
19 F_Window *parent_; // ÜÔÏ ÔÁËÖÅ ÉÎÆÁ Ï ÔÏÍ ÇÄÅ ×ÉÄÖÅÔ ÒÉÓÕÅÔÓÑ (ÍÅÎÀ for ex.)
20 F_Widget *parent_wdg_;
21 F_Group <F_Widget *> children;
23 F_Align_Type_t label_type_;
25 // border & background symbol (ÍÏÖÎÏ ÉÈ ÐÏÔÏÍ ÒÁÚÄÅÌÉÔØ)
27 // ÔÅËÕÝÉÊ Ã×ÅÔ ÔÅËÓÔÁ
30 // ÕÎÉËÁÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ widget'Ï× × ÏËÎÁÈ É ÏËÏÎ × ÐÒÉÌÏÖÅÎÉÉ
34 void *user_data_; // ÃÅÎÎÁÑ ÆÉÇÎÑ
35 F_Callback *callback_;
37 // F_ColorScheme scheme_;
40 void parent(F_Window *w) { parent_ = w; }
41 // void parent_wdg(F_Widget *w) { parent_wdg_ = w; }
42 void id(unsigned int i) { id_ = i; }
46 void when(int wh) { when_ = wh; }
47 int when(void) { return when_; }
48 F_Window *parent() { return parent_; }
49 F_Widget *parent_wdg() { return parent_wdg_; }
50 // child widget'Ù ÄÏÌÖÎÙ ÂÙÔØ ÄÏÂÁ×ÌÅÎÙ ÄÏ ÔÏÇÏ ËÁË ÂÕÄÅÔ ÄÏÂÁ×ÌÅÎ ÓÁÍ
51 // ÒÏÄÉÔÅÌØÓËÉÊ widget ?! ...
52 void add_child(F_Widget *wdg) {
53 children.push_back(wdg, 0);
54 wdg->parent_wdg_ = this;
56 F_Callback *callback() const { return callback_; }
57 void callback(F_Callback *c, void *p) { callback_ = c; user_data_ = p; }
58 void callback(F_Callback *c) { callback_=c; }
59 // void callback(F_Callback0*c) {callback_=(Fl_Callback*)c;}
60 // void callback(F_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;}
61 static void default_callback(F_Widget *, void *);
62 void do_callback() { callback_(this, user_data_); /* if (callback_ != default_callback) clear_changed(); */}
63 void do_callback(F_Widget *o, void *arg = 0) { callback_(o, arg); }
64 void do_callback(F_Widget *o, long arg) { callback_(o, (void*)arg); }
66 // ×Ù×ÏÄÉÔ ÓÔÒÏËÕ × ×ÉÄÖÅÔÅ
67 // ÄÏÌÖÎÁ ÉÓÐÏÌØÚÏ×ÁÔØ text_color ÐÏ ÉÄÅÅ ÉÌÉ ÄÏÂÁ×ÉÔØ ÐÁÒÁÍÅÔÒ
68 void put_string(F_Point &p, std::string &str, unsigned int offset = 0);
69 // F_Align_Type_t wrap = F_ALIGN_WRAP);
70 F_Widget(coord_t x, coord_t y, dim_t w, dim_t h, const char *l = 0) :
71 F_Text_Symbol_Region(x, y, w, h), bgs_(' ', F_DEFAULT_FG, F_DEFAULT_BG) {
75 parent_ = f_text_display->current_window;
77 when_ = F_WHEN_CHANGED;
78 can_be_focused_ = false;
79 label_type_ = F_ALIGN_LEFT;
80 text_color_.bg_ = F_DEFAULT_BG;
81 text_color_.fg_ = F_DEFAULT_FG;
82 callback_ = default_callback;
83 damage_ = F_DAMAGE_ALL;
86 virtual ~F_Widget() { }
87 unsigned int id() { return id_; }
88 void can_be_focused(bool c) { can_be_focused_ = c; }
89 bool can_be_focused() { return can_be_focused_; }
90 std::string& label() { return label_; }
91 void label(const char *l) { lock(); if (l) label_ = l; unlock(); }
92 void label(std::string &l) { lock(); label_ = l; unlock(); }
93 void label_type(F_Align_Type_t t) { label_type_ = t; }
94 F_Align_Type_t label_type() { return label_type_; }
96 void user_data(void *data) { user_data_ = data; }
97 void *user_data() { return user_data_; }
98 virtual void draw_children() {
99 for (unsigned int i = 0; i < children.size(); i++)
100 if (children[i]->visible())
104 virtual void draw() {
105 F_Region r(w(), h());
106 draw_buf.fill(r, bgs_);
107 damage_ = F_DAMAGE_FLUSH;
112 // damage() ÓÏÏÂÝÁÅÔ ÕÓÔÒÏÊÓÔ×Õ ÏÔÏÂÒÁÖÅÎÉÑ ÞÔÏ ÎÕÖÎÏ ÏÂÎÏ×ÉÔØ
113 // ÂÕÆÅÒ ÜËÒÁÎÁ ÓÏÄÅÒÖÉÍÙÍ ÄÁÎÎÏÇÏ ÏËÎÁ, ÉÌÉ ÏËÎÏ ÓÏÄÅÒÖÉÍÙÍ ÄÁÎÎÏÇÏ ×ÉÄÖÅÔÁ
114 virtual F_Damage_t damage() {
116 return F_DAMAGE_NONE;
119 // × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ "ÕÝÅÒÂÁ" ÐÒÏÉÚ×ÏÄÉÔ ÒÁÚÎÙÅ ÏÐÅÒÁÃÉÉ, for ex.
120 // F_DAMAGE_FLUSH - ÕËÁÚÁÎÉÅ ÏÂÎÏ×ÉÔØ draw_buf ×ÙÛÅ ÐÏ ÉÅÒÁÒÈÉÉ
121 virtual void damage(F_Damage_t dm) { lock(); damage_ = dm; unlock(); }
123 void redraw() { damage(F_DAMAGE_ALL); }
125 bool visible() { return visible_; }
127 void bg(F_Color_t bg_) { bgs_.bg(bg_); redraw(); }
128 void bgch(F_Char_t ch_) { bgs_.ch(ch_); redraw(); }
129 void fg(F_Color_t fg_) { bgs_.fg(fg_); redraw(); }
130 void color(F_Color c) { bgs_.color(c); redraw(); }
131 void color(F_Color_t bg_, F_Color_t fg_) { bg(bg_); fg(fg_); }
132 F_Color_t bg() { return bgs_.bg(); }
133 F_Color_t fg() { return bgs_.fg(); }
134 F_Color color() { return bgs_.color(); }
136 virtual void show(F_Damage_t d = F_DAMAGE_NONE);
137 // { lock(); visible_ = true; parent_->damage_ |= F_DAMAGE_FLUSH; unlock(); }
139 // { lock(); visible_ = false; parent_->damage_ |= F_DAMAGE_FLUSH; unlock(); }
140 virtual bool handle(F_Event_t &ev) { return false; }
142 friend class F_Window;