| 
							- #include "Fl_Osc_Pane.H"
 - #include "Fl_Osc_Widget.H"
 - #include <cassert>
 - #include <cstdio>
 - 
 - Fl_Osc_Pane::Fl_Osc_Pane(void)
 -     :osc(NULL), base()
 - {}
 - 
 - 
 - Fl_Osc_Window::Fl_Osc_Window(int w, int h, const char *L)
 -     :Fl_Double_Window(w,h,L), title_ext(NULL)
 - {}
 - 
 - void Fl_Osc_Window::init(Fl_Osc_Interface *osc_, std::string loc_)
 - {
 -     title_ext  = new Osc_DataModel(osc_);
 -     title_ext->doUpdate("/ui/title");
 -     title_ext->callback = [this](string next) {
 -         rewrite_rule = next;
 -         //printf("old: %s\n", title_orig.c_str());
 -         const char *orig = title_orig.c_str();
 -         //                               12345678901
 -         const char *sub  = strstr(orig, "zynaddsubfx");
 -         if(!sub)
 -             sub  = strstr(orig, "ZynAddSubFX");
 -         title_new = "";
 -         while(*orig) {
 -             if(orig == sub) {
 -                 title_new += next;
 -                 orig += 11;
 -             } else
 -                 title_new += *orig++;
 -         }
 -         //title_new = title_orig + next;
 -         this->label(title_new.c_str());
 -     };
 -     title_orig = label();
 - 
 -     osc   = osc_;
 -     base = loc_;
 - }
 - 
 - Fl_Osc_Window::~Fl_Osc_Window(void)
 - {
 -     delete title_ext;
 - }
 - 
 - std::string Fl_Osc_Window::loc(void) const
 - {
 -     return base;
 - }
 - 
 - static void nested_update(Fl_Group *g)
 - {
 -     unsigned nchildren = g->children();
 -     for(unsigned i=0; i < nchildren; ++i) {
 -         Fl_Widget *widget = g->child(i);
 -         if(Fl_Osc_Widget *o = dynamic_cast<Fl_Osc_Widget*>(widget)) {
 -             o->update();
 -         } else if(Fl_Group *o = dynamic_cast<Fl_Group*>(widget)) {
 -             nested_update(o);
 -         }
 - 
 -     }
 - }
 - 
 - void Fl_Osc_Window::update(void)
 - {
 -     unsigned nchildren = this->children();
 -     for(unsigned i=0; i < nchildren; ++i) {
 -         Fl_Widget *widget = this->child(i);
 -         if(Fl_Osc_Widget *o = dynamic_cast<Fl_Osc_Widget*>(widget)) {
 -             o->update();
 -         }
 -         if(dynamic_cast<Fl_Group*>(widget))
 -             nested_update(dynamic_cast<Fl_Group*>(widget));
 -     }
 - }
 - 
 - void Fl_Osc_Window::update_title(void)
 - {
 -     title_orig = label();
 -     title_ext->callback(rewrite_rule);
 - }
 - 
 - static void nested_rebase(Fl_Group *g, std::string new_base)
 - {
 -     unsigned nchildren = g->children();
 -     for(unsigned i=0; i < nchildren; ++i) {
 -         Fl_Widget *widget = g->child(i);
 -         if(Fl_Osc_Widget *o = dynamic_cast<Fl_Osc_Widget*>(widget)) {
 -             o->rebase(new_base);
 -         } else if(Fl_Osc_Group *o = dynamic_cast<Fl_Osc_Group*>(widget)) {
 -             o->rebase(new_base);
 -         } else if(Fl_Group *o = dynamic_cast<Fl_Group*>(widget)) {
 -             nested_rebase(o, new_base);
 -         }
 - 
 -     }
 - }
 - 
 - void Fl_Osc_Window::rebase(std::string new_base)
 - {
 -     unsigned nchildren = this->children();
 -     for(unsigned i=0; i < nchildren; ++i) {
 -         Fl_Widget *widget = this->child(i);
 -         if(Fl_Osc_Widget *o = dynamic_cast<Fl_Osc_Widget*>(widget)) {
 -             o->rebase(new_base);
 -         }
 -         if(Fl_Osc_Group *o = dynamic_cast<Fl_Osc_Group*>(widget))
 -             o->rebase(new_base);
 -         else if(dynamic_cast<Fl_Group*>(widget))
 -             nested_rebase(dynamic_cast<Fl_Group*>(widget), new_base);
 -     }
 -     base = new_base;
 - }
 - 
 - static Fl_Osc_Pane *find_osc_pane(Fl_Widget *root)
 - {
 -     if(!root)
 -         return NULL;
 -     Fl_Group *next = root->parent();
 - 
 -     if(auto *p = dynamic_cast<Fl_Osc_Pane*>(next))
 -         return p;
 -     else
 -         return find_osc_pane(next);
 - }
 - 
 - Fl_Osc_Group::Fl_Osc_Group(int x, int y, int w, int h, const char *L)
 - :Fl_Group(x,y,w,h,L)
 - {
 -     if(auto *p = find_osc_pane(this)) {
 -         osc  = p->osc;
 -         base = p->loc();
 -         assert(osc);
 -     }
 - };
 - 
 - 
 - std::string Fl_Osc_Group::loc(void) const
 - {
 -     return base + ext;
 - }
 - 
 - 
 - void Fl_Osc_Group::rebase(std::string new_base)
 - {
 -     nested_rebase(this, new_base+ext);
 -     base = new_base;
 - }
 - 
 - void Fl_Osc_Group::reext(std::string new_ext)
 - {
 -     nested_rebase(this, base+new_ext);
 -     ext = new_ext;
 - }
 
 
  |