summaryrefslogtreecommitdiffstats
path: root/khexedit/hexviewwidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'khexedit/hexviewwidget.h')
-rw-r--r--khexedit/hexviewwidget.h584
1 files changed, 584 insertions, 0 deletions
diff --git a/khexedit/hexviewwidget.h b/khexedit/hexviewwidget.h
new file mode 100644
index 0000000..9dc55e4
--- /dev/null
+++ b/khexedit/hexviewwidget.h
@@ -0,0 +1,584 @@
+/*
+ * khexedit - Versatile hex editor
+ * Copyright (C) 1999 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 _HEX_VIEW_WIDGET_H_
+#define _HEX_VIEW_WIDGET_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <qframe.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qscrollbar.h>
+
+#include <kapplication.h>
+#include <kcmenumngr.h>
+
+#include "hexclipboard.h"
+#include "hexbuffer.h"
+
+class CScrollBar : public QScrollBar
+{
+ Q_OBJECT
+
+ public:
+ CScrollBar( Orientation o, QWidget *parent, const char *name = 0 )
+ : QScrollBar( o, parent, name )
+ {
+ }
+
+ signals:
+ void hidden( void );
+
+ protected:
+ virtual void hideEvent( QHideEvent * )
+ {
+ emit hidden();
+ }
+};
+
+
+class CDragManager : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ enum EDragActivateMode
+ {
+ Movement = 0,
+ Timer = 1
+ };
+
+ public:
+ CDragManager( void );
+ void setActivateMode( EDragActivateMode mode );
+ void setup( int x, int y );
+ bool start( QMouseEvent *e );
+ bool clear( void );
+
+ protected:
+ virtual void timerEvent( QTimerEvent *e );
+
+ private:
+ void removeTimer( void );
+ void setupTimer( void );
+
+ signals:
+ void startDrag( bool asText );
+
+ private:
+ EDragActivateMode mActivateMode;
+ bool mPending;
+ int mTimerId;
+ QPoint mOrigin;
+};
+
+
+
+class CHexViewWidget : public QFrame
+{
+ Q_OBJECT
+
+ public:
+ CHexViewWidget( QWidget *parent, const char *name, CHexBuffer *hexBuffer );
+ ~CHexViewWidget( void );
+ inline bool widgetValid( void );
+
+ int readFile( QFile &file, const QString &url, CProgress &p );
+ int insertFile( QFile &file, CProgress &p );
+ int writeFile( QFile &file, CProgress &p );
+ int newFile( const QString &url );
+ void closeFile( void );
+ void initFile( void );
+ void setBuffer( CHexBuffer *hexBuffer );
+ void updateView( bool redraw, bool fixCursor );
+
+ void selectAll( void );
+ void unselect( void );
+ void unmark( void );
+ uint numPage( CHexPrinter &printer );
+ int print( CHexPrinter &printer, CProgress &p );
+ int exportText( const SExportText &ex, CProgress &p );
+ int exportHtml( const SExportHtml &ex, CProgress &p );
+ int exportCArray( const SExportCArray &ex, CProgress &p );
+
+ void copy( void );
+ void copyText( int columnSegment=CHexBuffer::VisibleColumn );
+ void paste( void );
+ void cut( void );
+ void undo( void );
+ void redo( void );
+ void addBookmark( int position );
+ void removeBookmark( bool all );
+ void replaceBookmark( void );
+ void gotoBookmark( uint position );
+ void gotoNextBookmark( bool next );
+ void benchmark( void );
+
+ virtual void setPalette( const QPalette & );
+ void setInputMode( SDisplayInputMode &mode );
+ void setLayout( SDisplayLayout &layout );
+ void setCursor( const SDisplayCursor &cursor, bool updateDisplay );
+ void setColor( const SDisplayColor &color, bool updateDisplay );
+ void setFont( const SDisplayFontInfo &fontInfo, bool updateDisplay );
+ void setMisc( SDisplayMisc &misc );
+ void setInsertMode( bool insertMode );
+ int setEncoding( CConversion::EMode mode, CProgress &p );
+ void reportEncoding( void );
+
+ int findFirst( SSearchControl &sc );
+ int findNext( SSearchControl &sc );
+ int findWrap( SSearchControl &sc );
+ int replaceAll( SSearchControl &sc, bool init );
+ int replaceMarked( SSearchControl &sc );
+ int collectStrings( CStringCollectControl &sc );
+ int collectStatistic( SStatisticControl &sc, CProgress &p );
+
+
+ inline void setPopupMenu( QPopupMenu *popupMenu );
+ inline void setDocumentMenu( QPopupMenu *popupMenu );
+ inline bool insertMode( void );
+ inline int scrollBarWidth( void );
+ inline int dataWidth( void );
+ inline int defaultWidth( void );
+ inline uint offset( void );
+ inline uint bookmarkCount( void );
+ inline bool modified( void );
+ inline void setModified( bool modified );
+ inline const QDateTime &diskModifyTime( void );
+ inline bool losslessEncoding( CConversion::EMode mode );
+ inline const SEncodeState &encoding( void );
+ inline bool documentPresent( void );
+ inline bool urlValid( void );
+ inline QString &url( void );
+ inline void setUrl( QString &url );
+ inline const CHexBuffer *hexBuffer( void );
+
+ public slots:
+ void filter( SFilterControl &fc );
+ void insert( SInsertData &id );
+ void insert( const QByteArray &buf );
+ void append( const QByteArray &buf );
+ void valueOnCursor( QByteArray &buf, uint size );
+ void paletteChanged( void );
+ void fontChanged( void );
+ void gotoOffset( uint offset, uint bit, bool fromCursor, bool forward );
+ void gotoOffset( uint offset );
+ void setMark( uint offset, uint size, bool moveCursor );
+ void setDropHighlight( bool mode );
+
+ protected:
+ virtual void drawFrame( QPainter *p );
+ virtual void paintEvent( QPaintEvent *e );
+ virtual void resizeEvent( QResizeEvent *e );
+ virtual void keyPressEvent( QKeyEvent *e );
+ virtual void keyReleaseEvent( QKeyEvent *e );
+ virtual void mousePressEvent( QMouseEvent *e );
+ virtual void mouseMoveEvent( QMouseEvent *e );
+ virtual void wheelEvent( QWheelEvent * );
+ virtual void mouseReleaseEvent( QMouseEvent *e );
+ virtual void dragEnterEvent( QDragEnterEvent *e );
+ virtual void dragLeaveEvent( QDragLeaveEvent *e );
+ virtual void dragMoveEvent( QDragMoveEvent *e );
+ virtual void dropEvent( QDropEvent *e );
+ virtual void showEvent( QShowEvent * );
+ virtual void timerEvent( QTimerEvent *e );
+ virtual void focusInEvent( QFocusEvent *e );
+ virtual void focusOutEvent( QFocusEvent *e );
+
+ protected slots:
+ void changeXPos( int pos );
+ void changeYPos( int pos );
+ void clipboardChanged( void );
+
+ signals:
+ void cursorChanged( SCursorState &state );
+ void fileState( SFileState &state );
+ void dataChanged( void );
+ void layoutChanged( const SDisplayLayout &layout );
+ void inputModeChanged( const SDisplayInputMode &mode );
+ void bookmarkChanged( QPtrList<SCursorOffset> &list );
+ void editMode( CHexBuffer::EEditMode editMode );
+ void encodingChanged( const SEncodeState &state );
+ void textWidth( uint width );
+ void fileName( const QString &url, bool onDisk );
+ void fileRename( const QString &curName, const QString &newName );
+ void fileClosed( const QString &url );
+
+ void pleaseOpenNewFile( void );
+ void pleaseStepFile( bool next );
+ void pleaseOpenFile(const QString &url,bool reloadWhenChanged,uint offset);
+
+ private:
+ void setSelection( uint offset, bool init );
+ void setCursorPosition( int x, int y, bool init, bool cellLevel );
+ void updateCursor( SCursorConfig &cc, bool always = false,
+ bool touchSelection = true );
+ void setEditMode( CHexBuffer::EEditMode mode );
+
+ void paintFrame( void );
+ void updateFrameSize( void );
+
+ void redrawInterval( uint start, uint stop );
+ void redrawLines( uint docLine, int numLine );
+ void redrawFromOffset( uint offset, bool finishWindow );
+ void paintText( const QRect &r, bool expand );
+ void paintCursor( int cursorMode );
+
+
+ void toggleEditor( void );
+ void cursorStep( SCursorConfig &cc, uint stepSize );
+ void cursorLeft( SCursorConfig &cc );
+ void cursorRight( SCursorConfig &cc );
+ void cursorHome( SCursorConfig &cc );
+ void cursorEnd( SCursorConfig &cc );
+ void cursorUp( SCursorConfig &cc );
+ void cursorDown( SCursorConfig &cc );
+ void cursorPageUp( SCursorConfig &cc );
+ void cursorPageDown( SCursorConfig &cc );
+ void cursorInsert( SCursorConfig &cc );
+ void cursorDelete( SCursorConfig &cc );
+ void cursorBackspace( SCursorConfig &cc );
+ void cursorInput( QChar c );
+
+ int bookmarkMenu( const QString &title );
+
+ static inline bool shiftButtonState( void );
+
+ inline void setupCursorTimer( void );
+ inline int startX( void );
+ inline int startY( void );
+ inline void setStartX( int val );
+ inline void setStartY( int val );
+ inline void updateWindow( bool completeRedraw, bool touchSelection );
+ inline void updateWindow( uint line );
+ inline void updateWindow( uint fromOffset, bool finishWindow );
+ inline void updateWindow( void );
+ inline void setTextBufferSize( void );
+ inline void autoCopy( void );
+
+ private slots:
+ void startDrag( bool asText );
+
+ private:
+ CScrollBar *mVertScroll;
+ CScrollBar *mHorzScroll;
+ QWidget *mCorner;
+
+ CHexBuffer *mHexBuffer;
+ QPixmap mTextBuffer;
+ SDisplayLayout mLayout;
+ SDisplayCursor mCursor;
+ SDisplayColor mColor;
+ SDisplayFontInfo mFontInfo;
+ SDisplayMisc mMisc;
+
+ QPopupMenu *mDocumentMenu;
+
+ int mScrollBarSize;
+ CHexBuffer::EEditMode mEditMode;
+ bool mShowCursor;
+ bool mDropHighlight;
+
+ int mCursorTimerId;
+
+ CDragManager *mDragManager;
+ CHexClipboard mClipConvert;
+};
+
+
+inline bool CHexViewWidget::shiftButtonState( void )
+{
+ return kapp->keyboardModifiers() & KApplication::ShiftModifier;
+}
+
+
+
+inline bool CHexViewWidget::widgetValid( void )
+{
+ if( mVertScroll == 0 || mHorzScroll == 0 || mHexBuffer == 0 )
+ {
+ return( false );
+ }
+ else
+ {
+ return( true );
+
+ }
+}
+
+inline void CHexViewWidget::setupCursorTimer( void )
+{
+ if( mCursorTimerId != 0 )
+ {
+ killTimer( mCursorTimerId );
+ mCursorTimerId = 0;
+ }
+
+ if( hasFocus() == true )
+ {
+ if( mCursor.alwaysVisible == false )
+ {
+ mCursorTimerId = startTimer( mCursor.interval );
+ }
+ mShowCursor = true;
+ mHexBuffer->setDisableCursor( false );
+ }
+ else
+ {
+ if( mCursor.alwaysVisible == false )
+ {
+ if( mCursor.focusMode == SDisplayCursor::ignore )
+ {
+ mCursorTimerId = startTimer( mCursor.interval );
+ }
+ }
+ if( mCursor.focusMode != SDisplayCursor::hide )
+ {
+ mShowCursor = true;
+ }
+ else
+ {
+ mShowCursor = false;
+ mHexBuffer->setDisableCursor( true );
+ }
+ }
+
+ mHexBuffer->setShowCursor( mShowCursor );
+}
+
+inline void CHexViewWidget::setPopupMenu( QPopupMenu *popupMenu )
+{
+ KContextMenuManager::insert( this, popupMenu );
+}
+
+
+inline void CHexViewWidget::setDocumentMenu( QPopupMenu *popupMenu )
+{
+ mDocumentMenu = popupMenu;
+}
+
+
+inline int CHexViewWidget::startX( void )
+{
+ return( mHexBuffer->startX() );
+}
+
+inline int CHexViewWidget::startY( void )
+{
+ return( mHexBuffer->startY() );
+}
+
+inline void CHexViewWidget::setStartX( int val )
+{
+ mHexBuffer->setStartX( val );
+}
+
+inline void CHexViewWidget::setStartY( int val )
+{
+ mHexBuffer->setStartY( val );
+}
+
+
+inline void CHexViewWidget::updateWindow( bool completeRedraw,
+ bool touchSelection )
+{
+ if( completeRedraw == true )
+ {
+ SCursorConfig cc;
+ updateCursor( cc, true, touchSelection );
+ updateView( true, false );
+ }
+ else
+ {
+ SCursorConfig cc;
+ updateCursor( cc, false, touchSelection );
+ redrawFromOffset( mHexBuffer->cursorOffset(), true );
+ updateView( false, false );
+ }
+
+ emit fileState( mHexBuffer->fileState() );
+}
+
+
+
+inline void CHexViewWidget::updateWindow( uint line )
+{
+ SCursorConfig cc;
+ updateCursor( cc, false, true );
+ if( line == mHexBuffer->cursorLine() )
+ {
+ redrawLines( line, 1 );
+ }
+ else if( line < mHexBuffer->cursorLine() )
+ {
+ redrawLines( line, mHexBuffer->cursorLine() - line );
+ }
+ else
+ {
+ redrawLines( line, line - mHexBuffer->cursorLine() );
+ }
+ emit fileState( mHexBuffer->fileState() );
+}
+
+
+inline void CHexViewWidget::updateWindow( uint fromOffset, bool finishWindow )
+{
+ SCursorConfig cc;
+ updateCursor( cc, true, true );
+ updateView( false, false );
+ redrawFromOffset( fromOffset, finishWindow );
+
+ emit fileState( mHexBuffer->fileState() );
+}
+
+
+inline void CHexViewWidget::updateWindow( void )
+{
+ setTextBufferSize();
+ mHexBuffer->cursorUp(0); // Makes sure cursor is visible
+
+ SCursorConfig cc;
+ cc.emulateControlButton( true );
+ updateCursor( cc, true, false );
+ updateView( true, false );
+
+ emit fileState( mHexBuffer->fileState() );
+}
+
+
+inline void CHexViewWidget::setTextBufferSize( void )
+{
+ int w = width();
+ int h = mHexBuffer->lineHeight();
+
+ if( w != mTextBuffer.width() || h != mTextBuffer.height() )
+ {
+ mTextBuffer.resize( w, h );
+ }
+}
+
+
+inline void CHexViewWidget::autoCopy( void )
+{
+ if( mMisc.autoCopyToClipboard == true )
+ {
+ copy();
+ }
+}
+
+
+inline bool CHexViewWidget::insertMode( void )
+{
+ return mEditMode == CHexBuffer::EditInsert;
+}
+
+
+inline int CHexViewWidget::scrollBarWidth( void )
+{
+ return( mScrollBarSize );
+}
+
+inline int CHexViewWidget::dataWidth( void )
+{
+ return( mHexBuffer->lineWidth() );
+}
+
+inline int CHexViewWidget::defaultWidth( void )
+{
+ return( dataWidth() + scrollBarWidth() + frameWidth()*2 );
+}
+
+
+inline uint CHexViewWidget::offset( void )
+{
+ return( mHexBuffer->cursorOffset() );
+}
+
+inline uint CHexViewWidget::bookmarkCount( void )
+{
+ const QPtrList<SCursorOffset> &list = mHexBuffer->bookmarkList();
+ return( list.count() );
+}
+
+inline bool CHexViewWidget::modified( void )
+{
+ return( mHexBuffer->modified() );
+}
+
+inline void CHexViewWidget::setModified( bool modified )
+{
+ mHexBuffer->setModified( modified );
+ emit fileState( mHexBuffer->fileState() );
+}
+
+inline const QDateTime &CHexViewWidget::diskModifyTime( void )
+{
+ return( mHexBuffer->diskModifyTime() );
+}
+
+inline bool CHexViewWidget::losslessEncoding( CConversion::EMode mode )
+{
+ return( mHexBuffer->losslessEncoding(mode) );
+}
+
+inline const SEncodeState &CHexViewWidget::encoding( void )
+{
+ return( mHexBuffer->encoding() );
+}
+
+inline bool CHexViewWidget::documentPresent( void )
+{
+ return( mHexBuffer->documentPresent() );
+}
+
+inline bool CHexViewWidget::urlValid( void )
+{
+ return( mHexBuffer->hasFileName() );
+}
+
+inline QString &CHexViewWidget::url( void )
+{
+ return( mHexBuffer->url() );
+}
+
+inline void CHexViewWidget::setUrl( QString &url )
+{
+ if( mHexBuffer->url() != url )
+ {
+ emit fileRename( mHexBuffer->url(), url );
+ mHexBuffer->setUrl( url );
+ }
+}
+
+inline const CHexBuffer *CHexViewWidget::hexBuffer( void )
+{
+ return( mHexBuffer );
+}
+
+
+#endif
+
+
+
+