|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <tqpainter.h>
|
|
|
|
|
|
|
|
#include <tdeglobalsettings.h>
|
|
|
|
|
|
|
|
#include "bitswapwidget.h"
|
|
|
|
|
|
|
|
CDigitLabel::CDigitLabel( TQWidget *parent, uint digit, const char *name )
|
|
|
|
:TQLabel(parent, name), mDigit( digit ), mDotPosition( 0 )
|
|
|
|
{
|
|
|
|
setFocusPolicy( TQWidget::StrongFocus );
|
|
|
|
initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
CDigitLabel::~CDigitLabel( void )
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CDigitLabel::initialize( void )
|
|
|
|
{
|
|
|
|
TQFont font( TDEGlobalSettings::generalFont() );
|
|
|
|
font.setBold( true );
|
|
|
|
setFont( font );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDigitLabel::paletteChange( const TQPalette & )
|
|
|
|
{
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDigitLabel::setValue( uint digit, bool notify )
|
|
|
|
{
|
|
|
|
if( mDigit != digit )
|
|
|
|
{
|
|
|
|
if( notify == true )
|
|
|
|
{
|
|
|
|
emit valueChanged( this, digit, false );
|
|
|
|
}
|
|
|
|
|
|
|
|
mDigit = digit;
|
|
|
|
update();
|
|
|
|
|
|
|
|
if( notify == true )
|
|
|
|
{
|
|
|
|
emit valueChanged( this, mDigit, true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDigitLabel::setDotPosition( uint dotPosition )
|
|
|
|
{
|
|
|
|
if( mDotPosition != dotPosition )
|
|
|
|
{
|
|
|
|
mDotPosition = dotPosition;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TQSize CDigitLabel::sizeHint( void ) const
|
|
|
|
{
|
|
|
|
int h = fontMetrics().height();
|
|
|
|
TQSize s( h, h ); // Retangular
|
|
|
|
return( s );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
|
|
void CDigitLabel::drawContents( TQPainter *p )
|
|
|
|
{
|
|
|
|
TQRect cr = contentsRect();
|
|
|
|
|
|
|
|
if( hasFocus() == true )
|
|
|
|
{
|
|
|
|
p->fillRect( cr, palette().active().highlight() );
|
|
|
|
p->setPen( palette().active().highlightedText() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
p->fillRect( cr, palette().active().base() );
|
|
|
|
p->setPen( palette().active().text() );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( mDotPosition != 0 )
|
|
|
|
{
|
|
|
|
p->fillRect( cr.x()+2, cr.y()+2, 5, 5, TQt::red ); // UL
|
|
|
|
/*
|
|
|
|
if( mDotPosition == 1 )
|
|
|
|
{
|
|
|
|
p->fillRect( cr.x()+2, cr.y()+2, 5, 5, red ); // UL
|
|
|
|
}
|
|
|
|
else if( mDotPosition == 2 )
|
|
|
|
{
|
|
|
|
p->fillRect( cr.width()-7, cr.y()+2, 5, 5, red ); // UR
|
|
|
|
}
|
|
|
|
else if( mDotPosition == 3 )
|
|
|
|
{
|
|
|
|
p->fillRect( cr.x()+2, cr.height()-7, 5, 5, red ); // LL
|
|
|
|
}
|
|
|
|
else if( mDotPosition == 4 )
|
|
|
|
{
|
|
|
|
p->fillRect( cr.width()-7, cr.height()-7, 5, 5, red ); // LR
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString text;
|
|
|
|
text.setNum( mDigit );
|
|
|
|
p->drawText( 0, 0, cr.width(), cr.height(), alignment(), text );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDigitLabel::keyPressEvent( TQKeyEvent *e )
|
|
|
|
{
|
|
|
|
switch ( e->key() )
|
|
|
|
{
|
|
|
|
case Key_Left:
|
|
|
|
case Key_Up:
|
|
|
|
emit stepCell( this, false );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Key_Right:
|
|
|
|
case Key_Down:
|
|
|
|
emit stepCell( this, true );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Key_Escape:
|
|
|
|
e->ignore(); // Allow dialog or whatever use this one
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
int val = e->text()[0].digitValue();
|
|
|
|
if( val >= 0 && val <= 7 )
|
|
|
|
{
|
|
|
|
setValue( val, true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
e->accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CByteWidget::CByteWidget( TQWidget *parent, const char *name )
|
|
|
|
:TQWidget(parent, name)
|
|
|
|
{
|
|
|
|
mHBox = new TQHBoxLayout( this, 0 );
|
|
|
|
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
mDigit[i] = new CDigitLabel( this, 7-i );
|
|
|
|
mDigit[i]->setLineWidth( 1 );
|
|
|
|
mDigit[i]->setFixedSize( mDigit[i]->sizeHint()*2 );
|
|
|
|
mDigit[i]->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
|
|
|
|
mDigit[i]->setAlignment( AlignCenter );
|
|
|
|
connect( mDigit[i], TQ_SIGNAL(stepCell(const TQObject *, bool )),
|
|
|
|
this, TQ_SLOT(stepCell(const TQObject *, bool )));
|
|
|
|
connect( mDigit[i], TQ_SIGNAL(valueChanged(const TQObject *, uint, bool )),
|
|
|
|
this, TQ_SLOT(valueChanged(const TQObject *, uint, bool )));
|
|
|
|
mHBox->addWidget( mDigit[i] );
|
|
|
|
}
|
|
|
|
|
|
|
|
mHBox->addStretch();
|
|
|
|
}
|
|
|
|
|
|
|
|
CByteWidget::~CByteWidget( void )
|
|
|
|
{
|
|
|
|
for( uint i=0; i<8; i++ ) { delete mDigit[i]; }
|
|
|
|
delete mHBox;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CByteWidget::stepCell( const TQObject *obj, bool next )
|
|
|
|
{
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
if( obj == mDigit[i] )
|
|
|
|
{
|
|
|
|
if( next == true )
|
|
|
|
{
|
|
|
|
mDigit[(i+1)%8]->setFocus();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mDigit[(i+7)%8]->setFocus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CByteWidget::valueChanged( const TQObject *obj, uint val, bool after )
|
|
|
|
{
|
|
|
|
if( after == false )
|
|
|
|
{
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
if( obj == mDigit[i] )
|
|
|
|
{
|
|
|
|
uint tmp = 7-mDigit[i]->value();
|
|
|
|
mDigit[tmp]->setValue( mDigit[i]->value(), false );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( mDigit[7-val]->value() != val )
|
|
|
|
{
|
|
|
|
uint tmp = mDigit[7-val]->value();
|
|
|
|
mDigit[7-tmp]->setValue( tmp, false );
|
|
|
|
mDigit[7-val]->setValue( val, false );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setBuddy( obj );
|
|
|
|
|
|
|
|
uint pos = 1;
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
if( mDigit[i]->value() < (7-i) )
|
|
|
|
{
|
|
|
|
mDigit[i]->setDotPosition( pos );
|
|
|
|
mDigit[7-mDigit[i]->value()]->setDotPosition( pos );
|
|
|
|
pos++;
|
|
|
|
}
|
|
|
|
else if( mDigit[i]->value() == (7-i) )
|
|
|
|
{
|
|
|
|
mDigit[i]->setDotPosition( 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CByteWidget::reset( void )
|
|
|
|
{
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
mDigit[i]->setValue( 7-i, false );
|
|
|
|
mDigit[i]->setDotPosition( 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CByteWidget::setBuddy( const TQObject *obj )
|
|
|
|
{
|
|
|
|
for( uint i=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
if( obj == mDigit[i] )
|
|
|
|
{
|
|
|
|
uint val = mDigit[i]->value();
|
|
|
|
if( val < 8 )
|
|
|
|
{
|
|
|
|
mDigit[7-val]->setValue( 7-i, false );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CByteWidget::flag( TQByteArray &buf )
|
|
|
|
{
|
|
|
|
bool swapPresent = false;
|
|
|
|
uint i, j;
|
|
|
|
|
|
|
|
buf.resize( 8 );
|
|
|
|
for( i=0; i<8; buf[i++] = 0 );
|
|
|
|
|
|
|
|
for( i=j=0; i<8; i++ )
|
|
|
|
{
|
|
|
|
if( mDigit[i]->value() < (7-i) )
|
|
|
|
{
|
|
|
|
buf[j] = 7 - i; j++;
|
|
|
|
buf[j] = mDigit[i]->value(); j++;
|
|
|
|
swapPresent = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return( swapPresent );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "bitswapwidget.moc"
|