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

📄 chvcontainer.cpp

📁 一个Symbain 文本编辑器
💻 CPP
字号:
/*
 * HView [c]2004 Marcin Skoczylas, All rights reserved
 *
 * This file is under GPL license, see gpl.txt file
 *
 */

#include "CHVContainer.h"
#include "SymDefs.h"

CHVContainer::CHVContainer()
{

}

// EPOC default constructor can leave.
void CHVContainer::ConstructL(const TRect& aRect, CHVAppUi *appUi)
{
    CreateWindowL();

    SetRect(aRect);
    ActivateL();

	screenRect = aRect;

	// create backbuffer first
	LOGF("creating backbuffer1 bitmap\n");
	backBuffer = new (ELeave) CFbsBitmap();
	CleanupStack::PushL(backBuffer);
	backBuffer->Create(CEikonEnv::Static()->ScreenDevice()->SizeInPixels(), CEikonEnv::Static()->DefaultDisplayMode());
	backBufferDevice = CFbsBitmapDevice::NewL(backBuffer);

	CleanupStack::PushL(backBufferDevice);
	User::LeaveIfError(backBufferDevice->CreateContext(backBufferGc));

	// clear screen
    backBufferGc->SetPenStyle(CGraphicsContext::ENullPen);
    backBufferGc->SetBrushColor(TRgb(149, 149, 239));
    backBufferGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
    backBufferGc->DrawRect(screenRect);

	backBufferGc->UseFont(iCoeEnv->NormalFont());
	_LIT(welcomeTxt,  "HView v1.13");	// HVIEWVERSION
	_LIT(welcomeTxt2, "by SLAJEREK");
	const int txtLength = 11;

	const int sysFontHeight = 15;		// faster than: font->TextWidthInPixels(text2);
	const int sysFontWidth = 8;
	int centrPosX = aRect.Width()/2 - ((sysFontWidth*txtLength)/2);
	int centrPosY = (aRect.Height()/2)-45;

	backBufferGc->DrawText(welcomeTxt, TPoint(centrPosX, centrPosY));
	backBufferGc->DrawText(welcomeTxt2, TPoint(centrPosX-3, centrPosY+sysFontHeight));
	ForceDraw();
	
	CleanupStack::Pop(2);



	
	this->appUi = appUi;
	
	DrawNow();
	
	// any debug code here:



	// STARTUP APP

	// loading font bitmap, convert to display mode
	LOGF("load hvfont.mbm\n");

	TFileName defaultPath;
	_LIT(hvfontsFileName, "hvfont.mbm");
		
	// This gives complete path name to your application 
	defaultPath.Copy(CEikonEnv::Static()->EikAppUi()->Application()->AppFullName()); 

	// now parse and strip of the application name 
	TParsePtr parse(defaultPath); 
	defaultPath.Copy(parse.DriveAndPath()); 
	defaultPath.Append(hvfontsFileName);

	LOGF("hvfont path:\n");
	LOGD(&defaultPath);
	LOGF_noTimeStamp("\n");

	CFbsBitmap *originalBitmap = new(ELeave) CFbsBitmap();
	CleanupStack::PushL(originalBitmap);
	TInt loadException = originalBitmap->Load(defaultPath, EMbmHvfontFreeascii);
	User::LeaveIfError(loadException);

	LOGF("converting\n");
	// Create a new bitmap, graphics device and context 
	fontBitmap = new (ELeave) CFbsBitmap();
	CleanupStack::PushL(fontBitmap); 
	fontBitmap->Create(originalBitmap->SizeInPixels(), CEikonEnv::Static()->DefaultDisplayMode()); 
	CFbsBitmapDevice* graphicsDevice = CFbsBitmapDevice::NewL(fontBitmap); 
	CleanupStack::PushL(graphicsDevice); 
	CFbsBitGc* graphicsContext; 
	User::LeaveIfError( graphicsDevice->CreateContext(graphicsContext) ); 
	// blit (conversion)
	graphicsContext->BitBlt( TPoint(0,0), originalBitmap );

	LOGF("cleaning up\n");
	CleanupStack::Pop(2);
	CleanupStack::Pop(originalBitmap);
	delete graphicsContext;
	delete graphicsDevice; 
	delete originalBitmap;
	LOGF("done\n");


	/*
	done at the beginnign
	  backBuffer = new (ELeave) CFbsBitmap();
	CleanupStack::PushL(backBuffer);
	backBuffer->Create(CEikonEnv::Static()->ScreenDevice()->SizeInPixels(), CEikonEnv::Static()->DefaultDisplayMode());
	backBufferDevice = CFbsBitmapDevice::NewL(backBuffer);
	CleanupStack::PushL(backBufferDevice);
	User::LeaveIfError(backBufferDevice->CreateContext(backBufferGc));
	CleanupStack::Pop(2);
    backBufferGc->SetPenStyle(CGraphicsContext::ENullPen);
    backBufferGc->SetBrushColor(TRgb(149, 149, 239));
    backBufferGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
    backBufferGc->DrawRect(screenRect);
	*/

	LOGF("creating backbuffer2 bitmap\n");
	backBuffer2 = new (ELeave) CFbsBitmap();
	CleanupStack::PushL(backBuffer2);
	backBuffer2->Create(CEikonEnv::Static()->ScreenDevice()->SizeInPixels(), CEikonEnv::Static()->DefaultDisplayMode());
	backBufferDevice2 = CFbsBitmapDevice::NewL(backBuffer2);
	CleanupStack::PushL(backBufferDevice2);
	User::LeaveIfError(backBufferDevice2->CreateContext(backBufferGc2));
	CleanupStack::Pop(2);
    backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
    backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
    backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
    backBufferGc2->DrawRect(screenRect);

	// loading up file
	LOGF("opening file\n");
	if (appUi->fileLoader == NULL)
	{
		SYS_Errorf("fileLoader null!");
	}

	// TAKE IT FROM INI FILE!
	viewMode = EViewPlain;
//	viewMode = EViewBinary;

	viewBinary = new (ELeave) CViewBinary(this);
	viewPlain = new (ELeave) CViewPlain(this);

	_LIT(empty, "");
	lastOpenedFile.Copy(empty);


	//appUi->fileLoader->WriteIniFile(viewMode, lastOpenedFile);
	appUi->fileLoader->ReadIniFile(viewMode, lastOpenedFile);

	LOGF("lastOpenedFile:\n");
//	LOGD(&lastOpenedFile);
	
	if (appUi->docFileName.Size() > 0)
	{
		if (OpenNewFile(appUi->docFileName))		// ;+)!= false
		{
			fileOpened = true;
			SetupArrays(0);			// start from beginning of file

			// temporary
			//SetupArrays(5);

			DrawWholeBackBuffer();

			DrawNow();

			lastOpenedFile = appUi->docFileName;

			appUi->fileLoader->WriteIniFile(viewMode, lastOpenedFile);
			return; // don't show welcome message
		}
	}

	fileOpened = false;
	LOGF("filenot opened preparing backbuffer\nget dense font\n");
	CFont *font = (CFont *)CEikonEnv::Static()->DenseFont();

	int posY = screenRect.Height()-font->HeightInPixels()*4;
	LOGF("additional text: posY=%d\n", posY);
	int textSizeX;

	backBufferGc->UseFont(font);

	_LIT(text1, "http://hview-s60.prv.pl");
	textSizeX = font->TextWidthInPixels(text1);
	backBufferGc->DrawText(text1, 
		TPoint(screenRect.Width()-textSizeX, posY));

	_LIT(text2, "bitmap fonts by:");
	textSizeX = font->TextWidthInPixels(text2);
	backBufferGc->DrawText(text2, 
		TPoint(screenRect.Width()-textSizeX, posY+font->HeightInPixels()*2));

	_LIT(text3, "Uwe Sieber");
	textSizeX = font->TextWidthInPixels(text3);
	backBufferGc->DrawText(text3, 
		TPoint(screenRect.Width()-textSizeX, posY+font->HeightInPixels()*3));

	LOGF("force\n");
	ForceDraw();

	// nothing below this line in da function
}

