/*
 *   khexedit - Versatile hex editor
 *   Copyright (C) 1999-2000  Espen Sand, espensa@online.no
 *
 *   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.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

#ifndef _TOPLEVEL_H_
#define _TOPLEVEL_H_

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

#include <tqptrlist.h>
#include <tdeapplication.h>
#include <tdestdaccel.h>
#include <tdemainwindow.h>

#include "hexbuffer.h"
#include "hexmanagerwidget.h"
#include "statusbarprogress.h"

class TQSignalMapper;
class TDEAction;
class TDERecentFilesAction;
class TDERadioAction;
class TDESelectAction;
class TDEToggleAction;
class TDEToolBarButton;
class KURL;
class CDragLabel;


class KHexEdit : public TDEMainWindow
{
  TQ_OBJECT
  

  enum StatusBarId
  {
    status_WriteProtect = 0,
    status_Layout       = 1,
    status_Offset       = 2,
    status_Size         = 3,
    status_Ovr          = 4,
    status_Modified     = 5,
    status_Selection    = 6,
    status_Progress     = 7
  };

  struct SActionList
  {
    TDEAction *insert;
    TDERecentFilesAction *openRecent;
    TDEAction *save;
    TDEAction *saveAs;
    TDEAction *revert;
    TDEAction *close;
    TDEAction *print;
    TDEAction *exportData;
    TDEAction *cancel;
    TDEToggleAction *readOnly;
    TDEToggleAction *resizeLock;
    TDEAction *newWindow;
    TDEAction *closeWindow;
    TDEAction *quit;
    TDEAction *undo;
    TDEAction *redo;
    TDEAction *cut;
    TDEAction *copy;
    TDEAction *paste;
    TDEAction *selectAll;
    TDEAction *unselect;
    TDEAction *find;
    TDEAction *findNext;
    TDEAction *findPrev;
    TDEAction *replace;
    TDEAction *gotoOffset;
    TDEAction *insertPattern;
    TDEAction *copyAsText;
    TDEAction *pasteToNewFile;
    TDEAction *pasteToNewWindow;
    TDERadioAction *hexadecimal;
    TDERadioAction *decimal;
    TDERadioAction *octal;
    TDERadioAction *binary;
    TDERadioAction *textOnly;
    TDEToggleAction *showOffsetColumn;
    TDEToggleAction *showTextColumn;
    TDEToggleAction *offsetAsDecimal;
    TDEToggleAction *dataUppercase;
    TDEToggleAction *offsetUppercase;
    TDERadioAction *defaultEncoding;
    TDERadioAction *usAsciiEncoding;
    TDERadioAction *ebcdicEncoding;
//     TDEAction *customEncoding;

    TDEAction *strings;
//     TDEAction *recordViewer;
    TDEAction *filter;
    TDEAction *characterTable;
    TDEAction *converter;
    TDEAction *statistics;

    TDEAction *addBookmark;
    TDEAction *replaceBookmark;
    TDEAction *removeBookmark;
    TDEAction *removeAllBookmark;
    TDEAction *nextBookmark;
    TDEAction *prevBookmark;

    TDEToggleAction *showFullPath;
    TDERadioAction *tabHide;
    TDERadioAction *tabShowBelowEditor;
    TDERadioAction *tabShowAboveEditor;
    TDERadioAction *conversionHide;
    TDERadioAction *conversionFloat;
    TDERadioAction *conversionEmbed;
    TDERadioAction *searchHide;
    TDERadioAction *searchShowAboveEditor;
    TDERadioAction *searchShowBelowEditor;

//     TDEAction *favorites;

    TQPtrList< TDEAction > bookmarkList;
    TQSignalMapper *bookmarkMapper;
  };

  public:
    KHexEdit( void );
    ~KHexEdit( void );

    inline void addStartupFile( const TQString &fileName );
    inline void setStartupOffset( uint offset );

  public slots:
    KHexEdit *newWindow( void );
    void pasteNewWindow( void );
    void closeWindow( void );
    void closeProgram( void );
    void statusBarPressed( int id );

    void operationChanged( bool state );
    void cursorChanged( SCursorState &state );
    void fileState( SFileState &state );
    void layoutChanged( const SDisplayLayout &layout );
    void inputModeChanged( const SDisplayInputMode &mode );
    void bookmarkChanged( TQPtrList<SCursorOffset> &list );
    void removeRecentFile( const TQString &fileName );
    void renameRecentFile( const TQString &curName, const TQString &newName );

    void setupCaption( const TQString &url );
    void fileActive( const TQString &url, bool onDisk );
    void fileRename( const TQString &curName, const TQString &newName );
    void fileClosed( const TQString &url );
    void readConfiguration( void );
    void writeConfiguration( void );
    void editMode( CHexBuffer::EEditMode editMode );
    void encodingChanged( const SEncodeState &state );
    void textWidth( uint width );

    void setDisplayMode( void );
    void showFullPath( void );
    void showDocumentTabs( void );
    void showConversionField( void );
    void showSearchBar( void );

    void setEncoding( void );
    void documentMenuCB( int id );

    /**
     *  Slot for opening a file among the recently opened files.
     */
    void slotFileOpenRecent( const KURL & );

