#ifndef cmUiDrvrFltk_h #define cmUiDrvrFltk_h class Fl_Tabs; class Fl_Widget; class Fl_Button; class Fl_Check_Button; class Fl_Menu_Button; class Fl_Select_Browser; class Fl_Box; class Fl_Input; class Fl_Value_Input; class Fl_Value_Slider; class Fl_Progress; class Fl_Vert_Progress; class Fl_File_Btn; class Fl_Text_Display; class cmUiDrvrFltk { public: cmUiDrvrFltk(cmCtx_t* ctx, Fl_Tabs* tabs, cmUiDriverFunc_t cbFunc, void* cbArg); virtual ~cmUiDrvrFltk(); void setBaseWindow( Fl_Tabs* tabs ); void setCallback( cmUiDriverFunc_t cbFunc, void* cbArg ); static cmUiRC_t cmUiDriverFunc( void* arg, const cmUiDriverArg_t* a ); private: struct panel_str; typedef struct ctl_str { cmUiCId_t cId; // control type id unsigned usrId; // user id unsigned flags; // flags from this controls create call. struct panel_str* pnl; // parent panel Fl_Widget* wdgt; // this controls FLTK wdgt ptr cmUiDriverArg_t cbArg; // cached callback arg. recd used by this ctl struct ctl_str* link; // panel.ctls list link union { Fl_Button* btn; Fl_Check_Button* chk; Fl_Menu_Button* mbt; Fl_Select_Browser* lst; Fl_Box* lbl; Fl_Input* str; Fl_Text_Display* con; Fl_Value_Input* num; Fl_Value_Slider* sld; Fl_Progress* prg; Fl_Progress* mtr; Fl_File_Btn* fnb; } u; } ctl_t; typedef struct panel_str { cmUiDrvrFltk* drvr; // parent driver object Fl_Group* grp; // panel Widget unsigned appId; // id of the app. this panel serves unsigned usrId; // panels id int x_offs; // left control border int y_offs; // top control border ctl_t* ctls; // this panels control list cmUiDriverArg_t cbArg; // cached callback arg recd used by this ctl struct panel_str* link; // links used by _panels } panel_t; cmErr_t _err; // Fl_Tabs* _tabs; // Fl_Tabs Widget containing the panels cmUiDriverFunc_t _cbFunc; // application event callback function void* _cbArgs; // panel_t* _panels; // panel list ctl_t _dummy; // void _insertNewCtl( panel_t* pp, ctl_t* ctl, Fl_Widget* wp, unsigned flags ); bool _hasNoAlignFlags( unsigned flags ) const; cmUiRC_t _createCtl( const cmUiDriverArg_t* a ); cmUiRC_t _destroyCtl( unsigned appId, unsigned panelId, unsigned usrId, bool deleteWindowEleFlag ); cmUiRC_t _destroyCtl( panel_t* pp, unsigned usrId, bool deleteWindowEleFlag ); cmUiRC_t _createPanel( const cmUiDriverArg_t* a ); cmUiRC_t _setValueCtl( const cmUiDriverArg_t* a ); cmUiRC_t _enableCtl( const cmUiDriverArg_t* a ); cmUiRC_t _destroyAllPanels( bool deleteWindowEleFl ); cmUiRC_t _destroyPanel(panel_t* pp, bool deleteWindowEleFl ); cmUiRC_t _findPanel( unsigned appId, unsigned usrId, panel_t*& ppRef, panel_t*& prvPnlRef, bool errFl=true ); cmUiRC_t _findCtl( panel_t* pp, unsigned usrId, ctl_t*& ctlRef, ctl_t*& prvCtlRef, bool errFl=true ); void _doCb( ctl_t* ctl, cmUiDId_t dId, unsigned flags ); static void _s_ctl_cb(Fl_Widget* wp, void* data ); static void _s_tab_cb(Fl_Widget* wp, void* data ); }; #endif