CHVContainer::~CHVContainer()
{
	LOGF("~CHVContainer\n");
	delete fontBitmap;
	delete backBuffer;
	delete backBufferDevice;
	delete backBufferGc;
	delete backBuffer2;
	delete backBufferDevice2;
	delete backBufferGc2;
	
	delete viewBinary;
	delete viewPlain;

	if (charsArray)
	{
		for (int i = 0; i < numCharsY; i++)
		{
			delete [] charsArray[i];
		}
		delete [] charsArray;
		charsArray = NULL;
	}

	LOGF("ok\n");

}

TKeyResponse CHVContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
{
	//LOGF("aType:%d\n", (int) aType);
	if (aType == EEventKey)
	{
		switch(aKeyEvent.iScanCode)
		{
		case EStdKeyDownArrow:
			{
				if (fileOpened)
					ScrollDown();
				return EKeyWasConsumed;
			}
			break;
		case EStdKeyUpArrow:
			{
				if (fileOpened)
					ScrollUp();
				return EKeyWasConsumed;
			}
			break;
		case EStdKeyLeftArrow:
			{
				if (fileOpened)
					ScrollLeft();
				return EKeyWasConsumed;
			}
			break;
		case EStdKeyRightArrow:
			{
				if (fileOpened)
					ScrollRight();
				return EKeyWasConsumed;
			}
			break;
		case 0x38:
			{
				if (fileOpened)
					ScrollPageDown();
				return EKeyWasConsumed;
			}
			break;
		case 0x35:
			{
				if (fileOpened)
					ScrollPageUp();
				return EKeyWasConsumed;
			}
			break;
		case 0x31:
			{
				if (viewMode == EViewBinary)
					SwitchModesPlease(EViewPlain);
				else if (viewMode == EViewPlain)
					SwitchModesPlease(EViewBinary);

			}

		default:
			return EKeyWasNotConsumed;
		}

	}
	else if (aType == EEventKeyUp)
	{
	}
	
	return EKeyWasNotConsumed;
    //return iGTextEd->OfferKeyEventL(aKeyEvent, aType);
}


