/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: FLTKPropertyItemRow.cxx,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:09 $
  Version:   $Revision: 1.1.1.1 $

  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
