Subversion Repositories svn.mios32

Rev

Rev 929 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
928 tk 1
/* -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*- */
2
// $Id: HexTextEditor.cpp 928 2010-02-20 23:38:06Z tk $
3
/*
4
 * Text Editor variant which allows to edit hex bytes
5
 *
6
 * ==========================================================================
7
 *
8
 *  Copyright (C) 2010 Thorsten Klose (tk@midibox.org)
9
 *  Licensed for personal non-commercial use only.
10
 *  All other rights reserved.
11
 *
12
 * ==========================================================================
13
 */
14
 
15
#include "HexTextEditor.h"
16
 
17
 
18
//==============================================================================
19
HexTextEditor::HexTextEditor(Label *_statusLabel)
20
    : TextEditor(String::empty)
21
    , statusLabel(_statusLabel)
22
    , bufferedText(String::empty)
23
{
24
    setMultiLine(true);
25
    setReturnKeyStartsNewLine(true);
26
    setReadOnly(false);
27
    setScrollbarsShown(true);
28
    setCaretVisible(true);
29
    setPopupMenuEnabled(true);
30
    setInputRestrictions(1000000, T("0123456789ABCDEFabcdef \n"));
31
#ifdef JUCE_WIN32
32
    setFont(Font(Typeface::defaultTypefaceNameMono, 10.0, 0));
33
#else
34
    setFont(Font(Typeface::defaultTypefaceNameMono, 13.0, 0));
35
#endif
36
    addListener(this);
37
 
38
    setSize(600, 200);
39
}
40
 
41
HexTextEditor::~HexTextEditor()
42
{
43
    deleteAllChildren();
44
}
45
 
46
//==============================================================================
47
void HexTextEditor::clear()
48
{
49
    bufferedText = String::empty;
50
    TextEditor::clear();
51
}
52
 
53
//==============================================================================
54
void HexTextEditor::textEditorTextChanged(TextEditor &editor)
55
{
56
    String hexStr = getText();
57
    int size = hexStr.length();
58
    const char *strBuffer = (const char *)hexStr; // for *much* faster access! The String[pos] handling of Juce should be optimized!
59
 
60
    int numBytes = 0;
61
    int charCounter = 0;
62
    bool invalidBytesFound = false;
63
 
64
    // we assume that only hex digits are entered (ensured via setInputRestrictions())
65
    for(int pos=0; pos<size; ++pos) {
66
        if( strBuffer[pos] == ' ' || strBuffer[pos] == '\n' ) {
67
            if( charCounter > 0 )
68
                ++numBytes;
69
            charCounter = 0;
70
        } else {
71
            if( ++charCounter > 2 )
72
                invalidBytesFound = true;
73
        }
74
    }
75
    if( charCounter > 0 )
76
        ++numBytes;
77
 
78
    if( invalidBytesFound )
79
        statusLabel->setText(T("Invalid Syntax!"), true);
80
    else if( numBytes == 0 )
81
        statusLabel->setText(String::empty, true);
82
    else if( numBytes == 1 )
83
        statusLabel->setText(T("1 byte"), true);
84
    else
85
        statusLabel->setText(String(numBytes) + T(" bytes"), true);
86
}
87
 
88
void HexTextEditor::textEditorReturnKeyPressed(TextEditor &editor)
89
{
90
}
91
 
92
void HexTextEditor::textEditorEscapeKeyPressed(TextEditor &editor)
93
{
94
}
95
 
96
void HexTextEditor::textEditorFocusLost(TextEditor &editor)
97
{
98
}
99
 
100
//==============================================================================
101
void HexTextEditor::setBinary(uint8 *buffer, const int &size)
102
{
103
    bufferedText = String::empty;
104
 
105
    clear();
106
    int64 lineBegin = 0;
107
    for(int64 pos=0; pos<size; ++pos) {
108
        if( buffer[pos] == 0xf7 || pos == (size-1) ) {
109
            if( bufferedText.length() > 0 )
110
                bufferedText += T("\n");
111
            bufferedText += String::toHexString(&buffer[lineBegin], pos-lineBegin+1);
112
            lineBegin = pos+1;
113
        }
114
    }
115
 
116
    setText(bufferedText, true);
117
}
118
 
119
 
120
//==============================================================================
121
void HexTextEditor::addBinary(uint8 *buffer, const int &size)
122
{
123
#if 0
124
    String hexStr = String::toHexString(buffer, size);
125
    if( !isEmpty() )
126
        insertTextAtCursor(T("\n"));
127
    insertTextAtCursor(hexStr);
128
#else
129
    // works faster! Will be removed once the Juce TextEditor has been optimized
130
    if( bufferedText != String::empty )
131
        bufferedText += T("\n");
132
    bufferedText += String::toHexString(buffer, size);
133
    setText(bufferedText);
134
#endif
135
}
136
 
137
//==============================================================================
138
Array<uint8> HexTextEditor::getBinary(void)
139
{
140
    String hexStr = getText();
141
    int size = hexStr.length();
142
    const char *strBuffer = (const char *)hexStr; // for *much* faster access! The String[pos] handling of Juce should be optimized!
143
 
144
    Array<uint8> retArray;
145
    int charCounter = 0;
146
    uint8 b = 0;
147
 
148
    // we assume that only hex digits are entered (ensured via setInputRestrictions())
149
    for(int pos=0; pos<size; ++pos) {
150
        char c = strBuffer[pos];
151
        if( c == ' ' || c == '\n' ) {
152
            if( charCounter > 0 )
153
                retArray.add(b);
154
            charCounter = 0;
155
        } else {
156
            uint8 nibble = 0;
157
            if( c >= '0' && c <= '9' )
158
                nibble = c - '0';
159
            else if( c >= 'A' && c <= 'F' )
160
                nibble = c - 'A' + 10;
161
            else if( c >= 'a' && c <= 'f' )
162
                nibble = c - 'a' + 10;
163
 
164
            if( charCounter == 0 )
165
                b = nibble << 4;
166
            else if( charCounter == 1 )
167
                b |= nibble;
168
            else {
169
                retArray.clear();
170
                return retArray;
171
            }
172
            ++charCounter;
173
        }
174
    }
175
 
176
    if( charCounter > 0 )
177
        retArray.add(b);
178
 
179
    return retArray;
180
}