void CHVContainer::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
{

}



void CHVContainer::SizeChanged()
{
}

/*TInt CHVContainer::CountComponentControls() const
{
	return KNumberOfControls; // return nbr of controls inside this container
}
*/

CCoeControl* CHVContainer::ComponentControl(TInt /*aIndex*/) const
{
	return NULL;
	/*
    switch (aIndex)
        {
        default:
            return NULL;
        }
		*/
}

void CHVContainer::Draw(const TRect& /*aRect*/) const
{

	LOGF("Drawer: full of pencils\n");
	CWindowGc& gc = SystemGc();
	gc.BitBlt(TPoint(0, 0), backBuffer);
	LOGF("Drawer: back ready\n");


//	crash compiler here please

}


//////////

TBool CHVContainer::OpenNewFile(TFileName fileName)
{
	if (fileName.Size() == 0)
	{
		LOGF("OpenNewFile: empty filename!\n");
		return EFalse;
	}

	if (appUi->fileLoader->Open(fileName) != KErrNone)
	{
		LOGF("failed\n");
		CAknErrorNote* dialog = new(ELeave)CAknErrorNote();
		TBuf<128> aDes;
		iCoeEnv->ReadResource(aDes, R_FILE_NOT_FOUND_NOTE);
		aDes.Append(fileName);
		dialog->ExecuteLD(aDes);
		return EFalse;
	}
	return ETrue;
}

void CHVContainer::OpenNewFileDialog()
{
	TBuf<128> textData;
	CAknTextQueryDialog* dlg;

	LOGF("fileOpen dialog\n");

	textData.Copy(lastOpenedFile);


	dlg = new(ELeave)CAknTextQueryDialog(textData, CAknQueryDialog::ENoTone );

	dlg->SetMaxLength(128);

	//r_open_file_query
	TBool answer( dlg->ExecuteLD( R_OPEN_FILE_QUERY ) );

	if (answer)
	{
		LOGF("readed:\n");
		//LOGD(&textData);
		LOGF("\nok\n");

		if (OpenNewFile(textData))
		{
			fileOpened = true;
			SetupArrays(0);
			DrawWholeBackBuffer();
			lastOpenedFile.Copy(textData);
			appUi->fileLoader->WriteIniFile(viewMode, lastOpenedFile);
		}
	}
}

void CHVContainer::GoToFilePositionDialog()
{
	CAknNumberQueryDialog *dlg;

	LOGF("gotoPos dialog\n");
	TInt value = GetFilePos();

	dlg = new(ELeave)CAknNumberQueryDialog(value, CAknQueryDialog::ENoTone );
	
	TBool answer( dlg->ExecuteLD( R_GOTO_POSITION_QUERY ) );

	if (answer)
	{
		LOGF("readed goto pos: %d\n", value);

		if (value < appUi->fileLoader->fileSize)
		{
			SetupArrays(value);
			DrawWholeBackBuffer();
			DrawNow();
		}
		else
		{
			LOGF("end of file\n");
			CAknInformationNote* dialog = new(ELeave)CAknInformationNote();
			TBuf<128> aDes;
			iCoeEnv->ReadResource(aDes, R_FILEPOS_TOO_BIG_NOTE);
			dialog->ExecuteLD(aDes);
			SetupArrays(appUi->fileLoader->fileSize-1);
			DrawWholeBackBuffer();
			DrawNow();
		}
	}
	LOGF("done\n");
}

// unsigned int (not unsigned char, because of future unicode addon)
TRect CHVContainer::GetFontRectByChar(unsigned int c)
{
	int x, y;

	//LOGF("c=%d\n",c);
	y = (int)((double) (c / 32));
	//LOGF("y=%d\n",y);
	x = c - (y * 32);
	//LOGF("x=%d\n",x);

	x *= HVFONT_WIDTH;
	//LOGF("x*hvdth(%d)=%d (+HVDTH)", HVFONT_WIDTH, x);
	y *= HVFONT_HEIGHT;
	//LOGF("y*hvdhgt(%d)=%d (+HVHGT)", HVFONT_HEIGHT, y);

	//LOGF("x=%d, y=%d\n", x, y);


	return TRect(x, y, x + HVFONT_WIDTH, y + HVFONT_HEIGHT);
}

