summaryrefslogtreecommitdiffstats
path: root/khexedit/hexmanagerwidget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'khexedit/hexmanagerwidget.cc')
-rw-r--r--khexedit/hexmanagerwidget.cc370
1 files changed, 370 insertions, 0 deletions
diff --git a/khexedit/hexmanagerwidget.cc b/khexedit/hexmanagerwidget.cc
new file mode 100644
index 0000000..1073b95
--- /dev/null
+++ b/khexedit/hexmanagerwidget.cc
@@ -0,0 +1,370 @@
+/*
+ * 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.
+ *
+ */
+
+#include <klocale.h>
+#include <qlayout.h>
+#include "hexmanagerwidget.h"
+#include "searchbar.h"
+
+CHexManagerWidget::CHexManagerWidget( QWidget *parent, const char *name,
+ EConversionPosition conversionPosition,
+ EPosition tabBarPosition,
+ EPosition searchBarPosition )
+ : QWidget( parent, name )
+{
+ mValid = false;
+
+ mEditor = new CHexEditorWidget( this );
+ mTabBar = new CTabBar( this );
+ mTabBar->hide();
+ mSearchBar = 0;
+
+ mConverter = new CHexToolWidget( this );
+
+ connect( mEditor->view(), SIGNAL(fileName(const QString &, bool)),
+ this, SLOT( addName(const QString &)));
+ connect( mEditor->view(), SIGNAL( fileClosed(const QString &)),
+ this, SLOT( removeName(const QString &)));
+ connect( mEditor->view(),SIGNAL(fileRename(const QString &,const QString &)),
+ this, SLOT(changeName(const QString &,const QString &)));
+ connect( mEditor->view(), SIGNAL( cursorChanged( SCursorState & ) ),
+ mConverter, SLOT( cursorChanged( SCursorState & ) ) );
+ connect( mConverter, SIGNAL( closed(void) ),
+ this, SIGNAL( conversionClosed(void) ) );
+ connect( mTabBar, SIGNAL(selected(const QString &)),
+ this, SLOT(open(const QString &)));
+
+ mValid = true;
+ setConversionVisibility( conversionPosition );
+ setTabBarPosition( tabBarPosition );
+ setSearchBarPosition( searchBarPosition );
+}
+
+
+CHexManagerWidget::~CHexManagerWidget( void )
+{
+ delete mEditor;
+ delete mTabBar;
+ delete mConverter;
+}
+
+
+void CHexManagerWidget::updateLayout( void )
+{
+ if( mValid == false ) { return; }
+
+ delete layout();
+ QVBoxLayout *vlay = new QVBoxLayout( this, 0, 0 );
+
+ if( mSearchBar && mSearchBarPosition == AboveEditor )
+ {
+ vlay->addWidget( mSearchBar );
+ }
+
+ if( mTabPosition == AboveEditor )
+ {
+ vlay->addWidget( mTabBar );
+ vlay->addWidget( mEditor, 1 );
+ }
+ else
+ {
+ vlay->addWidget( mEditor, 1 );
+ vlay->addWidget( mTabBar );
+ }
+
+ if( mSearchBar && mSearchBarPosition == BelowEditor )
+ {
+ vlay->addWidget( mSearchBar );
+ }
+
+ if( mConversionPosition == Embed )
+ {
+ vlay->addWidget( mConverter );
+ }
+ vlay->activate(); // Required in this case
+}
+
+
+void CHexManagerWidget::setConversionVisibility( EConversionPosition position )
+{
+ if( mValid == false )
+ {
+ return;
+ }
+
+ if( mConversionPosition == position )
+ {
+ if( mConversionPosition == Float )
+ {
+ mConverter->raise();
+ }
+ return;
+ }
+
+ mConversionPosition = position;
+ if( mConversionPosition == Hide )
+ {
+ mConverter->hide();
+ }
+ else if( mConversionPosition == Float )
+ {
+ QPoint point = mapToGlobal( QPoint(0,0) );
+ QRect rect = geometry();
+ QPoint p;
+
+ p.setX(point.x() + rect.width()/2 - mConverter->minimumSize().width()/2);
+ p.setY(point.y() + rect.height()/2 - mConverter->minimumSize().height()/2);
+ mConverter->resize( mConverter->minimumSize() );
+ mConverter->reparent( 0, WStyle_Customize | WStyle_DialogBorder, p, true );
+ mConverter->setCaption(kapp->makeStdCaption(i18n("Conversion")));
+ }
+ else
+ {
+ mConversionPosition = Embed;
+ uint utilHeight = mConverter->minimumSize().height();
+ QPoint p( 0, height() - utilHeight );
+ mConverter->reparent( this, 0, p, true );
+ }
+
+ updateLayout();
+}
+
+
+void CHexManagerWidget::setTabBarPosition( EPosition position )
+{
+ mTabPosition = position;
+ if( mTabPosition != HideItem && mTabBar->count() > 0 )
+ {
+ if( mTabPosition == AboveEditor )
+ {
+ mTabBar->setShape( QTabBar::RoundedAbove );
+ }
+ else
+ {
+ mTabBar->setShape( QTabBar::RoundedBelow );
+ }
+ mTabBar->show();
+ }
+ else
+ {
+ mTabBar->hide();
+ }
+
+ updateLayout();
+}
+
+
+void CHexManagerWidget::setSearchBarPosition( EPosition position )
+{
+ mSearchBarPosition = position;
+ if( position != HideItem )
+ {
+ if( mSearchBar == 0 )
+ {
+ mSearchBar = new CSearchBar( this );
+ connect( mSearchBar, SIGNAL(hidden()), this, SLOT(searchBarHidden()) );
+ connect( mSearchBar, SIGNAL(findData(SSearchControl &, uint, bool)),
+ mEditor, SLOT(findData(SSearchControl &, uint, bool)) );
+ connect( editor()->view(), SIGNAL( cursorChanged( SCursorState & ) ),
+ mSearchBar, SLOT( cursorMoved() ) );
+ }
+ mSearchBar->show();
+ }
+ else
+ {
+ if( mSearchBar != 0 )
+ {
+ mSearchBar->hide();
+ }
+ }
+
+ updateLayout();
+}
+
+
+void CHexManagerWidget::searchBarHidden( void )
+{
+ updateLayout();
+ mSearchBarPosition = HideItem;
+ emit searchBarClosed();
+}
+
+
+void CHexManagerWidget::addName( const QString &name )
+{
+ if( name.isEmpty() == true )
+ {
+ return;
+ }
+
+ mTabBar->addName( name );
+ if( mTabBar->isVisible() == false && mTabPosition != HideItem )
+ {
+ setTabBarPosition( mTabPosition );
+ }
+}
+
+
+void CHexManagerWidget::removeName( const QString &name )
+{
+ mTabBar->removeName( name );
+ if( mTabBar->isVisible() == true && mTabBar->count() == 0 )
+ {
+ setTabBarPosition( mTabPosition );
+ }
+}
+
+
+void CHexManagerWidget::changeName( const QString &curName,
+ const QString &newName )
+{
+ mTabBar->changeName( curName, newName );
+}
+
+
+void CHexManagerWidget::open( const QString &name )
+{
+ mEditor->open( name, false, 0 );
+}
+
+
+int CHexManagerWidget::preferredWidth( void )
+{
+ int w = mEditor->defaultTextWidth();
+ if( mConversionPosition == Embed )
+ {
+ int converterWidth = mConverter->sizeHint().width();
+ w = QMAX( w, converterWidth );
+ }
+ return( w );
+}
+
+
+
+CTabBar::CTabBar( QWidget *parent, char *name )
+ :QTabBar( parent, name )
+{
+ connect( this, SIGNAL(selected(int)), this, SLOT(slotSelected(int)) );
+}
+
+
+void CTabBar::addName( const QString &name )
+{
+ QString n( name.right(name.length()-name.findRev('/')-1) );
+
+ QTab *t = find( n );
+ if( t == 0 )
+ {
+ t = new QTab();
+ t->setText( n);
+ int id = addTab( t );
+ mFileList.append( CFileKey(name,id) );
+ }
+ setCurrentTab(t);
+}
+
+
+void CTabBar::removeName( const QString &name )
+{
+ QString n( name.right(name.length()-name.findRev('/')-1) );
+ QTab *t = find(n);
+ if( t == 0 )
+ {
+ return;
+ }
+
+ QValueList<CFileKey>::Iterator it;
+ for( it = mFileList.begin(); it != mFileList.end(); ++it )
+ {
+ if( (*it).id() == t->identifier() )
+ {
+ mFileList.remove(it);
+ removeTab(t);
+ layoutTabs();
+ break;
+ }
+ }
+}
+
+
+void CTabBar::changeName( const QString &curName, const QString &newName )
+{
+ QString n( curName.right(curName.length()-curName.findRev('/')-1) );
+ QTab *t = find(n);
+ if( t == 0 )
+ {
+ return;
+ }
+
+ QValueList<CFileKey>::Iterator it;
+ for( it = mFileList.begin(); it != mFileList.end(); ++it )
+ {
+ if( (*it).id() == t->identifier() )
+ {
+ QString m( newName.right(newName.length()-newName.findRev('/')-1) );
+ t->setText(m);
+
+ mFileList.remove(it);
+ mFileList.append( CFileKey(newName,t->identifier()) );
+ layoutTabs();
+ update(); // Seems to be necessary
+ break;
+ }
+ }
+}
+
+
+QTab *CTabBar::find( const QString &name )
+{
+ QPtrList<QTab> &list = *tabList();
+ for( QTab *t = list.first(); t != 0; t = list.next() )
+ {
+ if( t->text() == name )
+ {
+ return( t );
+ }
+ }
+
+ return( 0 );
+}
+
+
+int CTabBar::count( void )
+{
+ return( tabList()->count() );
+}
+
+
+void CTabBar::slotSelected( int id )
+{
+ QValueList<CFileKey>::Iterator it;
+ for( it = mFileList.begin(); it != mFileList.end(); ++it )
+ {
+ if( (*it).id() == id )
+ {
+ emit selected( (*it).filename() );
+ }
+ }
+}
+
+
+
+
+#include "hexmanagerwidget.moc"