⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cviewplain.cpp

📁 一个Symbain 文本编辑器
💻 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 + -