/***************************************************************************

                         main part of kvoctrain

    -----------------------------------------------------------------------

    begin          : Thu Mar 11 20:50:53 MET 1999

    copyright      : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
                     (C) 2001 The KDE-EDU team
                     (C) 2004-2005 Peter Hedlund <peter.hedlund@kdemail.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 KVOCTRAIN_H
#define KVOCTRAIN_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

// include files for QT
#include <tqpainter.h>

// include files for KDE
#include <tdeapplication.h>
#include <tdemainwindow.h>
#include <tdeaction.h>
#include <tdemenubar.h>
#include <tdemessagebox.h>
#include <krandomsequence.h>

// application specific includes
#include "kvoctrainview.h"
#include "kvoctraintable.h"
#include "query-dialogs/QueryDlgBase.h"
#include "kvtnewstuff.h"
#include "langset.h"

class TQTimer;
class KLined;
class ProgressDlg;
class kvoctrainDoc;
class SimpleQueryDlg;
class MCQueryDlg;
class VerbQueryDlg;
class RandomQueryDlg;
class AdjQueryDlg;
class ArtQueryDlg;
class EntryDlg;

class KLineEdit;
class KComboBox;
class KProgress;

class KVTNewStuff;

/**
  * This Class is the base class for your application. It sets up the main
  * window and reads the config file as well as providing a menubar, toolbar
  * and statusbar. For the main view, an instance of class kvoctrainView is
  * created which creates your view.
  */
class kvoctrainApp : public TDEMainWindow
{
  Q_OBJECT
  

public:
  /** construtor */
  kvoctrainApp(TQWidget *parent = NULL, const char *name = NULL);
  /** destructor */
  ~kvoctrainApp();
  void initActions();

  /** setup the statusbar */
  void initStatusBar();
  /** setup the main document*/
  void initDoc();
  /** setup the main view*/
  void initView();
  /** save the app-specific options on slotAppExit or by an Options dialog */
  void saveOptions();
  /** read the app-specific options on init() or by an Options dialog */
  void readOptions();

  void saveLanguages();
  void readLanguages();

  /** saves the window properties for each open window during session end to the session config file, including saving the currently
  * opened file by a temporary filename provided by TDEApplication.
  * @see TDEMainWindow#saveProperties
  */
  virtual void saveProperties(TDEConfig* );
  /** reads the session config file and restores the application's state including the last opened files and documents by reading the
  * temporary files saved by saveProperties()
  * @see TDEMainWindow#readProperties
  */
  virtual void readProperties(TDEConfig* );

  /** Whether the user has selected a range of items. **/
  bool hasSelection();

 signals:
  void progressChanged (kvoctrainDoc *, int curr_percent);

 public slots:
  void keyPressEvent( TQKeyEvent *e );
  void keyReleaseEvent( TQKeyEvent *e );
  void slotModifiedDoc(bool mod);
  void slotCurrentCellChanged(int row, int col);
//  void slotSelectEntry (int row, int col, int key_state);

  /** edit an entry */
  void slotEditEntry(int row, int col);
  void slotEditCallBack(int res);

  void commitEntryDlg(bool force);
  void createEntryDlg(int row, int col);
  void setDataEntryDlg (int row, int col);
  void removeEntryDlg();

  /** select an entry */
  void slotSaveSelection ();
  void slotCancelSelection ();
  void slotSelectAll();
  void slotProgress(kvoctrainDoc*,int);
  void slotResumeSearch(const TQString&);
  void slotSearchNext();
  void slotInitSearch();
  void slotCreateLesson(int header);
  void slotCleanVocabulary ();
  void slotChooseLesson(int id);
//  void slotSearchClip();
  void slotSetHeaderProp (int header_and_id);
  void slotHeaderCallBack (int cmd_and_id);
  void slotHeaderStatus (int cmd_and_id);
  void slotHeaderMenu(int header, int x, int y);
  /** append language to table */
  void slotAppendLang(int header);
  /** exit query mode */
  void slotStopQuery(bool show_view);
  bool queryClose();
  /** overloaded for Message box on last window exit */
  bool queryExit();
  /** set up options */
  void slotGeneralOptionsPage(int index);
  void slotGeneralOptions();
  //void slotQueryOptions();
  //void slotQueryOptions(int pageindex);
  void slotApplyPreferences();
  void slotDocProps();
  void slotDocPropsLang();
  void slotShowStatist();
  void slotCreateRandom();
  /** set up vocabulary and learning submenus */
  void aboutToShowVocabAppendLanguage();
  void aboutToShowVocabSetLanguage();
  void aboutToShowVocabRemoveLanguage();
  void aboutToShowLearn();

  /** starts random query mode */
  void slotRestartQuery();
  void slotStartTypeQuery(int col, const TQString & type);
  void slotStartPropertyQuery(int col, QueryType property);
  void slotStartQuery(const TQString & trans, const TQString & org, bool create_new);

  void slotTimeOutRandomQuery(QueryDlgBase::Result res);
  void slotTimeOutMultipleChoice(QueryDlgBase::Result res);
  void slotTimeOutQuery(QueryDlgBase::Result res);
  void slotTimeOutType(QueryDlgBase::Result res);
  void slotTimeOutProperty(QueryDlgBase::Result res);