protected:
    virtual bool queryExit( void );
    virtual bool queryClose( void );

  private slots:
    void delayedStartupOpen( void );
    void removeRecentFiles( void );
    void conversionClosed( void );
    void searchBarClosed( void );
    void resizeTest();

  private:
    void setupActions( void );
    void setupStatusBar( void );
    void open( TQStringList &fileList, TQStringList &offsetList );
    void initialize( bool openFiles );
    void addRecentFile( const TQString &fileName );
    bool closeAllWindow( void );
    void setUndoState( uint undoState );
    void setSelectionState( uint selectionOffset, uint selectionSize );
    void setSelectionText( uint selectionOffset, uint selectionSize );
    void addDocument( const TQString &fileName );
    void removeDocument( const TQString &fileName );
    void renameDocument( const TQString &curName, const TQString &newName );
    void setTickedDocument( const TQString &fileName );

    void writeConfiguration( TDEConfig &config );
    void readConfiguration( TDEConfig &config );
    bool eventFilter( TQObject *obj, TQEvent *event );

    int acceleratorNumKey( uint index );
    inline CHexEditorWidget *editor( void );
    inline CHexToolWidget *converter( void );
    inline CHexViewWidget *hexView( void );

  private:
    static TQPtrList<KHexEdit> mWindowList;
    CHexManagerWidget *mManager;
    TQStringList mDocumentList;

    TQStringList mStartupFileList;   ///< Files to automatically open on startup
    TQStringList mStartupOffsetList; ///< Start offset for those files.
    uint mStartupOffset; ///< Value read from the command line

    SActionList mAction;

    CDragLabel     *mDragLabel;
    TDEToolBarButton *mWriteProtectButton;

    bool mIsModified;
    bool mShowFullPath;
    bool mSelectionAsHexadecimal;
    uint mSelectionOffset;
    uint mSelectionSize;
    uint mUndoState;
    int  mRecentFileId;
};


inline void KHexEdit::addStartupFile( const TQString &fileName )
{
  mStartupFileList.prepend( fileName );
  mStartupOffsetList.prepend( TQString("%1").arg(mStartupOffset,0,16) );
  mStartupOffset = 0;
}

inline void KHexEdit::setStartupOffset( uint offset )
{
  mStartupOffset = offset;
}

inline CHexEditorWidget *KHexEdit::editor( void )
{
  return( mManager->editor() );
}

inline CHexViewWidget *KHexEdit::hexView( void )
{
  return( mManager->editor()->view() );
}

inline CHexToolWidget *KHexEdit::converter( void )
{
  return( mManager->converter() );
}



#endif


