diff --git a/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.cxx b/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.cxx new file mode 100644 index 000000000..33c8f646b --- /dev/null +++ b/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.cxx @@ -0,0 +1,160 @@ +#include +#include + +namespace fltk { + +Fl_Window * PropertyNameButtonWithHelp::helpBlob = 0; +Fl_Box * PropertyNameButtonWithHelp::helpText = 0; +unsigned int PropertyNameButtonWithHelp::counter = 0; +int PropertyNameButtonWithHelp::lastMousePositionX = 0; +int PropertyNameButtonWithHelp::lastMousePositionY = 0; + + + +PropertyNameButtonWithHelp +::PropertyNameButtonWithHelp(int x,int y, int w, int h, const char * l): +Fl_Button(x,y,w,h,l) +{ + counter++; // one more object instantiated +} + + + + +PropertyNameButtonWithHelp:: +~PropertyNameButtonWithHelp( ) +{ + counter--; + if( counter == 0 ) + { + delete helpBlob; + delete helpText; + } +} + + + +void +PropertyNameButtonWithHelp +::SetHelpText( const char * text ) +{ + m_HelpText = text; +} + + + +void +PropertyNameButtonWithHelp +::ShowHelp( void ) +{ + if( helpBlob ) + { + helpBlob->show(); + } +} + + +void +PropertyNameButtonWithHelp +::HideHelp( void ) +{ + if( helpBlob ) + { + helpBlob->hide(); + } +} + + + + +int +PropertyNameButtonWithHelp:: +handle( int event ) +{ + + const float delayForShowingHelpBlob = 1.0; // seconds + + const int maxWidth = 300; + const int lineHeight = 20; + + + // Create the help blob window if it doesn't exist + if( !helpBlob ) + { + helpBlob = new Fl_Window(0,0,200,20,""); + helpBlob->border( 0 ); + helpText = new Fl_Box(0,0,200,20,""); + helpBlob->end(); + Fl_Color yellowHelp = FL_YELLOW; + helpBlob->color( yellowHelp ); + helpText->color( yellowHelp ); + helpText->align( FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_WRAP ); + } + + int eventManaged = 0; + + switch( event ) + { + case FL_ENTER: + { + lastMousePositionX = Fl::event_x(); + lastMousePositionY = Fl::event_y(); + const float factor = helpText->labelsize() * 0.5; + int height = lineHeight; + int area = (int)( m_HelpText.size() * factor ); + int width = area; + if( width > maxWidth ) + { + width = maxWidth; + height = area / maxWidth * lineHeight; + if( area % maxWidth != 0 ) + { + height += lineHeight; + } + } + helpText->size( width, height ); + helpBlob->size( width, height ); + helpText->label( m_HelpText.c_str() ); + Fl_Widget * parent = this->parent(); + Fl::add_timeout( delayForShowingHelpBlob, ShowHelpBlobCallback, (void *)parent ); + eventManaged = 0; + break; + } + case FL_LEAVE: + helpBlob->hide(); + eventManaged = 0; + break; + case FL_MOVE: + helpBlob->hide(); + eventManaged = 0; + break; + default: + eventManaged = 0; + } + + + return eventManaged; + +} + +void +PropertyNameButtonWithHelp:: +ShowHelpBlobCallback( void * data ) +{ + + Fl_Widget * thisWidget = Fl::belowmouse(); + Fl_Widget * eventWidget = (Fl_Widget *)data; + + if( thisWidget == eventWidget ) + { + + helpBlob->position( lastMousePositionX, lastMousePositionY ); + helpBlob->show(); + } + +} + + + + +} // end namespace fltk diff --git a/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.h b/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.h new file mode 100644 index 000000000..040b2e9b0 --- /dev/null +++ b/Source/FLTKDialog/FLTKPropertyNameButtonWithHelp.h @@ -0,0 +1,51 @@ +#ifndef FLTKPropertyNameButtonWithHelp_h +#define FLTKPropertyNameButtonWithHelp_h + +#include +#include +#include +#include +#include +#include + +namespace fltk { + + +/** + + Helper class for managing help blobs over the property name + + */ +class PropertyNameButtonWithHelp : public Fl_Button +{ + public: + PropertyNameButtonWithHelp(int x,int y,int w, int h,const char *l); + virtual ~PropertyNameButtonWithHelp(); + int handle(int event); + void SetHelpText( const char * helpText); + void ShowHelp(void); + void HideHelp(void); + + static void ShowHelpBlobCallback( void * ); + + private: + + string m_HelpText; + + // Class variables + static Fl_Window * helpBlob; + static Fl_Box * helpText; + static unsigned int counter; + static int lastMousePositionX; + static int lastMousePositionY; + +}; + + + + +} // end namespace fltk + +#endif + +