  void slotTimeOutBackup();

  /** open a new application window */
  void slotFileNew();
  /** open a document */
  void slotFileOpen();
  /** opens a file from the recent files menu */
  void slotFileOpenRecent(const KURL& url);
  /** open a sample document */
  void slotFileOpenExample();
  /** download new vocabularies */
  void slotGHNS();
  void loadfileFromPath(const KURL &, bool addRecent=true);
  /** merge a document */
  void slotFileMerge();
  /** save a document */
  void slotFileSave();
  /** save a document under a different filename*/
  void slotFileSaveAs();
  void slotFilePrint();
  void slotFileQuit();

  /** put the marked text/object into the clipboard*/
  void slotEditCopy();
  void slotSmartSearchClip();
  void slotAppendRow();
  void slotRemoveRow();
  void slotEditRow();
  /** paste the clipboard into the document*/
  void slotEditPaste();

  /** change the status message to text */
  void slotStatusMsg(const TQString &text);
  /** change the status message of the whole statusbar temporary */
  void slotStatusHelpMsg(const TQString &text);

public:
  void removeProgressBar();
  void prepareProgressBar();
  void fillLessonBox(kvoctrainDoc *);
  void loadDocProps(kvoctrainDoc *);
  void saveDocProps(kvoctrainDoc *);
  static vector<int> getCsvOrder(kvoctrainDoc *);

private:
  // TDEAction pointers to enable/disable actions
  TDEAction* fileNew;
  TDEAction* fileOpen;
  TDEAction* fileOpenExample;
  TDEAction* fileGHNS;
  TDERecentFilesAction* fileOpenRecent;
  TDEAction* fileMerge;
  TDEAction* fileSave;
  TDEAction* fileSaveAs;
  TDEAction* filePrint;
  TDEAction* fileQuit;

  TDEAction* editCopy;
  TDEAction* editPaste;
  TDEAction* editSelectAll;
  TDEAction* editClearSelection;
  TDEAction* editSearchFromClipboard;
  TDEAction* editAppend;
  TDEAction* editEditSelectedArea;
  TDEAction* editRemoveSelectedArea;
  TDEAction* editSaveSelectedArea;

  TDEAction* vocabShowStatistics;
  TDEAction* vocabAssignLessons;
  TDEAction* vocabCleanUp;
  TDESelectAction* vocabAppendLanguage;
  TDESelectAction* vocabSetLanguage;
  TDESelectAction* vocabRemoveLanguage;
  TDEAction* vocabDocumentProperties;
  TDEAction* vocabLanguageProperties;
  KWidgetAction* vocabLessons;
  KWidgetAction* vocabSearch;

  //TDEAction* learningResumeQuery;
  //TDEAction* learningResumeMultipleChoice;

  TDEAction* configToolbar;
  TDEAction* configNotifications;
  TDEAction* configApp;
  //TDEAction* configQueryOptions;

  TQString lastPixName;

  TQPopupMenu *learn_menu;

  /** view is the main widget which represents your working area. The View
    * class should handle all events of the view widget.  It is kept empty so
    * you can create your view according to your application's needs by
    * changing the view class. */
  kvoctrainView *view;
  /** doc represents your actual document and is created only once. It keeps
    * information such as filename and does the serialization of your files.
    */
  kvoctrainDoc *doc;

  friend class kvoctrainView;

  vector<QueryEntryRef> random_expr1, random_expr2;
  // Vectors for use in Leitner style learning. There is no
  // correct_0_times, we simply reuse random_expr1.
  vector<QueryEntryRef> correct_1_times, correct_2_times, correct_3_times;
  QuerySelection queryList;
  //TDENewStuff       *m_GHNS;
  TQTimer          *btimer;
  int              random_query_nr;
  bool             querymode;
  bool             querying;
  TQString          def_lang;
  TQPopupMenu      *header_m;
  int              act_query_col;
  TQString          act_query_trans;
  TQString          act_query_org;
  LangSet          langset;
  int              searchpos;
  TQString          searchstr;
  KLineEdit       *searchLine;
  KComboBox       *lessons;
  int              act_lesson;
  QueryManager     querymanager;
  bool             controlActive;
  bool             shiftActive;
  bool             altActive;
  ProgressDlg     *pdlg;
  KProgress       *pbar;
  TQLabel          *vslide_label;
  TQLabel          *pron_label;
  TQLabel          *rem_label;
  TQLabel          *type_label;
  SimpleQueryDlg  *simpleQueryDlg;
  EntryDlg        *entryDlg;
  MCQueryDlg      *mcQueryDlg;
  VerbQueryDlg    *verbQueryDlg;
  RandomQueryDlg  *randomQueryDlg;
  AdjQueryDlg     *adjQueryDlg;
  ArtQueryDlg     *artQueryDlg;
  int              num_queryTimeout;
  int              query_cycle;
  int              query_num;
  int              query_startnum;
  QueryType        queryType;
  KRandomSequence  random;
  KVTNewStuff     *m_newStuff;
};

#endif // KVOCTRAIN_H

