#include #include "framework.h" #include #include struct GUILAYOUT_PRIVATE{ char mainid[10]; char areactx[10][100]; bool areaneeded[10]; // We must execute the areaN tag // immediatly int level; int nbform; int tbid[10]; int nbarea; // Number of area currently alive int nbmayend; // How many area confirmed they sccept to end int areaalive[10]; // Number of documents displayed in each area PRIVATE_MESSAGE mayend; PRIVATE_MESSAGE ending; PRIVATE_MESSAGE endarea; PRIVATE_MESSAGE allmayend; GUILAYOUT_PRIVATE(){ mainid[0] = '\0'; memset (areactx,0,sizeof(areactx)); memset (areaneeded,0,sizeof(areaneeded)); memset (areaalive,0,sizeof(areaalive)); level = 0; nbform = 0; nbarea = 0; nbmayend = 0; } int subform () { int id = nbform++; tbid[level++] = id; return id; } void endform () { level--; } void formatpath (int area, bool atstartup) { char *pt = areactx[area]; int len = sprintf (pt,"%s",mainid); for (int i=0; isubform()); } void _F_guilayout::guibook() { diagui_sendcmd (P_Book,"f%d\n",priv->subform()); } void _F_guilayout::guigroup(const char *title) { char tmp[1000]; diagui_sendcmd (P_Group,"f%d %s\n",priv->subform() ,diagui_quote(title,tmp)); } void _F_guilayout::guigroupfit(const char *title) { char tmp[1000]; diagui_sendcmd (P_Groupfit,"f%d %s\n",priv->subform() ,diagui_quote(title,tmp)); } void _F_guilayout::guiend() { diagui_sendcmd (P_End,"\n"); priv->endform(); } void _F_guilayout::guinewline() { diagui_sendcmd (P_Newline,"\n"); } void _F_guilayout::guidispolast( GUI_H_DISPO hdisp, int nbhcell, GUI_V_DISPO vdisp, int nbvcell) { static char tbh[]={'L','C','R'}; static char tbv[]={'T','C','B'}; diagui_sendcmd (P_Dispolast,"%c %d %c %d\n",tbh[hdisp],nbhcell ,tbv[vdisp],nbvcell); } void _F_guilayout::guicmd(int cmd, const char *ctl, ...) { } void _F_guilayout::setuparea1(bool atstartup) { priv->formatpath (0,atstartup); } void _F_guilayout::setuparea2(bool atstartup) { priv->formatpath (1,atstartup); } void _F_guilayout::setuparea3(bool atstartup) { priv->formatpath (2,atstartup); } void _F_guilayout::setuparea4(bool atstartup) { priv->formatpath (3,atstartup); } void _F_guilayout::setuparea5(bool atstartup) { priv->formatpath (4,atstartup); } void _F_guilayout::setuparea6(bool atstartup) { priv->formatpath (5,atstartup); } void _F_guilayout::setuparea7(bool atstartup) { priv->formatpath (6,atstartup); } void _F_guilayout::setuparea8(bool atstartup) { priv->formatpath (7,atstartup); } void _F_guilayout::setuparea9(bool atstartup) { priv->formatpath (8,atstartup); } void _F_guilayout::area3(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area4(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area5(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area6(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area7(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area8(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } void _F_guilayout::area9(PRIVATE_MESSAGE &, PRIVATE_MESSAGE &) { } struct GUILAYOUT_TH{ _F_guilayout *c; int area; GUILAYOUT_TH (_F_guilayout *_c, int _area) { c = _c; area = _area; } }; static void guilayout_callarea (void *p) { GUILAYOUT_TH *th = (GUILAYOUT_TH*)p; _F_guilayout *c = th->c; GUILAYOUT_PRIVATE *priv = c->priv; int area = th->area; // fprintf (stderr,"ctx %d :%s:\n",area,priv->areactx[area]); diagui_setdefaultctx (priv->areactx[area]); priv->nbarea++; priv->areaalive[area]++; switch (area){ case 0: c->area1(priv->mayend,priv->ending); break; case 1: c->area2(priv->mayend,priv->ending); break; case 2: c->area3(priv->mayend,priv->ending); break; case 3: c->area4(priv->mayend,priv->ending); break; case 4: c->area5(priv->mayend,priv->ending); break; case 5: c->area6(priv->mayend,priv->ending); break; case 6: c->area7(priv->mayend,priv->ending); break; case 7: c->area8(priv->mayend,priv->ending); break; case 8: c->area9(priv->mayend,priv->ending); break; }; priv->nbarea--; priv->areaalive[area]--; dialog_sendmessage (priv->endarea); delete th; } int _F_guilayout::isareaalive(int noarea) { int ret = 0; if (noarea >= 1 && noarea <= 9){ ret = priv->areaalive[noarea-1]; } return ret; } void _F_guilayout::callarea1() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,0)); } void _F_guilayout::callarea2() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,1)); } void _F_guilayout::callarea3() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,2)); } void _F_guilayout::callarea4() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,3)); } void _F_guilayout::callarea5() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,4)); } void _F_guilayout::callarea6() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,5)); } void _F_guilayout::callarea7() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,6)); } void _F_guilayout::callarea8() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,7)); } void _F_guilayout::callarea9() { uithread (guilayout_callarea,new GUILAYOUT_TH(this,8)); } /* The area accept to end */ void _F_guilayout::endok() { priv->nbmayend++; // fprintf (stderr,"endok %d %d\n",priv->nbmayend,priv->nbarea); if (priv->nbmayend == priv->nbarea){ dialog_sendmessage (priv->allmayend); } } void guilayout (_F_guilayout &c, const char *title) { dialog_clear(); GUILAYOUT_PRIVATE priv; c.priv = &priv; sprintf (priv.mainid,"layo-%d",uithread_id); char tmp[1000]; diagui_sendcmd (P_MainForm,"%s %s\n",priv.mainid,diagui_quote(title,tmp)); c.setup(); // fprintf (stderr,"priv.level %d %d %d\n",priv.level,priv.areaneeded[0],priv.areaneeded[1]); for (int i=priv.level; i>0; i--) diagui_sendcmd (P_End,"\n"); diagui_sendcmd (P_End,"\n"); if (priv.areaneeded[0]) c.callarea1(); if (priv.areaneeded[1]) c.callarea2(); if (priv.areaneeded[2]) c.callarea3(); if (priv.areaneeded[3]) c.callarea4(); if (priv.areaneeded[4]) c.callarea5(); if (priv.areaneeded[5]) c.callarea6(); if (priv.areaneeded[6]) c.callarea7(); if (priv.areaneeded[7]) c.callarea8(); if (priv.areaneeded[8]) c.callarea9(); while (1){ SSTRING path, menu, action; int code = diagui_sync (priv.mainid,path, action, menu); // fprintf (stderr,"guilayout[%d] code=%d :%s:%s:%s:\n",uithread_id,code,path.get(),menu.get(),action.get()); if (code == 99){ priv.nbmayend = 0; dialog_sendmessage (priv.mayend); }else if (dialog_testmessage(priv.allmayend)){ dialog_sendmessage (priv.ending); }else if (dialog_testmessage(priv.endarea)){ if (priv.nbarea == 0) break; } } }