34 #include <KSqueezedTextLabel>
38 #include <QtGui/QLayout>
39 #include <QtGui/QLabel>
40 #include <QtGui/QFontMetrics>
48 : mByteArrayView( 0 ), mStatusBar( statusBar )
52 mOffsetLabel =
new QLabel( statusBar );
55 mSelectionLabel =
new QLabel( statusBar );
58 const QString insertModeText = i18nc(
"@info:status short for: Insert mode",
"INS" );
59 const QString overwriteModeText = i18nc(
"@info:status short for: Overwrite mode",
"OVR" );
60 const QString insertModeTooltip = i18nc(
"@info:tooltip",
"Insert mode" );
61 const QString overwriteModeTooltip = i18nc(
"@info:tooltip",
"Overwrite mode" );
62 mOverwriteModeToggleButton =
new ToggleButton( insertModeText, insertModeTooltip, statusBar );
63 mOverwriteModeToggleButton->
setCheckedState( overwriteModeText, overwriteModeTooltip );
64 statusBar->
addWidget( mOverwriteModeToggleButton );
65 connect( mOverwriteModeToggleButton, SIGNAL(clicked(
bool)), SLOT(setOverwriteMode(
bool)) );
67 mValueCodingComboBox =
new KComboBox( statusBar );
69 list.append( i18nc(
"@item:inmenu encoding of the bytes as values in the hexadecimal format",
"Hexadecimal") );
70 list.append( i18nc(
"@item:inmenu encoding of the bytes as values in the decimal format",
"Decimal") );
71 list.append( i18nc(
"@item:inmenu encoding of the bytes as values in the octal format",
"Octal") );
72 list.append( i18nc(
"@item:inmenu encoding of the bytes as values in the binary format",
"Binary") );
73 mValueCodingComboBox->addItems( list );
74 mValueCodingComboBox->setToolTip(
75 i18nc(
"@info:tooltip",
"Coding of the value interpretation in the current view.") );
76 connect( mValueCodingComboBox, SIGNAL(activated(
int)), SLOT(setValueCoding(
int)) );
77 statusBar->
addWidget( mValueCodingComboBox );
79 mCharCodingComboBox =
new KComboBox( statusBar );
81 mCharCodingComboBox->setToolTip(
82 i18nc(
"@info:tooltip",
"Encoding in the character column of the current view.") );
83 connect( mCharCodingComboBox, SIGNAL(activated(
int)), SLOT(setCharCoding(
int)) );
84 statusBar->
addWidget( mCharCodingComboBox );
94 void ViewStatusController::fixWidths(
int offsetCoding )
96 const QFontMetrics metrics = mStatusBar->fontMetrics();
99 static const int hexDigitsCount = 16;
100 static const int decimalDigitsCount = 10;
101 static const int firstLetterIndex = 10;
102 static const char digits[hexDigitsCount] =
104 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
105 'A',
'B',
'C',
'D',
'E',
'F'
108 int largestOffsetWidth = 0;
109 int largestSelectionWidth = 0;
110 int widestDigitIndex = 0;
111 const int digitsCount = (offsetCoding == 0) ? hexDigitsCount : decimalDigitsCount;
112 for(
int i=0; i<digitsCount; ++i )
115 if( offsetCoding == 0 )
117 offset = QString( 9, QLatin1Char(digits[i]) );
118 offset[4] = QLatin1Char(
':');
122 offset = QString( 10, QLatin1Char(digits[i]) );
125 const QString offsetText = i18n(
"Offset: %1", offset );
126 const int offsetWidth = metrics.boundingRect( offsetText ).width();
127 if( largestOffsetWidth < offsetWidth )
128 largestOffsetWidth = offsetWidth;
130 const char countDigit = (i<firstLetterIndex) ? digits[i] : digits[widestDigitIndex];
131 const int maxNumber = QByteArray(
'1'+QByteArray(9,countDigit)).toInt();
132 const QString bytesCount = i18n(
"%1 bytes", maxNumber );
133 const QString selectionString = i18nc(
"@info:status selection: start offset - end offset ()",
134 "Selection: %1 - %2 (%3)", offset, offset, bytesCount );
136 const int selectionWidth = metrics.boundingRect( selectionString ).width();
137 if( largestSelectionWidth < selectionWidth )
139 if( i < firstLetterIndex )
140 widestDigitIndex = i;
141 largestSelectionWidth = selectionWidth;
144 mOffsetLabel->setFixedWidth( largestOffsetWidth );
145 mSelectionLabel->setFixedWidth( largestSelectionWidth );
153 mByteArrayView->disconnect(
this );
154 mByteArrayView->disconnect( mOverwriteModeToggleButton );
159 const bool hasView = ( mByteArrayView != 0 );
166 mOverwriteModeToggleButton->setChecked( mByteArrayView->
isOverwriteMode() );
167 onOffsetCodingChanged( mByteArrayView->
offsetCoding() );
168 onValueCodingChanged( mByteArrayView->
valueCoding() );
174 connect( mByteArrayView, SIGNAL(overwriteModeChanged(
bool)),
175 mOverwriteModeToggleButton, SLOT(setChecked(
bool)) );
176 connect( mByteArrayView, SIGNAL(offsetCodingChanged(
int)), SLOT(onOffsetCodingChanged(
int)) );
177 connect( mByteArrayView, SIGNAL(valueCodingChanged(
int)), SLOT(onValueCodingChanged(
int)) );
178 connect( mByteArrayView, SIGNAL(charCodecChanged(QString)),
179 SLOT(onCharCodecChanged(QString)) );
183 mOffsetLabel->setText( i18nc(
"@info:status offset value not available",
"Offset: -") );
184 mSelectionLabel->setText( i18nc(
"@info:status offset value not available",
"Selection: -") );
185 mOverwriteModeToggleButton->setChecked(
false );
186 mValueCodingComboBox->setCurrentIndex( 0 );
187 mCharCodingComboBox->setCurrentIndex( 0 );
190 mOffsetLabel->setEnabled( hasView );
191 mSelectionLabel->setEnabled( hasView );
192 mOverwriteModeToggleButton->setEnabled( hasView );
193 mValueCodingComboBox->setEnabled( hasView );
194 mCharCodingComboBox->setEnabled( hasView );
197 void ViewStatusController::setOverwriteMode(
bool overwrite )
202 void ViewStatusController::setValueCoding(
int valueCoding )
208 void ViewStatusController::setCharCoding(
int charCoding )
214 void ViewStatusController::onCursorPositionChanged(
Okteta::Address offset )
218 mPrintFunction( codedOffset, mStartOffset + offset );
220 mOffsetLabel->setText( i18n(
"Offset: %1", QLatin1String(codedOffset)) );
226 const ByteArraySelection* byteArraySelection =
static_cast<const ByteArraySelection*
>( modelSelection );
229 QString selectionString;
235 mPrintFunction( codedSelectionStart, mStartOffset + selection.
start() );
236 mPrintFunction( codedSelectionEnd, mStartOffset + selection.
end() );
238 const QString bytesCount = i18np(
"1 byte",
"%1 bytes", selection.
width() );
239 selectionString = i18nc(
"@info:status selection: start offset - end offset (number of bytes)",
240 "Selection: %1 - %2 (%3)", QLatin1String(codedSelectionStart), QLatin1String(codedSelectionEnd), bytesCount );
243 selectionString = i18nc(
"@info:status offset value not available",
"Selection: -" );
245 mSelectionLabel->setText( selectionString );
248 void ViewStatusController::onOffsetCodingChanged(
int offsetCoding )
251 fixWidths( offsetCoding );
258 void ViewStatusController::onValueCodingChanged(
int valueCoding )
260 mValueCodingComboBox->setCurrentIndex( valueCoding );
263 void ViewStatusController::onCharCodecChanged(
const QString& charCodecName )
267 mCharCodingComboBox->setCurrentIndex( charCodingIndex );
QString charCodingName() const
void setValueCoding(int valueCoding)
bool isOverwriteMode() const
void setCharCoding(const QString &charCodingName)
static const QStringList & codecNames()
virtual const AbstractModelSelection * modelSelection() const
Okteta::Address cursorPosition() const
T findBaseModel() const
returns the first baseModel which is of type T, or null if none is found.
virtual void setTargetModel(AbstractModel *model)
void setOverwriteMode(bool overwriteMode)
void addWidget(QWidget *widget)
Okteta::Address startOffset() const
ViewStatusController(StatusBar *statusBar)
bool isEmpty() const
returns true if the range has not been set