source: Sophya/trunk/SophyaPI/PIext/piacmd.cc@ 3460

Last change on this file since 3460 was 3374, checked in by ansari, 18 years ago

suite corrections pour eviter blocage: Request UpdateObjMgrWindow() -> SOpExObj::AddOpe()/run() - Reza 05/11/2007

File size: 12.2 KB
RevLine 
[2615]1#include "sopnamsp.h"
[293]2#include "piacmd.h"
[165]3#include <stdio.h>
4#include <stdlib.h>
[349]5#include <ctype.h>
[165]6#include <math.h>
7
8
[293]9#include "pdlmgr.h"
[165]10#include "ctimer.h"
[2214]11#include "strutil.h"
[2215]12#include "strutilxx.h"
[293]13// #include "dlftypes.h"
[2307]14#ifdef SANS_EVOLPLANCK
[2308]15#include "nbrandom.h"
[2307]16#else
17#include "srandgen.h"
18#endif
[165]19
[293]20#include "pistdimgapp.h"
[165]21#include "nobjmgr.h"
[2781]22
23// Les differentes classes CommandExecutor
24#include "basexecut.h"
25#include "graphexecut.h"
[361]26#include "piafitting.h"
[463]27#include "pawexecut.h"
[1224]28#include "cxxexecutor.h"
[1251]29#include "cxxexecwin.h"
[1828]30#include "contmodex.h"
[1920]31#include "flowmodex.h"
[165]32
[293]33#include PISTDWDG_H
34#include PILIST_H
[165]35
[293]36// ------------------------------------------------------------
[349]37// Gestion d'une fenetre d'aide interactive
38// Classe PIAHelpWind
[293]39// ------------------------------------------------------------
[165]40
[2474]41#define HGRPMSGOFFSET 100000
42
[293]43class PIAHelpWind : public PIWindow {
44public :
45 PIAHelpWind(PIStdImgApp* par, PIACmd* piacmd);
46 virtual ~PIAHelpWind();
[330]47 virtual void Show();
[293]48 virtual void Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);
[330]49 inline void AddHelpGroup(const char * hgrp, int gid)
[2474]50 { hgrpom->AppendItem(hgrp, HGRPMSGOFFSET+gid); }
[2465]51 inline void AddHelpGroup(string const & hgrp, int gid)
[2474]52 { hgrpom->AppendItem(hgrp.c_str(), HGRPMSGOFFSET+gid); }
[330]53 inline void ClearHelpList()
54 { mNitem=0; hitemlist->DeleteAllItems(); }
[293]55 inline void AddHelpItem(const char * hitem)
[330]56 { mNitem++; hitemlist->AppendItem(hitem, 100+mNitem); }
[2465]57 inline void SetHelpTextLabel(string const & htxt, string const & hlab)
58 { mTxt->SetText(htxt); mLab->SetLabel(hlab); }
59
[293]60protected :
61 PIStdImgApp* dap;
62 PIACmd* piac;
63 int mNitem;
64 PIList* hitemlist;
[330]65 PIOptMenu* hgrpom;
[293]66 PIButton * mBut;
67 PILabel * mLab;
68 PIText* mTxt;
69};
[165]70
[293]71/* --Methode-- */
72PIAHelpWind::PIAHelpWind(PIStdImgApp *par, PIACmd* piacmd)
73 : PIWindow((PIMsgHandler *)par, "Help-PIApp", PIWK_normal, 400, 300, 100, 350)
74{
75dap = par;
76piac = piacmd;
77mNitem = 0;
[330]78SetMsg(77);
[165]79
[293]80int bsx, bsy;
81int tsx, tsy;
82int spx, spy;
83PIApplicationPrefCompSize(bsx, bsy);
84spx = bsx/6; spy = bsy/6;
85tsx = 10*bsx+2*spx; tsy = 7*bsy+3*spy;
86SetSize(tsx,tsy);
[330]87hgrpom = new PIOptMenu(this, "hgrpoptmen", bsx*2.0, bsy, spx/2, spy);
88hgrpom->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
89hitemlist = new PIList(this, "hitemlist", bsx*2.0, tsy-3*spy-bsy, spx/2, 2*spy+bsy);
[293]90hitemlist->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
91// hitemlist->SetBorderWidth(2);
[324]92mTxt = new PIText(this, "helptext", true, true, bsx*8.0, 6*bsy, bsx*2.0+1.5*spx, spy);
93// mTxt->SetMutiLineMode(true);
[293]94mTxt->SetTextEditable(false);
95mTxt->SetText("");
96mTxt->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
97mLab = new PILabel(this, "helpitem", bsx*4, bsy, bsx*2.5+2*spx, tsy-spy-bsy);
98mLab->SetBorderWidth(1);
99mLab->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
100mLab->SetLabel("");
[330]101mBut = new PIButton(this, "Close", 70, bsx, bsy, tsx-bsx*1.5-spx, tsy-spy-bsy);
[293]102mBut->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
103}
[165]104
105/* --Methode-- */
[293]106PIAHelpWind::~PIAHelpWind()
107{
[330]108delete hgrpom;
[293]109delete hitemlist;
110delete mTxt;
111delete mLab;
112delete mBut;
113}
114
115/* --Methode-- */
116void PIAHelpWind::Process(PIMessage msg, PIMsgHandler* sender, void* /*data*/)
117{
118PIMessage um = UserMsg(msg);
[330]119if (((um == 77) && (ModMsg(msg) == PIMsg_Close)) || (um == 70) ) {
[293]120 Hide();
121 return;
122 }
[2474]123else if ( (um >= HGRPMSGOFFSET) && (sender == hgrpom)) { // Selection de groupe de Help
[330]124 mTxt->SetText("");
125 mLab->SetLabel("");
[2474]126 piac->UpdateHelpList(this, um-HGRPMSGOFFSET);
[330]127}
128else if ( (um > 100) && (sender == hitemlist) && (ModMsg(msg) == PIMsg_Select) ) {
[293]129 string s = hitemlist->GetSelectionStr();
130 mTxt->SetText(piac->GetUsage(s));
131 mLab->SetLabel(s);
132 }
133}
134
[330]135/* --Methode-- */
136void PIAHelpWind::Show()
137{
[2474]138hgrpom->SetValue(HGRPMSGOFFSET); // Groupe All
[330]139mTxt->SetText("");
140mLab->SetLabel("");
141piac->UpdateHelpList(this, 0);
142PIWindow::Show();
143}
[293]144
[349]145
146// ------------------------------------------------------------
147// Classe PIACmd
148// ------------------------------------------------------------
149
[2463]150// static PIACmd* curpiacmd = NULL;
[293]151/* --Methode-- */
[2490]152PIACmd::PIACmd(PIStdImgApp* app)
[2463]153 : Commander()
[165]154{
[2490]155mObjMgr = new NamedObjMgr;
[165]156mImgApp = app;
[293]157helpwin = new PIAHelpWind(app, this);
[2465]158helpwin_initdone = false;
[293]159
[2305]160string grp = "PIACmd";
[2465]161string gdesc = "piapp interpreter (class PIACmd) additional builtin commands";
162AddHelpGroup(grp, gdesc);
163
[2672]164string kw = "exitpiapp";
[2463]165string usage = "To end the piapp session ";
[2419]166RegisterCommand(kw, usage, NULL, grp);
[2463]167kw = "helpwindow";
168usage = "To display the Help window ";
[2419]169RegisterCommand(kw, usage, NULL, grp);
[2677]170kw = "stop";
171usage = "To stop (break) interpreter (PIACmd/Commander) execution";
[2672]172RegisterCommand(kw, usage, NULL, grp);
[2203]173
[2490]174basexec = new PIABaseExecutor(this, mObjMgr, app);
[2781]175graphexec = new PIAGraphicExecutor(this, mObjMgr, app);
[361]176fitexec = new PIAFitter(this, app);
[463]177pawexec = new PAWExecutor(this, app);
[1251]178CxxExecutor * cxxe = new CxxExecutor(this, app);
179cxxexec = cxxe;
[1828]180
181ContModExecutor *cntxx = new ContModExecutor(this, app);//_OP_
182cntexec = cntxx; //_OP_
[1920]183FlowModExecutor *flwxx = new FlowModExecutor(this, app);//_OP_
184flwexec = flwxx; //_OP_
[1828]185
[1251]186cxxoptwin = new CxxOptionWind(app, cxxe);
187cxxexwin = new CxxExecWind(app, cxxe);
188
[2465]189InitializeHelpWindowMenu();
[2486]190// <ZThread> Thread control attributes
191fg_thrstop = false;
192fg_threxe = false;
[165]193}
194
195/* --Methode-- */
196PIACmd::~PIACmd()
197{
[2490]198delete mObjMgr;
[293]199delete helpwin;
[1251]200delete cxxexwin;
201delete cxxoptwin;
[361]202delete basexec;
[2781]203delete graphexec;
[361]204delete fitexec;
[463]205delete pawexec;
[1224]206delete cxxexec;
[165]207}
208
209
[293]210/* --Methode-- */
[2486]211void PIACmd::AddInputLine(string const & line)
212{
[2677]213 if (line == "stop") {
[2672]214 StopExecution();
215 return;
216 }
[2486]217 mutx_inps.lock();
[2536]218 inputlines.push(line); // Ajout d'un element en fin de queue
[2486]219 mutx_inps.unlock();
220 mutx_inps.broadcast();
221}
222
223/* --Methode-- */
224void PIACmd::StopThread()
225{
226 fg_thrstop = true;
227 mutx_inps.broadcast();
228}
229
230/* --Methode-- */
231void PIACmd::run()
232{
233 while (!fg_thrstop) {
234 mutx_inps.lock();
235 while (inputlines.empty()) {
236 fg_threxe = false;
237 mutx_inps.wait();
238 }
[2536]239 string line = inputlines.front(); // On recupere l'element de tete
240 inputlines.pop(); // On supprime l'element de tete
[2486]241 fg_threxe = true;
242 mutx_inps.unlock();
[2606]243 try {
244 Interpret(line);
245 }
246 catch (PThrowable& pex) { // Catching SOPHYA exceptions
247 cerr << "PIACmd::run() SOPHYA exception in call to Interpret(" << line << ")\n"
248 << (string)typeid(pex).name() << " Msg= " << pex.Msg() << endl;
249 }
250 catch (std::exception& sex) {
251 cerr << "PIACmd::run() std::exception in call to Interpret(" << line << ")\n"
252 << (string)typeid(sex).name() << " Msg= " << sex.what() << endl;
253 }
254 catch (...) {
255 cerr << "PIACmd::run() unknown exception (...) in call to Interpret("
256 << line << ")" << endl;
257 }
[2486]258 }
259}
260
261/* --Methode-- */
[2465]262bool PIACmd::CheckHelpGrp(string& grp, int& gid, string& desc)
[330]263{
[2465]264bool fgnewgrp = Commander::CheckHelpGrp(grp, gid, desc);
265if (helpwin_initdone && fgnewgrp) helpwin->AddHelpGroup(grp.c_str(), gid);
266return fgnewgrp;
[330]267}
268
269/* --Methode-- */
270void PIACmd::UpdateHelpList(PIAHelpWind* hw, int gid)
271{
272helpwin->ClearHelpList();
[2465]273if (gid == 0) {
274 string htxt = "All registered commands";
275 string hlab = "All (HelpGroup)";
276 helpwin->SetHelpTextLabel(htxt, hlab);
277}
278else {
279 CmdHGroup::iterator ith;
280 for(ith = cmdhgrp.begin(); ith != cmdhgrp.end(); ith++) {
281 if ((*ith).second.gid == gid) {
282 string hlab = (*ith).first;
283 hlab += " (HelpGroup)";
284 helpwin->SetHelpTextLabel((*ith).second.desc, hlab);
285 break;
286 }
287 }
288}
[330]289CmdExmap::iterator it;
290for(it = helpexmap.begin(); it != helpexmap.end(); it++) {
291 if ( (gid != 0) && ((*it).second.group != gid) ) continue;
292 helpwin->AddHelpItem((*it).first.c_str());
293 }
294for(it = cmdexmap.begin(); it != cmdexmap.end(); it++) {
295 if ( (gid != 0) && ((*it).second.group != gid) ) continue;
296 helpwin->AddHelpItem((*it).first.c_str());
297 }
298}
299
[2465]300/* --Methode-- */
301void PIACmd::InitializeHelpWindowMenu()
302{
303 helpwin->AddHelpGroup("All", 0);
304 CmdHGroup::iterator it;
305 for(it = cmdhgrp.begin(); it != cmdhgrp.end(); it++)
306 helpwin->AddHelpGroup((*it).first, (*it).second.gid);
307 helpwin_initdone = true;
308}
[165]309
[357]310/* Fonction */
[368]311static string GetStringFrStdin(PIACmd* piac)
[357]312{
[368]313PIStdImgApp* piapp = piac->GetImgApp();
314if (piapp) {
315 PIBaseWdg* wdg = piapp->CurrentBaseWdg();
316 if (wdg) wdg->Refresh();
317}
[357]318char buff[128];
319fgets(buff, 128, stdin);
320buff[127] = '\0';
321return((string)buff);
322}
323
[2999]324/* --Methode-- */
325bool PIACmd::GetVarApp(string const & vn, string & vv)
326{
327 vv = "";
328 if (mObjMgr == NULL) return false;
329 vector<string> opts;
330 SplitStringToVString(vn, opts, '.');
331 string nom = opts[0];
332 opts.erase(opts.begin());
333 NObjMgrAdapter* obja = mObjMgr->GetObjAdapter(nom);
334 if (obja == NULL) return false;
335 vv = obja->GetInfoString(opts);
336 return true;
337}
[165]338
[1262]339/* --Methode-- */
340int PIACmd::ExecuteCommandLine(string & kw, vector<string> & tokens, string & toks)
341{
342int rc = 0;
343NamedObjMgr omg;
[349]344
[165]345// >>>>>>>>>>> Commande d'interpreteur
[2812]346if ( (kw == "helpwindow") && (mImgApp)) {
347 ZSync zs(mImgApp->getMutex());
[2465]348 ShowHelpWindow();
[2812]349 zs.NOp();
[2465]350 return 0;
351}
[2307]352// ----> Sortie d'application
[2812]353else if ((kw == "exitpiapp") && (mImgApp)) {
[2307]354 mImgApp->Stop();
[2465]355 return 0;
[2307]356}
[2463]357else return Commander::ExecuteCommandLine(kw, tokens, toks);
[2465]358return 0;
[165]359}
360
[333]361
[165]362/* --Methode-- */
[293]363void PIACmd::ShowHelpWindow()
[165]364{
[2812]365 helpwin->Show();
[165]366}
[357]367
[463]368/* --Methode-- */
[1251]369void PIACmd::ShowCxxOptionWindow()
370{
[2812]371 cxxoptwin->Show();
[1251]372}
373
374/* --Methode-- */
375void PIACmd::ShowCxxExecWindow()
376{
[2812]377 cxxexwin->Show();
[1251]378}
379
[2463]380/* --Methode-- */
381void PIACmd::SetCurrentPrompt(const char* pr)
[2377]382{
[2463]383 Commander::SetCurrentPrompt(pr);
[2489]384 if (mImgApp) {
[2755]385 ZSync zs(mImgApp->getMutex()); zs.NOp();
[2489]386 mImgApp->GetConsole()->SetPrompt(pr);
387 }
[2377]388}
389
[1251]390/* --Methode-- */
[2463]391void PIACmd::ShowMessage(const char * msg, int att)
[463]392{
[2489]393 /*
394 Il faut faire quelque chose pour gerer correctement ca en multithread
[2463]395 char va = (att == 0) ? 0 : PIVA_Magenta;
[2489]396 if (mImgApp) {
[2755]397 ZSync(mImgApp->getMutex()); zs.NOp();
[2489]398 mImgApp->GetConsole()->AddStr(msg, va);
399 }
400 */
401Commander::ShowMessage(msg, att);
[2263]402}
[3366]403
404
405/* --Methode-- */
406SOpExObj::SOpExObj(PIStdImgApp* app)
407{
408 mImgApp = app;
409 fg_thrstop = false;
410 fg_threxe = false;
411}
412
413/* --Methode-- */
414SOpExObj::~SOpExObj()
415{
416}
417
418/* --Methode-- */
419void SOpExObj::AddOpe(string const & line)
420{
421 mutx_inps.lock();
422 inputlines.push(line); // Ajout d'un element en fin de queue
423 mutx_inps.unlock();
424 mutx_inps.broadcast();
425}
426
427/* --Methode-- */
428void SOpExObj::run()
429{
430 NamedObjMgr omg;
431 while (!fg_thrstop) {
432 mutx_inps.lock();
433 while (inputlines.empty()) {
434 fg_threxe = false;
435 mutx_inps.wait();
436 }
437 string cmd = inputlines.front().substr(0,3); // On recupere l'element de tete
438 string nom = inputlines.front().substr(4); // On recupere l'element de tete
439 inputlines.pop(); // On supprime l'element de tete
440 fg_threxe = true;
441 mutx_inps.unlock();
442 try {
[3374]443 if (cmd == "UPD") { // UpdateObjMgrWindow()
444 int did = atoi(nom.c_str());
445 omg.UpdateObjMgrWindow(did);
446 }
447 else if (cmd == "SCO") { // set cobj
[3366]448 string ss = "set cobj ";
449 ss += nom;
450 cout << " Defining cobj : " << ss << endl;
451 mImgApp->CmdInterpreter()->AddInputLine(ss);
452 }
453 else if (cmd == "DIS") { // display obj
454 omg.DisplayObj(nom);
455 }
456 else if (cmd == "PRT") { // print obj
457 omg.PrintObj(nom);
458 }
459 else if (cmd == "DEL") { // delete obj
460 omg.DelObj(nom);
461 }
462 else if (cmd == "SAV") { // saveppf obj
463 if (mImgApp->mPpfout) omg.SaveObj(nom, *(mImgApp->mPpfout), false);
464 }
465 else cerr << "SOpExObj::run() ERROR CMD= " << cmd << endl;
466 }
467 catch (PThrowable& pex) { // Catching SOPHYA exceptions
468 cerr << "SOpExObj::run() SOPHYA exception CMD=" << cmd << " NOM=" << nom << "\n"
469 << (string)typeid(pex).name() << " Msg= " << pex.Msg() << endl;
470 }
471 catch (std::exception& sex) {
472 cerr << "SOpExObj::run() std::exception CMD=" << cmd << " NOM=" << nom << "\n"
473 << (string)typeid(sex).name() << " Msg= " << sex.what() << endl;
474 }
475 catch (...) {
476 cerr << "SOpExObj::run() unknown exception (...) CMD="
477 << cmd << " NOM=" << nom << endl;
478 }
479 }
480}
Note: See TracBrowser for help on using the repository browser.