fltkglue.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056
  1. //fltkglue.cpp
  2. #include <stdlib.h>
  3. #include <maxgui.mod/maxgui.mod/maxgui.h>
  4. #include <config.h>
  5. #include <maxgui_templates.h>
  6. #include <FL/Fl.H>
  7. #include <FL/gl.h>
  8. #include <FL/Fl_Window.H>
  9. #include <FL/Fl_Gl_Window.H>
  10. #include <FL/Fl_Tooltip.H>
  11. #include <FL/Fl_Box.H>
  12. #include <FL/Fl_Tiled_Image.H>
  13. #include <FL/Fl_Menu_Item.H>
  14. #include <FL/Fl_Menu_Bar.H>
  15. #include <FL/Fl_Menu_Window.H>
  16. #include <FL/Fl_Text_Editor.H>
  17. #include <FL/Fl_Text_Display.H>
  18. #include <FL/Fl_File_Chooser.H>
  19. #include <FLU/Flu_File_Chooser.h>
  20. #include <FLU/Flu_Simple_Group.h>
  21. #include <FL/Fl_Hold_Browser.H>
  22. #include <FL/Fl_Multi_Browser.H>
  23. #include <FL/Fl_Choice.H>
  24. #include <FL/Fl_Tabs.H>
  25. #include <FL/Fl_Pack.H>
  26. #include <FL/Fl_Secret_Input.H>
  27. #include <FL/Fl_Help_View.H>
  28. #include <FL/Fl_Round_Button.H>
  29. #include <FL/Fl_Color_Chooser.H>
  30. #include <FL/Fl_Progress.H>
  31. #include <FL/Fl_Slider.H>
  32. #include <FL/Fl_Scrollbar.H>
  33. #include <FL/Fl_Spinner.H>
  34. #include <FL/Fl_Toggle_Button.H>
  35. #include <FL/Fl_Input_Choice.H>
  36. #include <FLU/Flu_Tree_Browser.h>
  37. #include <FL/Flmm_Tabs.H>
  38. #include <FL/x.H>
  39. #if __linux
  40. #include <GL/glx.h>
  41. #define __usexpm 1
  42. #if __usexpm
  43. #include <X11/xpm.h>
  44. #endif
  45. #endif
  46. enum fltypes
  47. {
  48. FLWINDOW,FLMENUBAR,FLBUTTON,FLCHECKBUTTON,FLROUNDBUTTON,FLTOGGLEBUTTON,FLRADIOPUSHBUTTON,
  49. FLRETURNBUTTON,FLPANEL,FLGROUPPANEL,FLINPUT,FLPASSWORD,
  50. FLTABS,FLGROUP,FLPACK,FLBROWSER,FLMULTIBROWSER,FLCHOICE,
  51. FLTEXTEDITOR,FLTEXTDISPLAY,FLHELPVIEW,FLBOX,FLTOOLBAR,FLPROGBAR,FLSLIDER,FLSCROLLBAR,
  52. FLSPINNER,FLCANVAS,FLINPUTCHOICE,FLUTREEBROWSER,FLREPEATBUTTON
  53. };
  54. class Fl_AWindow;
  55. class Fl_Panel;
  56. class Fl_Canvas;
  57. class Fl_ATabs;
  58. // system
  59. const char *event_url = "none";
  60. char *redirect_url = 0; // init to null - markcw
  61. int eventid;
  62. const char *viewcallback(Fl_Widget *view, const char *uri)
  63. {
  64. free(redirect_url);
  65. redirect_url = 0;
  66. event_url = uri;
  67. view->do_callback();
  68. event_url = 0;
  69. return (const char *)redirect_url;
  70. }
  71. extern "C"
  72. {
  73. void flReset( void *display,int(*eventhandler)(int),int(*textfilter)(void*),int(*mousecallback)(Fl_Widget*,void*),int(*keycallback)(Fl_Widget*,void*));
  74. void flAddFd( int fd, int when, void (*cb)(int, void*), void* argument = 0){return Fl::add_fd( fd, when, (*cb), argument);}
  75. int flCountFonts();
  76. int flRun() {return Fl::run();}
  77. void flFlush() {Fl::check();} //Seb was here - we should use check() instead of flush()
  78. unsigned flGetColor( Fl_Color i ){return Fl::get_color( i );}
  79. int flHandle(void *evt) {
  80. #if __linux
  81. return fl_handle(*(XEvent*)evt);
  82. #endif
  83. }
  84. void flWait(int timeout)
  85. {
  86. if (timeout<0) Fl::wait(); else Fl::wait(.001*timeout);
  87. }
  88. const char *flFontName(Fl_Font i);
  89. int flFontSizes(int font,int *& size);
  90. const char *flFriendlyFontName(Fl_Font i);
  91. int flFriendlyFontAttributes(Fl_Font i);
  92. int flChooseColor(const char *title, uchar &r, uchar &g, uchar &b) {return fl_color_chooser(title,r,g,b);}
  93. void flSetBelowMouse(Fl_Widget* widget);
  94. // requesters
  95. int flRequest(const char *text,int flags);
  96. char *flRequestFile(const char * message,const char *pattern,const char *path,int save);
  97. char *flRequestDir(const char* message,const char *path,int relative);
  98. void flAddTimeout(double t,void(*callback)(void*),void *user);
  99. // widgets
  100. Fl_Widget *flWidget(int x,int y,int w,int h,char *name,int type);
  101. void flFreeWidget(Fl_Widget*widget);
  102. void flDelete(void* pointer);
  103. void flFreePtr(void* pointer);
  104. void* flUserData(Fl_Widget*widget);
  105. void flSetArea(Fl_Widget*widget,int x,int y,int w,int h);
  106. void flGetArea(Fl_Widget*widget,int *x,int *y,int *w,int *h);
  107. void flSetLabel(Fl_Widget*widget,char*label);
  108. void flSetLabelColor(Fl_Widget*widget, int r, int g, int b);
  109. void flSetLabelFont(Fl_Widget*widget,Fl_Font s);
  110. void flSetLabelSize(Fl_Widget*widget,Fl_Fontsize s);
  111. void flSetBox(Fl_Widget*widget,int boxtype,int redrawifneeded);
  112. void flSetLabelType(Fl_Widget*widget,Fl_Labeltype labeltype);
  113. const char *flGetLabel(Fl_Widget *widget);
  114. void flSetAlign(Fl_Widget*widget,int aligntype);
  115. int flAlign(Fl_Widget*widget);
  116. void flSetColor(Fl_Widget*widget,int r,int g,int b);
  117. void flRemoveColor(Fl_Widget*widget);
  118. void flSetFocus(Fl_Widget*widget);
  119. void *flGetFocus();
  120. void flSetWhen(Fl_Widget*,Fl_When);
  121. Fl_When flGetWhen(Fl_Widget*);
  122. void *flGetUser(Fl_Widget*);
  123. void flSetShow(Fl_Widget*widget,int truefalse);
  124. void flSetCallback(Fl_Widget*,void(*callback)(Fl_Widget*,void*),void *user);
  125. void flSetToolTip(Fl_Widget*widget, char* tip);
  126. void flSetActive(Fl_Widget*widget,int truefalse);
  127. Fl_Window* flWidgetWindow(Fl_Widget* widget);
  128. Fl_Widget* flPushed();
  129. void flSetPushed(Fl_Widget*widget);
  130. void flRedraw(Fl_Widget*widget);
  131. int flWidth(Fl_Widget*widget);
  132. int flHeight(Fl_Widget*widget);
  133. int flVisible(Fl_Widget*widget);
  134. int flChanged(Fl_Widget*widget);
  135. void flClearChanged(Fl_Widget*widget);
  136. void flSetWindowLabel(Fl_Window*window,char*label);
  137. void flSetWindowIcon(Fl_Window*window, char** icon);
  138. void flClearBorder(Fl_Window*window);
  139. void flShowWindow(Fl_Window*widget,int falsetrueiconize);
  140. void flDestroyWindow(Fl_Window*widget);
  141. void flSetMinWindowSize(Fl_AWindow*window,int w,int h);
  142. void flSetMaxWindowSize(Fl_AWindow*window,int w,int h);
  143. void flSetAcceptsFiles(Fl_AWindow*window, int enable );
  144. void flSetNonModal(Fl_AWindow*window);
  145. void flSetModal(Fl_AWindow*window);
  146. void flBegin(Fl_Group*group);
  147. void flEnd(Fl_Group*group);
  148. void flAddToGroup(Fl_Group*group,Fl_Widget*widget);
  149. void flRemoveFromGroup(Fl_Group*group,Fl_Widget*widget);
  150. void flSetMenu(Fl_Menu_ *,void *menu);
  151. void *flCreateMenu(int n,void(*callback)(Fl_Widget*,void*));
  152. void flSetMenuItem(Fl_Menu_Item* menu,int item,char *name,int shortcut,void *user,int flags, Fl_Font fonthandle, Fl_Fontsize fontsize);
  153. void *flPopupMenu(Fl_Menu_Item *menuitem,void *n);
  154. void flSelectTab(Fl_Tabs*,Fl_Widget*);
  155. int flGetTabPanel(Fl_Tabs *tab);
  156. void *flGetTabPanelForEvent(Fl_ATabs *tab);
  157. void flSetInputChoice(Fl_Input_Choice*,int value);
  158. void *flGetInputChoiceTextWidget(Fl_Input_Choice*);
  159. void *flGetInputChoiceMenuWidget(Fl_Input_Choice*);
  160. void flSetChoice(Fl_Choice*,int value);
  161. int flGetChoice(Fl_Choice*);
  162. void flSetButton(Fl_Button*,bool value);
  163. int flGetButton(Fl_Button*);
  164. void flSetButtonKey(Fl_Button*,int key);
  165. void flSetInput(Fl_Input*,char*value);
  166. const char *flGetInput(Fl_Input*);
  167. void flActivateInput(Fl_Input*);
  168. void flSetInputFont(Fl_Input*input,Fl_Font s);
  169. void flSetInputSize(Fl_Input*input,Fl_Fontsize s);
  170. void flClearBrowser(Fl_Browser*);
  171. void flAddBrowser(Fl_Browser*,const char *label,void *obj, Fl_Image* icon);
  172. void flInsertBrowser(Fl_Browser*,int index,const char *label,void *obj, Fl_Image* icon);
  173. void flShowBrowser(Fl_Browser*,int line,int show);
  174. void flSelectBrowser(Fl_Hold_Browser*,int line);
  175. void flMultiBrowserSelect(Fl_Multi_Browser *browse,int line,int select);
  176. int flMultiBrowserSelected(Fl_Multi_Browser *browse,int line);
  177. int flBrowserValue(Fl_Hold_Browser*);
  178. void *flBrowserData(Fl_Hold_Browser*,int line);
  179. const char *flBrowserItem(Fl_Hold_Browser*,int line);
  180. void flSetBrowserItem(Fl_Hold_Browser*,int line,char *text,void *obj, Fl_Image* icon);
  181. void flRemoveBrowserItem(Fl_Hold_Browser*,int line);
  182. void flSetBrowserTextColor(Fl_Hold_Browser *browse,int r,int g,int b);
  183. void flSetBrowserTextFont(Fl_Hold_Browser *browse,Fl_Font s);
  184. void flSetBrowserTextSize(Fl_Hold_Browser *browse,Fl_Fontsize s);
  185. int flBrowserCount(Fl_Hold_Browser *browse);
  186. void flCharPosXY(Fl_Text_Display *textdisplay, int charpos, int *x, int *y);
  187. int flLinePos(Fl_Text_Display *textdisplay,int line);
  188. int flLineStart(Fl_Text_Display *textdisplay,int pos);
  189. int flLineCount(Fl_Text_Display *textdisplay,int pos);
  190. int flTextLength(Fl_Text_Display *textdisplay);
  191. void flSetWrapMode(Fl_Text_Display *textdisplay, int mode, int col);
  192. void flAddText(Fl_Text_Display *textdisplay,char *text);
  193. void flReplaceText(Fl_Text_Display *textdisplay,int start,int count,char *text);
  194. void flSelectText(Fl_Text_Display *textdisplay,int start,int count);
  195. void flShowPosition(Fl_Text_Display *textdisplay);
  196. void flSetText(Fl_Text_Display *textdisplay,char *text);
  197. char *flGetText(Fl_Text_Display *textdisplay,int start,int count);
  198. void flRedrawText(Fl_Text_Display *textdisplay,int start,int count);
  199. void flSetEditTextColor(Fl_Text_Display *textdisplay,int r,int g,int b);
  200. void flSetTextFont(Fl_Text_Display *textdisplay,Fl_Font s);
  201. void flSetTextSize(Fl_Text_Display *textdisplay,Fl_Fontsize s);
  202. void flSetTextCallback(Fl_Text_Display *textdisplay,void(*callback)(int,int,int,int,const char*,void*),void *user);
  203. void flSetTextTabs(Fl_Text_Display *textdisplay,int tabs);
  204. void flActivateText(Fl_Text_Display *textdisplay);
  205. int flGetCursorPos(Fl_Text_Display *textdisplay);
  206. int flGetSelectionLen(Fl_Text_Display *textdisplay);
  207. int flGetTextStyleChar(Fl_Text_Display *textdisplay,int r,int g,int b,Fl_Font font,Fl_Fontsize size);
  208. void flSetTextStyle(Fl_Text_Display *textdisplay,char *text);
  209. void flAddTextStyle(Fl_Text_Display *textdisplay,char *text);
  210. void flReplaceTextStyle(Fl_Text_Display *textdisplay,int start,int count,char *text);
  211. void flInsertTextStyle(Fl_Text_Display *textdisplay,int start,char *text);
  212. void flDeleteTextStyle(Fl_Text_Display *textdisplay,int start,int count);
  213. void* flFreeTextDisplay(Fl_Text_Display *textdisplay);
  214. void flCutText(Fl_Text_Editor *editor);
  215. void flCopyText(Fl_Text_Editor *editor);
  216. void flPasteText(Fl_Text_Editor *editor);
  217. void flSetView(Fl_Help_View *view, const char *html);
  218. void flSeekView(Fl_Help_View *view, const char *anchor);
  219. void flRedirectView(Fl_Help_View *view, char *url);
  220. void flSetLineView(Fl_Help_View *view, int line);
  221. int flGetLineView(Fl_Help_View *view);
  222. void flSetPathView(Fl_Help_View *view, const char *path);
  223. char *flGetPathView(Fl_Help_View *view);
  224. int flIsLinkView(Fl_Help_View *view);
  225. void flSetStyleView(Fl_Help_View *view, int flag);
  226. void flSetProgress(Fl_Progress*,float val);
  227. Fl_RGB_Image *flImage(const unsigned char *pix,int w,int h,int d,int ld);
  228. void flSetImage( Fl_Widget *widget, Fl_RGB_Image *image );
  229. void flFreeImage( Fl_Image *image );
  230. void flSetPanelColor(Fl_Panel *panel,int r,int g,int b);
  231. void flSetPanelImage(Fl_Panel *panel,Fl_RGB_Image *image,int flags);
  232. void flSetPanelActive(Fl_Panel *panel,int yesno);
  233. void flSetPanelEnabled(Fl_Panel *panel,int yesno);
  234. void flSetSliderType(Fl_Slider *slider,int type);
  235. double flSliderValue(Fl_Slider *slider);
  236. void flSetSliderValue(Fl_Slider *slider,double value);
  237. void flSetSliderRange(Fl_Slider *slider,double low,double hi);
  238. int flScrollbarValue(Fl_Scrollbar *scrollbar);
  239. void flSetScrollbarValue(Fl_Scrollbar *scrollbar,int value,int visible,int top, int total);
  240. void flSetSpinnerMin(Fl_Spinner* spinner, double min);
  241. void flSetSpinnerMax(Fl_Spinner* spinner, double max);
  242. void flSetSpinnerValue(Fl_Spinner* spinner, double value);
  243. double flSpinnerValue(Fl_Spinner* spinner);
  244. int flEvent() {if (eventid) return eventid;else return Fl::event();}
  245. int flEventKey() {return Fl::event_key();}
  246. int flEventX() {return Fl::event_x();}
  247. int flEventY() {return Fl::event_y();}
  248. int flEventdX() {return Fl::event_dx();}
  249. int flEventdY() {return Fl::event_dy();}
  250. int flEventState() {return Fl::event_state();}
  251. int flEventKeys(int key) {return Fl::event_key(key);}
  252. int flEventButtons() {return Fl::event_buttons()>>24;}
  253. int flEventButton() {return Fl::event_button();}
  254. int flEventClicks() {return Fl::event_clicks();}
  255. const char *flEventText() {return Fl::event_text();}
  256. int flCompose(int &del){return Fl::compose(del);}
  257. const char *flEventURL() {return event_url;}
  258. void flDisplayRect(int*x,int*y,int*w,int*h);
  259. void flSetCursor(int shape);
  260. int flCanvasWindow(Fl_Canvas *canvas);
  261. void flSetCanvasMode(Fl_Canvas *canvas,int mode);
  262. void* fluRootNode( Flu_Tree_Browser* tree );
  263. void* fluSelectedNode( Flu_Tree_Browser* tree, int index );
  264. void* fluInsertNode( Flu_Tree_Browser::Node* parent, int pos, const char* text );
  265. void* fluAddNode( Flu_Tree_Browser::Node* parent, const char* text );
  266. void fluRemoveNode( Flu_Tree_Browser* tree, Flu_Tree_Browser::Node* node );
  267. void fluSetNode( Flu_Tree_Browser::Node* node, const char* text, Fl_RGB_Image* iconimage );
  268. void fluSetNodeUserData( Flu_Tree_Browser::Node* node, void* user_data );
  269. void* fluNodeUserData( Flu_Tree_Browser::Node* node );
  270. void fluExpandNode( Flu_Tree_Browser::Node* node, int collapse );
  271. void fluSelectNode( Flu_Tree_Browser::Node* node );
  272. void* fluCallbackNode( Flu_Tree_Browser* tree );
  273. int fluCallbackReason( Flu_Tree_Browser* tree );
  274. };
  275. void flSetCursor(int shape)
  276. {
  277. Fl_Cursor cursor=FL_CURSOR_DEFAULT;
  278. switch (shape)
  279. {
  280. case POINTER_ARROW:cursor=FL_CURSOR_ARROW;break;
  281. case POINTER_IBEAM:cursor=FL_CURSOR_INSERT;break;
  282. case POINTER_WAIT:cursor=FL_CURSOR_WAIT;break;
  283. case POINTER_CROSS:cursor=FL_CURSOR_CROSS;break;
  284. case POINTER_UPARROW:cursor=FL_CURSOR_N;break;
  285. case POINTER_SIZENWSE:cursor=FL_CURSOR_NWSE;break;
  286. case POINTER_SIZENESW:cursor=FL_CURSOR_NESW;break;
  287. case POINTER_SIZEWE:cursor=FL_CURSOR_WE;break;
  288. case POINTER_SIZENS:cursor=FL_CURSOR_NS;break;
  289. case POINTER_SIZEALL:cursor=FL_CURSOR_MOVE;break;
  290. case POINTER_NO:cursor=FL_CURSOR_NONE;break;
  291. case POINTER_HAND:cursor=FL_CURSOR_HAND;break;
  292. case POINTER_APPSTARTING:cursor=FL_CURSOR_WAIT;break;
  293. case POINTER_HELP:cursor=FL_CURSOR_HELP;break;
  294. }
  295. fl_cursor(cursor);
  296. }
  297. char *stringcopy(const char *l)
  298. {
  299. char *c;
  300. int n;
  301. if (!l) return 0;
  302. n=strlen(l);
  303. c=(char*)malloc(n+1);
  304. strcpy(c,l);
  305. return c;
  306. }
  307. int maxfonts;
  308. int(*mousehandler)(Fl_Widget*,void*);
  309. int(*keyhandler)(Fl_Widget*,void*);
  310. int(*syshandler)(int);
  311. int(*textfilter)(void*);
  312. void flReset(void *display,int(*handler)(int),int(*filter)(void*),int(*msehandler)(Fl_Widget*,void*),int(*kyhandler)(Fl_Widget*,void*))
  313. {
  314. Fl::visual(FL_RGB|FL_DOUBLE);
  315. #if __linux
  316. fl_open_display((Display*)display);
  317. #endif
  318. //Set default font sizes
  319. FL_NORMAL_SIZE = 12;
  320. fl_message_font( FL_HELVETICA, FL_NORMAL_SIZE );
  321. Fl_Tooltip::size( FL_NORMAL_SIZE );
  322. fl_register_images();
  323. Fl::scheme("gtk+");
  324. if (handler)
  325. {
  326. Fl::add_handler(handler);
  327. syshandler=handler;
  328. }
  329. textfilter=filter;
  330. mousehandler = msehandler;
  331. keyhandler = kyhandler;
  332. maxfonts=Fl::set_fonts(0);
  333. Fl::get_system_colors();
  334. }
  335. int flCountFonts() {return ((maxfonts < FL_FREE_FONT) ? FL_FREE_FONT-1 : maxfonts);}
  336. const char *flFontName(Fl_Font i)
  337. {
  338. if (i<0 || i>=maxfonts) return "";
  339. return Fl::get_font((Fl_Font)i);
  340. }
  341. const char *flFriendlyFontName(Fl_Font i)
  342. {
  343. int attributes;
  344. if (i<0 || i>=maxfonts) return "";
  345. attributes = 0;
  346. return Fl::get_font_name(i, &attributes);
  347. }
  348. int flFriendlyFontAttributes(Fl_Font i)
  349. {
  350. int attributes;
  351. if (i<0 || i>=maxfonts) return 0;
  352. attributes = 0;
  353. Fl::get_font_name(i, &attributes);
  354. return attributes;
  355. }
  356. int flFontSizes(Fl_Font font,int *& sizes)
  357. {
  358. return Fl::get_font_sizes(font,*&sizes);
  359. }
  360. void flSetBelowMouse(Fl_Widget* widget){Fl::belowmouse(widget);};
  361. void flDisplayRect(int*x,int*y,int*w,int*h)
  362. {
  363. *x=Fl::x();
  364. *y=Fl::y();
  365. *w=Fl::w();
  366. *h=Fl::h();
  367. }
  368. void flAddTimeout(double t,void(*callback)(void*),void *user)
  369. {
  370. Fl::add_timeout(t,callback,user);
  371. }
  372. int flRequest(const char *text,int flags)
  373. {
  374. switch (flags)
  375. {
  376. case 0:
  377. fl_message(text);
  378. return 0;
  379. case 1:
  380. fl_alert(text);
  381. return 0;
  382. case 2:
  383. return fl_choice(text,"No","Yes",0); //return fl_ask(text);
  384. case 3:
  385. return fl_choice(text,"Cancel","No","Yes");
  386. }
  387. }
  388. char *flRequestFile(const char * message,const char *pattern,const char *path,int save)
  389. {
  390. if(save) return (char*)flu_save_chooser(message,pattern,path); else return (char*)flu_file_chooser(message,pattern,path);
  391. }
  392. char *flRequestDir(const char* message,const char *path,int relative)
  393. {
  394. return (char*)flu_dir_chooser(message,path,0);
  395. }
  396. int isboxaframe( int box ){
  397. switch(box){
  398. case FL_NO_BOX:
  399. case FL_UP_FRAME:
  400. case FL_DOWN_FRAME:
  401. case FL_THIN_UP_FRAME:
  402. case FL_THIN_DOWN_FRAME:
  403. case FL_ENGRAVED_FRAME:
  404. case FL_EMBOSSED_FRAME:
  405. case FL_BORDER_FRAME:
  406. case _FL_SHADOW_FRAME:
  407. case _FL_ROUNDED_FRAME:
  408. case _FL_OVAL_FRAME:
  409. case _FL_PLASTIC_UP_FRAME:
  410. case _FL_PLASTIC_DOWN_FRAME:
  411. case FL_FREE_BOXTYPE:
  412. return 1;
  413. }
  414. return 0;
  415. }
  416. class Fl_Panel:public Fl_Group
  417. {
  418. Fl_Image *origimage;
  419. Fl_Image *img;
  420. int pixmapflags;
  421. int hascolor;
  422. int active;
  423. int enabled;
  424. public:
  425. Fl_Panel(int x,int y,int w,int h,const char *title):Fl_Group(x,y,w,h,title)
  426. {
  427. box(FL_ENGRAVED_FRAME);align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  428. clip_children(true);resizable(NULL);
  429. img=NULL;origimage=NULL;pixmapflags=0;
  430. hascolor=0;active=0;enabled=1;
  431. }
  432. void setimage(Fl_RGB_Image *i,int flags)
  433. {
  434. pixmapflags = flags;
  435. if(origimage!=i){
  436. if(origimage) origimage = NULL;
  437. updateImage();
  438. origimage = i;
  439. }
  440. updateImage();
  441. redraw();
  442. }
  443. void setcolor(Fl_Color c)
  444. {
  445. if(!hascolor){
  446. hascolor=1;
  447. switch(box()){
  448. case FL_NO_BOX:
  449. box(FL_FLAT_BOX);
  450. break;
  451. case FL_DOWN_FRAME:
  452. box(FL_DOWN_BOX);
  453. break;
  454. case FL_UP_FRAME:
  455. box(FL_UP_BOX);
  456. break;
  457. }
  458. }
  459. color(c);
  460. }
  461. void setactive(int yesno){active=yesno;}
  462. void setenabled(int yesno){
  463. if(enabled!=yesno){
  464. enabled=(yesno ? 1 : 0);
  465. if(img){
  466. delete img;
  467. img = NULL;
  468. }
  469. updateImage();
  470. } else {
  471. enabled=(yesno ? 1 : 0);
  472. }
  473. }
  474. void updateImage(){
  475. if (origimage) {
  476. double scalew = (double)w()/origimage->w(), scaleh = (double)h()/origimage->h();
  477. switch (pixmapflags & (PANELPIXMAP_FIT|PANELPIXMAP_FIT2|PANELPIXMAP_STRETCH)){
  478. case PANELPIXMAP_FIT:
  479. if (scalew < scaleh) scaleh = scalew; else scalew = scaleh;
  480. break;
  481. case PANELPIXMAP_FIT2:
  482. if (scaleh < scalew) scaleh = scalew; else scalew = scaleh;
  483. break;
  484. case PANELPIXMAP_STRETCH:
  485. break;
  486. default:
  487. scalew = scaleh = 1.0;
  488. }
  489. int neww = scalew * origimage->w(), newh = scaleh * origimage->h();
  490. if (!img || (neww != img->w()) || (newh != img->h())){
  491. if (img) delete img;
  492. img = origimage->copy(neww,newh);
  493. if (!enabled) img->inactive();
  494. }
  495. } else {
  496. if (img) delete img;
  497. img = NULL;
  498. }
  499. }
  500. void draw()
  501. {
  502. int lblW = 0, lblH, X, dx, dy, dw, dh;
  503. uchar* pix;
  504. if( (label() == 0) )
  505. lblW = lblH = 0;
  506. else if( strlen( label() ) == 0 )
  507. lblW = lblH = 0;
  508. else
  509. {
  510. measure_label( lblW, lblH );
  511. lblW += 4;
  512. lblH += 2;
  513. }
  514. // align the label
  515. if( align() & FL_ALIGN_LEFT )
  516. X = 4;
  517. else if( align() & FL_ALIGN_RIGHT )
  518. X = w() - lblW - 8;
  519. else
  520. X = w()/2 - lblW/2 - 2;
  521. // save label background to an image in memory
  522. if(lblW && lblH) pix = fl_read_image(NULL,x()+X,y(),lblW+4,lblH,0); else pix = NULL;
  523. // draw the main group box
  524. if( damage() & ~FL_DAMAGE_CHILD ){
  525. dx=x();dy=y()+lblH/2;dw=w();dh=h()-lblH/2;
  526. fl_draw_box( box(), dx, dy, dw, dh, color() );
  527. if (img){
  528. if ((box()!=FL_NO_BOX) && (box()!=FL_FLAT_BOX)) {dx+=3;dy+=3;dw-=6;dh-=6;}
  529. fl_clip(dx,dy,dw,dh);
  530. switch(pixmapflags){
  531. case PANELPIXMAP_TILE:
  532. img = new Fl_Tiled_Image(img,dw,dh);
  533. break;
  534. default:
  535. dx = x()+w()/2-img->w()/2;dy = y()+h()/2-img->h()/2;
  536. break;
  537. }
  538. img->draw(dx,dy);
  539. fl_pop_clip();
  540. }
  541. }
  542. // clip and draw the children
  543. if((box()!=FL_NO_BOX) && (box()!=FL_FLAT_BOX)) fl_clip( x()+2, y()+lblH+1, w()-4, h()-lblH-3 );
  544. else fl_clip( x(), y()+lblH, w(), h()-lblH );
  545. draw_children();
  546. fl_pop_clip();
  547. if(lblW && lblH) {
  548. // clear behind the label and draw it
  549. if(pix) {
  550. fl_draw_image( pix,x()+X,y(),lblW+4,lblH,3,0);
  551. delete[] pix;
  552. } else {
  553. fl_color( color() );
  554. fl_rectf( x()+X,y(),lblW+4,lblH );
  555. }
  556. fl_color( labelcolor() );
  557. draw_label( x()+X+2, y(), lblW, lblH, FL_ALIGN_CENTER );
  558. }
  559. }
  560. };
  561. class Fl_AWindow:public Fl_Double_Window
  562. {
  563. private:
  564. int minw, minh, maxw, maxh, dragdrop; //Used by setminsize() and setmaxsize()
  565. Fl_Widget* push_override;
  566. public:
  567. Fl_AWindow(int x,int y,int w,int h,const char *title):Fl_Double_Window(w,h,title)
  568. {
  569. minw = 0; minh = 0; maxw = 0; maxh = 0;
  570. push_override = NULL;
  571. dragdrop = 0;position(x,y);
  572. #if __linux
  573. Fl_X::make_xid(this);
  574. #elif defined(WIN32)
  575. icon(LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(101)));
  576. #endif
  577. }
  578. void resize(int x,int y,int w,int h)
  579. {
  580. Fl_Double_Window::resize(x,y,w,h);
  581. do_callback();
  582. }
  583. void updatesizerange()
  584. {
  585. if ((minw == 0) && (minh == 0))
  586. {
  587. resizable(0);
  588. size_range(w(),h());
  589. }
  590. else
  591. {
  592. resizable(this);
  593. size_range(minw,minh,maxw,maxh);
  594. }
  595. }
  596. void setminsize( int w, int h ) {minw = w;minh = h;updatesizerange();}
  597. void setmaxsize( int w, int h ) {maxw = w;maxh = h;updatesizerange();}
  598. void setdragdrop( int enable ) {dragdrop = enable ? 1 : 0;}
  599. int handle(int event)
  600. {
  601. int res = 0, shouldignore = 0;
  602. eventid = event;
  603. switch (event)
  604. {
  605. case FL_DND_ENTER:
  606. case FL_DND_DRAG:
  607. case FL_DND_RELEASE:
  608. case FL_DND_LEAVE:
  609. case FL_PASTE:
  610. if (dragdrop) {
  611. do_callback();
  612. res = 1;
  613. shouldignore = 1;
  614. }
  615. break;
  616. }
  617. eventid = 0;
  618. if(!shouldignore) res = Fl_Double_Window::handle(event);
  619. return res;
  620. }
  621. void maximize() {
  622. // Rafał Maj proposed patch here: http://www.mail-archive.com/[email protected]/msg00872.html
  623. #ifdef WIN32
  624. HWND hWnd = fl_xid(this);
  625. if(hWnd) ShowWindow(hWnd, SW_MAXIMIZE);
  626. #elif __linux
  627. XEvent xev;
  628. Atom wm_state = XInternAtom(fl_display, "_NET_WM_STATE", False);
  629. Atom maximizeV = XInternAtom(fl_display, "_NET_WM_STATE_MAXIMIZED_VERT", False);
  630. Atom maximizeH = XInternAtom(fl_display, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
  631. memset(&xev, 0, sizeof(xev));
  632. xev.type = ClientMessage;
  633. xev.xclient.window = fl_xid(this);
  634. xev.xclient.message_type = wm_state;
  635. xev.xclient.format = 32;
  636. xev.xclient.data.l[0] = 1;
  637. xev.xclient.data.l[1] = maximizeV;
  638. xev.xclient.data.l[2] = maximizeH;
  639. xev.xclient.data.l[3] = 0;
  640. XSendEvent(fl_display, RootWindow(fl_display, fl_screen), 0, SubstructureNotifyMask|SubstructureRedirectMask, &xev);
  641. #endif
  642. }
  643. void restore() {
  644. #ifdef WIN32
  645. HWND hWnd = fl_xid(this);
  646. if(hWnd) ShowWindow(hWnd, SW_RESTORE);
  647. #elif __linux
  648. XEvent xev;
  649. Atom wm_state = XInternAtom(fl_display, "_NET_WM_STATE", False);
  650. memset(&xev, 0, sizeof(xev));
  651. xev.type = ClientMessage;
  652. xev.xclient.window = fl_xid(this);
  653. xev.xclient.message_type = wm_state;
  654. xev.xclient.format = 32;
  655. xev.xclient.data.l[0] = 1;
  656. xev.xclient.data.l[1] = 0;
  657. xev.xclient.data.l[2] = 0;
  658. xev.xclient.data.l[3] = 0;
  659. XSendEvent(fl_display, RootWindow(fl_display, fl_screen), 0, SubstructureNotifyMask|SubstructureRedirectMask, &xev);
  660. #endif
  661. }
  662. };
  663. enum{
  664. FLAGS_BACKBUFFER= 0x2,
  665. FLAGS_ALPHABUFFER= 0x4,
  666. FLAGS_DEPTHBUFFER= 0x8,
  667. FLAGS_STENCILBUFFER=0x10,
  668. FLAGS_ACCUMBUFFER= 0x20,
  669. FLAGS_FULLSCREEN=0x80000000
  670. };
  671. #if __linux
  672. XVisualInfo *_chooseXVisual(int flags){
  673. int glspec[32],*s;
  674. s=glspec;
  675. *s++=GLX_RGBA;
  676. if (flags&FLAGS_BACKBUFFER) *s++=GLX_DOUBLEBUFFER;
  677. if (flags&FLAGS_ALPHABUFFER) {*s++=GLX_ALPHA_SIZE;*s++=1;}
  678. if (flags&FLAGS_DEPTHBUFFER) {*s++=GLX_DEPTH_SIZE;*s++=1;}
  679. if (flags&FLAGS_STENCILBUFFER) {*s++=GLX_STENCIL_SIZE;*s++=1;}
  680. if (flags&FLAGS_ACCUMBUFFER)
  681. {
  682. *s++=GLX_ACCUM_RED_SIZE;*s++=1;
  683. *s++=GLX_ACCUM_GREEN_SIZE;*s++=1;
  684. *s++=GLX_ACCUM_BLUE_SIZE;*s++=1;
  685. *s++=GLX_ACCUM_ALPHA_SIZE;*s++=1;
  686. }
  687. *s++=None;
  688. return glXChooseVisual(fl_display,fl_screen,glspec); //RootWindow(fl_display,
  689. }
  690. int glspec2[]={GLX_RGBA,GLX_DOUBLEBUFFER,GLX_DEPTH_SIZE,1,None};
  691. #endif
  692. class Fl_Canvas:public Fl_Window
  693. {
  694. int enabled, mode;
  695. #if __linux
  696. XVisualInfo *visual;
  697. Colormap colormap;
  698. #endif
  699. public:
  700. Fl_Canvas(int x,int y,int w,int h,const char *title):Fl_Window(x,y,w,h,title) {
  701. enabled=1;mode=0;
  702. #if __linux
  703. visual=0;
  704. #endif
  705. clip_children(true);
  706. }
  707. void setenabled(int yesno) {
  708. enabled=yesno;
  709. }
  710. void setmode(int gfxmode) {
  711. mode=gfxmode;
  712. }
  713. void show() {
  714. #if __linux
  715. if (window() && window()->shown()==0) return; //parent is hidden so must defer
  716. if (shown()) {Fl_Window::show(); return;} // you must do this!
  717. if (!visual)
  718. {
  719. visual=_chooseXVisual(mode);
  720. colormap=XCreateColormap(fl_display,RootWindow(fl_display,fl_screen),visual->visual,AllocNone);
  721. }
  722. Fl_X::make_xid(this,visual,colormap);
  723. #else
  724. Fl_Window::show();
  725. #endif
  726. }
  727. int handle(int event) {
  728. switch (event) {
  729. case FL_FOCUS:
  730. return (active_r() ? 1 : 0);
  731. break;
  732. default:
  733. return Fl_Window::handle(event);
  734. }
  735. }
  736. void draw() { //fltk callback for lowlevel drawing
  737. eventid=FL_ACTIVATE;
  738. do_callback();
  739. eventid=0;
  740. }
  741. };
  742. int flCanvasWindow(Fl_Canvas *canvas)
  743. {
  744. return (int)fl_xid(canvas);
  745. }
  746. void flSetCanvasMode(Fl_Canvas *canvas,int mode) {
  747. canvas->setmode(mode);
  748. }
  749. class Fl_ATabs:public Flmm_Tabs
  750. {
  751. public:
  752. Fl_ATabs(int x,int y,int w,int h,const char *title=0):Flmm_Tabs(x,y,w,h,title)
  753. {
  754. clip_children(true);
  755. }
  756. Fl_Widget* which(int event_x, int event_y) {
  757. return Flmm_Tabs::which(event_x,event_y);
  758. }
  759. int handle(int event)
  760. {
  761. int should_callback, should_ignore, res;
  762. should_callback=0;should_ignore=0;
  763. switch (event)
  764. {
  765. case FL_PUSH:
  766. case FL_RELEASE:
  767. should_callback=1;
  768. case FL_DRAG:
  769. if (which(Fl::event_x(),Fl::event_y()) && (Fl::event_button()!=FL_LEFT_MOUSE)) should_ignore = 1;
  770. }
  771. if (!should_ignore) res=Flmm_Tabs::handle(event);
  772. if (should_callback) do_callback();
  773. return res;
  774. }
  775. };
  776. static int colwidths[]={14,14,14,14,14,14,14,14,14,14,0}; //16,16,16,16,0};
  777. Fl_Widget *flWidget(int x,int y,int w,int h,char *label,int fltype)
  778. {
  779. Fl_Window *window;
  780. Fl_Group *group;
  781. Fl_Menu_Bar *menu;
  782. Fl_Browser *browser;
  783. Fl_Text_Buffer *text;
  784. Fl_Help_View *help;
  785. Fl_Choice *choice;
  786. Fl_Progress *progbar;
  787. Fl_Panel *panel;
  788. Fl_Slider *slider;
  789. Fl_Spinner *spinner;
  790. Fl_Canvas *canvas;
  791. Flu_Tree_Browser *tree;
  792. //printf("flWidget %d,%d,%d,%d \"%s\" %d\n",x,y,w,h,label,fltype);
  793. //label=stringcopy(label);
  794. switch (fltype)
  795. {
  796. case FLWINDOW:
  797. window=new Fl_AWindow(x,y,w,h,label);
  798. window->end();
  799. return window;
  800. case FLMENUBAR:
  801. menu=new Fl_Menu_Bar(x,y,w,h);
  802. menu->clear();
  803. return menu;
  804. case FLBUTTON:
  805. return new MaxGUIEventListener< MaxGUIHoverEffect<Fl_Button> >(x,y,w,h,label);
  806. case FLCHECKBUTTON:
  807. return new MaxGUIEventListener<Fl_Check_Button>(x,y,w,h,label);
  808. case FLROUNDBUTTON:
  809. return new MaxGUIEventListener< MaxGUIHoverEffect<Fl_Round_Button> >(x,y,w,h,label);
  810. case FLRADIOPUSHBUTTON:
  811. case FLTOGGLEBUTTON:
  812. return new MaxGUIEventListener<Fl_Toggle_Button>(x,y,w,h,label);
  813. case FLRETURNBUTTON:
  814. return new MaxGUIEventListener< MaxGUIHoverEffect<Fl_Return_Button> >(x,y,w,h,label);
  815. case FLREPEATBUTTON:
  816. return new MaxGUIEventListener< MaxGUIHoverEffect<Fl_Repeat_Button> >(x,y,w,h,label);
  817. case FLGROUPPANEL:
  818. case FLPANEL:
  819. panel=new MaxGUIEventListener<Fl_Panel>(x,y,w,h,label);
  820. panel->end();
  821. return panel;
  822. case FLINPUT:
  823. return new MaxGUIEventListener< MaxGUIKeyFilter<Fl_Input> >(x,y,w,h,label);
  824. case FLPASSWORD:
  825. return new MaxGUIEventListener< MaxGUIKeyFilter<Fl_Secret_Input> >(x,y,w,h,label);
  826. case FLTABS:
  827. group=new MaxGUIEventListener<Fl_ATabs>(x,y,w,h,label);
  828. group->selection_color(fl_color_average(group->selection_color(),FL_SELECTION_COLOR,.80f));
  829. group->end();
  830. return group;
  831. case FLGROUP:
  832. group=new MaxGUIEventListener<Fl_Group>(x,y,w,h,label);
  833. group->clip_children(true);
  834. group->end();
  835. group->box(FL_NO_BOX);
  836. return group;
  837. case FLPACK:
  838. group=new MaxGUIEventListener<Fl_Pack>(x,y,w,h,label);
  839. group->clip_children(true);
  840. group->end();
  841. return group;
  842. case FLMULTIBROWSER:
  843. case FLBROWSER:
  844. if(fltype==FLBROWSER) browser=new MaxGUIEventListener<Fl_Hold_Browser>(x,y,w,h,label);
  845. else browser=new MaxGUIEventListener<Fl_Multi_Browser>(x,y,w,h,label);
  846. browser->column_widths(colwidths);
  847. return browser;
  848. case FLINPUTCHOICE:
  849. group= new MaxGUIEventListener<Fl_Input_Choice>(x,y,w,h,label);
  850. group->end();
  851. return group;
  852. case FLCHOICE:
  853. return new MaxGUIEventListener< MaxGUIHoverEffect<Fl_Choice> >(x,y,w,h,label);
  854. case FLTEXTEDITOR:
  855. Fl_Text_Editor *edit;
  856. text=new Fl_Text_Buffer;
  857. edit=new MaxGUIEventListener< MaxGUIKeyFilter< MaxGUITextArea<Fl_Text_Editor> > >(x,y,w,h,"");
  858. edit->buffer(text);
  859. edit->remove_key_binding('z',FL_CTRL);
  860. return edit;
  861. case FLTEXTDISPLAY:
  862. Fl_Text_Display *display;
  863. text=new Fl_Text_Buffer;
  864. display=new MaxGUIEventListener< MaxGUIKeyFilter< MaxGUITextArea<Fl_Text_Display> > >(x,y,w,h,"");
  865. display->buffer(text);
  866. return display;
  867. case FLHELPVIEW:
  868. help=new MaxGUIEventListener<Fl_Help_View>(x,y,w,h,label);
  869. help->link(viewcallback);
  870. return help;
  871. case FLBOX:
  872. return new MaxGUIEventListener<Fl_Box>(x,y,w,h,label);
  873. case FLTOOLBAR:
  874. group=new MaxGUIEventListener<Fl_Group>(x,y,w,h);
  875. group->clip_children(true);
  876. group->end();
  877. return group;
  878. case FLPROGBAR:
  879. progbar=new MaxGUIEventListener<Fl_Progress>(x,y,w,h,label);
  880. progbar->minimum(0.0);
  881. progbar->maximum(1.0);
  882. progbar->selection_color(FL_SELECTION_COLOR);
  883. return progbar;
  884. case FLSLIDER:
  885. slider=new MaxGUIEventListener<Fl_Slider>(x,y,w,h);
  886. slider->bounds(0,100);
  887. return slider;
  888. case FLSCROLLBAR:
  889. slider=new MaxGUIEventListener<Fl_Scrollbar>(x,y,w,h);
  890. return slider;
  891. case FLSPINNER:
  892. spinner=new MaxGUIEventListener<Fl_Spinner>(x,y,w,h);
  893. spinner->minimum(5);
  894. spinner->maximum(10);
  895. spinner->step(1);
  896. spinner->value(5);
  897. spinner->end();
  898. return spinner;
  899. case FLCANVAS:
  900. canvas=new MaxGUIEventListener<Fl_Canvas>(x,y,w,h,label);
  901. canvas->end();
  902. return canvas;
  903. case FLUTREEBROWSER:
  904. tree=new MaxGUIEventListener<Flu_Tree_Browser>(x,y,w,h,label);
  905. tree->auto_branches(true);
  906. tree->show_root(false);
  907. tree->selection_mode(FLU_SINGLE_SELECT);
  908. tree->insertion_mode(FLU_INSERT_BACK);
  909. tree->selection_drag_mode(FLU_DRAG_IGNORE);
  910. tree->branch_icons(NULL,NULL);
  911. tree->branch_text(FL_BLACK,FL_HELVETICA,12);
  912. tree->double_click_opens(false);
  913. tree->open_on_select(false);
  914. tree->animate(false);
  915. tree->end();
  916. return tree;
  917. }
  918. return 0;
  919. }
  920. void flFreeWidget(Fl_Widget*widget)
  921. {
  922. Fl_Group *parent;
  923. parent=widget->parent();
  924. if (parent) parent->remove(widget);
  925. Fl::delete_widget(widget);
  926. }
  927. void flFreePtr( void* pointer )
  928. {
  929. if(pointer) free(pointer);
  930. }
  931. void* flUserData( Fl_Widget* widget )
  932. {
  933. if(widget) return widget->user_data();
  934. }
  935. void flDelete ( void* pointer )
  936. {
  937. delete pointer;
  938. }
  939. Fl_Widget* flPushed()
  940. {
  941. return Fl::pushed();
  942. }
  943. void flSetPushed(Fl_Widget* widget)
  944. {
  945. Fl::pushed(widget);
  946. }
  947. void flRedraw(Fl_Widget*widget)
  948. {
  949. widget->redraw();
  950. if((isboxaframe(widget->box())) && (widget->window()))
  951. widget->window()->damage(FL_DAMAGE_ALL,widget->x(),widget->y(),widget->w(),widget->h());
  952. if(widget->label())
  953. widget->redraw_label();
  954. }
  955. int flWidth(Fl_Widget*widget)
  956. {
  957. return widget->w();
  958. }
  959. int flHeight(Fl_Widget*widget)
  960. {
  961. return widget->h();
  962. }
  963. int flVisible(Fl_Widget*widget) {
  964. return widget->visible();
  965. }
  966. int flChanged(Fl_Widget*widget) {
  967. return widget->changed();
  968. }
  969. void flClearChanged(Fl_Widget*widget) {
  970. widget->clear_changed();
  971. }
  972. void flSetBox(Fl_Widget*widget,int boxtype,int redrawifneeded = 0)
  973. {
  974. if(widget->box()!=boxtype){
  975. widget->box((Fl_Boxtype)boxtype);
  976. if(redrawifneeded) flRedraw(widget);
  977. }
  978. }
  979. void flSetLabelType(Fl_Widget*widget,Fl_Labeltype labeltype)
  980. {
  981. widget->labeltype(labeltype);
  982. }
  983. void flSetAlign(Fl_Widget*widget,int aligntype)
  984. {
  985. widget->align(aligntype);
  986. }
  987. int flAlign(Fl_Widget*widget)
  988. {
  989. return widget->align();
  990. }
  991. void flRemoveColor(Fl_Widget*widget){
  992. int rr,gg,bb;
  993. widget->color(FL_BACKGROUND_COLOR);
  994. }
  995. void flSetColor(Fl_Widget*widget,int r,int g,int b)
  996. {
  997. int rr,gg,bb;
  998. widget->color(fl_rgb_color(r,g,b));
  999. widget->selection_color(FL_SELECTION_COLOR);
  1000. if(fl_contrast(widget->selection_color(),widget->color())!=widget->selection_color()){
  1001. rr=255-r;gg=255-g;bb=255-b;
  1002. if (abs(rr-r)+abs(gg-g)+abs(bb-b)<64)
  1003. {
  1004. rr=r^0x80;gg=g^0x80;bb=b^0x80;
  1005. }
  1006. widget->selection_color(fl_rgb_color(rr,gg,bb));
  1007. }
  1008. }
  1009. void flSetLabelColor(Fl_Widget*widget,int r,int g,int b)
  1010. {
  1011. widget->labelcolor(fl_rgb_color(r,g,b));
  1012. }
  1013. void flSetLabelFont(Fl_Widget*widget,Fl_Font s)
  1014. {
  1015. widget->labelfont(s);
  1016. }
  1017. void flSetLabelSize(Fl_Widget*widget,Fl_Fontsize s)
  1018. {
  1019. widget->labelsize(s);
  1020. }
  1021. const char *flGetLabel(Fl_Widget*widget)
  1022. {
  1023. return widget->label();
  1024. }
  1025. void flSetFocus(Fl_Widget*widget)
  1026. {
  1027. widget->take_focus();
  1028. }
  1029. void *flGetFocus() {
  1030. return Fl::focus();
  1031. }
  1032. Fl_When flGetWhen(Fl_Widget* widget) {
  1033. return widget->when();
  1034. }
  1035. void flSetWhen(Fl_Widget* widget, Fl_When when) {
  1036. widget->when(when);
  1037. }
  1038. void *flGetUser(Fl_Widget*widget) {
  1039. return widget->user_data();
  1040. }
  1041. void flSetArea(Fl_Widget*widget,int x,int y,int w,int h)
  1042. {
  1043. widget->damage_resize(x,y,w,h);
  1044. widget->redraw_label();
  1045. }
  1046. void flGetArea(Fl_Widget*widget,int *x,int *y,int *w,int *h)
  1047. {
  1048. *x=widget->x();
  1049. *y=widget->y();
  1050. *w=widget->w();
  1051. *h=widget->h();
  1052. }
  1053. void flSetLabel(Fl_Widget*widget,char*label)
  1054. {
  1055. widget->copy_label( label[0] ? label : 0 );
  1056. }
  1057. void flSetShow(Fl_Widget *widget,int truefalse)
  1058. {
  1059. if (truefalse)
  1060. widget->show();
  1061. else
  1062. widget->hide();
  1063. }
  1064. void flSetCallback(Fl_Widget *widget,void(*callback)(Fl_Widget*,void*),void *user)
  1065. {
  1066. widget->user_data(user);
  1067. widget->callback(callback);
  1068. }
  1069. void flSetToolTip(Fl_Widget*widget,char*tip)
  1070. {
  1071. widget->tooltip(stringcopy(tip));
  1072. }
  1073. void flSetActive(Fl_Widget *widget,int truefalse)
  1074. {
  1075. if (truefalse) widget->activate(); else widget->deactivate();
  1076. }
  1077. Fl_Window* flWidgetWindow(Fl_Widget* widget)
  1078. {
  1079. return widget->window();
  1080. }
  1081. void flSetWindowLabel(Fl_Window*window,char*label)
  1082. {
  1083. //For some reason Fl_Widget::copy_label() isn't virtual.
  1084. window->copy_label(label);
  1085. }
  1086. void flSetWindowIcon(Fl_Window*window,char** icon)
  1087. {
  1088. #if __usexpm
  1089. Pixmap p, mask;
  1090. XpmCreatePixmapFromData(fl_display, DefaultRootWindow(fl_display),icon, &p, &mask, NULL);
  1091. window->icon((char *)p);
  1092. #endif
  1093. }
  1094. void flClearBorder(Fl_Window *window)
  1095. {
  1096. window->border(0);
  1097. }
  1098. void flShowWindow(Fl_Window *window,int falsetrueiconize){
  1099. switch (falsetrueiconize){
  1100. case 0:
  1101. window->hide();
  1102. break;
  1103. case 1:
  1104. window->show();
  1105. break;
  1106. case 2:
  1107. window->iconize();
  1108. break;
  1109. case 3:
  1110. window->show();
  1111. ((Fl_AWindow*)window)->maximize();
  1112. break;
  1113. case 4:
  1114. window->show();
  1115. ((Fl_AWindow*)window)->restore();
  1116. break;
  1117. }
  1118. }
  1119. void flDestroyWindow(Fl_Window *window) {
  1120. delete window;
  1121. }
  1122. void flSetMaxWindowSize(Fl_AWindow*window,int w,int h)
  1123. {
  1124. window->setmaxsize(w,h);
  1125. }
  1126. void flSetMinWindowSize(Fl_AWindow*window,int w,int h)
  1127. {
  1128. window->setminsize(w,h);
  1129. }
  1130. void flSetAcceptsFiles(Fl_AWindow*window, int enable )
  1131. {
  1132. window->setdragdrop(enable);
  1133. }
  1134. void flSetNonModal(Fl_AWindow*window)
  1135. {
  1136. window->set_non_modal();
  1137. }
  1138. void flSetModal(Fl_AWindow*window)
  1139. {
  1140. window->set_modal();
  1141. }
  1142. void flBegin(Fl_Group*group)
  1143. {
  1144. group->begin();
  1145. }
  1146. void flEnd(Fl_Group*group)
  1147. {
  1148. group->end();
  1149. }
  1150. void flAddToGroup(Fl_Group*group,Fl_Widget*child)
  1151. {
  1152. if(group) group->add(child);
  1153. }
  1154. void flRemoveFromGroup(Fl_Group*group,Fl_Widget*child)
  1155. {
  1156. if(group) group->remove(child);
  1157. }
  1158. void flSetInputChoice(Fl_Input_Choice *input_choice, int value){
  1159. input_choice->value(value);
  1160. }
  1161. void* flGetInputChoiceTextWidget(Fl_Input_Choice *input_choice){
  1162. return input_choice->input();
  1163. }
  1164. void* flGetInputChoiceMenuWidget(Fl_Input_Choice *input_choice){
  1165. return input_choice->menubutton();
  1166. }
  1167. void flSetChoice(Fl_Choice *choice,int value) {
  1168. choice->value(value);
  1169. }
  1170. int flGetChoice(Fl_Choice* choice) {
  1171. return choice->value();
  1172. }
  1173. void flSetButton(Fl_Button*button,bool value)
  1174. {
  1175. button->value(value);
  1176. }
  1177. int flGetButton(Fl_Button*button)
  1178. {
  1179. return button->value();
  1180. }
  1181. void flSetButtonKey(Fl_Button*button,int key)
  1182. {
  1183. button->shortcut(key);
  1184. }
  1185. Fl_RGB_Image *flImage(const unsigned char *pix,int w,int h,int d,int span)
  1186. {
  1187. return new Fl_RGB_Image(pix,w,h,d,span);
  1188. }
  1189. void flSetImage(Fl_Widget *widget,Fl_RGB_Image *image)
  1190. {
  1191. Fl_Image* copy;
  1192. if(widget->image()) delete widget->image();
  1193. if(widget->deimage()) delete widget->deimage();
  1194. if(image){
  1195. widget->image(image->copy());
  1196. copy = image->copy();
  1197. copy->inactive();
  1198. widget->deimage(copy);
  1199. } else {
  1200. widget->image(0);widget->deimage(0);
  1201. }
  1202. }
  1203. void flFreeImage( Fl_Image *image )
  1204. {
  1205. delete image;
  1206. }
  1207. void flSetPanelImage(Fl_Panel *panel,Fl_RGB_Image *image,int flags)
  1208. {
  1209. panel->setimage(image,flags);
  1210. }
  1211. void flSetPanelColor(Fl_Panel *panel,int r,int g,int b)
  1212. {
  1213. panel->setcolor(fl_rgb_color(r,g,b));
  1214. }
  1215. void flSetPanelActive(Fl_Panel *panel,int yesno)
  1216. {
  1217. panel->setactive(yesno);
  1218. }
  1219. void flSetPanelEnabled(Fl_Panel *panel,int yesno)
  1220. {
  1221. panel->setenabled(yesno);
  1222. }
  1223. void flSetSliderType(Fl_Slider *slider,int type)
  1224. {
  1225. slider->type(type);
  1226. }
  1227. double flSliderValue(Fl_Slider *slider)
  1228. {
  1229. return slider->value();
  1230. }
  1231. void flSetSliderValue(Fl_Slider *slider,double value)
  1232. {
  1233. slider->value(value);
  1234. }
  1235. void flSetSliderRange(Fl_Slider *slider,double low,double hi)
  1236. {
  1237. slider->bounds(low,hi);
  1238. }
  1239. int flScrollbarValue(Fl_Scrollbar *scrollbar)
  1240. {
  1241. return scrollbar->value();
  1242. }
  1243. void flSetScrollbarValue(Fl_Scrollbar *scrollbar,int value,int visible,int top,int total)
  1244. {
  1245. scrollbar->value(value,visible,top,total);
  1246. }
  1247. void flSetInput(Fl_Input*input,char*value)
  1248. {
  1249. input->value(value);
  1250. input->position(0,strlen(value));
  1251. }
  1252. const char *flGetInput(Fl_Input*input)
  1253. {
  1254. return input->value();
  1255. }
  1256. void flActivateInput(Fl_Input*input)
  1257. {
  1258. input->position(input->size(),0);
  1259. }
  1260. void flSetInputFont(Fl_Input*input,Fl_Font s)
  1261. {
  1262. input->labelfont(s);
  1263. }
  1264. void flSetInputSize(Fl_Input*input,Fl_Fontsize s)
  1265. {
  1266. input->labelsize(s);
  1267. }
  1268. void flSetSpinnerMin(Fl_Spinner* spinner, double min)
  1269. {
  1270. spinner->minimum(min);
  1271. }
  1272. void flSetSpinnerMax(Fl_Spinner* spinner, double max)
  1273. {
  1274. spinner->maximum(max);
  1275. }
  1276. void flSetSpinnerValue(Fl_Spinner* spinner, double value)
  1277. {
  1278. spinner->value(value);
  1279. }
  1280. double flSpinnerValue(Fl_Spinner* spinner)
  1281. {
  1282. return spinner->value();
  1283. }
  1284. void flClearBrowser(Fl_Browser*browse)
  1285. {
  1286. browse->clear();
  1287. }
  1288. void flAddBrowser(Fl_Browser*browse,const char *label,void *object, Fl_Image* icon)
  1289. {
  1290. browse->add(label,object);
  1291. browse->icon(browse->size(), icon);
  1292. }
  1293. void flInsertBrowser(Fl_Browser*browse,int index,const char *label,void *object, Fl_Image* icon)
  1294. {
  1295. browse->insert(index,label,object);
  1296. browse->icon(index,icon);
  1297. }
  1298. void flShowBrowser(Fl_Browser*browse,int line,int show)
  1299. {
  1300. if (show)
  1301. browse->show(line);
  1302. else
  1303. browse->hide(line);
  1304. }
  1305. void flSelectBrowser(Fl_Hold_Browser*browse,int line)
  1306. {
  1307. browse->deselect();
  1308. if (line) browse->select(line);
  1309. }
  1310. void flMultiBrowserSelect(Fl_Multi_Browser *browse,int line,int select)
  1311. {
  1312. if(select) browse->select(line); else browse->deselect(line);
  1313. }
  1314. int flMultiBrowserSelected(Fl_Multi_Browser *browse,int line)
  1315. {
  1316. return browse->selected(line);
  1317. }
  1318. int flBrowserValue(Fl_Hold_Browser *browse)
  1319. {
  1320. return browse->value();
  1321. }
  1322. void *flBrowserData(Fl_Hold_Browser *browse,int line)
  1323. {
  1324. return browse->data(line);
  1325. }
  1326. const char *flBrowserItem(Fl_Hold_Browser *browse,int line)
  1327. {
  1328. return browse->text(line);
  1329. }
  1330. void flSetBrowserItem(Fl_Hold_Browser *browse,int line,char *text,void *object, Fl_Image* icon)
  1331. {
  1332. browse->text(line,text);
  1333. browse->data((int)object);
  1334. browse->icon(line,icon);
  1335. }
  1336. void flRemoveBrowserItem(Fl_Hold_Browser *browse,int line)
  1337. {
  1338. browse->remove(line);
  1339. }
  1340. void flSetBrowserTextColor(Fl_Hold_Browser *browse,int r,int g,int b)
  1341. {
  1342. browse->textcolor(fl_rgb_color(r,g,b));
  1343. }
  1344. void flSetBrowserTextFont(Fl_Hold_Browser *browse,Fl_Font s)
  1345. {
  1346. browse->textfont(s);
  1347. }
  1348. void flSetBrowserTextSize(Fl_Hold_Browser *browse,Fl_Fontsize s)
  1349. {
  1350. browse->textsize(s);
  1351. }
  1352. int flBrowserCount(Fl_Hold_Browser *browse)
  1353. {
  1354. return browse->size();
  1355. }
  1356. void flSelectTab(Fl_Tabs *tab,Fl_Widget *widget)
  1357. {
  1358. tab->value(widget);
  1359. }
  1360. int flGetTabPanel(Fl_Tabs *tab)
  1361. {
  1362. return (int)tab->value();
  1363. }
  1364. void *flGetTabPanelForEvent(Fl_ATabs *tab)
  1365. {
  1366. return tab->which(Fl::event_x(),Fl::event_y());
  1367. }
  1368. void flSetText(Fl_Text_Display *textdisplay,char *text)
  1369. {
  1370. Fl_Text_Buffer *buff;
  1371. buff=textdisplay->buffer();
  1372. buff->remove(1,buff->length());
  1373. buff->append(text);
  1374. }
  1375. void flSetEditTextColor(Fl_Text_Display *textdisplay,int r,int g,int b)
  1376. {
  1377. textdisplay->textcolor(fl_rgb_color(r,g,b));
  1378. textdisplay->cursor_color(fl_rgb_color(r,g,b));
  1379. }
  1380. void flRedrawText(Fl_Text_Display *textdisplay,int start,int count)
  1381. {
  1382. textdisplay->redisplay_range(start,start+count);
  1383. }
  1384. void flAddText(Fl_Text_Display *textdisplay,char *text)
  1385. {
  1386. Fl_Text_Buffer *buff;
  1387. buff=textdisplay->buffer();
  1388. buff->append(text);
  1389. // edit->show_insert_position();
  1390. }
  1391. char *flGetText(Fl_Text_Display *textdisplay,int start,int count)
  1392. {
  1393. Fl_Text_Buffer *buff;
  1394. buff=textdisplay->buffer();
  1395. if (count<0) count=buff->length()-start;
  1396. return buff->text_range(start,start+count);
  1397. }
  1398. int flLinePos(Fl_Text_Display *textdisplay,int line)
  1399. {
  1400. Fl_Text_Buffer *buff;
  1401. buff=textdisplay->buffer();
  1402. return buff->skip_lines(0,line);
  1403. }
  1404. int flLineCount(Fl_Text_Display *textdisplay,int pos)
  1405. {
  1406. Fl_Text_Buffer *buff;
  1407. buff=textdisplay->buffer();
  1408. return buff->count_lines(0,pos);
  1409. }
  1410. int flLineStart(Fl_Text_Display *textdisplay,int pos)
  1411. {
  1412. Fl_Text_Buffer *buff;
  1413. buff=textdisplay->buffer();
  1414. return buff->line_start(pos);
  1415. }
  1416. int flTextLength(Fl_Text_Display *textdisplay)
  1417. {
  1418. Fl_Text_Buffer *buff;
  1419. buff=textdisplay->buffer();
  1420. return buff->length();
  1421. }
  1422. void flCharPosXY(Fl_Text_Display *textdisplay, int charpos, int *x, int *y)
  1423. {
  1424. ((MaxGUITextArea< Fl_Text_Display >*)textdisplay)->pos_to_xy(charpos,x,y);
  1425. }
  1426. void flSetWrapMode(Fl_Text_Display *textdisplay, int mode, int col)
  1427. {
  1428. textdisplay->wrap_mode(mode,col);
  1429. }
  1430. void flReplaceText(Fl_Text_Display *textdisplay,int start,int count,char *text)
  1431. {
  1432. Fl_Text_Buffer *buff;
  1433. buff=textdisplay->buffer();
  1434. if (count<0) count=buff->length()-start;
  1435. buff->replace(start,start+count,text);
  1436. }
  1437. void flSelectText(Fl_Text_Display *textdisplay,int start,int count)
  1438. {
  1439. Fl_Text_Buffer *buff;
  1440. buff=textdisplay->buffer();
  1441. if (count<0) count=buff->length()-start;
  1442. buff->select(start,start+count);
  1443. textdisplay->insert_position(start+count);
  1444. }
  1445. void flShowPosition(Fl_Text_Display *textdisplay)
  1446. {
  1447. textdisplay->show_insert_position();
  1448. }
  1449. void flSetTextCallback(Fl_Text_Display *textdisplay,void(*callback)(int,int,int,int,const char*,void*),void *user)
  1450. {
  1451. Fl_Text_Buffer *buff;
  1452. buff=textdisplay->buffer();
  1453. buff->add_modify_callback(callback,user);
  1454. textdisplay->when(FL_WHEN_NOT_CHANGED|FL_WHEN_CHANGED|FL_WHEN_ENTER_KEY_ALWAYS|FL_WHEN_RELEASE);
  1455. }
  1456. int flGetCursorPos(Fl_Text_Display *textdisplay)
  1457. {
  1458. int start,endpos;
  1459. Fl_Text_Buffer *buff;
  1460. buff=textdisplay->buffer();
  1461. if (buff->selection_position(&start,&endpos)){
  1462. if (endpos>start) return start;
  1463. }
  1464. return textdisplay->insert_position();
  1465. }
  1466. int flGetSelectionLen(Fl_Text_Display *textdisplay)
  1467. {
  1468. int start,endpos;
  1469. Fl_Text_Buffer *buff;
  1470. buff=textdisplay->buffer();
  1471. if (buff->selection_position(&start,&endpos)){
  1472. return endpos-start;
  1473. }
  1474. return 0;
  1475. }
  1476. void flSetTextTabs(Fl_Text_Display *textdisplay,int tabs)
  1477. {
  1478. Fl_Text_Buffer *buff;
  1479. buff=textdisplay->buffer();
  1480. buff->tab_distance(tabs);
  1481. }
  1482. void flActivateText(Fl_Text_Display *textdisplay)
  1483. {
  1484. textdisplay->show_cursor(1);
  1485. }
  1486. void flCutText(Fl_Text_Editor *editor)
  1487. {
  1488. Fl_Text_Editor::kf_cut(0,editor);
  1489. }
  1490. void flCopyText(Fl_Text_Editor *editor)
  1491. {
  1492. Fl_Text_Editor::kf_copy(0,editor);
  1493. }
  1494. void flPasteText(Fl_Text_Editor *editor)
  1495. {
  1496. Fl_Text_Editor::kf_paste(0,editor);
  1497. }
  1498. typedef Fl_Text_Display::Style_Table_Entry style;
  1499. #define FLSTYLE_TABLELENGTH 128
  1500. struct flStyle
  1501. {
  1502. flStyle *next;
  1503. Fl_Text_Display *owner;
  1504. Fl_Text_Buffer *buffer;
  1505. int count;
  1506. style table[128];
  1507. flStyle *prev;
  1508. };
  1509. static flStyle *stylelist = NULL;
  1510. flStyle *GetStyle(Fl_Text_Display *e)
  1511. {
  1512. flStyle *s;
  1513. for (s=stylelist;s;s=s->next)
  1514. {
  1515. if (s->owner==e) return s;
  1516. }
  1517. if (!s)
  1518. {
  1519. s=new flStyle;
  1520. if(stylelist) stylelist->prev=s;
  1521. s->next=stylelist;
  1522. stylelist=s;
  1523. s->prev = NULL;
  1524. s->owner=e;
  1525. s->buffer=new Fl_Text_Buffer;
  1526. memset(s->table,0,sizeof(s->table));
  1527. s->count=0;
  1528. e->highlight_data(s->buffer,s->table,FLSTYLE_TABLELENGTH,'A',0,0); //stylecallback,s);
  1529. }
  1530. return s;
  1531. }
  1532. void* flFreeTextDisplay(Fl_Text_Display *textdisplay)
  1533. {
  1534. flStyle *s;
  1535. Fl_Text_Buffer* buff;
  1536. for (s=stylelist;s;s=s->next)
  1537. {
  1538. if (s->owner==textdisplay){
  1539. if(s->prev){
  1540. s->prev->next = s->next;
  1541. if(s->next) s->next->prev = s->prev;
  1542. } else {
  1543. stylelist = s->next;
  1544. stylelist->prev = NULL;
  1545. }
  1546. break;
  1547. }
  1548. }
  1549. if (s){
  1550. delete s->buffer;
  1551. delete s;
  1552. }
  1553. return textdisplay->buffer();
  1554. }
  1555. void flSetTextFont(Fl_Text_Display *textdisplay,Fl_Font s)
  1556. {
  1557. flStyle *style;
  1558. int i;
  1559. textdisplay->textfont(s);
  1560. style=GetStyle(textdisplay);
  1561. for (i=0;i<FLSTYLE_TABLELENGTH;i++)
  1562. {
  1563. style->table[i].font=(Fl_Font)s;
  1564. }
  1565. }
  1566. void flSetTextSize(Fl_Text_Display *textdisplay,Fl_Fontsize s)
  1567. {
  1568. flStyle *style;
  1569. int i;
  1570. textdisplay->textsize(s);
  1571. style=GetStyle(textdisplay);
  1572. for (i=0;i<FLSTYLE_TABLELENGTH;i++)
  1573. {
  1574. style->table[i].size=s;
  1575. }
  1576. }
  1577. int flGetTextStyleChar(Fl_Text_Display *textdisplay,int r,int g,int b,Fl_Font font,Fl_Fontsize size)
  1578. {
  1579. flStyle *s;
  1580. style *e;
  1581. int i;
  1582. Fl_Color rgb;
  1583. s=GetStyle(textdisplay);
  1584. rgb=fl_rgb_color(r,g,b);
  1585. for (i=0;i<s->count;i++)
  1586. {
  1587. e=&s->table[i];
  1588. if (e->color==rgb && e->size==size && e->font==font) return 'A'+i;
  1589. }
  1590. if (s->count==FLSTYLE_TABLELENGTH) return 0;
  1591. e=&s->table[s->count];
  1592. e->color=rgb;
  1593. e->font=(Fl_Font)font;
  1594. e->size=size;
  1595. return 'A'+s->count++;
  1596. }
  1597. void flSetTextStyle(Fl_Text_Display *textdisplay,char *text)
  1598. {
  1599. Fl_Text_Buffer *buff;
  1600. flStyle *s;
  1601. s=GetStyle(textdisplay);
  1602. buff=s->buffer;
  1603. buff->remove(0,buff->length());
  1604. buff->append(text);
  1605. }
  1606. void flAddTextStyle(Fl_Text_Display *textdisplay,char *text)
  1607. {
  1608. Fl_Text_Buffer *buff;
  1609. flStyle *s;
  1610. s=GetStyle(textdisplay);
  1611. buff=s->buffer;
  1612. buff->append(text);
  1613. }
  1614. void flReplaceTextStyle(Fl_Text_Display *textdisplay,int start,int count,char *text)
  1615. {
  1616. Fl_Text_Buffer *buff;
  1617. flStyle *s;
  1618. s=GetStyle(textdisplay);
  1619. buff=s->buffer;
  1620. if (count<0) count=buff->length()-start;
  1621. buff->replace(start,start+count,text);
  1622. }
  1623. void flInsertTextStyle(Fl_Text_Display *textdisplay,int start,char *text)
  1624. {
  1625. Fl_Text_Buffer *buff;
  1626. flStyle *s;
  1627. s=GetStyle(textdisplay);
  1628. buff=s->buffer;
  1629. if (buff) buff->insert(start,text);
  1630. }
  1631. void flDeleteTextStyle(Fl_Text_Display *textdisplay,int start,int count)
  1632. {
  1633. Fl_Text_Buffer *buff;
  1634. flStyle *s;
  1635. s=GetStyle(textdisplay);
  1636. buff=s->buffer;
  1637. if (buff)
  1638. {
  1639. if (count<0) count=buff->length()-start;
  1640. buff->remove(start,count);
  1641. }
  1642. }
  1643. void flSetView(Fl_Help_View *view, const char *html)
  1644. {
  1645. view->value(html);
  1646. }
  1647. void flSeekView(Fl_Help_View *view, const char *anchor)
  1648. {
  1649. view->topline(anchor);
  1650. }
  1651. void flRedirectView(Fl_Help_View *view, char *url)
  1652. {
  1653. redirect_url=stringcopy(url); // Seb was here, not freed by Fl_Help_View
  1654. }
  1655. void flSetLineView(Fl_Help_View *view, int line)
  1656. {
  1657. view->topline(line);
  1658. }
  1659. int flGetLineView(Fl_Help_View *view)
  1660. {
  1661. return view->gettopline();
  1662. }
  1663. void flSetPathView(Fl_Help_View *view, const char *path)
  1664. {
  1665. view->filepath(path);
  1666. }
  1667. char *flGetPathView(Fl_Help_View *view)
  1668. {
  1669. return view->filepath();
  1670. }
  1671. int flIsLinkView(Fl_Help_View *view)
  1672. {
  1673. return view->fileislink();
  1674. }
  1675. void flSetStyleView(Fl_Help_View *view, int flag)
  1676. {
  1677. view->setstyle(flag);
  1678. }
  1679. void flSetProgress(Fl_Progress *progbar,float val)
  1680. {
  1681. progbar->value(val);
  1682. }
  1683. void (*menucallback)(Fl_Widget*,void*);
  1684. void *flCreateMenu(int n,void (*callback)(Fl_Widget*,void*))
  1685. {
  1686. menucallback=callback;
  1687. return calloc(n,sizeof(Fl_Menu_Item));
  1688. }
  1689. void flSetMenuItem(Fl_Menu_Item* menu,int item,char *name,int shortcut,void *user,int flags, Fl_Font fonthandle, Fl_Fontsize fontsize)
  1690. {
  1691. if((item<0) || (item>=menu->size())) return;
  1692. Fl_Menu_Item *p=&menu[item];
  1693. p->text=stringcopy(name);
  1694. p->shortcut_=shortcut;
  1695. p->callback_=menucallback;
  1696. p->user_data_=user;
  1697. p->flags=flags;
  1698. p->labeltype_=0;
  1699. p->labelfont_=fonthandle;
  1700. p->labelsize_=fontsize;
  1701. p->labelcolor_=0;
  1702. }
  1703. void *flPopupMenu(Fl_Menu_Item *menuitem,void *n)
  1704. {
  1705. const Fl_Menu_Item *result;
  1706. result=menuitem->popup( Fl::event_x(),Fl::event_y() );
  1707. if (result) return result->user_data_;
  1708. return n;
  1709. }
  1710. void flSetMenu(Fl_Menu_ *menu,void *stack)
  1711. {
  1712. menu->copy((Fl_Menu_Item *)stack);
  1713. free((Fl_Menu_Item*)stack);
  1714. }
  1715. void* fluRootNode( Flu_Tree_Browser* tree ){
  1716. return (void*) tree->get_root();
  1717. }
  1718. void* fluSelectedNode( Flu_Tree_Browser* tree, int index ){
  1719. return (void*) tree->get_selected( index );
  1720. }
  1721. void* fluCallbackNode( Flu_Tree_Browser* tree ){
  1722. return (void*) tree->callback_node();
  1723. }
  1724. int fluCallbackReason( Flu_Tree_Browser* tree ){
  1725. return tree->callback_reason();
  1726. }
  1727. void* fluInsertNode( Flu_Tree_Browser::Node* parent, int pos, const char* text ){
  1728. return (void*) parent->insert( text, pos );
  1729. }
  1730. void* fluAddNode( Flu_Tree_Browser::Node* parent, const char* text ){
  1731. return (void*) parent->add( text );
  1732. }
  1733. void fluRemoveNode( Flu_Tree_Browser* tree, Flu_Tree_Browser::Node* node ){
  1734. tree->remove( node );
  1735. }
  1736. void fluSetNode( Flu_Tree_Browser::Node* node, const char* text, Fl_RGB_Image* iconimage ){
  1737. node->label( text );node->leaf_icon( iconimage );node->branch_icon( iconimage );
  1738. }
  1739. void fluSetNodeUserData( Flu_Tree_Browser::Node* node, void* user_data ){
  1740. node->user_data( user_data );
  1741. }
  1742. void* fluNodeUserData( Flu_Tree_Browser::Node* node ){
  1743. return node->user_data();
  1744. }
  1745. void fluExpandNode( Flu_Tree_Browser::Node* node, int collapse ){
  1746. node->open( (collapse ? false:true) );
  1747. }
  1748. void fluSelectNode( Flu_Tree_Browser::Node* node ){
  1749. node->select_only();
  1750. }