00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include <algorithm>
00021 #include "graphic_context.hxx"
00022 #include "colors.hxx"
00023 #include "gui_child_manager.hxx"
00024 
00025 GUIChildManager::GUIChildManager (int x, int y, int width, int height)
00026   : GUIComponent (x, y, width, height)
00027 {
00028   current_component = 0;
00029 }
00030 
00031 GUIChildManager::~GUIChildManager ()
00032 {
00033   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00034     {
00035       delete *i;
00036     }
00037 }
00038 
00039 void
00040 GUIChildManager::add (GUIComponent* comp)
00041 {
00042   components.push_back(comp);
00043 }
00044 
00045 void
00046 GUIChildManager::remove (GUIComponent* comp)
00047 {
00048   
00049   components.erase(std::remove(components.begin(), components.end(), comp), components.end());
00050 }
00051 
00052 void
00053 GUIChildManager::replace(GUIComponent* old_comp, GUIComponent* new_comp)
00054 {
00055   for (ComponentLst::iterator i = components.begin(); i != components.end(); ++i)
00056     {
00057       if (*i == old_comp)
00058         {
00059           *i = new_comp;
00060           return;
00061         }
00062     }
00063 }
00064 
00065 void
00066 GUIChildManager::draw (GraphicContext* parent_gc)
00067 {
00068   gc.set_parent_gc (parent_gc);
00069   gc.set_offset (x_pos, y_pos);
00070   
00071   parent_gc->draw_fill_rect (x_pos, y_pos,
00072                              x_pos + width, y_pos + height, 
00073                              Colors::button_bg_passive);
00074   parent_gc->draw_rect (x_pos, y_pos,
00075                         x_pos + width, y_pos + height, 
00076                         Colors::button_fg_passive);
00077 
00078   parent_gc->draw_fill_rect (x_pos, y_pos,
00079                              x_pos + width, y_pos, 
00080                              Colors::button_bg_hover);
00081 
00082   parent_gc->draw_rect (x_pos, y_pos,
00083                         x_pos + width, y_pos, 
00084                         Colors::button_fg_passive);
00085 
00086   for (ComponentLst::reverse_iterator i = components.rbegin (); i != components.rend (); ++i)
00087     {
00088       (*i)->draw (&gc);
00089     }
00090 
00091   draw_overlay(parent_gc);
00092 }
00093 
00094 void
00095 GUIChildManager::on_primary_button_press (int x, int y)
00096 {
00097   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00098     {
00099       if ((*i)->is_at (x - x_pos, y - y_pos))
00100         {
00101           (*i)->on_primary_button_press (x - x_pos, y - y_pos);
00102           return;
00103         }
00104     }
00105 }
00106 
00107 void
00108 GUIChildManager::on_primary_button_release (int x, int y)
00109 {
00110   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00111     {
00112       if ((*i)->is_at (x - x_pos, y - y_pos))
00113         {
00114           (*i)->on_primary_button_release (x - x_pos, y - y_pos);
00115           return;
00116         }
00117     }
00118 }
00119 
00120 void
00121 GUIChildManager::on_secondary_button_press (int x, int y)
00122 {
00123   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00124     {
00125       if ((*i)->is_at (x - x_pos, y - y_pos))
00126         {
00127           (*i)->on_secondary_button_press (x - x_pos, y - y_pos);
00128           return;
00129         }
00130     }
00131 }
00132 
00133 void
00134 GUIChildManager::on_secondary_button_release (int x, int y)
00135 {
00136   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00137     {
00138       if ((*i)->is_at (x - x_pos, y - y_pos))
00139         {
00140           (*i)->on_secondary_button_release (x - x_pos, y - y_pos);
00141           return;
00142         }
00143     }
00144 }
00145   
00146 void
00147 GUIChildManager::on_delete_press (int x, int y)
00148 {
00149   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00150     {
00151       if ((*i)->is_at (x - x_pos, y - y_pos))
00152         {
00153           (*i)->on_delete_press (x - x_pos, y - y_pos);
00154           return;
00155         }
00156     }
00157 }
00158 
00159 void
00160 GUIChildManager::on_fix_press (int x, int y)
00161 {
00162   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00163     {
00164       if ((*i)->is_at (x - x_pos, y - y_pos))
00165         {
00166           (*i)->on_fix_press (x - x_pos, y - y_pos);
00167           return;
00168         }
00169     }
00170 }
00171 
00172 void
00173 GUIChildManager::on_mouse_enter ()
00174 {
00175 }
00176 
00177 void
00178 GUIChildManager::on_mouse_leave ()
00179 {
00180 }
00181 
00182 void
00183 GUIChildManager::wheel_up (int x, int y)
00184 {
00185   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00186     {
00187       if ((*i)->is_at (x - x_pos, y - y_pos))
00188         {
00189           (*i)->wheel_up (x - x_pos, y - y_pos);
00190           return;
00191         }
00192     }
00193 }
00194 
00195 void
00196 GUIChildManager::wheel_down (int x, int y)
00197 {
00198   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00199     {
00200       if ((*i)->is_at (x - x_pos, y - y_pos))
00201         {
00202           (*i)->wheel_down (x - x_pos, y - y_pos);
00203           return;
00204         }
00205     }
00206 }
00207 
00208 void
00209 GUIChildManager::scroll_left ()
00210 {
00211   
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 }
00220 
00221 void
00222 GUIChildManager::scroll_right ()
00223 {
00224   
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 }
00234 
00235 void
00236 GUIChildManager::scroll_up ()
00237 {
00238   
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 }
00247 
00248 void
00249 GUIChildManager::scroll_down ()
00250 {
00251   
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 }
00261 
00262 void
00263 GUIChildManager::on_mouse_move (int x, int y, int of_x, int of_y)
00264 {
00265   GUIComponent* comp = find_component_at (x, y);
00266   
00267 
00268   if (comp != current_component)
00269     {
00270       if (comp) comp->on_mouse_enter();
00271       if (current_component) current_component->on_mouse_leave();
00272       current_component = comp;
00273     }
00274   else if (comp)
00275     comp->on_mouse_move(x, y, of_x, of_y);
00276 }
00277 
00278 GUIComponent* 
00279 GUIChildManager::find_component_at (int x, int y)
00280 {
00281   for (ComponentLst::iterator i = components.begin (); i != components.end (); ++i)
00282     {
00283       if ((*i)->is_at (x - x_pos, y - y_pos))
00284         {
00285           return *i;
00286         }
00287     }
00288   return 0;
00289 }
00290 
00291