source: Sophya/trunk/Poubelle/PI/pistdwdgx.cc

Last change on this file was 222, checked in by ansari, 26 years ago

Creation module DPC/PI Reza 09/04/99

File size: 15.0 KB
Line 
1#include<stdlib.h>
2#include<string.h>
3
4#include "pisysdep.h"
5#include PISTDWDG_H
6
7// ------- Pb de gestion du focus-keyboard Motif-PIBaseWdg -------
8// ** Note du 26/02/98 - Reza
9// Je desactive pour le moment XmNnavigationType et XmNtraversalOn
10// afin d'ameliorer la gestion du focus-keyboard entre Widget Motif
11// et objet Peida - Cela semble avoir un effet secondaire -
12// Il faut que la souris reste dans le widget Text pour taper dedans
13// ** Note du 30/04/98 - Reza
14// J'ai modifie le mecanisme de gestion des evenements pour PIBaseWdg
15// en passant par un EventHandler - Le probleme de gestion du
16// focus-keyboard n'a pour autant pas ete resolu
17// Je reactive XmNtraversalOn pour les PIText - Le probleme
18// d'attribution du focus-keyboard au PIBaseWdg reste si on
19// met PIText et un PIBaseWdg ds un meme conteneur
20
21
22/************* PILabelX ************/
23#include <Xm/Label.h>
24
25
26/* --Methode-- */
27PILabelX::PILabelX(PIContainerGen *par, char *nom,
28 int sx, int sy, int px, int py)
29: PILabelGen(par, nom, sx, sy, px, py)
30{
31Arg warg[3];
32int n = 0;
33CreateXtWdg(nom, xmLabelWidgetClass, NULL, sx, sy, px, py);
34SetBorderWidth(0);
35XtSetArg(warg[n], XmNrecomputeSize, FALSE); n++;
36XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
37XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
38XtSetValues(XtWdg(), warg, n);
39Manage();
40}
41
42/* --Methode-- */
43PILabelX::~PILabelX()
44{}
45
46
47/************* PIButtonX ************/
48#include <Xm/PushB.h>
49#include <Xm/ArrowB.h>
50
51// Fonctions privees (CallBack)
52static void button_action(Widget w, XtPointer *usd, XtPointer *calld);
53static void button_press(Widget w, XtPointer *usd, XmAnyCallbackStruct *calld);
54
55/* Nouvelle-Fonction */
56void button_action(Widget , XtPointer *usd, XtPointer *)
57{
58PIButtonX *pib;
59pib = (PIButtonX *) usd ;
60pib->Send(pib->Msg(),PIMsg_Click,NULL);
61return;
62}
63
64/* Nouvelle-Fonction */
65void button_press(Widget, XtPointer *usd, XmAnyCallbackStruct *calld)
66{
67PIButtonX *pib;
68pib = (PIButtonX *) usd ;
69pib->Send(pib->Msg(),PIMsg_Press,NULL);
70pib->myevt = *(calld->event);
71pib->myevt.type = pib->myevt.xbutton.type = ButtonRelease;
72pib->myevt.xbutton.serial += 10;
73PIXSetLastEventTimeSerial(calld->event->xbutton.time, calld->event->xbutton.serial);
74
75return;
76}
77
78
79/* --Methode-- */
80PIButtonX::PIButtonX(PIContainerGen *par, char *nom, PIMessage msg,
81 int sx, int sy, int px, int py, PIBtnSign bsgn)
82: PIButtonGen(par, nom, msg, sx, sy, px, py, bsgn)
83{
84
85Arg warg[6];
86int n = 0;
87
88XtSetArg(warg[n],XmNhighlightThickness, 0); n++;
89XtSetArg(warg[n], XmNrecomputeSize, FALSE); n++;
90XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
91XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
92
93if (bsgn == PIBtn_Label)
94 CreateXtWdg(nom, xmPushButtonWidgetClass, NULL, sx, sy, px, py);
95else
96 {
97 CreateXtWdg(nom, xmArrowButtonWidgetClass, NULL, sx, sy, px, py);
98 switch (bsgn)
99 {
100 case PIBtn_ArrowUp :
101 XtSetArg(warg[n], XmNarrowDirection, XmARROW_UP); n++;
102 break;
103 case PIBtn_ArrowDown :
104 XtSetArg(warg[n], XmNarrowDirection, XmARROW_DOWN); n++;
105 break;
106 case PIBtn_ArrowLeft :
107 XtSetArg(warg[n], XmNarrowDirection, XmARROW_LEFT); n++;
108 break;
109 case PIBtn_ArrowRight :
110 XtSetArg(warg[n], XmNarrowDirection, XmARROW_RIGHT); n++;
111 break;
112 }
113 }
114
115XtSetValues(XtWdg(), warg, n);
116XtAddCallback(XtWdg(), XmNactivateCallback,
117 (XtCallbackProc)button_action, (XtPointer)this);
118
119mAcP = false;
120SetBorderWidth(0);
121Manage();
122}
123
124/* --Methode-- */
125PIButtonX::~PIButtonX()
126{}
127
128/* --Methode-- */
129void PIButtonX::ActivatePress(bool acp)
130{
131if (mAcP == acp) return;
132
133if (mAcP)
134 XtRemoveCallback(XtWdg(), XmNarmCallback,
135 (XtCallbackProc)button_press, (XtPointer)this);
136else
137 XtAddCallback(XtWdg(), XmNarmCallback,
138 (XtCallbackProc)button_press, (XtPointer)this);
139mAcP = acp;
140return;
141}
142
143/* --Methode-- */
144void PIButtonX::ReleaseButton()
145{
146XPutBackEvent(myevt.xbutton.display, &myevt);
147return;
148}
149
150
151/************* PITextX ************/
152#include <Xm/Text.h>
153
154/* --Methode-- */
155PITextX::PITextX(PIContainerGen *par, char *nom,
156 int sx, int sy, int px, int py)
157: PITextGen(par, nom, sx, sy, px, py)
158{
159Arg warg[3];
160int n = 0;
161CreateXtWdg(nom, xmTextWidgetClass, NULL, sx, sy, px, py);
162XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
163// XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
164XtSetValues(XtWdg(), warg, n);
165SetMutiLineMode(false);
166SetTextEditable(true);
167Manage();
168}
169
170/* --Methode-- */
171PITextX::~PITextX()
172{}
173
174/* --Methode-- */
175void PITextX::SetText(string const& s)
176{
177XmTextSetString(XtWdg(), (char *)s.c_str());
178return;
179}
180
181/* --Methode-- */
182string PITextX::GetText() const
183{
184char *txtb;
185txtb = XmTextGetString(XtWdg());
186string s(txtb);
187XtFree(txtb);
188return(s);
189}
190
191/* --Methode-- */
192void PITextX::SetMutiLineMode(bool mlm)
193{
194Arg warg[2];
195int n = 0;
196
197if (mlm)
198 { XtSetArg(warg[n],XmNeditMode, XmMULTI_LINE_EDIT); n++; }
199else
200 { XtSetArg(warg[n],XmNeditMode, XmSINGLE_LINE_EDIT); n++; }
201
202XtSetValues(XtWdg(), warg, n);
203return;
204}
205
206/* --Methode-- */
207void PITextX::SetTextEditable(bool te)
208{
209Arg warg[2];
210int n = 0;
211
212if (te)
213 { XtSetArg(warg[n],XmNeditable, TRUE); n++; }
214else
215 { XtSetArg(warg[n],XmNeditable, FALSE); n++; }
216
217XtSetValues(XtWdg(), warg, n);
218return;
219}
220
221// Fonction privee (CallBack)
222static void text_action(Widget w, XtPointer *usd, XtPointer *calld);
223
224void text_action(Widget, XtPointer *usd, XtPointer *)
225{
226PIText *pit;
227
228pit = (PIText *) usd ;
229pit->Send(pit->Msg(), PIMsg_DataChanged, NULL);
230}
231
232
233/* --Methode-- */
234void PITextX::SetMsg(PIMessage msg)
235{
236
237if (Msg() && !msg)
238 XtRemoveCallback(XtWdg(), XmNactivateCallback,
239 (XtCallbackProc)text_action, (XtPointer)this);
240if (!Msg() && msg)
241 XtAddCallback(XtWdg(), XmNactivateCallback,
242 (XtCallbackProc)text_action, (XtPointer)this);
243
244PIWdg::SetMsg(msg);
245}
246
247
248/************* PICheckBoxX ************/
249#include <Xm/ToggleB.h>
250
251// Fonction prive (CallBack)
252static void toggb_action(Widget w, XtPointer *usd, XmToggleButtonCallbackStruct* calld);
253
254// Variable globale d'etat de checkbox pour Send(...)
255static bool toggb_state = false;
256
257/* Nouvelle-Fonction */
258void toggb_action(Widget , XtPointer *usd, XmToggleButtonCallbackStruct* calld)
259{
260PICheckBoxX *picb;
261picb = (PICheckBoxX *) usd ;
262if (calld->set == True) picb->mSt = true;
263else picb->mSt = false;
264toggb_state = picb->mSt;
265picb->Send(picb->Msg(), PIMsg_DataChanged, (void *)(&toggb_state));
266return;
267}
268
269/* --Methode-- */
270PICheckBoxX::PICheckBoxX(PIContainerGen *par, char *nom, PIMessage msg,
271 int sx, int sy, int px, int py)
272: PICheckBoxGen(par, nom, msg, sx, sy, px, py)
273{
274CreateXtWdg(nom, xmToggleButtonWidgetClass, NULL, sx, sy, px, py);
275XtAddCallback(XtWdg(), XmNvalueChangedCallback,
276 (XtCallbackProc) toggb_action, (XtPointer)this);
277Arg warg[4];
278int n = 0;
279XtSetArg(warg[n],XmNhighlightThickness, 0); n++;
280XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
281XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
282XtSetValues(XtWdg(), warg, n);
283SetState(false);
284Manage();
285}
286
287
288/* --Methode-- */
289PICheckBoxX::~PICheckBoxX()
290{}
291
292
293/* --Methode-- */
294void PICheckBoxX::SetState(bool st)
295{
296Arg warg[2];
297mSt = st;
298if (st) XtSetArg(warg[0],XmNset, True);
299else XtSetArg(warg[0],XmNset, False);
300XtSetValues(XtWdg(), warg, 1);
301return;
302}
303
304/* --Methode-- */
305bool PICheckBoxX::GetState()
306{
307return(mSt);
308}
309
310
311/************* PIScaleX ************/
312#include <Xm/Scale.h>
313
314// Fonction prive (CallBack)
315static void scale_action(Widget w, XtPointer *usd,
316 XmScaleCallbackStruct *calld);
317// Variable globale pour contenir valeur de Scale a l'appel de Send;
318static int scale_value=0;
319
320void scale_action(Widget, XtPointer *usd,
321 XmScaleCallbackStruct *calld)
322{
323PIScale *pis;
324
325pis = (PIScale *) usd ;
326pis->CBSetVal(calld->value);
327scale_value = calld->value;
328pis->Send(pis->Msg(), PIMsg_DataChanged, (void *)(&scale_value));
329return;
330}
331
332/* --Methode-- */
333PIScaleX::PIScaleX(PIContainerGen *par, char *nom, PIMessage msg,
334 int dir, int sx, int sy, int px, int py)
335: PIScaleGen(par, nom, msg, dir, sx, sy, px, py)
336{
337int n=0;
338Arg warg[8];
339XtSetArg(warg[n], XmNshowValue, TRUE); n++;
340XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
341XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
342if (dir == kSDirLtoR) {
343 XtSetArg(warg[n], XmNorientation, XmHORIZONTAL); n++;
344 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++;
345 }
346else if (dir == kSDirRtoL) {
347 XtSetArg(warg[n], XmNorientation, XmHORIZONTAL); n++;
348 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_LEFT); n++;
349 }
350else if (dir == kSDirDownUp) {
351 XtSetArg(warg[n], XmNorientation, XmVERTICAL); n++;
352 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_TOP); n++;
353 }
354else { // kSDirUpDown
355 XtSetArg(warg[n], XmNorientation, XmVERTICAL); n++;
356 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_BOTTOM); n++;
357 }
358// Il ne faut pas attribuer une valeur a XmNscaleWidth et XmNscaleHeight
359// Elles sont calculees automatiquement et repondent alors correctement aux resize
360// (Il faut laisser donc leur valeur par defaut=0) Reza 28/10/98
361// XtSetArg(warg[n], XmNscaleWidth, sx); n++;
362// XtSetArg(warg[n], XmNscaleHeight, sy); n++;
363// XtSetArg(warg[n], XmNstringDirection, XmSTRING_DIRECTION_R_TO_L); n++;
364CreateXtWdg(nom, xmScaleWidgetClass, NULL, sx, sy, px, py, warg, n);
365
366SetMinMax(1, 100);
367SetValue(1);
368
369XtAddCallback(XtWdg(), XmNvalueChangedCallback,
370 (XtCallbackProc) scale_action, (XtPointer)this);
371Manage();
372}
373
374/* --Methode-- */
375PIScaleX::~PIScaleX()
376{}
377
378/* --Methode-- */
379void PIScaleX::SetMinMax(int min, int max)
380{
381if (min >= max) max = min+10;
382if (mVal < min) mVal = min;
383if (mVal > max) mVal = max;
384int n=0;
385Arg warg[3];
386XtSetArg(warg[n], XmNminimum, min); n++;
387XtSetArg(warg[n], XmNmaximum, max); n++;
388XtSetArg(warg[n], XmNvalue, mVal); n++;
389XtSetValues(XtWdg(), warg, n);
390mMin = min; mMax = max;
391return;
392}
393
394/* --Methode-- */
395void PIScaleX::GetMinMax(int& min, int& max)
396{
397min = mMin; max = mMax;
398return;
399}
400
401/* --Methode-- */
402void PIScaleX::SetValue(int val)
403{
404int n=0;
405if (val < mMin) val = mMin;
406if (val > mMax) val = mMax;
407Arg warg[2];
408XtSetArg(warg[n], XmNvalue, val); n++;
409XtSetValues(this->sdw, warg, n);
410return;
411}
412
413/* --Methode-- */
414int PIScaleX::GetValue()
415{
416int val;
417int n=0;
418Arg warg[2];
419XtSetArg(warg[n], XmNvalue, &val); n++;
420XtGetValues(this->sdw, warg, n);
421mVal = val;
422return(mVal);
423}
424
425/* --Methode-- */
426void PIScaleX::CBSetVal(int val)
427{
428mVal = val;
429return;
430}
431
432
433
434/************* PIScrollBarX ************/
435
436#include <Xm/ScrollBar.h>
437
438// Fonction prive (CallBack)
439static void scrollbar_action(Widget w, XtPointer *usd,
440 XmScrollBarCallbackStruct *calld);
441static void scrollbar_drag(Widget w, XtPointer *usd,
442 XmScrollBarCallbackStruct *calld);
443// Variable globale pour contenir valeur de Scale a l'appel de Send;
444static int scroll_value=0;
445
446void scrollbar_action(Widget, XtPointer *usd,
447 XmScrollBarCallbackStruct *calld)
448{
449PIScrollBar *pis;
450
451pis = (PIScrollBar *) usd ;
452pis->CBSetVal(calld->value);
453pis->Send(pis->Msg(), PIMsg_DataChanged, (void *)(&scroll_value));
454return;
455}
456
457void scrollbar_drag(Widget, XtPointer *usd,
458 XmScrollBarCallbackStruct *calld)
459{
460PIScrollBar *pis;
461
462pis = (PIScrollBar *) usd ;
463pis->CBSetVal(calld->value);
464pis->Send(pis->Msg(), PIMsg_Drag, (void *)(&scroll_value));
465return;
466}
467
468/* --Methode-- */
469PIScrollBarX::PIScrollBarX(PIContainerGen *par, char *nom, PIMessage msg,
470 int dir, int sx, int sy, int px, int py)
471: PIScrollBarGen(par, nom, msg, dir, sx, sy, px, py)
472{
473int n=0;
474Arg warg[6];
475
476XtSetArg(warg[n],XmNnavigationType,XmNONE); n++;
477XtSetArg(warg[n],XmNtraversalOn,FALSE); n++;
478if (dir == kSDirLtoR) {
479 XtSetArg(warg[n], XmNorientation, XmHORIZONTAL); n++;
480 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++;
481 }
482else if (dir == kSDirRtoL) {
483 XtSetArg(warg[n], XmNorientation, XmHORIZONTAL); n++;
484 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_LEFT); n++;
485 }
486else if (dir == kSDirDownUp) {
487 XtSetArg(warg[n], XmNorientation, XmVERTICAL); n++;
488 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_TOP); n++;
489 }
490else { // kSDirUpDown
491 XtSetArg(warg[n], XmNorientation, XmVERTICAL); n++;
492 XtSetArg(warg[n], XmNprocessingDirection, XmMAX_ON_BOTTOM); n++;
493 }
494CreateXtWdg(nom, xmScrollBarWidgetClass, NULL, sx, sy, px, py, warg, n);
495mAcD = false;
496mVal = -1;
497mMin = mMax = 0;
498mSz = 10;
499mDir = dir;
500SetMinMax(1, 100);
501SetSlSize(10);
502SetValue(1);
503XtAddCallback(XtWdg(), XmNvalueChangedCallback,
504 (XtCallbackProc) scrollbar_action, (XtPointer)this);
505Manage();
506}
507
508/* --Methode-- */
509PIScrollBarX::~PIScrollBarX()
510{}
511
512
513/* --Methode-- */
514void PIScrollBarX::ActivateDrag(bool acd)
515{
516if (mAcD == acd) return;
517
518if (mAcD)
519 XtRemoveCallback(XtWdg(), XmNdragCallback,
520 (XtCallbackProc)scrollbar_drag, (XtPointer)this);
521else
522 XtAddCallback(XtWdg(), XmNdragCallback,
523 (XtCallbackProc)scrollbar_drag, (XtPointer)this);
524mAcD = acd;
525return;
526}
527
528/* --Methode-- */
529void PIScrollBarX::SetMinMax(int min, int max)
530{
531if (min >= max) max = min+100;
532if (mVal < min) mVal = min;
533if (mVal > max-mSz) mVal = max-mSz;
534//DBG printf("PIScrollBarX::SetMinMax(%d %d ) %d Sz=%d \n", min, max, mVal, mSz);
535int n=0;
536Arg warg[3];
537XtSetArg(warg[n], XmNminimum, min); n++;
538XtSetArg(warg[n], XmNmaximum, max); n++;
539XtSetArg(warg[n], XmNvalue, mVal); n++;
540XtSetValues(XtWdg(), warg, n);
541mMin = min; mMax = max;
542//DBG printf("--OUT-OF-- PIScrollBarX::SetMinMax(%d %d ) %d Sz=%d \n", min, max, mVal, mSz);
543return;
544}
545
546/* --Methode-- */
547void PIScrollBarX::GetMinMax(int& min, int& max)
548{
549min = mMin; max = mMax;
550return;
551}
552
553/* --Methode-- */
554void PIScrollBarX::SetValue(int val)
555{
556int n=0;
557if (val < mMin) val = mMin;
558if (val > mMax-mSz) val = mMax-mSz;
559Arg warg[2];
560//DBG printf("PIScrollBarX::SetValue(%d -> %d) \n", val, val0);
561XtSetArg(warg[n], XmNvalue, val); n++;
562XtSetValues(this->sdw, warg, n);
563mVal = val;
564//DBG printf("--OUT-OF---PIScrollBarX::SetValue(%d -> %d) \n", val, val0);
565return;
566}
567
568/* --Methode-- */
569int PIScrollBarX::GetValue()
570{
571int val;
572int n=0;
573Arg warg[2];
574XtSetArg(warg[n], XmNvalue, &val); n++;
575XtGetValues(this->sdw, warg, n);
576mVal = val;
577return(mVal);
578}
579
580/* --Methode-- */
581void PIScrollBarX::SetSlSize(int sz)
582{
583int n=0;
584Arg warg[4];
585int szl;
586
587szl = mMax-mMin;
588if (sz > szl) sz = szl;
589szl /= 100;
590if (szl < 1) szl = 1;
591if (sz < szl) sz = szl;
592szl = sz/10;
593if (szl < 1) szl = 1;
594//DBG printf("PIScrollBarX::SetSlSize(%d ) \n", sz);
595XtSetArg(warg[n], XmNsliderSize, sz); n++;
596XtSetArg(warg[n], XmNpageIncrement, sz); n++;
597XtSetArg(warg[n], XmNincrement, szl); n++;
598if (mVal < mMin) mVal = mMin;
599if (mVal > mMax-sz) mVal = mMax-sz;
600XtSetArg(warg[n], XmNvalue, mVal); n++;
601XtSetValues(this->sdw, warg, n);
602//DBG printf("---OUT-OF---PIScrollBarX::SetSlSize(%d ) -> mVal= %d (cv1,2=%d %d)\n", sz,mVal, cv1, cv2);
603mSz = sz;
604return;
605}
606
607/* --Methode-- */
608int PIScrollBarX::GetSlSize()
609{
610int sz;
611int n=0;
612Arg warg[2];
613XtSetArg(warg[n], XmNsliderSize, &sz); n++;
614XtGetValues(this->sdw, warg, n);
615mSz = sz;
616return(mSz);
617}
618
619
620/* --Methode-- */
621void PIScrollBarX::CBSetVal(int val)
622{
623mVal = val;
624scroll_value = mVal;
625//DBG printf("PIScrollBarX::CBSetVal(%d) %d -> %d \n", mDir, val, mVal);
626return;
627}
628
Note: See TracBrowser for help on using the repository browser.