📄 cviewplain.cpp
字号:
/*
* HView [c]2004 Marcin Skoczylas, All rights reserved
*
* This file is under GPL license, see gpl.txt file
*
*/
#include "SymDefs.h"
#include "CViewPlain.h"
CViewPlain::CViewPlain(CHVContainer *iContainer)
{
this->iContainer=iContainer;
}
CViewPlain::~CViewPlain()
{
delete [] filePosArray;
}
void CViewPlain::SetupArrays(TInt filePos)
{
int y;
char *buf;
iContainer->numCharsY = iContainer->screenRect.Height() / HVFONT_HEIGHT;
iContainer->numCharsX = iContainer->screenRect.Width() / HVFONT_WIDTH;
LOGF("preparing char arrays for plain view: iContainer->numCharsX=%d iContainer->numCharsY=%d\n", iContainer->numCharsX, iContainer->numCharsY);
//LOGF("setuparrays - !filePos?\n");
// prepare the char arrays knowing the screen and font size
if (!filePosArray)
filePosArray = new TInt[iContainer->numCharsY];
//LOGF("setuparrays - !iContainer->charsArray?\n");
if (!iContainer->charsArray)
{
iContainer->charsArray = new char* [iContainer->numCharsY];
for (y = 0; y < iContainer->numCharsY; y++)
{
iContainer->charsArray[y] = NULL;
}
}
for (y = 0; y < iContainer->numCharsY; y++)
{
buf = new char[iContainer->numCharsX+1]; //DEBUG!!!
buf[iContainer->numCharsX-1] = 0x00;
filePosArray[y] = filePos;
iContainer->appUi->fileLoader->ReadOneLine(buf, filePos, iContainer->numCharsX);
//LOGF("line readed: '%s' pos=%d next=%d\n", buf, filePosArray[y], filePos);
//LOGF("iContainer->charsArray[%d]?\n", y);
if (iContainer->charsArray[y])
{
//LOGF("delete\n");
delete iContainer->charsArray[y];
}
iContainer->charsArray[y] = buf;
}
afterLastLinePos = filePos;
}
void CViewPlain::DrawWholeBackBuffer()
{
int i,j;
for (i = 0; i < iContainer->numCharsY; i++)
{
for (j = 0; j < iContainer->numCharsX; j++)
{
if (iContainer->charsArray[i][j] == '\n')
break;
iContainer->backBufferGc->BitBlt(
TPoint(j * HVFONT_WIDTH, i * HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[i][j]));
}
}
}
void CViewPlain::ScrollRight()
{
/* too slow code, have time to write arrays swapping? mee no ;p
if (filePosArray[0] < (iContainer->appUi->fileLoader->fileSize-1))
{
SetupArrays(filePosArray[0]+1);
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
*/
}
void CViewPlain::ScrollLeft()
{
/* r u kiddin' ??
if (filePosArray[0] > 0)
{
SetupArrays(filePosArray[0]-1);
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
*/
}
void CViewPlain::ScrollPageDown()
{
for (int i = 0; i < iContainer->numCharsY; i++)
{
ScrollDown(false);
}
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
void CViewPlain::ScrollPageUp()
{
for (int i = 0; i < iContainer->numCharsY; i++)
{
ScrollUp(false);
}
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
void CViewPlain::ScrollDown(bool draw)
{
int y, x;
// already at end of file?
if (afterLastLinePos == iContainer->appUi->fileLoader->fileSize)
{
return;
}
delete [] iContainer->charsArray[0];
// scroll arrays
for (y = 1; y < iContainer->numCharsY; y++)
{
filePosArray[y-1] = filePosArray[y];
iContainer->charsArray[y-1] = iContainer->charsArray[y];
}
iContainer->charsArray[iContainer->numCharsY-1] = new char[iContainer->numCharsX+1]; //DEBUG!!!!!!
iContainer->charsArray[iContainer->numCharsY-1][iContainer->numCharsX-1] = 0x00;
filePosArray[iContainer->numCharsY-1] = afterLastLinePos;
iContainer->appUi->fileLoader->ReadOneLine(iContainer->charsArray[iContainer->numCharsY-1], afterLastLinePos, iContainer->numCharsX);
//LOGF("line readed: '%s' pos=%d next=%d\n", iContainer->charsArray[iContainer->numCharsY-1], filePosArray[iContainer->numCharsY-1], afterLastLinePos);
if (!draw)
return;
// move lines up, starting on second line (bitmap copy from backbuffer)
TRect src(0, HVFONT_HEIGHT, iContainer->numCharsX * HVFONT_WIDTH, iContainer->numCharsY * HVFONT_HEIGHT);
iContainer->backBufferGc2->BitBlt(TPoint(0, 0), iContainer->backBuffer, src);
// clear last line
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
iContainer->backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
iContainer->backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
iContainer->backBufferGc2->DrawRect(
TRect(0,
(iContainer->numCharsY-1) * HVFONT_HEIGHT,
iContainer->numCharsX * HVFONT_WIDTH,
iContainer->numCharsY * HVFONT_HEIGHT));
// draw last line
for (x = 0; x < iContainer->numCharsX; x++)
{
if (iContainer->charsArray[iContainer->numCharsY-1][x] == '\n')
break;
iContainer->backBufferGc2->BitBlt(TPoint(x * HVFONT_WIDTH, (iContainer->numCharsY-1) * HVFONT_HEIGHT), iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[iContainer->numCharsY-1][x]));
}
iContainer->backBufferGc->BitBlt(TPoint(0, 0), iContainer->backBuffer2);
iContainer->DrawNow();
}
void CViewPlain::ScrollUp(bool draw)
{
int x, y, retCode;
//LOGF("scrollup\n");
// already at beginning of file?
if (filePosArray[0] == 0)
{
LOGF("ScrollUp: on beginning of file\n");
return;
}
delete [] iContainer->charsArray[iContainer->numCharsY-1];
afterLastLinePos = filePosArray[iContainer->numCharsY-1];
for (y = (iContainer->numCharsY-2); y > -1; y--)
{
filePosArray[y+1] = filePosArray[y];
iContainer->charsArray[y+1] = iContainer->charsArray[y];
}
iContainer->charsArray[0] = new char[iContainer->numCharsX+1]; //DEBUG!!!!!!
iContainer->charsArray[0][iContainer->numCharsX-1] = 0x00;
if ((retCode = iContainer->appUi->fileLoader->ReadOneLineBefore(iContainer->charsArray[0], filePosArray[0], iContainer->numCharsX)) < 0)
{
LOGF("RE-READ full line from pos %d\n", filePosArray[0]);
char *buf;
int i, y, x, filePos;
filePos = filePosArray[0];
if (retCode == ERetMyk)
{
for (y = 0; y < iContainer->numCharsY; y++)
{
if (iContainer->charsArray[y])
delete [] iContainer->charsArray[y];
buf = new char[iContainer->numCharsX+1]; //DEBUG!!!
buf[iContainer->numCharsX-1] = 0x00;
filePosArray[y] = filePos;
iContainer->appUi->fileLoader->ReadOneLine(buf, filePos, iContainer->numCharsX);
//LOGF("line readed: '%s' pos=%d next=%d\n", buf, filePosArray[y], filePos);
iContainer->charsArray[y] = buf;
for (x = 0; x < iContainer->numCharsX; x++)
{
if (buf[x] == '\n')
{
if (!draw)
return;
// move down only needed lines
// move lines down, starting on next needed line (bitmap copy from backbuffer)
TRect src(0,
y * HVFONT_HEIGHT,
iContainer->numCharsX * HVFONT_WIDTH,
(iContainer->numCharsY-1) * HVFONT_HEIGHT);
iContainer->backBufferGc2->BitBlt(TPoint(0, HVFONT_HEIGHT*(y+1)), iContainer->backBuffer, src);
// clear first lines
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
iContainer->backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
iContainer->backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
iContainer->backBufferGc2->DrawRect(TRect(0, 0, iContainer->numCharsX * HVFONT_WIDTH, HVFONT_HEIGHT*(y+1)));
// draw first lines
for (i = 0; i < (y+1); i++)
{
for (x = 0; x < iContainer->numCharsX; x++)
{
if (iContainer->charsArray[i][x] == '\n')
break;
iContainer->backBufferGc2->BitBlt(TPoint(x * HVFONT_WIDTH, i * HVFONT_HEIGHT), iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[i][x]));
}
}
iContainer->backBufferGc->BitBlt(TPoint(0, 0), iContainer->backBuffer2);
iContainer->DrawNow();
return;
}
}
}
afterLastLinePos = filePos;
DrawWholeBackBuffer();
iContainer->DrawNow();
return;
}
else
{
/*
// olej ten wnik, do nothing, screen is already updated
*/
SetupArrays(0);
return;
}
DrawWholeBackBuffer();
iContainer->DrawNow();
return;
}
//LOGF("up line readed: '%s' pos=%d next=%d\n", iContainer->charsArray[0], filePosArray[0], afterLastLinePos);
if (!draw)
return;
// move lines down, starting on previous before last line (bitmap copy from backbuffer)
TRect src(0, 0, iContainer->numCharsX * HVFONT_WIDTH, (iContainer->numCharsY-1) * HVFONT_HEIGHT);
iContainer->backBufferGc2->BitBlt(TPoint(0, HVFONT_HEIGHT), iContainer->backBuffer, src);
// clear first line
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
iContainer->backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
iContainer->backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
iContainer->backBufferGc2->DrawRect(TRect(0, 0, iContainer->numCharsX * HVFONT_WIDTH, HVFONT_HEIGHT));
// draw first line
for (x = 0; x < iContainer->numCharsX; x++)
{
if (iContainer->charsArray[0][x] == '\n')
break;
iContainer->backBufferGc2->BitBlt(TPoint(x * HVFONT_WIDTH, 0), iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[0][x]));
}
iContainer->backBufferGc->BitBlt(TPoint(0, 0), iContainer->backBuffer2);
iContainer->DrawNow();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -