/***************************************************************************
                          kdiff3.h  -  description
                             -------------------
    begin                : Don Jul 11 12:31:29 CEST 2002
    copyright            : (C) 2002-2007 by Joachim Eibl
    email                : joachim.eibl at gmx.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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 KDIFF3_H
#define KDIFF3_H

#include "diff.h"

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

// include files for TQt
#include <tqdialog.h>
#include <tqsplitter.h>
#include <tqscrollbar.h>

// include files for KDE
#include <tdeapplication.h>
#include <tdemainwindow.h>
#include <tdeaccel.h>
#include <tdeaction.h>
#include <kurl.h>
#include <tdeparts/mainwindow.h>


// forward declaration of the KDiff3 classes
class OptionDialog;
class FindDialog;
class ManualDiffHelpDialog;
class DiffTextWindow;
class DiffTextWindowFrame;
class MergeResultWindow;
class WindowTitleWidget;
class Overview;

class TQScrollBar;
class TQComboBox;
class TQLineEdit;
class TQCheckBox;
class TQSplitter;


class KDiff3Part;
class DirectoryMergeWindow;
class DirectoryMergeInfo;


class ReversibleScrollBar : public TQScrollBar
{
   Q_OBJECT
  
   bool* m_pbRightToLeftLanguage;
   int m_realVal;
public:
   ReversibleScrollBar( Qt::Orientation o, TQWidget* pParent, bool* pbRightToLeftLanguage )
      : TQScrollBar( o, pParent )
   {
      m_pbRightToLeftLanguage=pbRightToLeftLanguage;
      m_realVal=0;
      connect( this, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotValueChanged(int)));
   }
   void setAgain(){ setValue(m_realVal); }
public slots:
   void slotValueChanged(int i)
   {
      m_realVal = i;
      if(m_pbRightToLeftLanguage && *m_pbRightToLeftLanguage)
         m_realVal = maxValue()-(i-minValue());
      emit valueChanged2(m_realVal);
   }
   void setValue(int i)
   {
      if(m_pbRightToLeftLanguage && *m_pbRightToLeftLanguage)
         TQScrollBar::setValue( maxValue()-(i-minValue())  );
      else
         TQScrollBar::setValue( i );
   }
signals:
   void valueChanged2(int);
};

class KDiff3App : public TQSplitter
{
  Q_OBJECT
  

  public:
    /** constructor of KDiff3App, calls all init functions to create the application.
     */
    KDiff3App( TQWidget* parent, const char* name, KDiff3Part* pKDiff3Part );
    ~KDiff3App();

    bool isPart();

    /** initializes the TDEActions of the application */
    void initActions( TDEActionCollection* );

    /** save general Options like all bar positions and status as well as the geometry
        and the recent file list to the configuration file */
    void saveOptions( TDEConfig* );

    /** read general Options again and initialize all variables like the recent file list */
    void readOptions( TDEConfig* );

    // Finish initialisation (virtual, so that it can be called from the shell too.)
    virtual void completeInit(const TQString& fn1="", const TQString& fn2="", const TQString& fn3="");

    /** queryClose is called by TDEMainWindow on each closeEvent of a window. Against the
     * default implementation (only returns true), this calles saveModified() on the document object to ask if the document shall
     * be saved if Modified; on cancel the closeEvent is rejected.
     * @see TDEMainWindow#queryClose
     * @see TDEMainWindow#closeEvent
     */
    virtual bool queryClose();
    virtual bool isFileSaved();

  signals:
     void createNewInstance( const TQString& fn1, const TQString& fn2, const TQString& fn3 );
  protected:
    void initDirectoryMergeActions();
    /** sets up the statusbar for the main window by initialzing a statuslabel. */
    void initStatusBar();

    /** creates the centerwidget of the TDEMainWindow instance and sets it as the view */
    void initView();

  public slots:

    /** open a file and load it into the document*/
    void slotFileOpen();
    void slotFileOpen2( TQString fn1, TQString fn2, TQString fn3, TQString ofn,
                        TQString an1, TQString an2, TQString an3, TotalDiffStatus* pTotalDiffStatus );

    void slotFileNameChanged(const TQString& fileName, int winIdx);

    /** save a document */
    void slotFileSave();
    /** save a document by a new filename*/
    void slotFileSaveAs();

    void slotFilePrint();

    /** closes all open windows by calling close() on each memberList item until the list is empty, then quits the application.
     * If queryClose() returns false because the user canceled the saveModified() dialog, the closing breaks.
     */
    void slotFileQuit();
    /** put the marked text/object into the clipboard and remove
     *  it from the document
     */
    void slotEditCut();
    /** put the marked text/object into the clipboard
     */
    void slotEditCopy();
    /** paste the clipboard into the document
     */
    void slotEditPaste();
    /** toggles the toolbar
     */
    void slotViewToolBar();
    /** toggles the statusbar
     */
    void slotViewStatusBar();
    /** changes the statusbar contents for the standard label permanently, used to indicate current actions.
     * @param text the text that is displayed in the statusbar
     */
    void slotStatusMsg(const TQString &text);

  private:
    /** the configuration object of the application */
    //TDEConfig *config;

    // TDEAction pointers to enable/disable actions
    TDEAction* fileOpen;
    TDEAction* fileSave;
    TDEAction* fileSaveAs;
    TDEAction* filePrint;
    TDEAction* fileQuit;
    TDEAction* fileReload;
    TDEAction* editCut;
    TDEAction* editCopy;
    TDEAction* editPaste;
    TDEAction* editSelectAll;
    TDEToggleAction* viewToolBar;
    TDEToggleAction* viewStatusBar;

////////////////////////////////////////////////////////////////////////
// Special KDiff3 specific stuff starts here
    TDEAction *editFind;
    TDEAction *editFindNext;

    TDEAction *goCurrent;
    TDEAction *goTop;
    TDEAction *goBottom;
    TDEAction *goPrevUnsolvedConflict;
    TDEAction *goNextUnsolvedConflict;
    TDEAction *goPrevConflict;
    TDEAction *goNextConflict;
    TDEAction *goPrevDelta;
    TDEAction *goNextDelta;
    TDEToggleAction *chooseA;
    TDEToggleAction *chooseB;
    TDEToggleAction *chooseC;
    TDEToggleAction *autoAdvance;
    TDEToggleAction *wordWrap;
    TDEAction* splitDiff;
    TDEAction* joinDiffs;
    TDEAction* addManualDiffHelp;
    TDEAction* clearManualDiffHelpList;
    TDEToggleAction *showWhiteSpaceCharacters;
    TDEToggleAction *showWhiteSpace;
    TDEToggleAction *showLineNumbers;
    TDEAction* chooseAEverywhere;
    TDEAction* chooseBEverywhere;
    TDEAction* chooseCEverywhere;
    TDEAction* chooseAForUnsolvedConflicts;
    TDEAction* chooseBForUnsolvedConflicts;
    TDEAction* chooseCForUnsolvedConflicts;
    TDEAction* chooseAForUnsolvedWhiteSpaceConflicts;
    TDEAction* chooseBForUnsolvedWhiteSpaceConflicts;
    TDEAction* chooseCForUnsolvedWhiteSpaceConflicts;
    TDEAction* autoSolve;
    TDEAction* unsolve;
    TDEAction* mergeHistory;
    TDEAction* mergeRegExp;
    TDEToggleAction *showWindowA;
    TDEToggleAction *showWindowB;
    TDEToggleAction *showWindowC;
    TDEAction *winFocusNext;
    TDEAction *winFocusPrev;
    TDEAction* winToggleSplitOrientation;
    TDEToggleAction *dirShowBoth;
    TDEAction *dirViewToggle;
    TDEToggleAction *overviewModeNormal;
    TDEToggleAction *overviewModeAB;
    TDEToggleAction *overviewModeAC;
    TDEToggleAction *overviewModeBC;


    TQPopupMenu* m_pMergeEditorPopupMenu;

    TQSplitter*  m_pMainSplitter;
    TQWidget*    m_pMainWidget;
    TQWidget*    m_pMergeWindowFrame;
    ReversibleScrollBar* m_pHScrollBar;
    TQScrollBar* m_pDiffVScrollBar;
    TQScrollBar* m_pMergeVScrollBar;

    DiffTextWindow* m_pDiffTextWindow1;
    DiffTextWindow* m_pDiffTextWindow2;
    DiffTextWindow* m_pDiffTextWindow3;
    DiffTextWindowFrame* m_pDiffTextWindowFrame1;
    DiffTextWindowFrame* m_pDiffTextWindowFrame2;
    DiffTextWindowFrame* m_pDiffTextWindowFrame3;
    TQSplitter* m_pDiffWindowSplitter;

    MergeResultWindow* m_pMergeResultWindow;
    WindowTitleWidget* m_pMergeResultWindowTitle;
    bool m_bTripleDiff;

    TQSplitter* m_pDirectoryMergeSplitter;
    DirectoryMergeWindow* m_pDirectoryMergeWindow;
    DirectoryMergeInfo* m_pDirectoryMergeInfo;
    bool m_bDirCompare;

    Overview* m_pOverview;

    TQWidget* m_pCornerWidget;

    TotalDiffStatus m_totalDiffStatus;

    SourceData m_sd1;
    SourceData m_sd2;
    SourceData m_sd3;

   TQString m_outputFilename;
   bool m_bDefaultFilename;

   DiffList m_diffList12;
   DiffList m_diffList23;
   DiffList m_diffList13;

   DiffBufferInfo m_diffBufferInfo;
   Diff3LineList m_diff3LineList;
   Diff3LineVector m_diff3LineVector;
   //ManualDiffHelpDialog* m_pManualDiffHelpDialog;
   ManualDiffHelpList m_manualDiffHelpList;

   int m_neededLines;
   int m_maxWidth;
   int m_DTWHeight;
   bool m_bOutputModified;
   bool m_bFileSaved;
   bool m_bTimerBlock;      // Synchronisation

   OptionDialog* m_pOptionDialog;
   FindDialog*   m_pFindDialog;

   void init( bool bAuto=false, TotalDiffStatus* pTotalDiffStatus=0, bool bLoadFiles=true );

   virtual bool eventFilter( TQObject* o, TQEvent* e );
   virtual void resizeEvent(TQResizeEvent*);

   bool improveFilenames(bool bCreateNewInstance);

   bool runDiff( const LineData* p1, int size1, const LineData* p2, int size2, DiffList& diffList, int winIdx1, int winIdx2 );
   bool runDiff( const LineData* p1, int size1, const LineData* p2, int size2, DiffList& diffList );
   bool canContinue();

   void choose(int choice);

   TDEActionCollection* actionCollection();
   KStatusBar*        statusBar();
   TDEToolBar*          toolBar(const char*);
   KDiff3Part*        m_pKDiff3Part;
   KParts::MainWindow*       m_pKDiff3Shell;
   bool m_bAutoFlag;
   bool m_bAutoMode;
   void recalcWordWrap(int nofVisibleColumns=-1);

public slots:
   void resizeDiffTextWindow(int newWidth, int newHeight);
   void resizeMergeResultWindow();
   void slotRecalcWordWrap();

   void showPopupMenu( const TQPoint& point );

   void scrollDiffTextWindow( int deltaX, int deltaY );
   void scrollMergeResultWindow( int deltaX, int deltaY );
   void setDiff3Line( int line );
   void sourceMask( int srcMask, int enabledMask );

   void slotDirShowBoth();
   void slotDirViewToggle();

   void slotUpdateAvailabilities();
   void slotEditSelectAll();
   void slotEditFind();
   void slotEditFindNext();
   void slotGoCurrent();
   void slotGoTop();
   void slotGoBottom();
   void slotGoPrevUnsolvedConflict();
   void slotGoNextUnsolvedConflict();
   void slotGoPrevConflict();
   void slotGoNextConflict();
   void slotGoPrevDelta();
   void slotGoNextDelta();
   void slotChooseA();
   void slotChooseB();
   void slotChooseC();
   void slotAutoSolve();
   void slotUnsolve();
   void slotMergeHistory();
   void slotRegExpAutoMerge();
   void slotChooseAEverywhere();
   void slotChooseBEverywhere();
   void slotChooseCEverywhere();
   void slotChooseAForUnsolvedConflicts();
   void slotChooseBForUnsolvedConflicts();
   void slotChooseCForUnsolvedConflicts();
   void slotChooseAForUnsolvedWhiteSpaceConflicts();
   void slotChooseBForUnsolvedWhiteSpaceConflicts();
   void slotChooseCForUnsolvedWhiteSpaceConflicts();
   void slotConfigure();
   void slotConfigureKeys();
   void slotRefresh();
   void slotSelectionEnd();
   void slotSelectionStart();
   void slotClipboardChanged();
   void slotOutputModified(bool);
   void slotAfterFirstPaint();
   void slotMergeCurrentFile();
   void slotReload();
   void slotCheckIfCanContinue( bool* pbContinue );
   void slotShowWhiteSpaceToggled();
   void slotShowLineNumbersToggled();
   void slotAutoAdvanceToggled();
   void slotWordWrapToggled();
   void slotShowWindowAToggled();
   void slotShowWindowBToggled();
   void slotShowWindowCToggled();
   void slotWinFocusNext();
   void slotWinFocusPrev();
   void slotWinToggleSplitterOrientation();
   void slotOverviewNormal();
   void slotOverviewAB();
   void slotOverviewAC();
   void slotOverviewBC();
   void slotSplitDiff();
   void slotJoinDiffs();
   void slotAddManualDiffHelp();
   void slotClearManualDiffHelpList();

   void slotNoRelevantChangesDetected();
};

#endif // KDIFF3_H