TBool CHVContainer::SetupArrays(TInt filePos)
{
	if (!fileOpened)
		return ETrue;

	if (filePos < 0)
		filePos = 0;

	if(viewMode == EViewPlain)
	{
		viewPlain->SetupArrays(filePos);
	}
	else if (viewMode == EViewBinary)
	{
		viewBinary->SetupArrays(filePos);
	}
	else
	{
		LOGF("unknown viewMode\n");
		viewMode=EViewPlain;
	}

	return ETrue;
}

TBool CHVContainer::DrawWholeBackBuffer()
{
	LOGF("drawing whole to backbuffer\n");

	// clear screen
    backBufferGc->SetPenStyle(CGraphicsContext::ENullPen);
    backBufferGc->SetBrushColor(TRgb(149, 149, 239));
    backBufferGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
    backBufferGc->DrawRect(screenRect);

	if (viewMode == EViewPlain)
	{
		viewPlain->DrawWholeBackBuffer();
	}
	else
	{
		viewBinary->DrawWholeBackBuffer();
	}
	return ETrue;
}

TInt CHVContainer::GetFilePos()
{
	switch(viewMode)
	{
	case EViewPlain:
		LOGF("filePosArray[0]=%d\n", viewPlain->filePosArray[0]);	/// grandfoother for connut cviewplain.cpp!
		return viewPlain->filePosArray[0];
		break;

	case EViewBinary:
		LOGF("better idea to plain switchnig: binary pos=%d\n", viewBinary->binaryFilePos);
		return viewBinary->binaryFilePos;
		break;
	default:

		break;
	}

	return 0;
}

TBool CHVContainer::ScrollDown()
{
	if (viewMode == EViewPlain)
	{
		viewPlain->ScrollDown(true);
	}
	else if (viewMode == EViewBinary)
	{
		viewBinary->ScrollDown(true);
	}
	else
	{
		LOGF("unknownviewmode");
		viewMode=EViewPlain;
		return ETrue;
	}

	return ETrue;
}

TBool CHVContainer::ScrollUp()
{
	
	if (viewMode == EViewPlain)
	{
		viewPlain->ScrollUp(true);
	}
	else if (viewMode == EViewBinary)
	{
		viewBinary->ScrollUp(true);		
	}
	else
	{
		LOGF("unknown vmode\n");
		viewMode=EViewPlain;
		return ETrue;
	}

	return ETrue;
}

void CHVContainer::SwitchModesPlease(TInt newMode)
{
	TInt startFilePos;

	if (!fileOpened)
	{
		LOGF("sweatchear: ...budger off!file\n");
		return;	// bye f*
	}
	LOGF("sweetcher: AgrE-3d! :P\n");	// Mr. Switcher just agreed

	/*
#define youAreLoughing 0

	if (youAreLoughing)
	{
		// put hidden s2ff here
	}

*/

	startFilePos = GetFilePos();

	viewMode = newMode;
	// new mode
	switch(newMode)
	{
	case EViewPlain:
		viewPlain->SetupArrays(startFilePos);
		break;
		
	case EViewBinary:
		viewBinary->SetupArrays(startFilePos);
		break;
		
	default:
		LOGF("unknown viewmode: %d\n", newMode);
		viewMode = EViewPlain;
		SwitchModesPlease(EViewPlain);
		// that's all mistress

		//for other modezz SetupArrays();
		break;
	}

	appUi->fileLoader->WriteIniFile(viewMode, lastOpenedFile);
	
	// clear second backbuffer
    backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
    backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
    backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
    backBufferGc2->DrawRect(screenRect);

	DrawWholeBackBuffer();
	DrawNow();	//	where is?
}

void CHVContainer::ScrollRight()
{
	switch(viewMode)
	{
	case EViewPlain:
		viewPlain->ScrollRight();
		break;
	case EViewBinary:
		viewBinary->ScrollRight();
		break;
	}
}

void CHVContainer::ScrollLeft()
{
	switch(viewMode)
	{
	case EViewPlain:
		viewPlain->ScrollLeft();
		break;
	case EViewBinary:
		viewBinary->ScrollLeft();
		break;
	}
}

void CHVContainer::ScrollPageDown()
{
	switch(viewMode)
	{
	case EViewPlain:
		viewPlain->ScrollPageDown();
		break;
	case EViewBinary:
		viewBinary->ScrollPageDown();
		break;
	}
}

void CHVContainer::ScrollPageUp()
{
	switch(viewMode)
	{
	case EViewPlain:
		viewPlain->ScrollPageUp();
		break;
	case EViewBinary:
		viewBinary->ScrollPageUp();
		break;
	}

}

void CHVContainer::ForceDraw()
{
	ActivateGc();
	Draw(Rect());
	DeactivateGc();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -