From: <si...@us...> - 2006-08-29 08:58:05
|
Revision: 330 Author: sidos Date: 2006-08-29 01:57:38 -0700 (Tue, 29 Aug 2006) ViewCVS: http://svn.sourceforge.net/qterm/?rev=330&view=rev Log Message: ----------- create the ansi editor branch Added Paths: ----------- branches/ansi/ branches/ansi/ansi.pro branches/ansi/main.cpp branches/ansi/qtermbuffer.cpp branches/ansi/qtermbuffer.h branches/ansi/qtermdecode.cpp branches/ansi/qtermdecode.h branches/ansi/qtermencode.cpp branches/ansi/qtermencode.h branches/ansi/qtermtextline.cpp branches/ansi/qtermtextline.h Added: branches/ansi/ansi.pro =================================================================== --- branches/ansi/ansi.pro (rev 0) +++ branches/ansi/ansi.pro 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,19 @@ +TARGET = ansi + +CONFIG = qt + +MOC_DIR = .moc + +OBJECTS_DIR = .obj + +HEADERS = qterm.h \ + qtermtextline.h \ + qtermbuffer.h \ + qtermdecode.h + +SOURCES = main.cpp \ + qtermtextline.cpp \ + qtermbuffer.cpp \ + qtermdecode.cpp + + Added: branches/ansi/main.cpp =================================================================== --- branches/ansi/main.cpp (rev 0) +++ branches/ansi/main.cpp 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,40 @@ +#include <QCoreApplication> +#include <QFile> +#include <QTextStream> + +#include "qtermdecode.h" +#include "qtermbuffer.h" +#include "qtermtextline.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + QTermBuffer buffer(120,120,200); + QTermDecode decoder(&buffer); + + QFile file("main.cpp"); + file.open(QIODevice::ReadOnly); + + QByteArray ba=file.readAll(); + + decoder.decode(ba.data(),ba.size()); + + QFile of("pp.txt"); + of.open(QIODevice::WriteOnly); + + QTextStream ds(&of); + + int n=0; + while(n<buffer.lines()) + { + QByteArray cstrTemp = buffer.at(n)->getText(); + if(!cstrTemp.isEmpty()) + ds << cstrTemp; + else + ds << "\n"; + n++; + } + of.close(); + app.quit(); +} Property changes on: branches/ansi/main.cpp ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermbuffer.cpp =================================================================== --- branches/ansi/qtermbuffer.cpp (rev 0) +++ branches/ansi/qtermbuffer.cpp 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,695 @@ +/******************************************************************************* +FILENAME: qtermbuffer.cpp +REVISION: 2002.6.15 first created. + +AUTHOR: kingson +*******************************************************************************/ +/******************************************************************************* + NOTE + This file may be used, distributed and modified without limitation. + ******************************************************************************/ +#include "qtermbuffer.h" + +#include "qtermtextline.h" + + +//Added by qt3to4: +#include <QString> +#include <QRect> +#include <QRegExp> + + +QTermBuffer::QTermBuffer( int row, int column, int limit, QTerm_Mode mode ) +{ + m_row = row; + m_col = column; + m_limit = limit; + + m_screenY = 0; + + while( m_lineList.count()< m_row ) + m_lineList.append( new QTermTextLine ); + +// m_lineList.setAutoDelete(true); + + // initialize variables + m_curAttr = SETCOLOR( NO_COLOR ) | SETATTR( NO_ATTR ); + + m_caretX = 0; + m_caretY = 0; + m_oldCaretX = 0; + m_oldCaretY = 0; + + // the whole screen used + m_top = 0; + m_bottom = m_row -1; + + Insert_Mode = false; + NewLine_Mode = false; + + m_ptSelStart = QPoint(-1,-1); + m_ptSelEnd = QPoint(-1,-1); + +} + + +QTermBuffer::~QTermBuffer() +{ + +} + +void QTermBuffer::setSize(int col, int row) +{ + if(m_col==col && m_row==row) + return; + + if(m_row<row) + for(int i=0; i<row-m_row; i++ ) + m_lineList.append( new QTermTextLine ); + else if(m_row>row) + for(int i=0; i<m_row-row; i++ ) + delete m_lineList.takeAt(m_screenY+m_top); + + m_col = col; + m_row = row; + + m_top = 0; + m_bottom = m_row -1; + + m_caretY = qMin(m_caretY, row-1); + m_oldCaretY = qMin(m_caretY, row-1); + + clearSelect(); + + emit windowSizeChanged(m_col,m_row); + + emit bufferSizeChanged(); +} + +int QTermBuffer::column() +{ + return m_col; +} + +int QTermBuffer::lines() +{ + return m_screenY+m_row; +} +int QTermBuffer::row() +{ + // for BBS, row is defined as the visble area + if(mode==BBS) + return m_row; + // for others, it is the whole editing area. + if(mode==EDITOR || mode==VIEWER) + return m_lineList.count(); +} + +// take by the absolute index +QTermTextLine * QTermBuffer::at( int y ) +{ + return m_lineList.value( y , NULL); +} +// take by the relative (to screen) index +QTermTextLine * QTermBuffer::screen( int y ) +{ + return m_lineList.value( m_screenY+y , NULL); +} + +void QTermBuffer::setCurAttr( short attr ) +{ + m_curAttr = attr; +} + +void QTermBuffer::setBuffer( const QByteArray& cstr, int n ) +{ + + QTermTextLine * line = m_lineList.value( m_screenY + m_caretY, NULL ); + + if(line==NULL) + { + if( mode==BBS ) // out of BBS screen + { + qDebug("setBuffer: null line"); + return; + } + if( mode==EDITOR|| mode==VIEWER )// insert new line + { + while(m_caretY>=m_lineList.count()) + m_lineList.append(new QTermTextLine); + line = m_lineList.value( m_screenY + m_caretY, NULL ); + } + } + + if ( Insert_Mode /*bInsert*/ ) + line->insertText( cstr, m_curAttr, m_caretX ); + else + line->replaceText( cstr, m_curAttr, m_caretX ); + + moveCursorOffset( n, 0 ); +} +//nextline +void QTermBuffer::newLine() +{ + // NewLine_Mode also has effects in EDITOR mode + if( NewLine_Mode ) + { + moveCursor( 0, m_caretY ); + return; + } + + // for editor and viewer, always move to nextline + // not limited by m_row + if( mode == EDITOR || mode== VIEWER ) + { + moveCursorOffset(0, 1); + if( m_caretY==m_lineList.count() ) + m_lineList.append(new QTermTextLine); + return; + } + + + if( m_caretY == m_bottom ) + { + if( m_bottom == m_row -1 ) + addHistoryLine(1); + else + scrollLines( m_top, 1 ); + } + else + if (m_caretY < m_row-1 ) + moveCursorOffset( 0, 1 ); + +} + +//table +void QTermBuffer::tab() +{ + int x = ( m_caretX + 8 ) & -8; // or ( caretX/8 + 1 ) * 8 + moveCursor( x, m_caretY ); + + QByteArray cstr; + cstr.fill(' ',x-m_caretX); + setBuffer(cstr,x-m_caretX); +} + +void QTermBuffer::setMargins( int top, int bottom ) +{ + m_top = qMax(top-1,0); + m_bottom = qMin(qMax(bottom - 1,0), m_row-1); +} + +// cursor functions +void QTermBuffer::moveCursor( int x, int y ) +{ + // FIXME: column limit is not so important, why not relax it? + if ( x >= m_col ) + x = m_col; + if ( x < 0 ) + x = 0; + // row limit, only felt by BBS mode + if( mode==BBS ) + { + int stop = m_caretY<m_top?0:m_top; + if ( y < stop ) + y = stop; + stop = m_caretY>m_bottom?m_row-1:m_bottom; + if ( y > stop ) + y = stop; + } + + m_caretX = x; + m_caretY = y; +} + +// +void QTermBuffer::restoreCursor() +{ + moveCursor( m_saveX, m_saveY ); +} + +void QTermBuffer::moveCursorOffset( int x, int y ) +{ + moveCursor( m_caretX+x, m_caretY+y ); +} + +void QTermBuffer::saveCursor() +{ + m_saveX = m_caretX; + m_saveY = m_caretY; +} + +// carriage return +void QTermBuffer::cr() +{ + m_caretX = 0; +} + +// the screen oriented caret +QPoint QTermBuffer::scrCaret() +{ + return QPoint( m_caretX, m_caretY ); +} + +// the buffer oriented caret +QPoint QTermBuffer::absCaret() +{ + return QPoint(m_caretX, m_screenY+m_caretY); +} + +// erase functions +void QTermBuffer::eraseStr( int n ) +{ + QTermTextLine * line = m_lineList.at( m_caretY+m_screenY ); + + if( line==NULL ) + { + qDebug("QTermBuffer::eraseStr(%d) Null line",n); + return; + } + + int x = line->getLength() - m_caretX; + + clearArea( m_caretX, m_caretY, qMin(n, x), 1, m_curAttr ); +} +// delete functions +void QTermBuffer::deleteStr( int n ) +{ + QTermTextLine * line = m_lineList.at( m_caretY+m_screenY ); + + if( line==NULL ) + { + qDebug("QTermBuffer::deleteStr(%d) Null line",n); + return; + } + + int x = line->getLength() - m_caretX; + + if ( n >= x ) + clearArea( m_caretX, m_caretY, x, 1, m_curAttr ); + else + shiftStr( m_caretY, m_caretX, x, -n ); +} +// insert functions +void QTermBuffer::insertStr( int n ) +{ + QTermTextLine * line = m_lineList.at( m_caretY+m_screenY ); + + if( line==NULL ) + { + qDebug("QTermBuffer::insertStr(%d) Null line",n); + return; + } + + int x = line->getLength() - m_caretX; + + if ( n >= x ) + clearArea( m_caretX, m_caretY, x, m_caretY, m_curAttr ); + else + shiftStr( m_caretY, m_caretX, x, n ); +} + +// shift str in one line +// num > 0 shift right +void QTermBuffer::shiftStr( int index, int startX, int len, int num ) +{ + if ( !num ) + return; + + QByteArray cstr; + cstr.fill( ' ', abs( num ) ); + + QTermTextLine * line = m_lineList.at( index+m_screenY ); + + if( line==NULL ) + { + qDebug("QTermBuffer::shiftStr() Null line"); + return; + } + + if ( num > 0 ) // insert + { + line->insertText( cstr, m_curAttr, startX ); + return; + } + + if ( len + startX > line->getLength() ) + len = line->getLength() - startX; + + if ( num < 0 ) // delete + { + line->deleteText( startX + num, -num ); + line->insertText( cstr, m_curAttr, startX + len + num ); + return; + } +} + + +void QTermBuffer::deleteLine( int n ) +{ + int y = m_bottom - m_caretY; + + if ( n >= y ) + clearArea( 0, m_caretY, -1, y, m_curAttr ); + else + scrollLines( m_caretY, n ); +} + +void QTermBuffer::insertLine( int n ) +{ + int y = m_bottom - m_caretY; + + if ( n >= y ) + clearArea( 0, m_caretY, -1, y, m_curAttr ); + else + scrollLines( m_caretY, -n ); +} + +void QTermBuffer::eraseToEndLine() +{ + clearArea( m_caretX, m_caretY, -1, 1, m_curAttr ); +} + +void QTermBuffer::eraseToBeginLine() +{ + clearArea( 0, m_caretY, m_caretX, 1, m_curAttr ); +} + +void QTermBuffer::eraseEntireLine() +{ + clearArea( 0, m_caretY, -1, 1, m_curAttr ); +} +//scroll line +//num > 0 scroll up +void QTermBuffer::scrollLines( int startY, int num ) +{ + if ( !num ) + return; + + if ( num > 0 ) // delete + { + while ( num ) + { + delete m_lineList.takeAt( m_screenY+startY ); + m_lineList.insert( m_screenY+m_bottom, new QTermTextLine ); + num--; + } + } + + if ( num < 0 ) // insert + { + while ( num ) + { + delete m_lineList.takeAt( m_screenY+m_bottom ); + m_lineList.insert( m_screenY+startY, new QTermTextLine ); + num++; + } + } + + for(int i=m_screenY+startY; i<m_screenY+m_bottom; i++) + m_lineList.at(i)->setChanged(-1,-1); + +} + +void QTermBuffer::eraseToEndScreen() +{ + if( m_caretX==0 && m_caretY ==0 ) + { + eraseEntireScreen(); + return; + } + + clearArea( m_caretX, m_caretY, -1, 1, m_curAttr ); // erase to end line + + if ( m_caretY < m_bottom - 1 ) // erase + clearArea( 0, m_caretY + 1, -1, m_bottom - m_caretY - 1, m_curAttr ); + +} +void QTermBuffer::eraseToBeginScreen() +{ + if( m_caretX==m_col-1 && m_caretY ==m_row-1 ) + { + eraseEntireScreen(); + return; + } + + clearArea( 0, m_caretY, m_caretX, 1, m_curAttr ); // erase to begin line + if ( m_caretY > 0 ) // erase + clearArea( 0, 0, -1, m_caretY - 1, m_curAttr ); + +} +void QTermBuffer::eraseEntireScreen() +{ + addHistoryLine( m_row ); + + clearArea( 0, 0, m_col, m_bottom, m_curAttr ); +} +// width = -1 : clear to end +void QTermBuffer::clearArea(int startX, int startY, int width, int height, short attr ) +{ + QByteArray cstr; + + QTermTextLine * line; + + if ( startY < m_top ) + startY = m_top; + + if ( height > (int)( m_bottom - startY +1 ) ) + height = m_bottom - startY; + + for ( int i = startY; i < height + startY; i++ ) + { + line = m_lineList.at( i + m_screenY ); + + if(width == -1) + { + cstr.fill(' ',line->getLength() - startX ); + } + else + cstr.fill(' ',width); + line->replaceText( cstr, attr, startX ); + } + +} + +void QTermBuffer::addHistoryLine( int n ) +{ + while( n ) + { + if( m_screenY == m_limit ) + { + m_lineList.removeAt(uint(0)); + //m_ptSelStart.setY( m_ptSelStart.y()-1 ); + //m_ptSelEnd.setY( m_ptSelEnd.y()-1 ); + //if(m_ptSelStart.y()<0) + // m_ptSelStart=m_ptSelEnd=QPoint(-1,-1); + } + + m_lineList.append( new QTermTextLine ); + m_screenY = qMin(m_screenY+1,m_limit); + n--; + } + + for(int i=m_screenY+0; i<m_screenY+m_bottom; i++) + m_lineList.at(i)->setChanged(-1,-1); + + emit bufferSizeChanged(); +} + +// for debug +void QTermBuffer::startDecode() +{ + m_oldCaretX = m_caretX; + m_oldCaretY = m_caretY; + +} + +void QTermBuffer::endDecode() +{ + QTermTextLine * line = m_lineList.at( m_oldCaretY+m_screenY ); + + line->setChanged( m_oldCaretX, m_oldCaretX+1 ); + + line = m_lineList.at( m_caretY+m_screenY ); + + line->setChanged( m_caretX, m_caretX+1 ); + + clearSelect(); + +} + +void QTermBuffer::setMode( int mode ) +{ + switch( mode ) + { + case INSERT_MODE: + Insert_Mode = true; + break; + case NEWLINE_MODE: + NewLine_Mode = true; + break; + default: + break; + } + +} +void QTermBuffer::resetMode( int mode ) +{ + switch( mode ) + { + case INSERT_MODE: + Insert_Mode = false; + break; + case NEWLINE_MODE: + NewLine_Mode = false; + break; + default: + break; + } +} + +void QTermBuffer::setSelect( const QPoint& pt1, const QPoint& pt2, bool rect ) +{ + QPoint ptSelStart, ptSelEnd; + + if(pt1.y()==pt2.y()) + { + ptSelStart = pt1.x()<pt2.x() ? pt1 : pt2; + ptSelEnd = pt1.x()>pt2.x() ? pt1 : pt2; + } + else + { + ptSelStart = pt1.y()<pt2.y() ? pt1 : pt2; + ptSelEnd = pt1.y()>pt2.y() ? pt1 : pt2; + } + + if( m_ptSelStart == m_ptSelEnd ) // the first + { + for(int i=ptSelStart.y(); i<=m_ptSelEnd.y(); i++) + at(i)->setChanged(-1,-1); + } + else // find the changed area + { + if(rect) + { + for( int i=qMin(ptSelStart.y(),m_ptSelStart.y()); i<=qMax(ptSelEnd.y(), m_ptSelEnd.y()); i++) + at(i)->setChanged(-1,-1); + } + else + { + if( ptSelStart==m_ptSelStart ) + for(int i=qMin(ptSelEnd.y(), m_ptSelEnd.y()); i<=qMax(ptSelEnd.y(), m_ptSelEnd.y()); i++) + at(i)->setChanged(-1,-1); + else + if( ptSelEnd==m_ptSelEnd ) + for(int i=qMin(ptSelStart.y(), m_ptSelStart.y()); i<=qMax(ptSelStart.y(), m_ptSelStart.y()); i++) + at(i)->setChanged(-1,-1); + else + for(int i=qMin(ptSelStart.y(), m_ptSelStart.y()); i<=qMax(ptSelEnd.y(), m_ptSelEnd.y()); i++) + at(i)->setChanged(-1,-1); + + } + } + + m_ptSelStart = ptSelStart; + m_ptSelEnd = ptSelEnd; +} + +void QTermBuffer::clearSelect() +{ + if( m_ptSelStart == m_ptSelEnd ) + return; + + for(int i=m_ptSelStart.y(); i<=m_ptSelEnd.y(); i++ ) + at(i)->setChanged(-1,-1); + + m_ptSelStart=m_ptSelEnd=QPoint(-1,-1); +} + +bool QTermBuffer::isSelected( int index ) +{ + if( m_ptSelStart == m_ptSelEnd ) + return false; + else + return index>=m_ptSelStart.y() && index<=m_ptSelEnd.y(); +} + +bool QTermBuffer::isSelected( const QPoint& pt, bool rect ) +{ + if( m_ptSelStart == m_ptSelEnd ) + return false; + + if(rect) + { + int x1, x2; + x1=qMin(m_ptSelStart.x(), m_ptSelEnd.x()); + x2=qMax(m_ptSelStart.x(), m_ptSelEnd.x()); + return pt.x()<=x2 && pt.x()>=x1 && pt.y()>=m_ptSelStart.y() && pt.y()<=m_ptSelEnd.y(); + } + + if( pt.y()==m_ptSelStart.y() && m_ptSelStart.y()==m_ptSelEnd.y() ) + return pt.x()>=m_ptSelStart.x() && pt.x()<=m_ptSelEnd.x(); + else + if( pt.y()==m_ptSelStart.y() ) + return pt.x()>=m_ptSelStart.x(); + else + if( pt.y()==m_ptSelEnd.y() ) + return pt.x()<=m_ptSelEnd.x(); + else + return pt.y()>m_ptSelStart.y() && pt.y()<m_ptSelEnd.y(); + +} + +QByteArray QTermBuffer::getSelectText( bool rect, bool color, const QByteArray& escape ) +{ + QByteArray cstrSelect=""; + + if(m_ptSelStart == m_ptSelEnd ) + return cstrSelect; + + QRect rc; + QString strTemp; + + for( int i=m_ptSelStart.y(); i<=m_ptSelEnd.y(); i++ ) + { + rc = getSelectRect( i, rect ); + + if(color) + strTemp = QString::fromLatin1(m_lineList.at(i)->getAttrText( rc.left(), rc.width(), escape )); + else + strTemp = QString::fromLatin1(m_lineList.at(i)->getText( rc.left(), rc.width() )); + + //FIXME: potential problem? + int pos=strTemp.lastIndexOf(QRegExp("[\\S]")); + strTemp.truncate(pos+1); + cstrSelect += strTemp.toLatin1(); + + // add newline except the last line + if(i != m_ptSelEnd.y()) + { + #if defined(_OS_WIN32_) || defined(Q_OS_WIN32) + cstrSelect += '\r'; + #endif + cstrSelect += '\n'; + } + } + + return cstrSelect; +} + +QRect QTermBuffer::getSelectRect( int index, bool rect ) +{ + if(rect) + return QRect( qMin(m_ptSelStart.x(),m_ptSelEnd.x()), index, abs(m_ptSelEnd.x()-m_ptSelStart.x())+1, 1); + else + if( m_ptSelStart.y()==m_ptSelEnd.y() ) + return QRect( m_ptSelStart.x(), index, qMin(m_ptSelEnd.x(),m_col)-m_ptSelStart.x()+1, 1); + else + if( index==m_ptSelStart.y() ) + return QRect( m_ptSelStart.x(), index, qMax(0,m_col-m_ptSelStart.x()), 1); + else + if( index==m_ptSelEnd.y() ) + return QRect( 0, index, qMin(m_col, m_ptSelEnd.x()+1), 1); + else + return QRect( 0, index, m_col, 1); +} Property changes on: branches/ansi/qtermbuffer.cpp ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermbuffer.h =================================================================== --- branches/ansi/qtermbuffer.h (rev 0) +++ branches/ansi/qtermbuffer.h 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,152 @@ +#ifndef QTERMBUFFER_H +#define QTERMBUFFER_H + +#include <QList> +#include <QObject> + +#include <QPoint> + +#include "../frame/qterm.h" + +#define INSERT_MODE 0 +#define NEWLINE_MODE 1 + +enum QTerm_Mode {BBS, EDITOR, VIEWER}; + +class QTermTextLine; +class QString; +class QByteArray; +class QRect; + +class QTermBuffer : public QObject +{ + Q_OBJECT + +public: + QTermBuffer( int, int, int, QTerm_Mode=BBS ); + ~QTermBuffer(); + + QTermTextLine * at( int ); + QTermTextLine * screen( int ); + + void setSize( int, int ); + + int column(); + int row(); + int lines(); + + QPoint absCaret(); + QPoint scrCaret(); + + // string + void setBuffer( const QByteArray&, int n ); + + // attribute + void setCurAttr( short ); + + // string functions + void deleteStr( int ); + void insertStr( int ); + void eraseStr( int ); + + void deleteLine( int ); + void insertLine( int ); + + void eraseToBeginLine(); + void eraseToEndLine(); + void eraseEntireLine(); + + void eraseToBeginScreen(); + void eraseToEndScreen(); + void eraseEntireScreen(); + + + // cursor functions + void moveCursorOffset( int, int ); + void moveCursor( int, int ); + void saveCursor(); + void restoreCursor(); + void cr(); + + // non-printing characters + void newLine(); + void tab(); + void setMargins( int, int ); + + // mode set + void setMode( int ); + void resetMode( int ); + + // for test + void startDecode(); + void endDecode(); + + // selecting function + void setSelect( const QPoint&, const QPoint&, bool ); + void clearSelect(); + bool isSelected( const QPoint&, bool ); + bool isSelected( int ); + QByteArray getSelectText( bool, bool, const QByteArray& ); + QRect getSelectRect( int, bool ); + +signals: + void bufferSizeChanged(); + void windowSizeChanged(int,int); + +protected: + void shiftStr( int, int, int, int ); + void scrollLines( int, int ); + void clearArea( int, int, int, int, short ); + void addHistoryLine( int ); +/* + * simple illustration of buffer structure + * + * + * | ...................... + * | ...................... + * l | ...................... + * l | [ ###################### --->m_screenY + * i | [ ###################### + * m | r [ ###################### }--->m_top (relative to screen) + * i | o [ ###################### } + * t | w [ ###################### } + * | [ ###################### }--->m_bottom (relative to screen) + * | [ ###################### + * | [ ###################### + * ====================== + * column + */ + + // buffer size + int m_col, m_row; + // absolute position of the first screen line + int m_screenY; + // the maximum lines holding (BBS and CONSOLE) + int m_limit; + // page margins, which define the active area + int m_top, m_bottom; + + + // the actual data + QList<QTermTextLine*> m_lineList; + QTermTextLine * m_pCurrentLine; + + // caret indicator + int m_caretX, m_caretY, m_saveX, m_saveY; + // attribute + short m_curAttr; + + // ANSI modes + bool Insert_Mode, NewLine_Mode; + // data type: bbs, editor, etc + QTerm_Mode mode; + + // selection support + QPoint m_ptSelStart; + QPoint m_ptSelEnd; + + // for test + int m_oldCaretX, m_oldCaretY; + +}; +#endif // QTERMBUFFER_H Property changes on: branches/ansi/qtermbuffer.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermdecode.cpp =================================================================== --- branches/ansi/qtermdecode.cpp (rev 0) +++ branches/ansi/qtermdecode.cpp 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,563 @@ +/******************************************************************************* +FILENAME: qtermdecode.cpp +REVISION: 2001.8.12 first created. + +AUTHOR: kingson fiasco +*******************************************************************************/ +/******************************************************************************* + NOTE + This file may be used, distributed and modified without limitation. + *******************************************************************************/ +#include "qtermdecode.h" + +#include "qterm.h" +#include "qtermbuffer.h" + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> + +#define MODE_MouseX11 0 + +/************************************************************************/ +// state for FSM +// please read ANSI decoding +StateOption QTermDecode::normalState[] = +{ + { CHAR_CR, &QTermDecode::cr, normalState }, + { CHAR_LF, &QTermDecode::lf, normalState }, + { CHAR_FF, &QTermDecode::ff, normalState }, + { CHAR_TAB, &QTermDecode::tab, normalState }, + { CHAR_BS, &QTermDecode::bs, normalState }, + { CHAR_BELL, &QTermDecode::bell, normalState }, + { CHAR_ESC, 0, escState }, + { CHAR_NORMAL, &QTermDecode::normalInput, normalState } +}; + +// state after a ESC_CHAR +// only for BBS, so I reduce a lots +StateOption QTermDecode::escState[] = +{ + { '[', &QTermDecode::clearParam, bracketState},// VT52 + { 'A', &QTermDecode::cursorUp, normalState }, + { 'B', &QTermDecode::cursorDown, normalState }, + { 'C', &QTermDecode::cursorRight, normalState }, + { 'D', &QTermDecode::cursorLeft, normalState }, + { 'J', &QTermDecode::eraseScreen, normalState }, + { 'K', &QTermDecode::eraseLine, normalState }, + { 'Z', &QTermDecode::test, normalState }, + { '>', &QTermDecode::test, normalState }, + { '<', &QTermDecode::test, normalState }, + { CHAR_NORMAL, 0, normalState } +}; + +// state after ESC [ +StateOption QTermDecode::bracketState[] = +{ + { '0', &QTermDecode::paramDigit, bracketState }, + { '1', &QTermDecode::paramDigit, bracketState }, + { '2', &QTermDecode::paramDigit, bracketState }, + { '3', &QTermDecode::paramDigit, bracketState }, + { '4', &QTermDecode::paramDigit, bracketState }, + { '5', &QTermDecode::paramDigit, bracketState }, + { '6', &QTermDecode::paramDigit, bracketState }, + { '7', &QTermDecode::paramDigit, bracketState }, + { '8', &QTermDecode::paramDigit, bracketState }, + { '9', &QTermDecode::paramDigit, bracketState }, + { ';', &QTermDecode::nextParam, bracketState }, + + { '?', &QTermDecode::clearParam, privateState}, + + { 'A', &QTermDecode::cursorUp, normalState }, + { 'B', &QTermDecode::cursorDown, normalState }, + { 'C', &QTermDecode::cursorRight, normalState }, + { 'D', &QTermDecode::cursorLeft, normalState }, + { 'H', &QTermDecode::cursorPosition, normalState }, + { 'J', &QTermDecode::eraseScreen, normalState }, + { 'K', &QTermDecode::eraseLine, normalState }, + { 'L', &QTermDecode::insertLine, normalState }, + { 'M', &QTermDecode::deleteLine, normalState }, + { 'P', &QTermDecode::deleteStr, normalState }, + { 'X', &QTermDecode::eraseStr, normalState }, + { 'f', &QTermDecode::cursorPosition, normalState }, + { 'h', &QTermDecode::setMode, normalState }, + { 'l', &QTermDecode::resetMode, normalState }, + { 'm', &QTermDecode::getAttr, normalState }, + { 'r', &QTermDecode::setMargins, normalState }, + { 's', &QTermDecode::saveCursor, normalState }, + { 'u', &QTermDecode::restoreCursor, normalState }, + { '@', &QTermDecode::insertStr, normalState }, + + { CHAR_CR, &QTermDecode::cr, bracketState }, + { CHAR_LF, &QTermDecode::lf, bracketState }, + { CHAR_FF, &QTermDecode::ff, bracketState }, + { CHAR_TAB, &QTermDecode::tab, bracketState }, + { CHAR_BS, &QTermDecode::bs, bracketState }, + { CHAR_BELL, &QTermDecode::bell, bracketState }, + { CHAR_NORMAL, 0, normalState } +}; + +// state after ESC [ ? + +StateOption QTermDecode::privateState[] = +{ + { '0', &QTermDecode::paramDigit, privateState }, + { '1', &QTermDecode::paramDigit, privateState }, + { '2', &QTermDecode::paramDigit, privateState }, + { '3', &QTermDecode::paramDigit, privateState }, + { '4', &QTermDecode::paramDigit, privateState }, + { '5', &QTermDecode::paramDigit, privateState }, + { '6', &QTermDecode::paramDigit, privateState }, + { '7', &QTermDecode::paramDigit, privateState }, + { '8', &QTermDecode::paramDigit, privateState }, + { '9', &QTermDecode::paramDigit, privateState }, + { ';', &QTermDecode::nextParam, privateState }, + + { 'h', &QTermDecode::setMode, normalState }, + { 'l', &QTermDecode::resetMode, normalState }, + { 's', &QTermDecode::saveMode, normalState }, + { 'r', &QTermDecode::restoreMode, normalState }, + + { CHAR_NORMAL, 0, normalState } +}; + +QTermDecode::QTermDecode( QTermBuffer * buffer ) +{ + m_pBuffer = buffer; + + currentState = normalState; + + m_defAttr = SETCOLOR( NO_COLOR ) | SETATTR( NO_ATTR ); + + m_curAttr = m_defAttr; + + m_pBuffer->setCurAttr( m_curAttr ); + + bCurMode[MODE_MouseX11]=bSaveMode[MODE_MouseX11]=false; +} + +QTermDecode::~QTermDecode() +{ +} + +// process input string from C string +void QTermDecode::decode( const char *cstr, int length ) +{ + m_pData = cstr; + m_nLength = length; + m_nIndex = 0; + + m_bBell = false; + + int i; + StateOption *lastState; + + m_pBuffer->startDecode(); + + while ( m_nIndex < m_nLength ) + { + i = 0; + while ( currentState[i].byte != CHAR_NORMAL + && currentState[i].byte != m_pData[m_nIndex] ) + i++; + + lastState = currentState + i; + + if ( lastState->action != 0 ) + ( this->*( lastState->action ) )(); + + // reinit current state + currentState = lastState->nextState; + + m_nIndex++; + } + + m_pBuffer->endDecode(); +} + + +// fill letters into char buffer +void QTermDecode::normalInput() +{ + if ( m_pData[m_nIndex] < 0x20 && m_pData[m_nIndex] >= 0x00 ) // not print char + return; + int n = 0; + + while ( ( m_pData[m_nIndex + n] >= 0x20 || m_pData[m_nIndex + n] < 0x00 ) + && ( m_nIndex + n ) < m_nLength ) + n++; + + m_pBuffer->setBuffer( QByteArray(m_pData+m_nIndex,n+1) ); + + n--; + m_nIndex += n; +} + + +// non-printing characters functions +void QTermDecode::cr() +{ + // FIXME: dirty + m_pBuffer->cr(); +} + +void QTermDecode::lf() +{ + m_pBuffer->newLine(); +} + +void QTermDecode::ff() +{ + m_pBuffer->eraseEntireScreen(); + + m_pBuffer->moveCursor( 0, 0 ); +} + +void QTermDecode::tab() +{ + m_pBuffer->tab(); +} + +void QTermDecode::bs() +{ + m_pBuffer->moveCursorOffset( - 1, 0 ); +} + +void QTermDecode::bell() +{ + m_bBell = true; +} + +void QTermDecode::setMargins() +{ + m_pBuffer->setMargins( param[0], param[1] ); +} + +void QTermDecode::nextLine() +{ + cr(); + lf(); +} + +// parameters functions +void QTermDecode::clearParam() +{ + nParam = 0; + memset( param, 0, sizeof(param) ); +} + +// for performance, this grabs all digits +void QTermDecode::paramDigit() +{ + // make stream into number + // ( e.g. this input character is '1' and this param is 4 + // after the following sentence this param is changed to 41 + param[nParam] = param[nParam]*10 + m_pData[m_nIndex] - '0'; +} + +void QTermDecode::nextParam() +{ + nParam++; +} + +void QTermDecode::saveCursor() +{ + m_pBuffer->saveCursor(); +} + +void QTermDecode::restoreCursor() +{ + m_pBuffer->restoreCursor(); +} + +void QTermDecode::cursorLeft() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->moveCursorOffset( -n, 0 ); +} + +void QTermDecode::cursorRight() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->moveCursorOffset( n, 0 ); +} + +void QTermDecode::cursorUp() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->moveCursorOffset( 0, -n ); +} + +void QTermDecode::cursorDown() +{ + int n = param[0]; + + if ( n < 1) + n = 1; + + m_pBuffer->moveCursorOffset( 0, n ); +} + +void QTermDecode::cursorPosition() +{ + int x = param[1]; + int y = param[0]; + + if(x == 0) x = 1; + if(y == 0) y = 1; + + m_pBuffer->moveCursor( x - 1, y - 1 ); +} + +// erase functions +void QTermDecode::eraseStr() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->eraseStr( n ); +} + +// insert functions +void QTermDecode::insertStr() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->insertStr( n ); +} +// delete functions +void QTermDecode::deleteStr() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->deleteStr( n ); +} + + +void QTermDecode::eraseLine() +{ + switch ( param[0] ) + { + case 0: + m_pBuffer->eraseToEndLine(); + break; + case 1: + m_pBuffer->eraseToBeginLine(); + break; + case 2: + m_pBuffer->eraseEntireLine(); + break; + default: + break; + } +} + +void QTermDecode::insertLine() +{ + + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->insertLine( n ); +} + +void QTermDecode::deleteLine() +{ + int n = param[0]; + + if ( n < 1 ) + n = 1; + + m_pBuffer->deleteLine( n ); +} + +void QTermDecode::eraseScreen() +{ + switch ( param[0] ) + { + case 0: + m_pBuffer->eraseToEndScreen(); + break; + case 1: + m_pBuffer->eraseToBeginScreen(); + break; + case 2: + m_pBuffer->eraseEntireScreen(); + break; + case 3: + break; + } +} + + +void QTermDecode::getAttr() +{ + // get all attributes of character + + if ( !nParam && param[0] == 0 ) + { + m_curAttr = m_defAttr ; + m_pBuffer->setCurAttr(m_curAttr); + return; + } + + char cp = GETCOLOR( m_curAttr ); + char ea = GETATTR( m_curAttr ); + for ( int n = 0; n <= nParam; n++ ) + { + if ( param[n]/10 == 4 ) // background color + { + cp = cp & ~BGMASK; + cp += SETBG( param[n]%10 ); + } + else if ( param[n]/10 == 3 ) // front color + { + cp = cp & ~FGMASK; + cp += SETFG( param[n]%10 ); + } + else + { + switch ( param[n] ) + { + case 0: // attr off + cp = GETCOLOR( m_defAttr );//NO_COLOR; + ea = GETATTR( m_defAttr );//NO_ATTR; + break; + case 1: // bold + ea = SETBOLD( ea ); + break; + case 2: // dim + ea = SETDIM( ea ); + break; + case 4: // underline + ea = SETUNDERLINE( ea ); + break; + case 5: // blink + ea = SETBLINK( ea ); + break; + case 7: // reverse + ea = SETREVERSE( ea ); + break; + case 8: // invisible + ea = SETINVISIBLE( ea ); + break; + default: + break; + } + } + } + + m_curAttr = SETCOLOR( cp ) | SETATTR( ea ); + + m_pBuffer->setCurAttr( m_curAttr ); +} + +void QTermDecode::setMode() +{ + for( int i=0; i<=nParam; i++) + { + int n = param[i]; + switch(n) + { + case 4: + m_pBuffer->setMode( INSERT_MODE ); + break; + case 20: + m_pBuffer->setMode( INSERT_MODE ); + break; + case 1000: + case 1001: + emit mouseMode(true); + bCurMode[MODE_MouseX11]=true; + break; + default: + break; + } + } +} + +void QTermDecode::resetMode() +{ + for( int i=0; i<=nParam; i++) + { + int n = param[i]; + switch(n) + { + case 4: + m_pBuffer->resetMode( INSERT_MODE ); + break; + case 20: + m_pBuffer->resetMode( NEWLINE_MODE ); + break; + case 1000: + case 1001: + bCurMode[MODE_MouseX11]=false; + emit mouseMode(false); + break; + default: + break; + } + } +} + +void QTermDecode::saveMode() +{ + for( int i=0; i<=nParam; i++) + { + int n = param[i]; + switch(n) + { + case 1000: + case 1001: + bSaveMode[MODE_MouseX11]=bCurMode[MODE_MouseX11]; + break; + default: + break; + } + } +} + +void QTermDecode::restoreMode() +{ + for( int i=0; i<=nParam; i++) + { + int n = param[i]; + switch(n) + { + case 1000: + case 1001: + bCurMode[MODE_MouseX11]=bSaveMode[MODE_MouseX11]; + emit mouseMode( bCurMode[MODE_MouseX11] ); + break; + default: + break; + } + } +} + + +void QTermDecode::test() +{ +} Property changes on: branches/ansi/qtermdecode.cpp ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermdecode.h =================================================================== --- branches/ansi/qtermdecode.h (rev 0) +++ branches/ansi/qtermdecode.h 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,105 @@ +#ifndef QTERMDECODE_H +#define QTERMDECODE_H + + +#include <QObject> + +class QTermDecode; +class QTermBuffer; + +typedef void ( QTermDecode::*StateFunc )(); + +struct StateOption +{ + int byte; // char value to look for; -1==end/default + StateFunc action; + StateOption *nextState; +}; + + + +class QTermDecode : public QObject +{ + Q_OBJECT + +public: + QTermDecode( QTermBuffer * ); + ~QTermDecode(); + + void decode( const char *cstr, int length ); + + bool bellReceive() { return m_bBell; } + +private: +// escape sequence actions +// you'd better see FSM structure array in QTermDecode.cpp + + void nextLine(); + void getAttr(); + void setMargins(); + + // char screen functions + void deleteStr(); + void deleteLine(); + void insertStr(); + void insertLine(); + void eraseStr(); + void eraseLine(); + void eraseScreen(); + + // cursor functions + void saveCursor(); + void restoreCursor(); + void cursorLeft(); + void cursorDown(); + void cursorRight(); + void cursorUp(); + void cursorPosition(); + +/*****************************************************************************/ +// other escape sequence actions + void normalInput(); + + // action parameters + void clearParam(); + void paramDigit(); + void nextParam(); + + // non-printing characters + void cr(), lf(), ff(), bell(), tab(), bs(); + + void setMode(); + void resetMode(); + + void saveMode(); + void restoreMode(); + + void test(); + +signals: + void mouseMode(bool); + +private: + + bool m_bBell; + short m_curAttr, m_defAttr; + + StateOption *currentState; // FSM related + static StateOption normalState[], escState[], + bracketState[], privateState[]; + + const char *m_pData; + int m_nIndex, m_nLength; + + int nParam, param[30]; // to store digital params like *[m,nPn; + + QTermBuffer * m_pBuffer; // the buffer operated on + + + bool bSaveMode[30]; + bool bCurMode[30]; + + bool m_test; +}; + +#endif Property changes on: branches/ansi/qtermdecode.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermencode.cpp =================================================================== --- branches/ansi/qtermencode.cpp (rev 0) +++ branches/ansi/qtermencode.cpp 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,36 @@ +/******************************************************************************* +FILENAME: qtermencode.cpp +REVISION: 2005.7.19 first created. + +AUTHOR: kingson +*******************************************************************************/ +/******************************************************************************* + NOTE + This file may be used, distributed and modified without limitation. + *******************************************************************************/ +#include "qtermencode.h" + +#include "qtermbuffer.h" + +QTermDecode::QTermDecode( QTermBuffer * buffer ) +{ + m_pBuffer = buffer; + +} + +QTermDecode::~QTermDecode() +{ +} + +QByteArray QTermDecode::encode( const QByteArray& escape ) +{ + QByteArray text; + + int n=0; + while( n<m_pBuffer->lines() ) + { + QTermTextLine *pLine = m_pBuffer->at(n); + + n++; + } +} Property changes on: branches/ansi/qtermencode.cpp ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermencode.h =================================================================== --- branches/ansi/qtermencode.h (rev 0) +++ branches/ansi/qtermencode.h 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,23 @@ +#ifndef QTERMENCODE_H +#define QTERMENCODE_H + +#include <QObject> + +class QTermBuffer; + +class QTermEncode : public QObject +{ + Q_OBJECT + +public: + QTermEncode( QTermBuffer * ); + ~QTermEncode(); + + QByteArray encode(const QByteArray escape=""); + +private: + QTermBuffer * m_pBuffer; // the buffer operated on + +}; + +#endif // QTERMENCODE_H Property changes on: branches/ansi/qtermencode.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermtextline.cpp =================================================================== --- branches/ansi/qtermtextline.cpp (rev 0) +++ branches/ansi/qtermtextline.cpp 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,353 @@ +/******************************************************************************* +FILENAME: qtermtextline.cpp +REVISION: 2001.8.12 first created. + +AUTHOR: kingson fiasco +*******************************************************************************/ +/******************************************************************************* + NOTE + This file may be used, distributed and modified without limitation. + *******************************************************************************/ +#include "../../frame/qterm.h" +#include "qtermtextline.h" + +#include <QRegExp> +#include <QString> +#include <stdio.h> + +QTermTextLine::QTermTextLine() + :m_text(),m_color(),m_attr() +{ + m_bChanged=true; + m_start = -1; + m_end = -1; + reset(); +} + +QTermTextLine::~QTermTextLine() +{ + +} + + +// insert cstr at position index of line, +// if attrib == -1, use current attr, +// if index == -1, append line +void QTermTextLine::insertText( const QByteArray& str, short attribute, int index ) +{ + // set attribute + if ( attribute != -1 ) + { + m_curColor = GETCOLOR(attribute); + if( m_curColor == '\0' ) + m_curColor = NO_COLOR; + m_curAttr = GETATTR (attribute); + if( m_curAttr == '\0' ) + m_curAttr = NO_ATTR; + } + + + int len = str.length(); + + QByteArray tmp; + + int start; + + if ( index == -1 ) // append + { + m_text += str; + + tmp.fill( m_curColor, len ); + m_color += tmp; + tmp.fill( m_curAttr, len ); + m_attr += tmp; + + start = m_length; + m_length += len; + } + else // insert + { + + if(index>=m_length) + { + m_text.insert( index, str.data() ); + m_length = m_text.length(); + + tmp.fill( NO_COLOR, index-m_length ); + m_color.append(tmp); + tmp.fill( m_curColor, len ); + m_color.insert( index, tmp.data() ); + + tmp.fill( NO_ATTR, index-m_length ); + m_attr.append(tmp); + tmp.fill( m_curAttr, len ); + m_attr.insert( index, tmp.data() ); + } + else + { + m_text.insert( index, str.data() ); + m_length = m_text.length(); + tmp.fill( m_curColor, len ); + m_color.insert( index, tmp.data() ); + tmp.fill( m_curAttr, len ); + m_attr.insert( index, tmp.data() ); + + } + start = index; + } + + setChanged( start, m_length ); + +} + +// replace the cstring with cstr, which start at index and have len chars, +// if attr == -1, use the current attr, +// if index == -1, reset line and insert str. +// if len == -1, replace str's length chars. +void QTermTextLine::replaceText( const QByteArray& str, short attribute, int index, int len ) +{ + // set attribute + if ( attribute != -1 ) + { + m_curColor = GETCOLOR(attribute); + if( m_curColor == '\0' ) + m_curColor = NO_COLOR; + m_curAttr = GETATTR (attribute); + if( m_curAttr == '\0' ) + m_curAttr = NO_ATTR; + } + + int newlen = str.length(); + + QByteArray tmp; + + if ( index == -1 ) // replace whole line + { + m_text = str; + + m_color.fill( m_curColor, newlen ); + m_attr.fill( m_curAttr, newlen ); + + setChanged( 0,qMax(newlen, m_length) ); + + m_length = newlen; + + return; + } + + if ( len == -1 ) // replace with str + len = newlen; + + if( index>=m_length ) + { + tmp.fill( ' ', index-m_length ); + m_text.replace( index, len, str ); + + setChanged( index, qMax(m_length, m_text.length())); + + m_length = m_text.length(); + + + tmp.fill( NO_COLOR, index-m_length ); + m_color.append(tmp); + tmp.fill( m_curColor, newlen ); + m_color.replace( index, len, tmp ); + + tmp.fill( NO_ATTR, index-m_length ); + m_attr.append(tmp); + tmp.fill( m_curAttr, newlen ); + m_attr.replace( index, len, tmp ); + + } + else + { + m_text.replace( index, len, str ); + + setChanged( index, qMax(m_length, m_text.length())); + + m_length = m_text.length(); + + tmp.fill( m_curColor, newlen ); + m_color.replace( index, len, tmp ); + tmp.fill( m_curAttr, newlen ); + m_attr.replace( index, len, tmp ); + } + +} + +// delete cstr from position index of line, +// it will delete len chars, +// if index == -1, delete the whole line +// if len ==-1, delete the rest from index +void QTermTextLine::deleteText( int index, int len ) +{ + if ( index == -1 ) // delete the line + { + setChanged( 0, m_length ); + reset(); + return; + } + + if ( len == -1 ) // only make len larger so it will delete + len = m_length; // the right from index + + m_text.remove( index, len ); + m_color.remove( index, len ); + m_attr.remove( index, len ); + + setChanged( index, m_length ); + + m_length = m_text.length(); + + +} + +// return str in text for show +// if index == -1, get the whole line +// if len == -1, get the rest from index +QByteArray QTermTextLine::getText( int index, int len ) +{ + QByteArray str; + + if ( index == -1 ) + str = m_text; + else if ( len == -1 ) + str = m_text.mid( index, len ); + else + str = m_text.mid( index, len ); + return str; +} + +QByteArray QTermTextLine::getAttrText( int index, int len, const QByteArray& escape ) +{ + QByteArray str; + int startx; + char tempcp, tempea; + + if ( index == -1 ) + { + index =0; + len = m_length; + } + else if ( len == -1 ) + len = m_length-index; + + + if(index>=m_length) + return (char *)NULL; + + printf("index=%d len=%d m_length=%d\n", index, len, m_length); + + for( int i=index; i<index+len && i<m_length; i++) + { + startx = i; + tempcp = m_color.at(i); + tempea = m_attr.at(i); + // get str of the same attribute + while ( tempcp == m_color.at(i) && + tempea == m_attr.at(i) && + i < m_length ) + i++; + + int fg = GETFG(tempcp)+30; + int bg = GETBG(tempcp)+40; + QByteArray cstrAttr=QString("%1;%2").arg(fg).arg(bg).toLatin1();//QByteArray::setNum(fg)+';'+QByteArray::setNum(bg)+';'; +// cstrAttr.sprintf("%d;%d;", fg, bg ); + cstrAttr = escape + cstrAttr; + + if (GETBOLD(tempea)) + cstrAttr += "1;"; + if ( GETDIM(tempea ) ) + cstrAttr += "2;"; + if ( GETUNDERLINE( tempea ) ) + cstrAttr += "4;"; + if ( GETBLINK( tempea ) ) + cstrAttr += "5;"; + if ( GETRAPIDBLINK( tempea ) ) + cstrAttr += "6;"; + if ( GETREVERSE( tempea ) ) + cstrAttr += "7;"; + if ( GETINVISIBLE( tempea ) ) + cstrAttr += "8;"; + cstrAttr.remove(cstrAttr.length()-1,1); + cstrAttr += "m"; + str += cstrAttr; // set attr + // the text + str += getText(startx, i-startx); + // reset attr + cstrAttr = escape+"0m"; + str += cstrAttr; + i--; + } + + return str; +} + +// reset line +inline void QTermTextLine::reset() +{ + m_length = 0; + + m_text = ""; + m_color = ""; + m_attr =""; + + m_curColor = NO_COLOR; + m_curAttr = NO_ATTR; + + +} +bool QTermTextLine::hasBlink() +{ + bool blink = false; + + char tempea; + for( int i=0; i<m_length; i++) + { + tempea = m_attr.at(i); + if(GETBLINK(tempea)) + { + blink = true; + break; + } + } + + return blink; +} + + +bool QTermTextLine::isChanged(int &start, int &end) +{ + start=m_start; + end=m_end; + + return m_bChanged; +} + +void QTermTextLine::setChanged( int start, int end ) +{ + if(start==-1 && end==-1) + { + m_bChanged = true; + m_start=start; + m_end=end; + return; + } + + if(m_bChanged) + { + if(!(m_start==-1 && m_end==-1)) + { + m_start=qMin(start, m_start); + m_end = qMax(end, m_end); + } + } + else + { + m_start = start; + m_end = end; + } + + m_bChanged = true; +} + Property changes on: branches/ansi/qtermtextline.cpp ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: branches/ansi/qtermtextline.h =================================================================== --- branches/ansi/qtermtextline.h (rev 0) +++ branches/ansi/qtermtextline.h 2006-08-29 08:57:38 UTC (rev 330) @@ -0,0 +1,55 @@ +#ifndef QTERMTEXTLINE_H +#define QTERMTEXTLINE_H + +#include <QByteArray> + +class QTermTextLine +{ + +public: + QTermTextLine(); + ~QTermTextLine(); + + void reset(); + + void setChanged(int start, int end); + + void clearChange() { m_bChanged = false; m_start=-1; m_end=-1; } + + bool isChanged( int &start, int &end ); + + QByteArray getColor() { return m_color; } + + QByteArray getAttr() { return m_attr; } + + int getLength() { return m_length; } + + QByteArray getAttrText( int index = -1, int len = -1, const QByteArray & escape="\x1b\x1b" ); + + QByteArray getText( int index = -1, int len = -1 ); + + void insertText( const QByteArray& str, short attr = -1, int index = -1 ); + + void deleteText( int index = -1, int len = -1 ); + + void replaceText( const QByteArray& str, short attr = -1, int index = -1, int len = -1 ); + + bool hasBlink(); + +protected: + + + // we use QString to store any character after decode + int m_length; + QByteArray m_text; + QByteArray m_color; + QByteArray m_attr; + char m_curColor; + char m_curAttr; + bool m_bChanged; + bool m_bBlink; + + int m_start, m_end; +}; + +#endif //QTERMTEXTLINE_H Property changes on: branches/ansi/qtermtextline.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |