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

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