You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
piklab/src/common/gui/hexword_gui.cpp

137 lines
4.1 KiB

/***************************************************************************
* Copyright (C) 2005-2007 Nicolas Hadacek <hadacek@kde.org> *
* Copyright (C) 2003-2004 Alain Gibaud <alain.gibaud@free.fr> *
* *
* 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. *
***************************************************************************/
#include "hexword_gui.h"
#include <tqtimer.h>
#include "common/gui/number_gui.h"
#include "common/common/misc.h"
//-----------------------------------------------------------------------------
HexValueValidator::HexValueValidator(uint nbChars, TQObject *parent)
: TQValidator(parent, "hex_value_validator"), _nbChars(nbChars) {}
TQValidator::State HexValueValidator::validate(TQString &input, int &) const
{
if ( input.length()==0 ) return Acceptable;
if ( input.length()>_nbChars ) return Invalid;
for (uint i=0; i<input.length(); i++)
if ( !isxdigit(input[i].latin1()) && input[i]!='-' ) return Invalid;
return Acceptable;
}
//-----------------------------------------------------------------------------
GenericHexWordEditor::GenericHexWordEditor(uint nbChars, bool hasBlankValue, TQWidget *parent)
: KLineEdit(parent, "hex_word_editor"), _nbChars(nbChars), _hasBlankValue(hasBlankValue)
{
setFocusPolicy(TQ_ClickFocus);
setValidator(new HexValueValidator(nbChars, TQT_TQOBJECT(this)));
connect(this, TQT_SIGNAL(textChanged(const TQString &)), TQT_SLOT(slotTextChanged()));
setFrame(false);
}
void GenericHexWordEditor::slotTextChanged()
{
if ( text().length()!=_nbChars ) return;
if ( changeValue() ) emit moveNext();
}
bool GenericHexWordEditor::changeValue()
{
if ( !isValid() ) return false;
TQString s = text();
BitValue v = blankValue();
if ( s!=TQString(repeat("-", _nbChars)) ) {
s = s.leftJustify(_nbChars, '0', true);
for (uint i=0; i<_nbChars; i++)
if ( !isxdigit(s[i].latin1()) ) s[i] = '0';
v = normalizeWord(fromHex(s, 0));
setText(toHex(v, _nbChars));
}
if ( v==word() ) return false;
setWord(v);
emit modified();
return true;
}
void GenericHexWordEditor::set()
{
blockSignals(true);
setEnabled(isValid());
if ( !isValid() ) clear();
else {
BitValue value = word();
if ( _hasBlankValue && value==blankValue() ) setText(repeat("-", _nbChars));
else setText(toHex(normalizeWord(value), _nbChars));
}
blockSignals(false);
}
bool GenericHexWordEditor::event(TQEvent *e)
{
switch (e->type()) {
case TQEvent::FocusOut:
changeValue();
break;
case TQEvent::FocusIn:
TQTimer::singleShot(0, this, TQT_SLOT(selectAll())); // ugly but it works
break;
case TQEvent::KeyPress:
switch ( TQT_TQKEYEVENT(e)->key() ) {
case Key_Next:
emit moveNextPage();
return true;
case Key_Tab:
case Key_Enter:
case Key_Return:
emit moveNext();
return true;
case Key_Prior:
emit movePrevPage();
return true;
case Key_BackTab:
emit movePrev();
return true;
case Key_Down:
emit moveDown();
return true;
case Key_Up:
emit moveUp();
return true;
case Key_Home:
emit moveFirst();
return true;
case Key_End:
emit moveLast();
return true;
case Key_Right:
if ( cursorPosition()!=int(text().length()) ) break;
emit moveNext();
return true;
case Key_Left:
if ( cursorPosition()!=0 ) break;
emit movePrev();
return true;
}
default: break;
}
return TQLineEdit::event(e);
}
TQSize GenericHexWordEditor::sizeHint() const
{
return TQSize(maxCharWidth(NumberBase::Hex, font()) * (_nbChars+1), fontMetrics().height());
}
TQSize GenericHexWordEditor::minimumSizeHint() const
{
return TQSize(maxCharWidth(NumberBase::Hex, font()) * (_nbChars+1), fontMetrics().height());
}