Programmable real-time audio signal processing application
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmGrFltk.cpp 39KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546
  1. #include <FL/Fl.H>
  2. #include <FL/Fl_Group.H>
  3. #include <FL/Fl_Widget.H>
  4. #include <FL/Fl_Button.H>
  5. #include <FL/Fl_Output.H>
  6. #include <FL/Fl_Scrollbar.H>
  7. #include <FL/fl_draw.H>
  8. #include "cmPrefix.h"
  9. #include "cmGlobal.h"
  10. #include "cmFloatTypes.h"
  11. #include "cmRpt.h"
  12. #include "cmErr.h"
  13. #include "cmCtx.h"
  14. #include "cmMem.h"
  15. #include "cmMallocDebug.h"
  16. #include "cmGr.h"
  17. #include "cmGrDevCtx.h"
  18. #include "cmGrPage.h"
  19. #include "cmGrPlot.h"
  20. #include "cmGrFltk.h"
  21. //--------------------------------------------------------------------------------------
  22. cmGrDevDrvFltk::cmGrDevDrvFltk()
  23. : _fltk_pen_width(0), _fltk_pen_style(0), _fltk_font_size(0),
  24. _w(0), _h(0)
  25. {
  26. d.create = create;
  27. d.destroy = destroy;
  28. d.begin_draw = begin_draw;
  29. d.end_draw = end_draw;
  30. d.draw = draw;
  31. d.set_color = set_color;
  32. d.get_color = get_color;
  33. d.set_font_family = set_font_family;
  34. d.get_font_family = get_font_family;
  35. d.set_font_style = set_font_style;
  36. d.get_font_style = get_font_style;
  37. d.set_font_size = set_font_size;
  38. d.get_font_size = get_font_size;
  39. d.set_pen_style = set_pen_style;
  40. d.get_pen_style = get_pen_style;
  41. d.set_pen_width = set_pen_width;
  42. d.get_pen_width = get_pen_width;
  43. d.draw_line = draw_line;
  44. d.draw_rect = draw_rect;
  45. d.fill_rect = fill_rect;
  46. d.draw_ellipse = draw_ellipse;
  47. d.fill_ellipse = fill_ellipse;
  48. d.draw_diamond = draw_diamond;
  49. d.fill_diamond = fill_diamond;
  50. d.draw_triangle = draw_triangle;
  51. d.fill_triangle = fill_triangle;
  52. d.draw_text = draw_text;
  53. d.draw_text_rot = draw_text_rot;
  54. d.measure_text = measure_text;
  55. d.read_image = read_image;
  56. d.draw_image = draw_image;
  57. }
  58. bool cmGrDevDrvFltk::create( void* user, unsigned ww, unsigned hh )
  59. {
  60. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  61. if( ww && hh && p->_w != ww && p->_h != hh )
  62. {
  63. destroy(user);
  64. p->_w = ww;
  65. p->_h = hh;
  66. //printf("creat: 0x%x w:%i h:%i\n",(unsigned)p->fl_os,p->w,p->h);
  67. }
  68. return true;
  69. }
  70. void cmGrDevDrvFltk::destroy( void* user )
  71. {
  72. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  73. p->_w = 0;
  74. p->_h = 0;
  75. }
  76. void cmGrDevDrvFltk::begin_draw( void* arg )
  77. {
  78. }
  79. void cmGrDevDrvFltk::end_draw( void* arg )
  80. {
  81. }
  82. void cmGrDevDrvFltk::draw( void* arg, int x, int y )
  83. {
  84. }
  85. void cmGrDevDrvFltk::set_color( void* user, const cmGrColor_t c )
  86. {
  87. Fl_Color color = fl_rgb_color(cmGrColorToR(c),cmGrColorToG(c),cmGrColorToB(c));
  88. fl_color(color);
  89. }
  90. void cmGrDevDrvFltk::get_color( void* user, cmGrColor_t* c )
  91. {
  92. Fl_Color color = fl_color();
  93. *c = cmGrRgbToColor( ((color>>24)&0x000000ff),((color>>16)&0x000000ff),((color>>8)&0x000000ff));
  94. }
  95. void cmGrDevDrvFltk::_get_font_family_style( unsigned* fontId, unsigned* style)
  96. {
  97. switch( fl_font() )
  98. {
  99. case FL_HELVETICA: *fontId = kHelveticaFfGrId; *style = kNormalFsGrFl; break;
  100. case FL_HELVETICA_BOLD: *fontId = kHelveticaFfGrId; *style = kBoldFsGrFl; break;
  101. case FL_HELVETICA_ITALIC: *fontId = kHelveticaFfGrId; *style = kItalicFsGrFl; break;
  102. case FL_HELVETICA_BOLD_ITALIC: *fontId = kHelveticaFfGrId; *style = kBoldFsGrFl | kItalicFsGrFl; break;
  103. case FL_TIMES: *fontId = kTimesFfGrId; *style = kNormalFsGrFl; break;
  104. case FL_TIMES_BOLD: *fontId = kTimesFfGrId; *style = kBoldFsGrFl; break;
  105. case FL_TIMES_ITALIC: *fontId = kTimesFfGrId; *style = kItalicFsGrFl; break;
  106. case FL_TIMES_BOLD_ITALIC: *fontId = kTimesFfGrId; *style = kBoldFsGrFl | kItalicFsGrFl; break;
  107. case FL_COURIER: *fontId = kCourierFfGrId; *style = kNormalFsGrFl; break;
  108. case FL_COURIER_BOLD: *fontId = kCourierFfGrId; *style = kBoldFsGrFl; break;
  109. case FL_COURIER_ITALIC: *fontId = kCourierFfGrId; *style = kItalicFsGrFl; break;
  110. case FL_COURIER_BOLD_ITALIC: *fontId = kCourierFfGrId; *style = kBoldFsGrFl | kItalicFsGrFl; break;
  111. default:
  112. { assert(0); }
  113. }
  114. }
  115. void cmGrDevDrvFltk::_set_font_family_style( void* user, unsigned fontId, unsigned style)
  116. {
  117. switch( fontId )
  118. {
  119. case kHelveticaFfGrId:
  120. switch( style )
  121. {
  122. case kNormalFsGrFl: fontId = FL_HELVETICA; break;
  123. case kBoldFsGrFl: fontId = FL_HELVETICA_BOLD; break;
  124. case kItalicFsGrFl: fontId = FL_HELVETICA_ITALIC; break;
  125. case kItalicFsGrFl + kBoldFsGrFl: fontId = FL_HELVETICA_BOLD_ITALIC; break;
  126. default:
  127. { assert(0); }
  128. }
  129. break;
  130. case kTimesFfGrId:
  131. switch( style )
  132. {
  133. case kNormalFsGrFl: fontId = FL_TIMES; break;
  134. case kBoldFsGrFl: fontId = FL_TIMES_BOLD; break;
  135. case kItalicFsGrFl: fontId = FL_TIMES_ITALIC; break;
  136. case kItalicFsGrFl + kBoldFsGrFl: fontId = FL_TIMES_BOLD_ITALIC; break;
  137. default:
  138. { assert(0); }
  139. }
  140. break;
  141. case kCourierFfGrId:
  142. switch( style )
  143. {
  144. case kNormalFsGrFl: fontId = FL_COURIER; break;
  145. case kBoldFsGrFl: fontId = FL_COURIER_BOLD; break;
  146. case kItalicFsGrFl: fontId = FL_COURIER_ITALIC; break;
  147. case kItalicFsGrFl + kBoldFsGrFl: fontId = FL_COURIER_BOLD_ITALIC; break;
  148. default:
  149. { assert(0); }
  150. }
  151. break;
  152. default:
  153. { assert(0); }
  154. }
  155. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  156. fl_font( fontId, p->_fltk_font_size );
  157. }
  158. void cmGrDevDrvFltk::set_font_family( void* user, unsigned fontId )
  159. { _set_font_family_style( user, fontId, get_font_style(user) ); }
  160. unsigned cmGrDevDrvFltk::get_font_family( void* user )
  161. {
  162. unsigned fontId=0, style=0;
  163. _get_font_family_style(&fontId,&style);
  164. return fontId;
  165. }
  166. void cmGrDevDrvFltk::set_font_style( void* user, unsigned style )
  167. { _set_font_family_style( user, get_font_family(user), style); }
  168. unsigned cmGrDevDrvFltk::get_font_style( void* user )
  169. {
  170. unsigned fontId=0, style=0;
  171. _get_font_family_style(&fontId,&style);
  172. return style;
  173. }
  174. void cmGrDevDrvFltk::set_font_size( void* user, unsigned size )
  175. {
  176. unsigned fontId=0, style=0;
  177. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  178. _get_font_family_style(&fontId,&style);
  179. p->_fltk_font_size = size;
  180. _set_font_family_style(user,fontId,style);
  181. }
  182. unsigned cmGrDevDrvFltk::get_font_size( void* user )
  183. { return fl_size(); }
  184. void cmGrDevDrvFltk::set_pen_style( void* user, unsigned style )
  185. {
  186. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  187. switch( style )
  188. {
  189. case kSolidLsGrFl: style = FL_SOLID; break;
  190. case kDashLsGrFl: style = FL_DASH; break;
  191. case kDotLsGrFl: style = FL_DOT; break;
  192. default:
  193. { assert(0); }
  194. }
  195. p->_fltk_pen_style = style;
  196. fl_line_style( p->_fltk_pen_style, p->_fltk_pen_width );
  197. }
  198. unsigned cmGrDevDrvFltk::get_pen_style( void* user )
  199. {
  200. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  201. unsigned style = kSolidLsGrFl;
  202. switch( p->_fltk_pen_style )
  203. {
  204. case FL_SOLID: style = kSolidLsGrFl; break;
  205. case FL_DASH: style = kDashLsGrFl; break;
  206. case FL_DOT: style = kDotLsGrFl; break;
  207. default:
  208. { assert(0); }
  209. }
  210. return style;
  211. }
  212. void cmGrDevDrvFltk::set_pen_width( void* user, unsigned w )
  213. {
  214. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  215. p->_fltk_pen_width = w;
  216. fl_line_style( p->_fltk_pen_style, p->_fltk_pen_width );
  217. }
  218. unsigned cmGrDevDrvFltk::get_pen_width( void* user )
  219. {
  220. cmGrDevDrvFltk* p = (cmGrDevDrvFltk*)user;
  221. return p->_fltk_pen_width;
  222. }
  223. void cmGrDevDrvFltk::draw_line( void* user, int x0, int y0, int x1, int y1 )
  224. { fl_line(x0,y0,x1,y1); }
  225. void cmGrDevDrvFltk::draw_rect( void* user, int x0, int y0, unsigned w, unsigned h )
  226. { fl_rect(x0,y0,w,h); }
  227. void cmGrDevDrvFltk::fill_rect( void* user, int x0, int y0, unsigned w, unsigned h )
  228. { fl_rectf(x0,y0,w,h); }
  229. void cmGrDevDrvFltk::draw_ellipse( void* user, int x0, int y0, unsigned w, unsigned h )
  230. {
  231. fl_arc(x0,y0,w,h,0,360);
  232. }
  233. void cmGrDevDrvFltk::fill_ellipse( void* user, int x0, int y0, unsigned w, unsigned h )
  234. {
  235. fl_pie(x0,y0,w,h,0,360);
  236. }
  237. void cmGrDevDrvFltk::draw_diamond( void* user, int x0, int y0, unsigned w, unsigned h )
  238. {
  239. }
  240. void cmGrDevDrvFltk::fill_diamond( void* user, int x0, int y0, unsigned w, unsigned h )
  241. {
  242. }
  243. void cmGrDevDrvFltk::draw_triangle( void* user, int x0, int y0, unsigned w, unsigned h, unsigned dirFlag )
  244. {
  245. }
  246. void cmGrDevDrvFltk::fill_triangle( void* user, int x0, int y0, unsigned w, unsigned h, unsigned dirFlag )
  247. {
  248. }
  249. void cmGrDevDrvFltk::draw_text( void* user, const char* text, int x, int y )
  250. {
  251. int y0 = y - fl_descent();
  252. fl_draw(text,x,y0);
  253. /*
  254. Fl_Color c = fl_color();
  255. fl_color(FL_RED);
  256. fl_point(x,y);
  257. fl_point(x,y0);
  258. fl_point(x,y - fl_height());
  259. fl_color(c);
  260. */
  261. }
  262. void cmGrDevDrvFltk::draw_text_rot( void* user, const char* text, int x, int y, int angle )
  263. {
  264. fl_draw(angle,text,strlen(text),x,y);
  265. Fl_Color c = fl_color();
  266. fl_color(FL_RED);
  267. fl_point(x,y);
  268. fl_color(c);
  269. }
  270. void cmGrDevDrvFltk::measure_text( void* user, const char* text, unsigned* w, unsigned* h )
  271. {
  272. int ww;
  273. int hh;
  274. fl_measure(text,ww,hh);
  275. *w = ww;
  276. *h = hh;
  277. }
  278. void cmGrDevDrvFltk::read_image( void* user, unsigned char* p, int x, int y, unsigned w, unsigned h )
  279. {
  280. fl_read_image(p,x,y,w,h,false);
  281. }
  282. void cmGrDevDrvFltk::draw_image( void* user, const unsigned char* p, int x, int y, unsigned w, unsigned h )
  283. {
  284. fl_draw_image(p,x,y,w,h,3,0);
  285. }
  286. bool cmGrDevDrvFltk::is_initialized() const
  287. { return true; }
  288. //--------------------------------------------------------------------------------------
  289. void testKey()
  290. {
  291. int k = Fl::event_key();
  292. printf("code:0x%x text:%s ",k,Fl::event_text());
  293. bool fl = Fl::event_state() & FL_NUM_LOCK;
  294. if( fl )
  295. printf("KP ");
  296. // if this key has an ASCII printable symbol
  297. if( kSpaceGrId <= k && k <= kTildeGrId )
  298. {
  299. char ch = Fl::event_text()[0];
  300. // correct for an apparent bug in FLTK
  301. // which get's the case of the characters
  302. // wrong.
  303. if( ('A' <= ch && ch <= 'Z') )
  304. ch = tolower(ch);
  305. else
  306. if(('a' <= ch && ch <= 'z' ) )
  307. ch = toupper(ch);
  308. printf("Known: ASCII '%c'.\n", ch);
  309. return;
  310. }
  311. const char* str = NULL;
  312. if( str == NULL )
  313. switch( k )
  314. {
  315. case 0xffaa: str="KP_Mult"; break;
  316. case 0xffab: str="KP_Plus"; break;
  317. case 0xffad: str="KP_Minus"; break;
  318. case 0xffae: str="KP_DecPt"; break;
  319. case 0xffaf: str="KP_Div"; break;
  320. case 0xffb1: str="KP_1"; break;
  321. case 0xffb2: str="KP_2"; break;
  322. case 0xffb3: str="KP_3"; break;
  323. case 0xffb4: str="KP_4"; break;
  324. case 0xffb5: str="KP_5"; break;
  325. case 0xffb6: str="KP_6"; break;
  326. case 0xffb7: str="KP_7"; break;
  327. case 0xffb8: str="KP_8"; break;
  328. case 0xffb9: str="KP_9"; break;
  329. case 0xffbd: str="KP_Equal"; break;
  330. case 0xffbe: str="F1"; break;
  331. case 0xffbf: str="F2"; break;
  332. case 0xffc0: str="F3"; break;
  333. case 0xffc1: str="F4"; break;
  334. case 0xffc2: str="F5"; break;
  335. case 0xffc3: str="F6"; break;
  336. case 0xffc4: str="F7"; break;
  337. case 0xffc5: str="F8"; break;
  338. case 0xffc6: str="F9"; break;
  339. case 0xffc7: str="F10"; break;
  340. case 0xffc8: str="F11"; break;
  341. case 0xffc9: str="F12"; break;
  342. case FL_Home: str="Home"; break;
  343. case FL_Page_Up: str="PgUp"; break;
  344. case FL_Delete: str="Del"; break;
  345. case FL_End: str="End"; break;
  346. case FL_Page_Down: str="PgDn"; break;
  347. case FL_Left: str="Left"; break;
  348. case FL_Up: str="Up"; break;
  349. case FL_Right: str="Right"; break;
  350. case FL_Down: str="Down"; break;
  351. case FL_Insert: str="Insert"; break;
  352. case FL_Escape: str="Esc"; break;
  353. case FL_BackSpace: str="BS"; break;
  354. case FL_Tab: str="Tab"; break;
  355. case FL_Enter: str="Enter"; break;
  356. case FL_Print: str="Print"; break;
  357. case FL_Scroll_Lock: str="ScrLck";break;
  358. case FL_Pause: str="Pause"; break;
  359. case FL_Shift_L: str="L-Shift"; break;
  360. case FL_Shift_R: str="R-Shift"; break;
  361. case FL_Control_L: str="L_Ctrl"; break;
  362. case FL_Control_R: str="R_Ctrl"; break;
  363. case FL_Caps_Lock: str="CapLck"; break;
  364. case FL_Alt_L: str="L_Alt"; break;
  365. case FL_Alt_R: str="R_Alt"; break;
  366. case FL_Meta_L: str="L_Super"; break;
  367. case FL_Meta_R: str="R_Super"; break;
  368. case FL_Menu: str="Menu"; break;
  369. case FL_Num_Lock: str="NumLock"; break;
  370. case FL_KP_Enter: str="KP_Enter"; break;
  371. }
  372. printf("%s\n", (str==NULL ? "<Unknown>" : str));
  373. }
  374. cmGrViewFltk::keyMap_t cmGrViewFltk::_keymap[] =
  375. {
  376. { 0, 0, 0, kInvalidKeyCodeGrId },
  377. { 1, 0, 0, kInvalidKeyCodeGrId },
  378. { 2, 0, 0, kInvalidKeyCodeGrId },
  379. { 3, 0, 0, kInvalidKeyCodeGrId },
  380. { 4, 0, 0, kInvalidKeyCodeGrId },
  381. { 5, FL_Home, 0, kHomeGrId},
  382. { 6, FL_Page_Up, 0, kPageUpGrId},
  383. { 7, FL_End, 0, kEndGrId},
  384. { 8, FL_BackSpace, 8, kBackSpaceGrId },
  385. { 9, FL_Tab, 9, kTabGrId },
  386. { 10, FL_Page_Down, 0, kPageDownGrId},
  387. { 11, FL_Left, 0, kLeftGrId},
  388. { 12, FL_Up, 0, kUpGrId},
  389. { 13, FL_Enter, 13, kEnterGrId },
  390. { 14, FL_Right, 0, kRightGrId},
  391. { 15, FL_Down, 0, kDownGrId},
  392. { 16, FL_Insert, 0, kInsertGrId},
  393. { 17, FL_Print, 0, kPrintGrId},
  394. { 18, FL_Scroll_Lock, 0, kScrollLockGrId},
  395. { 19, FL_Pause, 0, kPauseGrId},
  396. { 20, FL_Menu, 0, kMenuGrId},
  397. { 21, FL_Shift_L, 0, kLShiftGrId},
  398. { 22, FL_Shift_R, 0, kRShiftGrId},
  399. { 23, FL_Control_L, 0, kLCtrlGrId},
  400. { 24, FL_Control_R, 0, kRCtrlGrId},
  401. { 25, FL_Alt_L, 0, kLAltGrId},
  402. { 26, FL_Alt_R, 0, kRAltGrId},
  403. { 27, FL_Escape, 27, kEscapeGrId },
  404. { 28, FL_Meta_L, 0, kLSuperGrId},
  405. { 29, FL_Meta_R, 0, kRSuperGrId},
  406. { 30, FL_Num_Lock, 0, kNumLockGrId},
  407. { 31, FL_Caps_Lock, 0, kCapsLockGrId},
  408. { 32, 32, 32, kSpaceGrId },
  409. { 33, 33, 33, kExclMarkGrId },
  410. { 34, 34, 34, kDQuoteGrId },
  411. { 35, 35, 35, kPoundGrId },
  412. { 36, 36, 36, kDollarGrId },
  413. { 37, 37, 37, kPercentGrId },
  414. { 38, 38, 38, kAmpersandGrId },
  415. { 39, 39, 39, kApostropheGrId },
  416. { 40, 40, 40, kLParenGrId },
  417. { 41, 41, 41, kRParenGrId },
  418. { 42, 42, 42, kAsteriskGrId },
  419. { 43, 43, 43, kPlusGrId },
  420. { 44, 44, 44, kCommaGrId },
  421. { 45, 45, 45, kHyphenGrId },
  422. { 46, 46, 46, kPeriodGrId },
  423. { 47, 47, 47, kForwardSlashGrId },
  424. { 48, 48, 48, k0GrId },
  425. { 49, 49, 49, k1GrId },
  426. { 50, 50, 50, k2GrId },
  427. { 51, 51, 51, k3GrId },
  428. { 52, 52, 52, k4GrId },
  429. { 53, 53, 53, k5GrId },
  430. { 54, 54, 54, k6GrId },
  431. { 55, 55, 55, k7GrId },
  432. { 56, 56, 56, k8GrId },
  433. { 57, 57, 57, k9GrId },
  434. { 58, 58, 58, kColonGrId },
  435. { 59, 59, 59, kSemiColonGrId },
  436. { 60, 60, 60, kLesserGrId },
  437. { 61, 61, 61, kEqualGrId },
  438. { 62, 62, 62, kGreaterGrId },
  439. { 63, 63, 63, kQMarkGrId },
  440. { 64, 64, 64, kAtGrId },
  441. { 65, 65, 65, kA_GrId },
  442. { 66, 66, 66, kB_GrId },
  443. { 67, 67, 67, kC_GrId },
  444. { 68, 68, 68, kD_GrId },
  445. { 69, 69, 69, kE_GrId },
  446. { 70, 70, 70, kF_GrId },
  447. { 71, 71, 71, kG_GrId },
  448. { 72, 72, 72, kH_GrId },
  449. { 73, 73, 73, kI_GrId },
  450. { 74, 74, 74, kJ_GrId },
  451. { 75, 75, 75, kK_GrId },
  452. { 76, 76, 76, kL_GrId },
  453. { 77, 77, 77, kM_GrId },
  454. { 78, 78, 78, kN_GrId },
  455. { 79, 79, 79, kO_GrId },
  456. { 80, 80, 80, kP_GrId },
  457. { 81, 81, 81, kQ_GrId },
  458. { 82, 82, 82, kR_GrId },
  459. { 83, 83, 83, kS_GrId },
  460. { 84, 84, 84, kT_GrId },
  461. { 85, 85, 85, kU_GrId },
  462. { 86, 86, 86, kV_GrId },
  463. { 87, 87, 87, kW_GrId },
  464. { 88, 88, 88, kX_GrId },
  465. { 89, 89, 89, kY_GrId },
  466. { 90, 90, 90, kZ_GrId },
  467. { 91, 91, 91, kLBracketGrId },
  468. { 92, 92, 92, kBackSlashGrId },
  469. { 93, 93, 93, kRBracketGrId },
  470. { 94, 94, 94, kCaretGrId },
  471. { 95, 95, 95, kUnderScoreGrId },
  472. { 96, 96, 96, kAccentGrId },
  473. { 97, 97, 97, ka_GrId },
  474. { 98, 98, 98, kb_GrId },
  475. { 99, 99, 99, kc_GrId },
  476. { 100, 100, 100, kd_GrId },
  477. { 101, 101, 101, ke_GrId },
  478. { 102, 102, 102, kf_GrId },
  479. { 103, 103, 103, kg_GrId },
  480. { 104, 104, 104, kh_GrId },
  481. { 105, 105, 105, ki_GrId },
  482. { 106, 106, 106, kj_GrId },
  483. { 107, 107, 107, kk_GrId },
  484. { 108, 108, 108, kl_GrId },
  485. { 109, 109, 109, km_GrId },
  486. { 110, 110, 110, kn_GrId },
  487. { 111, 111, 111, ko_GrId },
  488. { 112, 112, 112, kp_GrId },
  489. { 113, 113, 113, kq_GrId },
  490. { 114, 114, 114, kr_GrId },
  491. { 115, 115, 115, ks_GrId },
  492. { 116, 116, 116, kt_GrId },
  493. { 117, 117, 117, ku_GrId },
  494. { 118, 118, 118, kv_GrId },
  495. { 119, 119, 119, kw_GrId },
  496. { 120, 120, 120, kx_GrId },
  497. { 121, 121, 121, ky_GrId },
  498. { 122, 122, 122, kz_GrId },
  499. { 123, 123, 123, kLBraceGrId },
  500. { 124, 124, 124, kPipeGrId },
  501. { 125, 125, 125, kRBraceGrId },
  502. { 126, 126, 126, kTildeGrId },
  503. { 127, FL_Delete, 127, kDeleteGrId },
  504. { 128, 0xffaa, 42, kNP_MultGrId },
  505. { 129, 0xffab, 43, kNP_PlusGrId },
  506. { 130, 0xffad, 45, kNP_MinusGrId },
  507. { 131, 0xffae, 46, kNP_DecPtGrId},
  508. { 132, 0xffaf, 47, kNP_DivGrId},
  509. { 133, 0xffb0, 48, kNP_0GrId},
  510. { 134, 0xffb1, 49, kNP_1GrId},
  511. { 135, 0xffb2, 50, kNP_2GrId},
  512. { 136, 0xffb3, 51, kNP_3GrId},
  513. { 137, 0xffb4, 52, kNP_4GrId},
  514. { 138, 0xffb5, 53, kNP_5GrId},
  515. { 139, 0xffb6, 54, kNP_6GrId},
  516. { 140, 0xffb7, 55, kNP_7GrId},
  517. { 141, 0xffb8, 56, kNP_8GrId},
  518. { 142, 0xffb9, 57, kNP_9GrId},
  519. { 143, 0xffbd, 61, kNP_EqualGrId},
  520. { 144, FL_KP_Enter, 13, kNP_EnterGrId},
  521. { 145, 0xffbe, 0, kFunc_1GrId},
  522. { 146, 0xffbf, 0, kFunc_2GrId},
  523. { 147, 0xffc0, 0, kFunc_3GrId},
  524. { 148, 0xffc1, 0, kFunc_4GrId},
  525. { 149, 0xffc2, 0, kFunc_5GrId},
  526. { 150, 0xffc3, 0, kFunc_6GrId},
  527. { 151, 0xffc4, 0, kFunc_7GrId},
  528. { 152, 0xffc5, 0, kFunc_8GrId},
  529. { 153, 0xffc6, 0, kFunc_9GrId},
  530. { 154, 0xffc7, 0, kFunc_10GrId},
  531. { 155, 0xffc8, 0, kFunc_11GrId},
  532. { 156, 0xffc9, 0, kFunc_12GrId},
  533. { 157, 0x1008ff03, 0, kBrightUpGrId},
  534. { 158, 0x1008ff02, 0, kBrightDnGrId},
  535. { 159, 0xef16, 0, kAudio_PrevGrId},
  536. { 160, 0xef14, 0, kAudio_PlayGrId},
  537. { 161, 0xef17, 0, kAudio_NextGrId},
  538. { 162, 0xef12, 0, kAudio_MuteGrId},
  539. { 163, 0xef11, 0, kAudio_DnGrId },
  540. { 164, 0xef13, 0, kAudio_UpGrId },
  541. { 165, 0x1008ff2c, 0, kEjectGrId },
  542. { cmInvalidIdx, cmInvalidId, 0, kInvalidKeyCodeGrId }
  543. };
  544. const cmGrViewFltk::keyMap_t* cmGrViewFltk::_getGrKeyCode( unsigned fltk_code )
  545. {
  546. if( 32 <= fltk_code && fltk_code <= 126 )
  547. return _keymap + fltk_code;
  548. unsigned i;
  549. for(i=0; i<32; ++i)
  550. if( _keymap[i].fltk_code == fltk_code )
  551. return _keymap + i;
  552. for(i=127; _keymap[i].idx != cmInvalidIdx; ++i)
  553. if( _keymap[i].fltk_code == fltk_code )
  554. return _keymap + i;
  555. return NULL;
  556. }
  557. cmGrViewFltk::cmGrViewFltk( cmCtx_t* ctx, cmGrH_t grH, int x, int y, int w, int h )
  558. : Fl_Widget(x,y,w,h),_grH(grH),_dcH(cmGrDcNullHandle)
  559. {
  560. cmGrDevCtxCreate( ctx, &_dcH, &_dd.d, &_dd, x, y, w, h );
  561. }
  562. cmGrViewFltk::~cmGrViewFltk()
  563. { cmGrDevCtxDestroy(&_dcH); }
  564. unsigned eventModKeyFlags()
  565. {
  566. unsigned flags = 0;
  567. if( Fl::event_alt() )
  568. flags |= kAltKeyGrFl;
  569. if( Fl::event_ctrl() )
  570. flags |= kCtlKeyGrFl;
  571. if( Fl::event_shift() )
  572. flags |= kShiftKeyGrFl;
  573. switch( Fl::event_button() )
  574. {
  575. case FL_LEFT_MOUSE: flags |= kMsLBtnGrFl; break;
  576. case FL_RIGHT_MOUSE: flags |= kMsRBtnGrFl; break;
  577. case FL_MIDDLE_MOUSE: flags |= kMsCBtnGrFl; break;
  578. }
  579. return flags;
  580. }
  581. cmGrKeyCodeId_t cmGrViewFltk::_eventKeyCode()
  582. {
  583. const keyMap_t* kmp;
  584. if(( kmp = _getGrKeyCode(Fl::event_key())) != NULL )
  585. return kmp->gr_code;
  586. return kInvalidKeyCodeGrId;
  587. }
  588. int cmGrViewFltk::handle(int event)
  589. {
  590. bool fl = false;
  591. switch(event)
  592. {
  593. case FL_ENTER: // req'd to receive FL_MOVE event
  594. break;
  595. case FL_LEAVE:
  596. break;
  597. case FL_PUSH:
  598. fl = cmGrEvent(_grH, kMsDownGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  599. break;
  600. case FL_RELEASE:
  601. fl = cmGrEvent(_grH, kMsUpGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  602. break;
  603. case FL_DRAG:
  604. fl = cmGrEvent(_grH, kMsDragGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  605. break;
  606. case FL_MOVE:
  607. fl = cmGrEvent(_grH, kMsMoveGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  608. break;
  609. case FL_FOCUS:
  610. Fl::focus(this);
  611. break;
  612. case FL_UNFOCUS:
  613. break;
  614. case FL_KEYDOWN:
  615. fl = cmGrEvent(_grH, kKeyDnGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  616. break;
  617. case FL_KEYUP:
  618. fl = cmGrEvent(_grH, kKeyUpGrFl | eventModKeyFlags(), _eventKeyCode(), Fl::event_x(),Fl::event_y());
  619. break;
  620. default:
  621. return Fl_Widget::handle(event);
  622. }
  623. if( fl )
  624. redraw();
  625. return 1;
  626. }
  627. void cmGrViewFltk::resize(int x, int y, int w, int h )
  628. {
  629. cmGrPExt_t pext0,pext1;
  630. cmGrPExtSet(&pext0,this->x(),this->y(),this->w(),this->h());
  631. cmGrPExtSet(&pext1,x,y,w,h);
  632. if( cmGrPExtIsEqual(&pext0,&pext1)==false )
  633. {
  634. // must call base to make size change
  635. Fl_Widget::resize(x,y,w,h);
  636. //printf("resize: %i %i %i %i : %i %i %i %i\n",x,y,w,h,this->x(),this->y(),this->w(),this->h());
  637. if( cmGrIsValid( _grH ) )
  638. {
  639. //cmGrDevCtxResize( _dcH, x, y, w, h );
  640. cmGrSetPhysExtents( _grH, x, y, w, h);
  641. }
  642. }
  643. }
  644. void cmGrViewFltk::setGrH( cmGrH_t grH )
  645. { _grH=grH;}
  646. void cmGrViewFltk::draw()
  647. {
  648. /*
  649. fl_line_style(FL_SOLID,1,NULL);
  650. fl_color(FL_RED);
  651. cmGrPExt_t pext;
  652. cmGrPhysExtents(_grH, &pext );
  653. fl_rect(pext.loc.x,pext.loc.y,pext.sz.w,pext.sz.h);
  654. fl_line(x(),y(),x()+w()-1,y()+h()-1);
  655. fl_line(x()+w()-1,y(),x(),y()+h()-1);
  656. */
  657. fl_push_clip(x(),y(),w(),h());
  658. fl_color(FL_BACKGROUND_COLOR);
  659. fl_rectf(x(),y(),w(),h());
  660. if( cmGrIsValid(_grH) )
  661. {
  662. cmGrPExt_t pext0,pext1;
  663. //cmGrPExtSet(&pext0,this->x(),this->y(),this->w(),this->h());
  664. cmGrPhysExtents(_grH, &pext0 );
  665. cmGrDevCtxSize( _dcH, &pext1 );
  666. if( cmGrPExtIsEqual(&pext0,&pext1)==false )
  667. //cmGrDevCtxResize(_dcH, this->x(), this->y(), this->w(),this->h() );
  668. cmGrDevCtxResize(_dcH, cmGrPExtL(&pext0), cmGrPExtT(&pext0), cmGrPExtW(&pext0), cmGrPExtH(&pext0) );
  669. cmGrDevCtxBeginDraw(_dcH);
  670. cmGrDraw(_grH,_dcH);
  671. cmGrDevCtxEndDraw(_dcH);
  672. cmGrDevCtxDraw(_dcH);
  673. }
  674. fl_pop_clip();
  675. }
  676. //--------------------------------------------------------------------------------------
  677. cmGrPageFltk::cmGrPageFltk( cmCtx_t* ctx, cmGrPgH_t pgH, int x, int y, int w, int h )
  678. : Fl_Group(x,y,w,h),_ctx(ctx),_pgH(pgH),_dcH(cmGrDcNullHandle),
  679. _vwV(NULL),_vwN(0)
  680. {
  681. end();
  682. resizable(NULL);
  683. cmGrDevCtxCreate( ctx, &_dcH, &_dd.d, &_dd, x, y, w, h );
  684. }
  685. cmGrPageFltk::~cmGrPageFltk()
  686. {
  687. if( _vwV != NULL )
  688. {
  689. int i, n = _vwN;
  690. for(i=0; i<n; ++i)
  691. delete _vwV[i];
  692. cmMemFree(_vwV);
  693. _vwV = NULL;
  694. }
  695. cmGrDevCtxDestroy(&_dcH);
  696. }
  697. void cmGrPageFltk::createView( unsigned vwIdx )
  698. {
  699. cmGrVwH_t vwH = cmGrPageViewHandle( _pgH, vwIdx );
  700. cmGrH_t grH = cmGrViewGrHandle( vwH );
  701. cmGrPExt_t pext;
  702. assert( cmGrViewIsValid(vwH) );
  703. cmGrViewPExt( vwH, &pext );
  704. if( vwIdx >= _vwN )
  705. {
  706. assert( vwIdx == _vwN );
  707. _vwV = cmMemResizeP(cmGrViewFltk*,_vwV,++_vwN);
  708. _vwV[ vwIdx ] = new cmGrViewFltk( _ctx, grH, pext.loc.x, pext.loc.y, pext.sz.w, pext.sz.h );
  709. add(_vwV[vwIdx]);
  710. }
  711. else
  712. {
  713. _vwV[vwIdx]->setGrH(grH);
  714. cmGrSetPhysExtentsE(grH,&pext);
  715. }
  716. }
  717. void cmGrPageFltk::destroyView( unsigned vwIdx )
  718. {
  719. assert( vwIdx < _vwN );
  720. delete _vwV[vwIdx];
  721. _vwV = NULL;
  722. }
  723. cmGrDcH_t cmGrPageFltk::devCtxHandle()
  724. { return _dcH; }
  725. cmGrViewFltk* cmGrPageFltk::viewWidget( unsigned vwIdx )
  726. {
  727. assert( vwIdx < _vwN );
  728. if( vwIdx < _vwN )
  729. return _vwV[vwIdx];
  730. return NULL;
  731. }
  732. void cmGrPageFltk::resize(int x, int y, int w, int h )
  733. {
  734. cmGrPExt_t pext;
  735. x+=1;
  736. y+=1;
  737. w-=2;
  738. h-=2;
  739. Fl_Group::resize(x,y,w,h);
  740. // We would like to call cmGrPageLayout() here but it is not
  741. // possible because we cannot guarantee that we can get
  742. // an offscreen FLTK drawing context which needed to measure the
  743. // size of text strings given a paricular font. Instead we defer
  744. // to the draw() routine where we know the drawing context is
  745. // valid.
  746. cmGrPExtSet(&pext,x,y,w,h);
  747. cmGrPageResize(_pgH,&pext,_dcH);
  748. }
  749. void cmGrPageFltk::draw()
  750. {
  751. fl_color(FL_BACKGROUND_COLOR);
  752. fl_rectf(x(),y(),w(),h());
  753. // if the dc is valid and the layout changed
  754. if( cmGrDevCtxIsValid(_dcH))
  755. {
  756. if( cmGrPageLayout(_pgH,_dcH) )
  757. {
  758. cmGrDevCtxResize( _dcH, x(), y(), w(), h() );
  759. unsigned vwIdx;
  760. for(vwIdx=0; vwIdx<_vwN; ++vwIdx)
  761. {
  762. cmGrVwH_t vwH = cmGrPageViewHandle( _pgH, vwIdx );
  763. cmGrViewFltk* vp = _vwV[vwIdx];
  764. cmGrPExt_t p0ext,p1ext;
  765. assert( cmGrViewIsValid(vwH) );
  766. // get the size of the view
  767. cmGrViewPExt( vwH, &p0ext );
  768. // get the size of the FLTK widget containing the view
  769. cmGrPExtSet(&p1ext,vp->x(),vp->y(),vp->w(),vp->h());
  770. // if the views are different sizes then
  771. if( !cmGrPExtIsEqual(&p0ext,&p1ext) )
  772. vp->resize(p0ext.loc.x,p0ext.loc.y,p0ext.sz.w,p0ext.sz.h);
  773. }
  774. }
  775. cmGrDevCtxBeginDraw(_dcH);
  776. cmGrPageDraw(_pgH,_dcH);
  777. cmGrDevCtxEndDraw(_dcH);
  778. cmGrDevCtxDraw(_dcH);
  779. }
  780. draw_children();
  781. }
  782. //--------------------------------------------------------------------------------------
  783. cmGrPlotFltk::cmGrPlotFltk( cmCtx_t* ctx, int x, int y, int w, int h, int rn, int cn, int textSz )
  784. : Fl_Group(x,y,w,h,NULL),
  785. _pgH(cmGrPgNullHandle),_plH(cmGrPlNullHandle),
  786. _pg(NULL),_ctl_grp(NULL),_usr_grp(NULL),_status(NULL),
  787. _hsb(NULL),_vsb(NULL),
  788. _gx(NULL),_gy(NULL),_lx(NULL),_ly(NULL),
  789. _s0x(NULL),_s0y(NULL),_s1x(NULL),_s1y(NULL),_sdx(NULL),_sdy(NULL),
  790. _textSz(textSz)
  791. {
  792. end();
  793. // create the platform indendent page
  794. cmGrPageCreate(ctx,&_pgH,_s_cmGrCallback,this);
  795. // create the ctl panel
  796. add(_ctl_grp = _create_ctls());
  797. // create the scroll bars
  798. _create_scroll_bars();
  799. // create the FLTK page
  800. add(_pg = new cmGrPageFltk(ctx,_pgH,0,0,10,10));
  801. // turn off automatic resizing - all resizing is done
  802. // explicitly in _layout().
  803. resizable(NULL);
  804. // create the plot object manager
  805. cmGrPlotCreate(ctx,&_plH);
  806. cmGrPlotSetCb(_plH,_s_cmGrPlotObjCbFunc,this );
  807. initViews(rn,cn);
  808. // layout the window
  809. _layout();
  810. }
  811. cmGrPlotFltk::~cmGrPlotFltk()
  812. {
  813. cmGrPageDestroy(&_pgH);
  814. cmGrPlotDestroy(&_plH);
  815. }
  816. void cmGrPlotFltk::resize(int x, int y, int w, int h )
  817. {
  818. Fl_Group::resize(x,y,w,h);
  819. _layout();
  820. }
  821. cmGrPgH_t cmGrPlotFltk::pageHandle() { return _pgH; }
  822. cmGrPlH_t cmGrPlotFltk::plotHandle() { return _plH; }
  823. cmGrDcH_t cmGrPlotFltk::dcHandle() { return _pg->devCtxHandle(); }
  824. void cmGrPlotFltk::initViews( int rn, int cn )
  825. {
  826. if( cmGrPageIsValid(_pgH) && _pg != NULL )
  827. {
  828. cmGrPExt_t pext;
  829. cmGrPExtSet(&pext,_pg->x(),_pg->y(),_pg->w(),_pg->h());
  830. cmGrPageInit( _pgH, &pext, rn, cn, _pg->devCtxHandle() );
  831. }
  832. }
  833. void cmGrPlotFltk::setStatusText( const cmChar_t* text )
  834. { _status->value(text); }
  835. void cmGrPlotFltk::on_button( unsigned id )
  836. {
  837. cmGrH_t grH;
  838. if( !cmGrIsValid(grH = _getFocusedView()) )
  839. return;
  840. switch( id )
  841. {
  842. case kShowAllId:
  843. cmGrZoom( grH, kShowAllGrFl | kXAxisGrFl | kYAxisGrFl );
  844. break;
  845. case kZoomInId:
  846. cmGrZoom( grH, kZoomInGrFl | kXAxisGrFl | kYAxisGrFl | kSelectGrFl );
  847. break;
  848. case kZoomInXId:
  849. cmGrZoom( grH, kZoomInGrFl | kXAxisGrFl | kSelectGrFl );
  850. break;
  851. case kZoomInYId:
  852. cmGrZoom( grH, kZoomInGrFl | kYAxisGrFl | kSelectGrFl );
  853. break;
  854. case kZoomOutId:
  855. cmGrZoom( grH, kXAxisGrFl | kYAxisGrFl | kSelectGrFl );
  856. break;
  857. case kZoomOutXId:
  858. cmGrZoom( grH, kXAxisGrFl | kSelectGrFl );
  859. break;
  860. case kZoomOutYId:
  861. cmGrZoom( grH, kYAxisGrFl | kSelectGrFl );
  862. break;
  863. case kReportId:
  864. cmGrReport( grH, NULL );
  865. break;
  866. }
  867. }
  868. void cmGrPlotFltk::on_scroll( Fl_Scrollbar* sb, unsigned id )
  869. {
  870. bool fl = false;
  871. cmGrH_t grH = cmGrNullHandle;
  872. if( cmGrIsValid(grH = _getFocusedView()) )
  873. {
  874. switch( id )
  875. {
  876. case kHScrollId:
  877. fl = cmGrSetScrollH( grH, sb->value() );
  878. break;
  879. case kVScrollId:
  880. fl = cmGrSetScrollV( grH, (sb->maximum() - sb->slider_size()) + 1 - sb->value() );
  881. break;
  882. }
  883. }
  884. if( fl )
  885. {
  886. _pg->redraw();
  887. }
  888. }
  889. void cmGrPlotFltk::on_view_create( unsigned viewIdx )
  890. {
  891. if( _pg != NULL )
  892. _pg->createView(viewIdx);
  893. }
  894. void cmGrPlotFltk::on_view_destroy( unsigned viewIdx )
  895. {
  896. if( _pg != NULL )
  897. _pg->destroyView(viewIdx);
  898. }
  899. void cmGrPlotFltk::rpt_local_pt( cmGrH_t grH )
  900. {
  901. int bufCharCnt = 31;
  902. cmChar_t buf[ bufCharCnt ];
  903. cmGrVwH_t vwH = cmGrPageViewHandle( _pgH, cmGrId(grH) );
  904. const cmChar_t* cp = NULL ;
  905. if( _lx != NULL )
  906. {
  907. _lx->value( cp = cmGrViewValue( vwH, kLocalX_VwId, buf, bufCharCnt));
  908. _lx->redraw();
  909. }
  910. if( _ly != NULL )
  911. {
  912. _ly->value( cp = cmGrViewValue( vwH, kLocalY_VwId, buf, bufCharCnt));
  913. _ly->redraw();
  914. }
  915. }
  916. void cmGrPlotFltk::rpt_global_pt( cmGrH_t grH )
  917. {
  918. int bufCharCnt = 31;
  919. cmChar_t buf[ bufCharCnt ];
  920. cmGrVwH_t vwH = cmGrPageViewHandle( _pgH, cmGrId(grH) );
  921. if( _gx != NULL )
  922. {
  923. _gx->value( cmGrViewValue( vwH, kGlobalX_VwId, buf, bufCharCnt));
  924. _gx->redraw();
  925. }
  926. if( _gy != NULL )
  927. {
  928. _gy->value( cmGrViewValue( vwH, kGlobalY_VwId, buf, bufCharCnt));
  929. _gy->redraw();
  930. }
  931. }
  932. void cmGrPlotFltk::on_phys_change( cmGrH_t grH )
  933. {
  934. cmGrViewFltk* vwp = _pg->viewWidget( cmGrId( grH ) );
  935. if( vwp != NULL )
  936. {
  937. cmGrPExt_t pext;
  938. cmGrPhysExtents(grH,&pext);
  939. vwp->resize( pext.loc.x, pext.loc.y, pext.sz.w, pext.sz.h );
  940. }
  941. }
  942. void cmGrPlotFltk::on_view_change(cmGrH_t grH)
  943. {
  944. unsigned vwIdx = cmGrId(grH);
  945. cmGrViewFltk* vwp;
  946. if( cmGrViewHasFocus( cmGrPageGrHandleToView(_pgH,grH) ) )
  947. {
  948. cmGrPSz_t tot,vis,max;
  949. cmGrPPt_t pos;
  950. _showHideScrollBars();
  951. cmGrScrollExtents(grH,&tot,&vis,&max,&pos);
  952. _hsb->value(pos.x,vis.w,0,tot.w);
  953. pos.y = (tot.h - vis.h) + 1 - pos.y; // invert vert slider
  954. _vsb->value(pos.y,vis.h,0,tot.h);
  955. }
  956. // update the hash labels
  957. if((vwp = _pg->viewWidget( vwIdx )) != NULL )
  958. vwp->redraw();
  959. }
  960. void cmGrPlotFltk::on_select_change(cmGrH_t grH)
  961. {
  962. cmGrViewFltk* vwp;
  963. unsigned vwIdx = cmGrId(grH);
  964. if( cmGrViewHasFocus( cmGrPageGrHandleToView(_pgH,grH) ) )
  965. {
  966. int bufCharCnt = 31;
  967. cmChar_t buf[ bufCharCnt ];
  968. cmGrVwH_t vwH = cmGrPageViewHandle( _pgH, vwIdx );
  969. _s0x->value(cmGrViewValue( vwH, kSelX0_VwId, buf, bufCharCnt)); _s0x->redraw();
  970. _s0y->value(cmGrViewValue( vwH, kSelY0_VwId, buf, bufCharCnt)); _s0y->redraw();
  971. _s1x->value(cmGrViewValue( vwH, kSelX1_VwId, buf, bufCharCnt)); _s1x->redraw();
  972. _s1y->value(cmGrViewValue( vwH, kSelY1_VwId, buf, bufCharCnt)); _s1y->redraw();
  973. _sdx->value(cmGrViewValue( vwH, kSelW_VwId, buf, bufCharCnt)); _sdx->redraw();
  974. _sdy->value(cmGrViewValue( vwH, kSelH_VwId, buf, bufCharCnt)); _sdy->redraw();
  975. }
  976. if((vwp = _pg->viewWidget( vwIdx )) != NULL )
  977. vwp->redraw();
  978. }
  979. void cmGrPlotFltk::on_focused_plot( cmGrH_t grH)
  980. {
  981. on_view_change(grH);
  982. redraw();
  983. }
  984. void cmGrPlotFltk::on_key_event( cmGrH_t grH, unsigned eventFlags, cmGrKeyCodeId_t keycode )
  985. {
  986. cmGrPlotKeyEvent( _plH, grH, eventFlags, keycode );
  987. }
  988. bool cmGrPlotFltk::on_plot_object( cmGrPlotCbArg_t* arg )
  989. { return true; }
  990. void cmGrPlotFltk::_layout()
  991. {
  992. // position the vertical scroll bar
  993. _vsb->position(x()+w()-_vsb->w(),y());
  994. _vsb->size(_vsb->w(),h()-_hsb->h());
  995. // position the horizontal scroll bar
  996. _hsb->position(x(),y()+h()-_hsb->h());
  997. _hsb->size(w()-_vsb->w(),_hsb->h());
  998. // position the ctl panel
  999. _ctl_grp->position(x(),_hsb->y()-_ctl_grp->h());
  1000. _ctl_grp->size(w()-_vsb->w(),_ctl_grp->h());
  1001. // position the user programmable group
  1002. _usr_grp->size(_ctl_grp->w()-_usr_grp->x()-1,_usr_grp->h());
  1003. // position the status ctl
  1004. _status->size(_ctl_grp->w()-_status->x()-1,_status->h());
  1005. // position the page
  1006. _pg->resize(x(),y(),w()-_vsb->w(),_ctl_grp->y()-y());
  1007. }
  1008. Fl_Group* cmGrPlotFltk::_create_ctls()
  1009. {
  1010. Fl_Boxtype outBoxFlags = FL_FLAT_BOX;
  1011. Fl_Group* grp = new Fl_Group(0,0,10,10);
  1012. grp->user_data(this);
  1013. grp->box(FL_FLAT_BOX);
  1014. grp->end();
  1015. int x0 = kVBord;
  1016. int y0 = kHBord;
  1017. int x1 =0;
  1018. int x = x0;
  1019. int y = y0;
  1020. Fl_Button* btn;
  1021. btn = new Fl_Button(x,y,kBtnW,kBtnH,"All");
  1022. btn->callback(_s_ctl_cb,kShowAllId);
  1023. btn->labelsize(_textSz);
  1024. grp->add(btn);
  1025. x += kBtnW+kVBord;
  1026. btn = new Fl_Button(x,y,kBtnW,kBtnH,"In");
  1027. btn->callback(_s_ctl_cb,kZoomInId);
  1028. btn->labelsize(_textSz);
  1029. grp->add(btn);
  1030. x += kBtnW+kVBord;
  1031. btn = new Fl_Button(x,y,kBtnW,kBtnH,"In X");
  1032. btn->callback(_s_ctl_cb,kZoomInXId);
  1033. btn->labelsize(_textSz);
  1034. grp->add(btn);
  1035. x += kBtnW+kVBord;
  1036. btn = new Fl_Button(x,y,kBtnW,kBtnH,"Out X");
  1037. btn->callback(_s_ctl_cb,kZoomOutXId);
  1038. btn->labelsize(_textSz);
  1039. grp->add(btn);
  1040. x += kBtnW+kLblW+kVBord;
  1041. _gx = new Fl_Output(x,y+1,kOutW,kBtnH-2,"gx");
  1042. _gx->box(outBoxFlags);
  1043. _gx->color(FL_LIGHT2);
  1044. _gx->labelsize(_textSz);
  1045. _gx->textsize(_textSz);
  1046. grp->add(_gx);
  1047. x += kOutW+kLblW+kVBord;
  1048. _lx = new Fl_Output(x,y+1,kOutW,kBtnH-2,"lx");
  1049. _lx->box(outBoxFlags);
  1050. _lx->color(FL_LIGHT2);
  1051. _lx->labelsize(_textSz);
  1052. _lx->textsize(_textSz);
  1053. grp->add(_lx);
  1054. x += kOutW+kLblW+kVBord;
  1055. _s0x = new Fl_Output(x,y+1,kOutW,kBtnH-2,"sx");
  1056. _s0x->box(outBoxFlags);
  1057. _s0x->color(FL_LIGHT2);
  1058. _s0x->labelsize(_textSz);
  1059. _s0x->textsize(_textSz);
  1060. grp->add(_s0x);
  1061. x += kOutW+kLblW+kVBord;
  1062. _s1x = new Fl_Output(x,y+1,kOutW,kBtnH-2,"sx");
  1063. _s1x->box(outBoxFlags);
  1064. _s1x->color(FL_LIGHT2);
  1065. _s1x->labelsize(_textSz);
  1066. _s1x->textsize(_textSz);
  1067. grp->add(_s1x);
  1068. x += kOutW+kLblW+kVBord;
  1069. _sdx = new Fl_Output(x,y+1,kOutW,kBtnH-2,"dsx");
  1070. _sdx->box(outBoxFlags);
  1071. _sdx->color(FL_LIGHT2);
  1072. _sdx->labelsize(_textSz);
  1073. _sdx->textsize(_textSz);
  1074. grp->add(_sdx);
  1075. x += kOutW+kVBord;
  1076. x1 = x;
  1077. x = x0;
  1078. y += kBtnH+kHBord;
  1079. btn = new Fl_Button(x,y,kBtnW,kBtnH,"Rpt");
  1080. btn->callback(_s_ctl_cb,kReportId);
  1081. btn->labelsize(_textSz);
  1082. grp->add(btn);
  1083. x += kBtnW+kVBord;
  1084. btn = new Fl_Button(x,y,kBtnW,kBtnH,"Out");
  1085. btn->callback(_s_ctl_cb,kZoomOutId);
  1086. btn->labelsize(_textSz);
  1087. grp->add(btn);
  1088. x += kBtnW+kVBord;
  1089. btn = new Fl_Button(x,y,kBtnW,kBtnH,"In Y");
  1090. btn->callback(_s_ctl_cb,kZoomInYId);
  1091. btn->labelsize(_textSz);
  1092. grp->add(btn);
  1093. x += kBtnW+kVBord;
  1094. btn = new Fl_Button(x,y,kBtnW,kBtnH,"Out Y");
  1095. btn->callback(_s_ctl_cb,kZoomOutYId);
  1096. btn->labelsize(_textSz);
  1097. grp->add(btn);
  1098. x += kBtnW+kLblW+kVBord;
  1099. _gy = new Fl_Output(x,y+1,kOutW,kBtnH-2,"gy");
  1100. _gy->box(outBoxFlags);
  1101. _gy->color(FL_LIGHT2);
  1102. _gy->labelsize(_textSz);
  1103. _gy->textsize(_textSz);
  1104. grp->add(_gy);
  1105. x += kOutW+kLblW+kVBord;
  1106. _ly = new Fl_Output(x,y+1,kOutW,kBtnH-2,"ly");
  1107. _ly->box(outBoxFlags);
  1108. _ly->color(FL_LIGHT2);
  1109. _ly->labelsize(_textSz);
  1110. _ly->textsize(_textSz);
  1111. grp->add(_ly);
  1112. x += kOutW+kLblW+kVBord;
  1113. _s0y = new Fl_Output(x,y+1,kOutW,kBtnH-2,"sy");
  1114. _s0y->box(outBoxFlags);
  1115. _s0y->color(FL_LIGHT2);
  1116. _s0y->labelsize(_textSz);
  1117. _s0y->textsize(_textSz);
  1118. grp->add(_s0y);
  1119. x += kOutW+kLblW+kVBord;
  1120. _s1y = new Fl_Output(x,y+1,kOutW,kBtnH-2,"sy");
  1121. _s1y->box(outBoxFlags);
  1122. _s1y->color(FL_LIGHT2);
  1123. _s1y->labelsize(_textSz);
  1124. _s1y->textsize(_textSz);
  1125. grp->add(_s1y);
  1126. x += kOutW+kLblW+kVBord;
  1127. _sdy = new Fl_Output(x,y+1,kOutW,kBtnH-2,"dsy");
  1128. _sdy->box(outBoxFlags);
  1129. _sdy->color(FL_LIGHT2);
  1130. _sdy->labelsize(_textSz);
  1131. _sdy->textsize(_textSz);
  1132. grp->add(_sdy);
  1133. x += kOutW+kVBord;
  1134. x1 = cmMax(x1,x);
  1135. x = x0;
  1136. y += kBtnH+kHBord;
  1137. _status = new Fl_Output(x,y+1,x1-x0,kBtnH-2);
  1138. _status->box(FL_FLAT_BOX);
  1139. _status->color(FL_LIGHT2);
  1140. _status->textsize(_textSz);
  1141. grp->add(_status);
  1142. _usr_grp = new Fl_Group(x1,y0,x1-x0,y-y0);
  1143. _usr_grp->end();
  1144. _usr_grp->box(FL_FLAT_BOX);
  1145. grp->add(_usr_grp);
  1146. x = x0;
  1147. y += kBtnH+kHBord;
  1148. grp->resizable(NULL);
  1149. grp->resize(grp->x(),grp->y(),x1-grp->x(),y-grp->y());
  1150. return grp;
  1151. }
  1152. void cmGrPlotFltk::_create_scroll_bars()
  1153. {
  1154. // vert scroll bar
  1155. _vsb = new Fl_Scrollbar(x()+w()-kScrD, y(), kScrD, h()-kScrD, NULL);
  1156. _vsb->type(FL_VERTICAL);
  1157. _vsb->callback(_s_ctl_cb,kVScrollId);
  1158. add(_vsb);
  1159. // horz scrollback
  1160. _hsb = new Fl_Scrollbar(x(),y()+h()-kScrD, w()-kScrD, kScrD, NULL);
  1161. _hsb->type(FL_HORIZONTAL);
  1162. _hsb->callback(_s_ctl_cb,kHScrollId);
  1163. add(_hsb);
  1164. _showHideScrollBars();
  1165. }
  1166. void cmGrPlotFltk::_showHideScrollBars()
  1167. {
  1168. bool hfl = true, vfl=true;
  1169. cmGrH_t grH;
  1170. if( cmGrIsValid(grH = _getFocusedView()) == false )
  1171. hfl = vfl = false;
  1172. else
  1173. {
  1174. cmGrPSz_t tot, vis;
  1175. cmGrScrollExtents(grH, &tot, &vis, NULL, NULL );
  1176. vfl = tot.h != vis.h;
  1177. hfl = tot.w != vis.w;
  1178. }
  1179. if( hfl != _hsb->visible() )
  1180. hfl ? _hsb->show() : _hsb->hide();
  1181. if( vfl != _vsb->visible() )
  1182. vfl ? _vsb->show() : _vsb->hide();
  1183. }
  1184. cmGrH_t cmGrPlotFltk::_getFocusedView()
  1185. {
  1186. cmGrVwH_t vwH = cmGrPageFocusedView(_pgH);
  1187. if( cmGrViewIsValid(vwH) == false )
  1188. return cmGrNullHandle;
  1189. return cmGrViewGrHandle( vwH );
  1190. }
  1191. void cmGrPlotFltk::_s_ctl_cb(Fl_Widget* wp, long id )
  1192. {
  1193. switch( id )
  1194. {
  1195. case kHScrollId:
  1196. case kVScrollId:
  1197. {
  1198. cmGrPlotFltk* p = static_cast<cmGrPlotFltk*>(wp->parent());
  1199. p->on_scroll( (Fl_Scrollbar*)wp, id );
  1200. }
  1201. break;
  1202. case kShowAllId:
  1203. case kReportId:
  1204. case kZoomInId:
  1205. case kZoomOutId:
  1206. case kZoomInXId:
  1207. case kZoomInYId:
  1208. case kZoomOutXId:
  1209. case kZoomOutYId:
  1210. {
  1211. cmGrPlotFltk* p = (cmGrPlotFltk*)wp->parent()->user_data();
  1212. p->on_button( id );
  1213. }
  1214. break;
  1215. }
  1216. }
  1217. void cmGrPlotFltk::_s_cmGrCallback( void* arg, cmGrH_t grH, cmGrCbId_t id, unsigned eventFlags, cmGrKeyCodeId_t keycode )
  1218. {
  1219. cmGrPlotFltk* p = (cmGrPlotFltk*)arg;
  1220. switch(id)
  1221. {
  1222. case kCreateCbGrId: p->on_view_create( cmGrId(grH)); break;
  1223. case kDestroyCbGrId: p->on_view_destroy(cmGrId(grH)); break;
  1224. case kLocalPtCbGrId: p->rpt_local_pt( grH ); break;
  1225. case kGlobalPtCbGrId: p->rpt_global_pt(grH ); break;
  1226. case kPhysExtCbGrId: p->on_phys_change( grH ); break;
  1227. case kViewExtCbGrId: p->on_view_change( grH ); break;
  1228. case kSelectExtCbGrId:p->on_select_change(grH); break;
  1229. case kFocusCbGrId: p->on_focused_plot(grH); break;
  1230. case kKeyUpCbGrId: p->on_key_event( grH, eventFlags, keycode ); break;
  1231. case kKeyDnCbGrId: p->on_key_event( grH, eventFlags, keycode ); break;
  1232. default:
  1233. { assert(0); }
  1234. }
  1235. }
  1236. bool cmGrPlotFltk::_s_cmGrPlotObjCbFunc( cmGrPlotCbArg_t* arg )
  1237. {
  1238. cmGrPlotFltk* p = (cmGrPlotFltk*)arg->cbArg;
  1239. return p->on_plot_object(arg);
  1240. }