diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2005-09-23 21:47:46 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2005-09-23 21:47:46 (GMT) |
commit | 46521aef8cf2523990dfbf90dbdf435a94f8e5c4 (patch) | |
tree | 7da33dc6434184423e86b635357cfda4632e5d38 /Source/FLTKDialog/FLTKPropertyItemRow.cxx | |
parent | f7d926d072a6582237282ef9a3302c8a1e8e94b1 (diff) | |
download | CMake-46521aef8cf2523990dfbf90dbdf435a94f8e5c4.zip CMake-46521aef8cf2523990dfbf90dbdf435a94f8e5c4.tar.gz CMake-46521aef8cf2523990dfbf90dbdf435a94f8e5c4.tar.bz2 |
ENH: try to find a gui for the Mac
Diffstat (limited to 'Source/FLTKDialog/FLTKPropertyItemRow.cxx')
-rw-r--r-- | Source/FLTKDialog/FLTKPropertyItemRow.cxx | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/Source/FLTKDialog/FLTKPropertyItemRow.cxx b/Source/FLTKDialog/FLTKPropertyItemRow.cxx new file mode 100644 index 0000000..5c12637 --- /dev/null +++ b/Source/FLTKDialog/FLTKPropertyItemRow.cxx @@ -0,0 +1,387 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Insight Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "FLTKPropertyItemRow.h" +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Tile.H> +#include <FL/fl_ask.H> +#include <FL/fl_file_chooser.H> +#include <FL/Fl_Color_Chooser.H> +#include <FL/Fl_Menu_Button.H> +#include "../cmCacheManager.h" +#include "FLTKPropertyList.h" +#include "CMakeSetupGUIImplementation.h" +#include <stdio.h> +#include "../cmake.h" +#include "../cmCacheManager.h" + +namespace fltk { + + + +CMakeSetupGUIImplementation * PropertyItemRow::m_CMakeSetup = 0; + + + + +PropertyItemRow +::PropertyItemRow( PropertyItem * pItem ):Fl_Tile(0,0,10,10,"") +{ + + m_PropertyItem = pItem; + m_ItemValue = new ItemValue; + + const unsigned int fontsize = 11; + const unsigned int nameWidth = 200; + const unsigned int textWidth = 1400; + const unsigned int checkWidth = textWidth; + const unsigned int browseWidth = 20; + const unsigned int firstColumn = 0; + + const unsigned int secondColumn = nameWidth; + + const unsigned int rowHeight = 20; + + size( nameWidth + textWidth , rowHeight ); + + // Make the parent Fl_Pack widget at least a row wide. + parent()->size( nameWidth + textWidth , rowHeight ); + + m_NameButton = new + Fl_Button( firstColumn, 0, nameWidth, rowHeight, + m_PropertyItem->m_propName.c_str() ); + + m_NameButton->align( FL_ALIGN_CLIP | FL_ALIGN_LEFT | FL_ALIGN_INSIDE ); + m_NameButton->labelsize( fontsize ); + m_NameButton->box( FL_DOWN_BOX ); + m_NameButton->size( secondColumn, rowHeight ); + m_NameButton->callback( NameButtonCallback, (void *)m_PropertyItem ); + if( m_PropertyItem->m_NewValue ) + { + m_NameButton->color(FL_RED); + } + + switch( m_PropertyItem->m_nItemType ) + { + case PropertyList::COMBO: + { + break; + } + case PropertyList::EDIT: + { + + Fl_Input * input = new + Fl_Input( secondColumn, 0, textWidth ,rowHeight ,""); + input->value( m_PropertyItem->m_curValue.c_str() ); + input->textsize( fontsize ); + input->callback( InputTextCallback, (void *)m_PropertyItem ); + input->when( FL_WHEN_CHANGED ); + + break; + } + case PropertyList::COLOR: + { + Fl_Button * colorButton = new + Fl_Button( secondColumn, 0, textWidth ,rowHeight ,""); + colorButton->labelsize( fontsize ); + //colorButton->color(); + colorButton->callback( ColorSelectionCallback, (void *)m_PropertyItem ); + + break; + } + case PropertyList::FILE: + { + + Fl_Button * browseButton = new + Fl_Button( secondColumn, 0, browseWidth ,rowHeight ,"..."); + browseButton->labelsize( fontsize ); + + Fl_Input * input = new + Fl_Input( secondColumn+browseWidth, 0, textWidth ,rowHeight ,""); + input->value( m_PropertyItem->m_curValue.c_str() ); + input->textsize( fontsize ); + + m_ItemValue->m_InputText = input; + m_ItemValue->m_PropertyItem = m_PropertyItem; + + browseButton->callback( BrowsePathCallback, (void *)m_ItemValue ); + input->callback( InputTextCallback, m_PropertyItem ); + input->when( FL_WHEN_CHANGED ); + + break; + } + case PropertyList::CHECKBOX: + { + Fl_Button * button = new + Fl_Button( secondColumn, 0, checkWidth ,rowHeight ,""); + button->align( FL_ALIGN_INSIDE | FL_ALIGN_LEFT ); + button->callback( CheckButtonCallback, (void *)m_PropertyItem ); + + if( m_PropertyItem->m_curValue == "ON" ) + { + button->label(" ON "); + button->value(1); + } + else if( m_PropertyItem->m_curValue == "OFF" ) + { + button->label(" OFF "); + button->value(0); + } + button->type( FL_TOGGLE_BUTTON ); + button->labelsize( fontsize ); + break; + } + case PropertyList::PATH: + { + + Fl_Button * browseButton = new + Fl_Button( secondColumn, 0, browseWidth ,rowHeight ,"..."); + browseButton->labelsize( fontsize ); + + Fl_Input * input = new + Fl_Input( secondColumn+browseWidth, 0, textWidth ,rowHeight ,""); + input->value( m_PropertyItem->m_curValue.c_str() ); + input->textsize( fontsize ); + + m_ItemValue->m_InputText = input; + m_ItemValue->m_PropertyItem = m_PropertyItem; + + browseButton->callback( BrowsePathCallback, (void *)m_ItemValue ); + input->callback( InputTextCallback, (void *)m_PropertyItem ); + input->when( FL_WHEN_CHANGED ); + + break; + } + break; + default: + fl_alert("Unkown item type %d",m_PropertyItem->m_nItemType); + break; + } + + + end(); // Close the inclusion of widgets in the Tile object + +} + + + + + +PropertyItemRow::~PropertyItemRow( ) +{ + delete m_ItemValue; +} + + + +void PropertyItemRow +::SetCMakeSetupGUI( CMakeSetupGUIImplementation * cmakeSetup ) +{ + m_CMakeSetup = cmakeSetup; +} + + + +void +PropertyItemRow:: +NameButtonCallback( Fl_Widget * widget, void * data) +{ + Fl_Button * button = (Fl_Button *)widget; + PropertyItem * pItem = (PropertyItem *)data; + + static Fl_Menu_Button * popupMenu = 0; + if( !popupMenu ) + { + int lastMousePositionX = Fl::event_x(); + int lastMousePositionY = Fl::event_y(); + popupMenu = new Fl_Menu_Button(lastMousePositionX, + lastMousePositionY,100,200); + } + + popupMenu->type( Fl_Menu_Button::POPUP3 ); + popupMenu->add("Help|Remove|Properties..."); + popupMenu->popup(); + + typedef enum { + HELP=0, + REMOVE, + PROPERTIES + } MenuOptions; + + + switch( popupMenu->value() ) + { + case HELP: + fl_message( pItem->m_HelpString.c_str() ); + break; + case REMOVE: // Remove + { + const char * propertyName = pItem->m_propName.c_str(); + int answer = fl_ask( "Do you want to remove property %s", propertyName ); + if( answer == 1 ) + { + // Remove the entry from the cache + m_CMakeSetup->GetCMakeInstance()->GetCacheManager()->RemoveCacheEntry(propertyName); + // Get the parent: Fl_Tile that manages the whole row in the GUI + Fl_Group * parentGroup = dynamic_cast<Fl_Group *>(button->parent()); + // Get the grandParent: Fl_Pack with the property list + Fl_Group * grandParentGroup = dynamic_cast<Fl_Group *>( parentGroup->parent() ); + // Remove the row from the list + grandParentGroup->remove( *parentGroup ); + // Destroy the row + delete parentGroup; // Patricide... ? + // Redraw the list + grandParentGroup->redraw(); + FillCacheManagerFromCacheGUI(); + return; + } + break; + } + case PROPERTIES: // Properties + break; + } +} + + + +void +PropertyItemRow:: +FillCacheManagerFromCacheGUI( void ) +{ + if( m_CMakeSetup ) + { + m_CMakeSetup->FillCacheManagerFromCacheGUI(); + } +} + + + +void +PropertyItemRow:: +CheckButtonCallback( Fl_Widget * widget, void * data) +{ + Fl_Button * button = (Fl_Button *)widget; + PropertyItem * pItem = (PropertyItem *)data; + + int value = button->value(); + + if( value ) + { + button->label(" ON "); + pItem->m_curValue = "ON"; + } + else + { + button->label(" OFF "); + pItem->m_curValue = "OFF"; + } + + pItem->m_Dirty = true; + + button->redraw(); + + FillCacheManagerFromCacheGUI(); + +} + + + +void +PropertyItemRow:: +InputTextCallback( Fl_Widget * widget, void * data) +{ + Fl_Input * input = (Fl_Input *)widget; + PropertyItem * item = (PropertyItem *)data; + + item->m_curValue = input->value(); + + item->m_Dirty = true; + + FillCacheManagerFromCacheGUI(); + +} + + + +void +PropertyItemRow:: +ColorSelectionCallback( Fl_Widget * widget, void * data) +{ + Fl_Button * colorButton = (Fl_Button *)widget; + PropertyItem * propertyItem = (PropertyItem *)data; + + static Fl_Color colorIndex = FL_FREE_COLOR; + + unsigned char red = 0; + unsigned char blue = 0; + unsigned char green = 0; + fl_color_chooser("Please pick a color",red,green,blue); + char buffer[300]; + sprintf( buffer,"RGB(%d,%d,%d)", red, green, blue ); + propertyItem->m_curValue = buffer; + Fl::set_color( colorIndex, red, green, blue ); + colorButton->color( colorIndex ); + colorIndex = (Fl_Color)( colorIndex + 1 ); + if( colorIndex == FL_FREE_COLOR + FL_NUM_FREE_COLOR ) + { + fl_alert("Maximum number of free colors used, recycling..."); + colorIndex = FL_FREE_COLOR; + } + + propertyItem->m_Dirty = true; + + colorButton->redraw(); + + FillCacheManagerFromCacheGUI(); + +} + + + + + + +void +PropertyItemRow:: +BrowsePathCallback( Fl_Widget * widget, void * data) +{ + ItemValue * itemValue = (ItemValue *)data; + Fl_Input * inputText = itemValue->m_InputText; + PropertyItem * propertyItem = itemValue->m_PropertyItem; + + const char * newpath = + fl_file_chooser("Select a path","*", inputText->value() ); + + if( newpath ) + { + propertyItem->m_curValue = newpath; + inputText->value( newpath ); + } + + propertyItem->m_Dirty = true; + + FillCacheManagerFromCacheGUI(); + +} + + + + +} // end namespace fltk |