📄 chvcontainer.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 + -