| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #include <FLTKPropertyNameButtonWithHelp.h>
- #include <Fl/Fl.H>
- #include <Fl/fl_ask.H>
- #include <Fl/Fl_Menu_Button.H>
- #include "../cmCacheManager.h"
- 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 )
- {
- static bool helpBlobVisible = false;
- 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 );
- helpBlobVisible = true;
- eventManaged = 0;
- break;
- }
- case FL_LEAVE:
- {
- if( helpBlobVisible )
- {
- helpBlobVisible = false;
- helpBlob->hide();
- }
- eventManaged = 0;
- break;
- }
- case FL_MOVE:
- if( helpBlobVisible )
- {
- helpBlobVisible = false;
- helpBlob->hide();
- }
- eventManaged = 0;
- break;
- case FL_PUSH:
- if( Fl::event_button() == FL_RIGHT_MOUSE )
- {
- PopupMenu();
- }
- 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();
- }
- }
- ////////////////////////////////////////////////////////////////
- // This popup menu is displayed when the
- // right mouse button is pressed
- void
- PropertyNameButtonWithHelp::
- PopupMenu(void)
- {
- static Fl_Menu_Button * popupMenu = 0;
- if( !popupMenu )
- {
- popupMenu = new Fl_Menu_Button(0,0,100,200);
- }
-
- popupMenu->type( Fl_Menu_Button::POPUP3 );
- popupMenu->add("Remove|Properties...");
- popupMenu->popup();
-
- switch( popupMenu->value() )
- {
- case 0: // Remove
- {
- const char * propertyName = label();
- int answer = fl_ask( "Do you want to remove property %s", propertyName );
- if( answer == 1 )
- {
- // Remove the entry from the cache
- cmCacheManager::GetInstance()->RemoveCacheEntry( propertyName );
- // Get the parent: Fl_Tile that manages the whole row in the GUI
- Fl_Group * parentGroup = (Fl_Group *) parent();
- // Get the grandParent: Fl_Pack with the property list
- Fl_Group * grandParentGroup = (Fl_Group *) parentGroup->parent();
- // Remove the row from the list
- grandParentGroup->remove( *parentGroup );
- // Destroy the row
- delete parentGroup; // Patricide... ?
- // Redraw the list
- grandParentGroup->redraw();
- return;
- }
- break;
- }
- case 1: // Properties
- break;
- }
- }
- } // end namespace fltk
|