/*
**************************************************************************
                                 description
                             --------------------
    copyright            : (C) 2000-2002 by Andreas Zehender
    email                : zehender@kde.org
**************************************************************************

**************************************************************************
*                                                                        *
*  This program is free software; you can redistribute it and/or modify  *
*  it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or     *
*  (at your option) any later version.                                   *
*                                                                        *
**************************************************************************/

#include "pmactions.h"

#include <tqcombobox.h>
#include <tqwhatsthis.h>
#include <tqspinbox.h>
#include <tqlabel.h>
#include <tqstyle.h>
#include <tqpainter.h>
#include <ktoolbar.h>
#include <ktoolbarbutton.h>

#include "pmdebug.h"

// Fixed widths are calculated wrong in a toolbar.
// Fixed sizeHint for the combo box to return
// at least the minimum size
class PMComboBox : public TQComboBox
{
public:
   PMComboBox( TQWidget* parent, const char* name = 0 )
         : TQComboBox( parent, name )
   {
   }

   virtual TQSize minimumSizeHint( ) const
   {
      TQSize s = TQComboBox::minimumSizeHint( );
      return s.expandedTo( minimumSize( ) );
   }
   virtual TQSize sizeHint( ) const
   {
      TQSize s = TQComboBox::sizeHint( );
      return s.expandedTo( minimumSize( ) );
   }
};

PMComboAction::PMComboAction( const TQString& text, int accel, const TQObject* receiver, const char* member,
                              TQObject* parent, const char* name )
      : KAction( text, accel, parent, name )
{
   m_receiver = receiver;
   m_member = member;
   m_minWidth = 0;
   m_maxWidth = 0;
}

PMComboAction::~PMComboAction( )
{
}

int PMComboAction::plug( TQWidget* w, int index )
{
   if( !w->inherits( "KToolBar" ) )
      return -1;

   KToolBar* toolBar = ( KToolBar* ) w;

   int id = KAction::getToolButtonID( );

   TQComboBox* comboBox = new PMComboBox( toolBar );
   if( m_minWidth > 0 )
      comboBox->setMinimumWidth( m_minWidth );
   if( m_maxWidth > 0 )
      comboBox->setMaximumWidth( m_maxWidth );

   toolBar->insertWidget( id, m_minWidth > 0 ? m_minWidth : 300,
                          comboBox, index );
   connect( comboBox, TQT_SIGNAL( activated( int ) ), m_receiver, m_member );

   addContainer( toolBar, id );

   connect( toolBar, TQT_SIGNAL( destroyed( ) ), this, TQT_SLOT( slotDestroyed( ) ) );

   //toolBar->setItemAutoSized( id, true );

   m_combo = comboBox;

   emit plugged( );

   TQWhatsThis::add( comboBox, whatsThis( ) );

   return containerCount( ) - 1;
}

void PMComboAction::unplug( TQWidget *w )
{
   if( !w->inherits( "KToolBar" ) )
      return;

   KToolBar *toolBar = ( KToolBar* ) w;

   int idx = findContainer( w );

   toolBar->removeItem( itemId( idx ) );

   removeContainer( idx );
   m_combo = 0L;
}


// Use a toolbutton instead of a label so it is styled correctly.
// copied from konq_actions.cc
class PMToolBarLabel : public TQToolButton
{
public:
   PMToolBarLabel( const TQString& text, TQWidget* parent = 0, const char* name = 0 )
         : TQToolButton( parent, name )
   {
      setText( text );
   }
protected:
   TQSize sizeHint( ) const
   {
      int w = fontMetrics( ).width( text( ) );
      int h = fontMetrics( ).height( );
      return TQSize( w, h );
   }
   void drawButton( TQPainter* p )
   {
      // Draw the background
      style( ).drawComplexControl( TQStyle::CC_ToolButton, p, this, rect( ), colorGroup( ),
                                   TQStyle::Style_Enabled, TQStyle::SC_ToolButton );
      // Draw the label
      style( ).drawControl( TQStyle::CE_ToolButtonLabel, p, this, rect( ), colorGroup( ),
                            TQStyle::Style_Enabled );
   }
};

PMLabelAction::PMLabelAction( const TQString &text, TQObject *parent, const char *name )
    : KAction( text, 0, parent, name )
{
   m_button = 0;
}

int PMLabelAction::plug( TQWidget *widget, int index )
{
   //do not call the previous implementation here

   if( widget->inherits( "KToolBar" ) )
   {
      KToolBar* tb = ( KToolBar* ) widget;

      int id = KAction::getToolButtonID( );

      m_button = new PMToolBarLabel( text( ), widget );
      tb->insertWidget( id, m_button->width( ), m_button, index );

      addContainer( tb, id );

      connect( tb, TQT_SIGNAL( destroyed( ) ), this, TQT_SLOT( slotDestroyed( ) ) );

      return containerCount( ) - 1;
  }

  return -1;
}

void PMLabelAction::unplug( TQWidget *widget )
{
   if( widget->inherits( "KToolBar" ) )
   {
      KToolBar* bar = ( KToolBar* ) widget;
      
      int idx = findContainer( bar );
      
      if( idx != -1 )
      {
         bar->removeItem( itemId( idx ) );
         removeContainer( idx );
      }
      
      m_button = 0;
      return;
   }
}


PMSpinBoxAction::PMSpinBoxAction( const TQString& text, int accel, const TQObject* receiver, const char* member,
                                  TQObject* parent, const char* name )
      : KAction( text, accel, parent, name )
{
   m_receiver = receiver;
   m_member = member;
}

PMSpinBoxAction::~PMSpinBoxAction( )
{
}

int PMSpinBoxAction::plug( TQWidget* w, int index )
{
   if( !w->inherits( "KToolBar" ) )
      return -1;

   KToolBar* toolBar = ( KToolBar* ) w;

   int id = KAction::getToolButtonID( );
   
   TQSpinBox* spinBox = new TQSpinBox( -1000, 1000, 1, w );
   toolBar->insertWidget( id, 70, spinBox, index );
   
   connect( spinBox, TQT_SIGNAL( valueChanged( int ) ), m_receiver, m_member );

   addContainer( toolBar, id );

   connect( toolBar, TQT_SIGNAL( destroyed( ) ), this, TQT_SLOT( slotDestroyed( ) ) );
   //toolBar->setItemAutoSized( id, false );

   m_spinBox = spinBox;

   emit plugged( );

   TQWhatsThis::add( spinBox, whatsThis( ) );

   return containerCount( ) - 1;
}

void PMSpinBoxAction::unplug( TQWidget *w )
{
   if( !w->inherits( "KToolBar" ) )
      return;

   KToolBar *toolBar = (KToolBar *)w;

   int idx = findContainer( w );

   toolBar->removeItem( itemId( idx ) );

   removeContainer( idx );
   m_spinBox = 0L;
}

#include "pmactions.moc"