/***************************************************************************
                             transactionform.h
                             ----------
    begin                : Sun May 14 2006
    copyright            : (C) 2006 by Thomas Baumgart
    email                : Thomas Baumgart <ipwizard@users.sourceforge.net>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef TRANSACTIONFORM_H
#define TRANSACTIONFORM_H

// ----------------------------------------------------------------------------
// QT Includes

#include <tqtable.h>
#include <tqvaluelist.h>
#include <tqvaluevector.h>
#include <tqpalette.h>
#include <tqwidgetlist.h>
#include <tqtabbar.h>

// ----------------------------------------------------------------------------
// KDE Includes

// ----------------------------------------------------------------------------
// Project Includes

#include <kmymoney/mymoneyaccount.h>
#include <kmymoney/mymoneyobject.h>
#include <kmymoney/register.h>

#include "../kmymoneysettings.h"

class MyMoneyObjectContainer;

namespace KMyMoneyTransactionForm {

/**
  * @author Thomas Baumgart
  */
class TabBar : public TQTabBar
{
  Q_OBJECT
  
public:
  typedef enum {
    SignalNormal = 0,      // standard signal behaviour
    SignalNever,           // don't signal selection of a tab at all
    SignalAlways           // always signal selection of a tab
  } SignalEmissionE;

  TabBar(TQWidget* parent = 0, const char* name = 0);
  virtual ~TabBar() {}

  SignalEmissionE setSignalEmission(SignalEmissionE type);

  void copyTabs(const TabBar* otabbar);

  void addTab(TQTab* tab, int id);

  void setIdentifier(TQTab* tab, int newId);

  TQTab* tab(int id) const;

  int currentTab(void) const;

public slots:
  /**
    * overridden for internal reasons, API not changed
    */
  virtual void setCurrentTab( int );

  /**
    * overridden for internal reasons, API not changed
    */
  virtual void setCurrentTab( TQTab * );

  /**
    * overridden for internal reasons, API not changed
    */
  virtual void show(void);

protected slots:
  void slotTabSelected(int id);

signals:
  void tabSelected(int id);

private:
  SignalEmissionE    m_signalType;
  
  /**
    * maps our internal action ids to those used by
    * qt3. Since it does not seem possible to tell
    * qt3 to use our ids everywhere (in TQAccel) we
    * need to know which is which
    */
  TQMap<int, int>     m_idMap;
  
  
};

typedef enum {
  LabelColumn1 = 0,
  ValueColumn1,
  LabelColumn2,
  ValueColumn2,
  // insert new values above this line
  MaxColumns
} Column;

/**
  * @author Thomas Baumgart
  */
class TransactionForm : public TransactionEditorContainer
{
  Q_OBJECT
  
public:
  TransactionForm(TQWidget *parent = 0, const char *name = 0);
  virtual ~TransactionForm() {}

  /**
    * Override the TQTable member function to avoid display of focus
    */
  void paintFocus(TQPainter* /*p*/, const TQRect& /*cr*/ ) {}

  TQSize tableSize(void) const;
  TQSize sizeHint(void) const;
  void adjustColumn(Column col);
  void clear(void);

  void paintCell(TQPainter* painter, int row, int col, const TQRect& r, bool selected, const TQColorGroup& cg);

  void resize(int col);

  void arrangeEditWidgets(TQMap<TQString, TQWidget*>& editWidgets, KMyMoneyRegister::Transaction* t);
  void removeEditWidgets(TQMap<TQString, TQWidget*>& editWidgets);
  void tabOrder(TQWidgetList& tabOrderWidgets, KMyMoneyRegister::Transaction* t) const;

  /**
    * reimplemented to prevent normal cell selection behavior
    */
  void setCurrentCell(int, int) {}

  TabBar* tabBar(TQWidget* parent = 0);

  void setupForm(const MyMoneyAccount& acc);

  void enableTabBar(bool b);

  protected:
  /**
    * reimplemented to support TQWidget::WState_BlockUpdates
    */
  void drawContents(TQPainter *p, int cx, int cy, int cw, int ch);

  /**
    * reimplemented to prevent normal mouse press behavior
    */
  void contentsMousePressEvent(TQMouseEvent* ev) { ev->ignore(); }

  /**
    * reimplemented to prevent normal mouse move behavior
    */
  void contentsMouseMoveEvent(TQMouseEvent* ev) { ev->ignore(); }

  /**
    * reimplemented to prevent normal mouse release behavior
    */
  void contentsMouseReleaseEvent(TQMouseEvent* ev) { ev->ignore(); }

  /**
    * reimplemented to prevent normal mouse double click behavior
    */
  void contentsMouseDoubleClickEvent(TQMouseEvent* ev) { ev->ignore(); }

  /**
    * reimplemented to prevent normal keyboard behavior
    */
  void keyPressEvent(TQKeyEvent* ev) { ev->ignore(); }

  /**
    * Override logic and use standard TQFrame behaviour
    */
  bool focusNextPrevChild(bool next);

public slots:
  void slotSetTransaction(KMyMoneyRegister::Transaction* item);

protected slots:
  void resize(void);

  /**
    * Helper method to convert @a int into @a KMyMoneyRegister::Action
    */
  void slotActionSelected(int);

signals:
  /**
    * This signal is emitted when a user selects a tab. @a id
    * contains the tab's id (e.g. KMyMoneyRegister::ActionDeposit)
    */
  void newTransaction(KMyMoneyRegister::Action id);

protected:
  KMyMoneyRegister::Transaction*       m_transaction;
  TQColorGroup                          m_cellColorGroup;
  TabBar*                              m_tabBar;
};


} // namespace

#endif
// vim:cin:si:ai:et:ts=2:sw=2:
