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

Last change on this file since 2606 was 2606, checked in by ansari, 21 years ago

Ajout bloc try/catch ds piacmd.cc (thread execution commandes) et ds pistdimgapp.cc (methode process, thread boucle d'evts) - Reza 07/09/2004

File size: 9.4 KB
RevLine 
[293]1#include "piacmd.h"
[165]2#include <stdio.h>
3#include <stdlib.h>
[349]4#include <ctype.h>
[165]5#include <math.h>
6
[293]7#include "basexecut.h"
[165]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"
[361]22#include "piafitting.h"
[463]23#include "pawexecut.h"
[1224]24#include "cxxexecutor.h"
[1251]25#include "cxxexecwin.h"
[1828]26#include "contmodex.h"
[1920]27#include "flowmodex.h"
[165]28
[293]29#include PISTDWDG_H
30#include PILIST_H
[165]31
[293]32// ------------------------------------------------------------
[349]33// Gestion d'une fenetre d'aide interactive
34// Classe PIAHelpWind
[293]35// ------------------------------------------------------------
[165]36
[2474]37#define HGRPMSGOFFSET 100000
38
[293]39class PIAHelpWind : public PIWindow {
40public :
41 PIAHelpWind(PIStdImgApp* par, PIACmd* piacmd);
42 virtual ~PIAHelpWind();
[330]43 virtual void Show();
[293]44 virtual void Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);
[330]45 inline void AddHelpGroup(const char * hgrp, int gid)
[2474]46 { hgrpom->AppendItem(hgrp, HGRPMSGOFFSET+gid); }
[2465]47 inline void AddHelpGroup(string const & hgrp, int gid)
[2474]48 { hgrpom->AppendItem(hgrp.c_str(), HGRPMSGOFFSET+gid); }
[330]49 inline void ClearHelpList()
50 { mNitem=0; hitemlist->DeleteAllItems(); }
[293]51 inline void AddHelpItem(const char * hitem)
[330]52 { mNitem++; hitemlist->AppendItem(hitem, 100+mNitem); }
[2465]53 inline void SetHelpTextLabel(string const & htxt, string const & hlab)
54 { mTxt->SetText(htxt); mLab->SetLabel(hlab); }
55
[293]56protected :
57 PIStdImgApp* dap;
58 PIACmd* piac;
59 int mNitem;
60 PIList* hitemlist;
[330]61 PIOptMenu* hgrpom;
[293]62 PIButton * mBut;
63 PILabel * mLab;
64 PIText* mTxt;
65};
[165]66
[293]67/* --Methode-- */
68PIAHelpWind::PIAHelpWind(PIStdImgApp *par, PIACmd* piacmd)
69 : PIWindow((PIMsgHandler *)par, "Help-PIApp", PIWK_normal, 400, 300, 100, 350)
70{
71dap = par;
72piac = piacmd;
73mNitem = 0;
[330]74SetMsg(77);
[165]75
[293]76int bsx, bsy;
77int tsx, tsy;
78int spx, spy;
79PIApplicationPrefCompSize(bsx, bsy);
80spx = bsx/6; spy = bsy/6;
81tsx = 10*bsx+2*spx; tsy = 7*bsy+3*spy;
82SetSize(tsx,tsy);
[330]83hgrpom = new PIOptMenu(this, "hgrpoptmen", bsx*2.0, bsy, spx/2, spy);
84hgrpom->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
85hitemlist = new PIList(this, "hitemlist", bsx*2.0, tsy-3*spy-bsy, spx/2, 2*spy+bsy);
[293]86hitemlist->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
87// hitemlist->SetBorderWidth(2);
[324]88mTxt = new PIText(this, "helptext", true, true, bsx*8.0, 6*bsy, bsx*2.0+1.5*spx, spy);
89// mTxt->SetMutiLineMode(true);
[293]90mTxt->SetTextEditable(false);
91mTxt->SetText("");
92mTxt->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
93mLab = new PILabel(this, "helpitem", bsx*4, bsy, bsx*2.5+2*spx, tsy-spy-bsy);
94mLab->SetBorderWidth(1);
95mLab->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
96mLab->SetLabel("");
[330]97mBut = new PIButton(this, "Close", 70, bsx, bsy, tsx-bsx*1.5-spx, tsy-spy-bsy);
[293]98mBut->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
99}
[165]100
101/* --Methode-- */
[293]102PIAHelpWind::~PIAHelpWind()
103{
[330]104delete hgrpom;
[293]105delete hitemlist;
106delete mTxt;
107delete mLab;
108delete mBut;
109}
110
111/* --Methode-- */
112void PIAHelpWind::Process(PIMessage msg, PIMsgHandler* sender, void* /*data*/)
113{
114PIMessage um = UserMsg(msg);
[330]115if (((um == 77) && (ModMsg(msg) == PIMsg_Close)) || (um == 70) ) {
[293]116 Hide();
117 return;
118 }
[2474]119else if ( (um >= HGRPMSGOFFSET) && (sender == hgrpom)) { // Selection de groupe de Help
[330]120 mTxt->SetText("");
121 mLab->SetLabel("");
[2474]122 piac->UpdateHelpList(this, um-HGRPMSGOFFSET);
[330]123}
124else if ( (um > 100) && (sender == hitemlist) && (ModMsg(msg) == PIMsg_Select) ) {
[293]125 string s = hitemlist->GetSelectionStr();
126 mTxt->SetText(piac->GetUsage(s));
127 mLab->SetLabel(s);
128 }
129}
130
[330]131/* --Methode-- */
132void PIAHelpWind::Show()
133{
[2474]134hgrpom->SetValue(HGRPMSGOFFSET); // Groupe All
[330]135mTxt->SetText("");
136mLab->SetLabel("");
137piac->UpdateHelpList(this, 0);
138PIWindow::Show();
139}
[293]140
[349]141
142// ------------------------------------------------------------
143// Classe PIACmd
144// ------------------------------------------------------------
145
[2463]146// static PIACmd* curpiacmd = NULL;
[293]147/* --Methode-- */
[2490]148PIACmd::PIACmd(PIStdImgApp* app)
[2463]149 : Commander()
[165]150{
[2490]151mObjMgr = new NamedObjMgr;
[165]152mImgApp = app;
[293]153helpwin = new PIAHelpWind(app, this);
[2465]154helpwin_initdone = false;
[293]155
[2463]156string kw = "exitpiapp";
[2305]157string grp = "PIACmd";
[2465]158string gdesc = "piapp interpreter (class PIACmd) additional builtin commands";
159AddHelpGroup(grp, gdesc);
160
[2463]161string usage = "To end the piapp session ";
[2419]162RegisterCommand(kw, usage, NULL, grp);
[2463]163kw = "helpwindow";
164usage = "To display the Help window ";
[2419]165RegisterCommand(kw, usage, NULL, grp);
[2203]166
[2490]167basexec = new PIABaseExecutor(this, mObjMgr, app);
[361]168fitexec = new PIAFitter(this, app);
[463]169pawexec = new PAWExecutor(this, app);
[1251]170CxxExecutor * cxxe = new CxxExecutor(this, app);
171cxxexec = cxxe;
[1828]172
173ContModExecutor *cntxx = new ContModExecutor(this, app);//_OP_
174cntexec = cntxx; //_OP_
[1920]175FlowModExecutor *flwxx = new FlowModExecutor(this, app);//_OP_
176flwexec = flwxx; //_OP_
[1828]177
[1251]178cxxoptwin = new CxxOptionWind(app, cxxe);
179cxxexwin = new CxxExecWind(app, cxxe);
180
[2465]181InitializeHelpWindowMenu();
[2486]182// <ZThread> Thread control attributes
183fg_thrstop = false;
184fg_threxe = false;
[165]185}
186
187/* --Methode-- */
188PIACmd::~PIACmd()
189{
[2490]190delete mObjMgr;
[293]191delete helpwin;
[1251]192delete cxxexwin;
193delete cxxoptwin;
[361]194delete basexec;
195delete fitexec;
[463]196delete pawexec;
[1224]197delete cxxexec;
[165]198}
199
200
[293]201/* --Methode-- */
[2486]202void PIACmd::AddInputLine(string const & line)
203{
204 mutx_inps.lock();
[2536]205 inputlines.push(line); // Ajout d'un element en fin de queue
[2486]206 mutx_inps.unlock();
207 mutx_inps.broadcast();
208}
209
210/* --Methode-- */
211void PIACmd::StopThread()
212{
213 fg_thrstop = true;
214 mutx_inps.broadcast();
215}
216
217/* --Methode-- */
218void PIACmd::run()
219{
220 while (!fg_thrstop) {
221 mutx_inps.lock();
222 while (inputlines.empty()) {
223 fg_threxe = false;
224 mutx_inps.wait();
225 }
[2536]226 string line = inputlines.front(); // On recupere l'element de tete
227 inputlines.pop(); // On supprime l'element de tete
[2486]228 fg_threxe = true;
229 mutx_inps.unlock();
[2606]230 try {
231 Interpret(line);
232 }
233 catch (PThrowable& pex) { // Catching SOPHYA exceptions
234 cerr << "PIACmd::run() SOPHYA exception in call to Interpret(" << line << ")\n"
235 << (string)typeid(pex).name() << " Msg= " << pex.Msg() << endl;
236 }
237 catch (std::exception& sex) {
238 cerr << "PIACmd::run() std::exception in call to Interpret(" << line << ")\n"
239 << (string)typeid(sex).name() << " Msg= " << sex.what() << endl;
240 }
241 catch (...) {
242 cerr << "PIACmd::run() unknown exception (...) in call to Interpret("
243 << line << ")" << endl;
244 }
[2486]245 }
246}
247
248/* --Methode-- */
[2465]249bool PIACmd::CheckHelpGrp(string& grp, int& gid, string& desc)
[330]250{
[2465]251bool fgnewgrp = Commander::CheckHelpGrp(grp, gid, desc);
252if (helpwin_initdone && fgnewgrp) helpwin->AddHelpGroup(grp.c_str(), gid);
253return fgnewgrp;
[330]254}
255
256/* --Methode-- */
257void PIACmd::UpdateHelpList(PIAHelpWind* hw, int gid)
258{
259helpwin->ClearHelpList();
[2465]260if (gid == 0) {
261 string htxt = "All registered commands";
262 string hlab = "All (HelpGroup)";
263 helpwin->SetHelpTextLabel(htxt, hlab);
264}
265else {
266 CmdHGroup::iterator ith;
267 for(ith = cmdhgrp.begin(); ith != cmdhgrp.end(); ith++) {
268 if ((*ith).second.gid == gid) {
269 string hlab = (*ith).first;
270 hlab += " (HelpGroup)";
271 helpwin->SetHelpTextLabel((*ith).second.desc, hlab);
272 break;
273 }
274 }
275}
[330]276CmdExmap::iterator it;
277for(it = helpexmap.begin(); it != helpexmap.end(); it++) {
278 if ( (gid != 0) && ((*it).second.group != gid) ) continue;
279 helpwin->AddHelpItem((*it).first.c_str());
280 }
281for(it = cmdexmap.begin(); it != cmdexmap.end(); it++) {
282 if ( (gid != 0) && ((*it).second.group != gid) ) continue;
283 helpwin->AddHelpItem((*it).first.c_str());
284 }
285}
286
[2465]287/* --Methode-- */
288void PIACmd::InitializeHelpWindowMenu()
289{
290 helpwin->AddHelpGroup("All", 0);
291 CmdHGroup::iterator it;
292 for(it = cmdhgrp.begin(); it != cmdhgrp.end(); it++)
293 helpwin->AddHelpGroup((*it).first, (*it).second.gid);
294 helpwin_initdone = true;
295}
[165]296
[357]297/* Fonction */
[368]298static string GetStringFrStdin(PIACmd* piac)
[357]299{
[368]300PIStdImgApp* piapp = piac->GetImgApp();
301if (piapp) {
302 PIBaseWdg* wdg = piapp->CurrentBaseWdg();
303 if (wdg) wdg->Refresh();
[357]304#ifndef __mac__
[368]305 /* On vide le buffer X-Window */
[374]306 XSync(PIXDisplay(),False);
[357]307#endif
[368]308}
[357]309char buff[128];
310fgets(buff, 128, stdin);
311buff[127] = '\0';
312return((string)buff);
313}
314
[165]315
[1262]316/* --Methode-- */
317int PIACmd::ExecuteCommandLine(string & kw, vector<string> & tokens, string & toks)
318{
319int rc = 0;
320NamedObjMgr omg;
[349]321
[165]322// >>>>>>>>>>> Commande d'interpreteur
[2465]323if (kw == "helpwindow") {
324 ShowHelpWindow();
325 return 0;
326}
[2307]327// ----> Sortie d'application
328else if (kw == "exitpiapp") {
329 mImgApp->Stop();
[2465]330 return 0;
[2307]331}
[2463]332else return Commander::ExecuteCommandLine(kw, tokens, toks);
[2465]333return 0;
[165]334}
335
[333]336
[165]337/* --Methode-- */
[293]338void PIACmd::ShowHelpWindow()
[165]339{
[293]340helpwin->Show();
[165]341}
[357]342
[463]343/* --Methode-- */
[1251]344void PIACmd::ShowCxxOptionWindow()
345{
346cxxoptwin->Show();
347}
348
349/* --Methode-- */
350void PIACmd::ShowCxxExecWindow()
351{
352cxxexwin->Show();
353}
354
[2463]355/* --Methode-- */
356void PIACmd::SetCurrentPrompt(const char* pr)
[2377]357{
[2463]358 Commander::SetCurrentPrompt(pr);
[2489]359 if (mImgApp) {
360 ZSync(mImgApp->getMutex());
361 mImgApp->GetConsole()->SetPrompt(pr);
362 }
[2377]363}
364
[1251]365/* --Methode-- */
[2463]366void PIACmd::ShowMessage(const char * msg, int att)
[463]367{
[2489]368 /*
369 Il faut faire quelque chose pour gerer correctement ca en multithread
[2463]370 char va = (att == 0) ? 0 : PIVA_Magenta;
[2489]371 if (mImgApp) {
372 ZSync(mImgApp->getMutex());
373 mImgApp->GetConsole()->AddStr(msg, va);
374 }
375 */
376Commander::ShowMessage(msg, att);
[2263]377}
Note: See TracBrowser for help on using the repository browser.