Programmable real-time audio signal processing application
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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. }