filebrowser/src/FBFileEditor.cpp
branchRCL_3
changeset 21 b3cee849fa46
parent 20 48060abbbeaf
child 22 fad26422216a
--- a/filebrowser/src/FBFileEditor.cpp	Thu Aug 19 09:55:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1300 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  
-*
-*/
-
-
-// INCLUDE FILES
-#include "FBFileEditor.h"
-#include "FBStd.h"
-#include "FB.hrh"
-#include <filebrowser.rsg>
-
-#include <utf.h>
-#include <eikedwin.h>
-#include <eikrted.h>
-#include <txtrich.h>
-#include <eikspane.h>
-#include <avkon.hrh> 
-#include <akntitle.h>
-#include <AknUtils.h> 
-#include <AknBidiTextUtils.h>
-#include <aknnotewrappers.h>
-#include <eiksbfrm.h>
-#include <AknDef.h>
-#include <layoutmetadata.cdl.h>
-
-const TUint KLeftMargin = 2;
-const TUint KRightMargin = 2;
-const TUint KHexSeparatorMargin = 4;
-
-const TInt KEditorFontHeight = 117;
-const TInt KViewerFontHeight = 117;
-const TInt KEditorFontHeightQHD = 100;
-const TInt KViewerFontHeightQHD = 100;
-
-
-
-// ================= MEMBER FUNCTIONS =======================
-
-CFileBrowserFileEditorDlg* CFileBrowserFileEditorDlg::NewL(const TDesC& aFileName, TInt aMode)
-    {
-    CFileBrowserFileEditorDlg* self = new(ELeave) CFileBrowserFileEditorDlg(aFileName, aMode);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);
-    return self;    
-    }
-
-// --------------------------------------------------------------------------------------------
-
-CFileBrowserFileEditorDlg::~CFileBrowserFileEditorDlg()
-    {
-    if (iEditorPF)
-        delete iEditorPF;
-    }
-
-// --------------------------------------------------------------------------------------------
-
-CFileBrowserFileEditorDlg::CFileBrowserFileEditorDlg(const TDesC& aFileName, TInt aMode) :
-    iFileName(aFileName), iActiveMode(aMode)
-    {
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::ConstructL()
-    {
-    // construct a menu bar
-    if (iActiveMode == EFileEditorEditAsText || iActiveMode == EFileEditorEditAsHex)
-        CAknDialog::ConstructL(R_FILEBROWSER_FILEEDITOR_MENUBAR);
-    else
-        CAknDialog::ConstructL(R_FILEBROWSER_FILEVIEWER_MENUBAR);
-    
-    iTextFormat = EFileBrowserCmdFileEditorSaveFormatANSIASCII;
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::PreLayoutDynInitL()
-    {
-    CAknDialog::PreLayoutDynInitL();
-    
-    // set title text
-    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
-    CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
-    tp->SetTextL( _L("File editor") );
-    
-    
-    // init edwin editor component
-    if (iActiveMode == EFileEditorEditAsText || iActiveMode == EFileEditorEditAsHex)
-        {
-        CCoeControl* control = CreateLineByTypeL(KNullDesC, EFileEditorDialogId, EEikCtEdwin, NULL);
-        iTextEditor = static_cast<CEikEdwin*>(control);
-        iTextEditor->SetMopParent(this);
-        iTextEditor->ConstructL(EEikEdwinOwnsWindow|EEikEdwinNoHorizScrolling|EEikEdwinInclusiveSizeFixed|EEikEdwinNoAutoSelection, 0, 0, 0 );
-        iTextEditor->CreateTextViewL();
-        iTextEditor->SetAknEditorFlags(EAknEditorFlagEnableScrollBars);
-        iTextEditor->CreateScrollBarFrameL();
-        iTextEditor->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
-        iTextEditor->ForceScrollBarUpdateL(); 
-        iTextEditor->SetBackgroundColorL(KRgbWhite);
-        iTextEditor->SetFocus(ETrue);
-        }
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::PostLayoutDynInitL()
-    {
-    CAknDialog::PostLayoutDynInitL();
-    
-    // modify layout of the texteditor
-    if (iActiveMode == EFileEditorEditAsText || iActiveMode == EFileEditorEditAsHex)
-        {
-        CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
-        const TSize screenSize = dev->SizeInPixels();
-        
-        // Set the font of the editor
-        TFontSpec fontSpec = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont)->FontSpecInTwips();
-        fontSpec.iHeight = IsQHD(screenSize) ? KEditorFontHeightQHD : KEditorFontHeight; // set height
-        
-        TCharFormat cf(fontSpec.iTypeface.iName, fontSpec.iHeight);
-        cf.iFontPresentation.iTextColor = KRgbBlack; 
-
-        TCharFormatMask cfm;
-        cfm.SetAll();
-
-        CCharFormatLayer *charFL = CCharFormatLayer::NewL(cf, cfm);
-        iTextEditor->SetCharFormatLayer(charFL);
-
-        if (iEditorPF)
-            {
-            delete iEditorPF;
-            iEditorPF = NULL;
-            }
-
-        iEditorPF = CParaFormat::NewL();
-        iEditorPF->iLineSpacingInTwips = IsQHD(screenSize) ? KEditorFontHeightQHD : KEditorFontHeight;
-        iEditorPF->iFillColor = KRgbWhite;
-
-        TParaFormatMask pfm;
-        pfm.SetAll();
-
-        CParaFormatLayer *paraFL = CParaFormatLayer::NewL(iEditorPF, pfm);
-        iTextEditor->SetParaFormatLayer(paraFL);
-        
-
-        // set size of the editor
-        TRect rect = Rect();
-        iTextEditor->SetRect(rect);
-        //iTextEditor->Size().iWidth - (CEikScrollBar::DefaultScrollBarBreadth());
-        }
-
-    // load the file to editor or viewer
-    LoadFileL();
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::OpenFileLC(RFile& aFile, const TDesC& aFileName)
-    {
-    TInt err = aFile.Open(CEikonEnv::Static()->FsSession(), aFileName, EFileRead|EFileShareReadersOnly);
-    
-    if (err == KErrInUse)
-        {
-        CAknErrorNote* note = new(ELeave) CAknErrorNote;
-        note->ExecuteLD(_L("The file is in use, cannot open"));
-        User::Leave(KErrNone);
-        }
-    else if (err != KErrNone)
-        {
-        CAknErrorNote* note = new(ELeave) CAknErrorNote;
-        note->ExecuteLD(_L("Cannot open the file"));
-        User::Leave(KErrNone);
-        }
-    else
-        {
-        // opened succesfully, add to cleanup stack
-        CleanupClosePushL(aFile);
-        }     
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::GetTextFileMode(RFile& aFile, TInt& aFileSize)
-    {
-    iTextFormat = EFileBrowserCmdFileEditorSaveFormatANSIASCII;
-
-    // if we are working with text files, check the type first   
-    if (iActiveMode == EFileEditorEditAsText || iActiveMode == EFileEditorViewAsText)
-        {
-        TBuf8<4> BOM;
-
-        // first check for UTF-16
-        if (aFileSize >= 2 && aFile.Read(0, BOM, 2) == KErrNone)
-            {
-            if (BOM.Length()==2 && BOM[0]==0xFF && BOM[1]==0xFE)
-                {
-                iTextFormat = EFileBrowserCmdFileEditorSaveFormatUTF16LE;
-                aFileSize -= 2;
-                return;
-                }
-            else if (BOM.Length()==2 && BOM[0]==0xFE && BOM[1]==0xFF)
-                {
-                iTextFormat = EFileBrowserCmdFileEditorSaveFormatUTF16BE;
-                aFileSize -= 2;
-                return;
-                }
-            }       
-
-        // then check for UTF-8
-        if (aFileSize >= 3 && aFile.Read(0, BOM, 3) == KErrNone)
-            {
-            if (BOM.Length()==3 && BOM[0]==0xEF && BOM[1]==0xBB && BOM[2]==0xBF)
-                {
-                iTextFormat = EFileBrowserCmdFileEditorSaveFormatUTF8;
-                aFileSize -= 3;
-                return;
-                }
-            }
-            
-        
-        // none of those, seek back to beginning
-        TInt pos(0);
-        aFile.Seek(ESeekStart, pos);
-        }    
-    }
-
-
-// --------------------------------------------------------------------------------------------
-
-HBufC16* CFileBrowserFileEditorDlg::ConvertBuf8ToBuf16L(HBufC8* aBuf8)
-    {
-    __ASSERT_ALWAYS(aBuf8 != NULL, User::Panic(_L("Emp.Buf."),942));
-
-    HBufC16* buf16 = NULL;
-    TPtr8 buf8Ptr(aBuf8->Des()); 
-
-    if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatANSIASCII)
-        {
-        // simple conversion
-        buf16 = HBufC16::NewMaxL(aBuf8->Length());
-        buf16->Des().Copy(aBuf8->Des());
-        }
-    
-    else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF8)
-        {
-        // use the conversion service
-        buf16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L(aBuf8->Des());
-        }            
-
-    else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE || iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-        {
-        buf16 = HBufC16::NewL(aBuf8->Length());
-        buf16->Des().Copy(KNullDesC);
-        
-        HBufC16* oneUniCodeChar = HBufC16::NewMaxLC(1);
-        TUint16* oneUniCodeCharPtr = &oneUniCodeChar->Des()[0];
-       
-        for (TInt i=0; i<buf8Ptr.Length(); i+=2)
-            {
-            // get two 8-bit values and pack them to one 16-bit character depending of endianess
-
-            if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE)
-                {
-                oneUniCodeCharPtr[0] = TUint16((buf8Ptr[i+1] << 8) + buf8Ptr[i]);
-                }
-            else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-                {
-                oneUniCodeCharPtr[0] = TUint16((buf8Ptr[i] << 8) + buf8Ptr[i+1]);
-                }
-            
-            // append to buffer
-            buf16->Des().Append( oneUniCodeChar->Des() );
-            }
-        
-        CleanupStack::PopAndDestroy(); // oneUniCodeChar
-        } 
-    
-    return buf16; //ownership of buf16 will transferred to the caller           
-    }
-
-// --------------------------------------------------------------------------------------------
-
-HBufC8* CFileBrowserFileEditorDlg::ConvertBuf16ToBuf8L(HBufC16* aBuf16)
-    {
-    __ASSERT_ALWAYS(aBuf16 != NULL, User::Panic(_L("Emp.Buf."),943));
-
-    HBufC8* buf8 = NULL;
-    TPtr16 buf16Ptr(aBuf16->Des()); 
-
-    if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatANSIASCII)
-        {
-        // simple conversion
-        buf8 = HBufC8::NewMaxL(aBuf16->Length());
-        buf8->Des().Copy(aBuf16->Des());
-        }
-    
-    else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF8)
-        {
-        // use the conversion service
-        buf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aBuf16->Des());
-        }            
-
-    else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE || iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-        {
-        buf8 = HBufC8::NewL(aBuf16->Length()*2);
-        buf8->Des().Copy(KNullDesC);
-
-        TUint16* charPtr = NULL;
-        TBuf8<2> twoChars;
-        twoChars.Copy(_L8("XX"));        
-       
-        for (TInt i=0; i<aBuf16->Length(); i++)
-            {
-            charPtr = &aBuf16->Des()[i];
-            
-            // get 16-bit character to two variables
-            if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE)
-                {
-                twoChars[0] = TUint8(charPtr[0]);
-                twoChars[1] = TUint8(charPtr[0] << 8);
-                }
-            else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-                {
-                twoChars[0] = TUint8(charPtr[0] << 8);
-                twoChars[1] = TUint8(charPtr[0]);
-                }
-
-            // append to the buffer
-            buf8->Des().Append(twoChars);
-
-            } // for
-            
-        } // else if
-    
-    return buf8; //ownership of buf8 will transferred to the caller           
-    }                
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::LoadFileL()
-    {
-    // open the file for reading
-    RFile fileP;
-    OpenFileLC(fileP, iFileName);
-    
-    // get file size
-    TInt fileSize(0);
-    User::LeaveIfError(fileP.Size(fileSize));
-
-    // read BOM from file
-    GetTextFileMode(fileP, fileSize);
-
-    
-    // editor related file loading
-    if (iActiveMode == EFileEditorEditAsText || iActiveMode == EFileEditorEditAsHex)
-        {
-        // make sure that there is currently no text in the editor 
-        iTextEditor->Text()->Reset();
-
-        // set character handling related cases for the editor
-        if (iActiveMode == EFileEditorEditAsText)
-            {
-            iTextEditor->SetOnlyASCIIChars(EFalse);
-            iTextEditor->SetAknEditorCase(EAknEditorTextCase);
-            }
-        else if (iActiveMode == EFileEditorEditAsHex)
-            {
-            iTextEditor->SetOnlyASCIIChars(ETrue);
-            iTextEditor->SetAknEditorCase(EAknEditorUpperCase);
-            }  
-            
-        const TInt KBufSize(1024);
-        TInt fileOffset(0);
-        TInt printOffset(0);
-
-        HBufC8* buf = HBufC8::NewLC(KBufSize);
-        TPtr8 bufPtr(buf->Des());
-        TChar ch;
-        _LIT(KHex, "%02x");
-        TBuf<3> hexBuf;
-
-        // read to buffer and supply the editor
-        while (fileOffset < fileSize)
-            {
-            // read to buffer
-            User::LeaveIfError( fileP.Read(bufPtr, KBufSize) );
-            
-            // handle in text format
-            if (iActiveMode == EFileEditorEditAsText)
-                {
-                HBufC16* buf16 = ConvertBuf8ToBuf16L(buf);
-                CleanupStack::PushL(buf16);
-                TPtr16 buf16Ptr(buf16->Des());
-
-                // replace any line breaks and append to the editor
-                for (TInt i=0; i<buf16Ptr.Length(); i++)
-                    {
-                    ch = buf16Ptr[i] != '\n' ? (TChar)buf16Ptr[i] : (TChar)CEditableText::ELineBreak;
-                    iTextEditor->Text()->InsertL(printOffset, ch);
-                    printOffset++;
-                    }
-                
-                CleanupStack::PopAndDestroy(); // buf16
-                }
-            
-            // or handle in hex format
-            else if (iActiveMode == EFileEditorEditAsHex)
-                {
-                for (TInt i=0; i<bufPtr.Length(); i++)
-                    {
-                    hexBuf.Format(KHex, bufPtr[i]);
-                    hexBuf.UpperCase();
-                    hexBuf.Append(_L(" "));                    
-                    iTextEditor->Text()->InsertL(printOffset, hexBuf);
-                    printOffset += 3;
-                    }
-                }
-            
-            fileOffset += bufPtr.Length();
-            }
-                
-        CleanupStack::PopAndDestroy(); // buf
-
-        // make sure that the cursor position is in the beginning 
-        iTextEditor->SetCursorPosL(0, EFalse);
-        iTextEditor->NotifyNewDocumentL();
-        iTextEditor->UpdateScrollBarsL();
-        }
-
-
-    // viewer related file loading
-    else if (iActiveMode == EFileEditorViewAsText || iActiveMode == EFileEditorViewAsHex)
-        {
-        // load the entire file to buffer
-        HBufC8* buf = HBufC8::NewLC(fileSize);
-        TPtr8 bufPtr(buf->Des());
-        
-        User::LeaveIfError( fileP.Read(bufPtr, fileSize) );
-        
-        // send the buffer to viewer
-        if (iActiveMode == EFileEditorViewAsText)
-            {
-            HBufC16* buf16 = ConvertBuf8ToBuf16L(buf);
-            CleanupStack::PopAndDestroy(); // buf
-            iViewer->FormatAsTextL(buf16);
-            }
-
-        else if (iActiveMode == EFileEditorViewAsHex)
-            {
-            iViewer->FormatAsHexL(buf);
-            CleanupStack::Pop(); // buf
-            }
-        }
-
-    CleanupStack::PopAndDestroy(); // fileP
-    }
-    
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::SaveEditorDataL(TBool aQueryNewName)
-    {
-    TBool doSave(ETrue);
-    CPlainText* docText = iTextEditor->Text();
-    TInt docLength = docText->DocumentLength();
-    
-    TFileName fileName;
-    fileName.Copy(iFileName);
-    
-    // check that format of the file is valid
-    if (iActiveMode == EFileEditorEditAsHex)
-        {
-        // check every 3rd char is a space
-        for (TInt i=2; i<docLength; i+=3)
-            {
-            TPtrC docPtr = docText->Read(i, 1);
-            if (docPtr.Length() < 1 || docPtr[0] != ' ')
-                {
-                CAknErrorNote* note = new(ELeave) CAknErrorNote;
-                note->ExecuteLD(_L("Separate hex blocks with space!"));
-                return;                
-                }
-            }
-        
-        // check for valid chars
-        for (TInt i=0; i<docLength; i+=3)
-            {
-            TPtrC docPtr = docText->Read(i, 2);
-            if (docPtr.Length() < 2 || !IsHexChar(docPtr[0]) || !IsHexChar(docPtr[1]))
-                {
-                CAknErrorNote* note = new(ELeave) CAknErrorNote;
-                note->ExecuteLD(_L("Use only hex characters!"));
-                return;                
-                }
-            }
-        }
-    
-    
-    // query new file name
-    if (aQueryNewName)
-        {
-        CAknTextQueryDialog* textQuery = CAknTextQueryDialog::NewL(fileName);
-        textQuery->SetPromptL(_L("Full path:"));
-        
-        if (textQuery->ExecuteLD(R_GENERAL_TEXT_QUERY))
-            {
-            doSave = ETrue;
-            }
-        else
-            {
-            doSave = EFalse;
-            }
-        }
-
-
-    // continue with writing
-    if (doSave)        
-        {
-        RFile fileP;
-        TInt err = fileP.Replace(CEikonEnv::Static()->FsSession(), fileName, EFileWrite);
-            
-        if (err == KErrNone)    
-            {
-            CleanupClosePushL(fileP);
-            
-            const TInt KBufSize(1002);
-            TInt fileOffset(0);        
-            TInt docOffset(0);
-            TLex converter;
-            TUint hexValue(0);
-            
-            // write BOM for text files
-            if (iActiveMode == EFileEditorEditAsText)
-                {
-                if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE)
-                    {
-                    TBuf8<2> BOM;
-                    BOM.Append(0xFF);
-                    BOM.Append(0xFE);
-                    
-                    if (fileP.Write(0, BOM, 2) == KErrNone)
-                        fileOffset += 2;
-                    }
-                
-                else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-                    {
-                    TBuf8<2> BOM;
-                    BOM.Append(0xFE);
-                    BOM.Append(0xFF);
-                    
-                    if (fileP.Write(0, BOM, 2) == KErrNone)
-                        fileOffset += 2;
-                    }
-                                  
-                else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF8)
-                    {
-                    TBuf8<3> BOM;
-                    BOM.Append(0xEF);
-                    BOM.Append(0xBB);
-                    BOM.Append(0xBF);
-                    
-                    if (fileP.Write(0, BOM, 3) == KErrNone)
-                        fileOffset += 3;
-                    }                
-                }
-            
-            
-            HBufC8* buf = HBufC8::NewLC(KBufSize * 2);
-            TPtr8 bufPtr(buf->Des());      
-          
-            while (docOffset < docLength)
-                {
-                // get text from storage
-                TPtrC docPtr = docText->Read(docOffset, KBufSize);
-                bufPtr.Copy(KNullDesC);
-
-                if (iActiveMode == EFileEditorEditAsText)
-                    {
-                    HBufC16* convBuf = HBufC16::NewLC(docPtr.Length());
-                    convBuf->Des().Copy(KNullDesC);
-                    
-                     // convert to line breaks first
-                    for (TInt i=0; i<docPtr.Length(); i++)
-                        {
-                        if (docPtr[i] == CEditableText::EParagraphDelimiter) // skip extra char from the editor
-                            continue;    
-                        else if (docPtr[i] == CEditableText::ELineBreak)
-                            convBuf->Des().Append('\n');
-                        else
-                            convBuf->Des().Append(docPtr[i]);
-                        }
- 
-                    HBufC8* buf8 = ConvertBuf16ToBuf8L(convBuf);
-                    
-                    // make sure the sizes are correct
-                    if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatANSIASCII || iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF8)
-                        {
-                        bufPtr.Copy(buf8->Des().Left(convBuf->Length())); 
-                        }
-                    else if (iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16LE || iTextFormat == EFileBrowserCmdFileEditorSaveFormatUTF16BE)
-                        {
-                        bufPtr.Copy(buf8->Des().Left(convBuf->Length()*2)); 
-                        }
-                    
-                    delete buf8;
-                    buf8 = NULL;
-
-                    CleanupStack::PopAndDestroy(); // convBuf
-                    }
-                    
-                else if (iActiveMode == EFileEditorEditAsHex)
-                    {
-                    for (TInt i=0; i<docPtr.Length(); i+=3)
-                        {
-                        if (i+1 >= docPtr.Length() - 1)
-                            break;
-                        
-                        TBuf<3> buf2;
-                        buf2.Append(docPtr[i]);
-                        buf2.Append(docPtr[i+1]);
-
-                        // convert from hex to decimal
-                        converter.Assign(buf2);
-                        if (converter.Val(hexValue, EHex) == KErrNone)
-                            {
-                            bufPtr.Append(hexValue);
-                            }
-                        }                    
-                    }
-                
-                // write to a file
-                err = fileP.Write(fileOffset, bufPtr, bufPtr.Length());
-                if (err != KErrNone)
-                    break;
-                
-                docOffset += docPtr.Length();
-                fileOffset += bufPtr.Length();
-                }
-            
-           CleanupStack::PopAndDestroy(2); // buf, fileP
-            }
-        
-        if (err == KErrNone)
-            {
-            // remember the new file name if save was succesfull
-            iFileName.Copy(fileName);
-            
-            CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
-            note->ExecuteLD(_L("Saved succesfully"));
-            } 
-        else if (err == KErrInUse)
-            {
-            CAknErrorNote* note = new(ELeave) CAknErrorNote;
-            note->ExecuteLD(_L("The file is in use, cannot write"));
-            User::Leave(KErrNone);
-            }
-        else
-            {
-            CAknErrorNote* note = new(ELeave) CAknErrorNote;
-            note->ExecuteLD(_L("Cannot write to the file"));
-            User::Leave(KErrNone);
-            }
-        }
-    }
-    
-// --------------------------------------------------------------------------------------------
-
-TBool CFileBrowserFileEditorDlg::IsHexChar(TInt aCh)
-    {
-    if (aCh >= '0' && aCh <= '9')
-        return ETrue;
-    else if (aCh >= 'a' && aCh <= 'f')
-        return ETrue;
-    else if (aCh >= 'A' && aCh <= 'F')
-        return ETrue;
-    else
-        return EFalse;
-    }
-      
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::ProcessCommandL(TInt aCommandId)
-    {
-    CAknDialog::ProcessCommandL(aCommandId);
-
-    switch (aCommandId)
-        {
-        case EFileBrowserCmdFileEditorViewAsText:
-            {
-            iActiveMode = EFileEditorViewAsText;
-            LoadFileL();
-            }
-            break;
-
-        case EFileBrowserCmdFileEditorViewAsHex:
-            {
-            iActiveMode = EFileEditorViewAsHex;
-            LoadFileL();
-            }
-            break;
-
-//
-        case EFileBrowserCmdFileEditorSave:
-            {
-            SaveEditorDataL();
-            }
-            break;
-            
-        case EFileBrowserCmdFileEditorSaveAs:
-            {
-            SaveEditorDataL(ETrue);
-            }
-            break;
-
-        case EFileBrowserCmdFileEditorSaveFormatANSIASCII:
-        case EFileBrowserCmdFileEditorSaveFormatUTF8:
-        case EFileBrowserCmdFileEditorSaveFormatUTF16LE:
-        case EFileBrowserCmdFileEditorSaveFormatUTF16BE:
-            {
-            iTextFormat = aCommandId;
-            }
-            break;
-            
-        case EFileBrowserCmdFileEditorEditAsText:
-            {
-            iActiveMode = EFileEditorEditAsText;
-            LoadFileL();
-            }
-            break;
-
-        case EFileBrowserCmdFileEditorEditAsHex:
-            {
-            iActiveMode = EFileEditorEditAsHex;
-            LoadFileL();
-            }
-            break;
-
-//                        
-        case EFileBrowserCmdFileEditorExit:
-            TryExitL(EAknCmdExit);
-            break;
-
-        default:
-            break;
-        }
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
-    {
-    if (aResourceId == R_FILEBROWSER_FILEVIEWER_MENUPANE)
-        {
-        aMenuPane->SetItemDimmed(EFileBrowserCmdFileEditorViewAsText, iActiveMode == EFileEditorViewAsText);
-        aMenuPane->SetItemDimmed(EFileBrowserCmdFileEditorViewAsHex, iActiveMode == EFileEditorViewAsHex);
-        }
-    else if (aResourceId == R_FILEBROWSER_FILEEDITOR_MENUPANE)
-        {
-        aMenuPane->SetItemDimmed(EFileBrowserCmdFileEditorEditAsText, iActiveMode == EFileEditorEditAsText);
-        aMenuPane->SetItemDimmed(EFileBrowserCmdFileEditorEditAsHex, iActiveMode == EFileEditorEditAsHex);
-        aMenuPane->SetItemDimmed(EFileBrowserCmdFileEditorSaveFormat, iActiveMode == EFileEditorEditAsHex);
-        }
-	else if (aResourceId == R_FILEBROWSER_FILEEDITOR_SAVEFORMAT_SUBMENU)
-	    {
-        aMenuPane->SetItemButtonState(iTextFormat, EEikMenuItemSymbolOn);
-	    }
-    }
-
-// --------------------------------------------------------------------------------------------
-
-SEikControlInfo CFileBrowserFileEditorDlg::CreateCustomControlL(TInt aControlType)
-    {
-    SEikControlInfo controlInfo;
-    controlInfo.iControl = NULL;
-    controlInfo.iTrailerTextId = 0;
-    controlInfo.iFlags = 0;
-
-    if (aControlType == EFileViewerDialogControl)
-        {
-        // create a control
-        iViewer = new(ELeave) CFileBrowserFileEditorViewControl();
-        iViewer->SetMopParent(this);
-        iViewer->ConstructL();
-
-        controlInfo.iControl = iViewer;
-        }
-        
-    return controlInfo;
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorDlg::SetSizeAndPosition(const TSize& /*aSize*/)
-    {
-    // fill whole window
-    TRect mainPaneRect;
-    TRect naviPaneRect;
-
-    if (Layout_Meta_Data::IsLandscapeOrientation() ||
-        iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        }
-    else
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
-        mainPaneRect.iTl.iY = naviPaneRect.Height();   
-        }
-            
-    SetRect(mainPaneRect);
-    }
-
-// --------------------------------------------------------------------------------------------
-
-TBool CFileBrowserFileEditorDlg::RunDlgLD()
-    {
-    if (iActiveMode == EFileEditorViewAsText || iActiveMode == EFileEditorViewAsHex)
-        return ExecuteLD(R_FILEBROWSER_FILEVIEWER_DIALOG);
-    else
-        return ExecuteLD(R_FILEBROWSER_FILEEDITOR_DIALOG);
-    }
-       
-// --------------------------------------------------------------------------------------------
-// --------------------------------------------------------------------------------------------
-
-CFileBrowserFileEditorViewControl::~CFileBrowserFileEditorViewControl()
-    {
-    ResetVariables();
-    }
-
-// --------------------------------------------------------------------------------------------
-
-CFileBrowserFileEditorViewControl::CFileBrowserFileEditorViewControl()
-    {
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::ConstructL()
-    {
-    CreateWindowL();
-    SetBlank();
-    SetRect(Rect());
-    ActivateL();
-    
-    iTotalNumberOfLines = 0;
-    }
-
-// --------------------------------------------------------------------------------------------
-
-TSize CFileBrowserFileEditorViewControl::MinimumSize()
-    {
-    TRect mainPaneRect;
-    TRect naviPaneRect;
-    
-    if (Layout_Meta_Data::IsLandscapeOrientation() ||
-        iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        }
-    else
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
-        mainPaneRect.iTl.iY = naviPaneRect.Height();   
-        }
-
-    return mainPaneRect.Size();
-    }
-        
-// --------------------------------------------------------------------------------------------
-
-TKeyResponse CFileBrowserFileEditorViewControl::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
-    {
-    if(aType != EEventKey)
-        return EKeyWasNotConsumed;
-    
-    // normally scroll only one line
-    TInt scrollLines(1); 
-    
-    // with special keys scroll iNumberOfLinesFitsScreen-1 lines instead
-    if (aKeyEvent.iCode == EKeyIncVolume || aKeyEvent.iCode=='#' || aKeyEvent.iCode == EKeyDecVolume || aKeyEvent.iCode=='*')
-        scrollLines = iNumberOfLinesFitsScreen-1;
-    
-    
-    if (aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyIncVolume || aKeyEvent.iCode=='#')
-        {
-        if (iCurrentLine > 0)
-            {
-            iCurrentLine -= scrollLines;
-            
-            if (iCurrentLine < 0)
-                iCurrentLine = 0;
-            
-            UpdateScrollBarL();
-            DrawNow();
-            }
-
-        return EKeyWasConsumed;
-        }
-    
-    else if (aKeyEvent.iCode == EKeyDownArrow || aKeyEvent.iCode == EKeyDecVolume || aKeyEvent.iCode=='*')
-        {
-        if (iActiveMode == EFileEditorViewAsText)
-            {
-            // no need to scroll text if it fits to the screen
-            if (iTotalNumberOfLines <= iNumberOfLinesFitsScreen)
-                return EKeyWasConsumed;
-
-            iCurrentLine += scrollLines;
-
-            // adjust the last line to end of the screen            
-            if (iCurrentLine > iTotalNumberOfLines - iNumberOfLinesFitsScreen)
-                iCurrentLine = iTotalNumberOfLines - iNumberOfLinesFitsScreen;            
-            }
-        else if (iActiveMode == EFileEditorViewAsHex)
-            {
-            iCurrentLine += scrollLines;
-
-            // last line can be first line on the screen            
-            if (iCurrentLine > iTotalNumberOfLines - 1)
-                iCurrentLine = iTotalNumberOfLines - 1;              
-            }
-            
-        UpdateScrollBarL();
-        DrawNow();
-        
-        return EKeyWasConsumed;
-        }
-    
-    return EKeyWasNotConsumed;
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::FormatAsTextL(HBufC16* aBuf)
-    {
-    if (aBuf == NULL)    
-        ResetVariables(EFalse);
-    else
-        ResetVariables();
-    
-    InitVariables();
-    iActiveMode = EFileEditorViewAsText;
-    
-    // store the bugger
-    if (aBuf != NULL)
-        iTextBuf = aBuf;
-    
-    iWrappedTextArray = new(ELeave) CArrayFixFlat<TPtrC>(32);
-    
-    // wrap to array
-    AknTextUtils::WrapToArrayL(iTextBuf->Des(), iDrawingWidth, *iFont, *iWrappedTextArray);
-    iTotalNumberOfLines = iWrappedTextArray->Count();
-
-    // count amount of lines fits to screen
-    iNumberOfLinesFitsScreen = TInt(iViewerRect.Height() / (iFont->HeightInPixels()));
-
-    // update scroll bars
-    UpdateScrollBarL();
-
-    // update the screen
-    DrawNow();    
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::FormatAsHexL(HBufC8* aBuf)
-    {
-    if (aBuf == NULL)    
-        ResetVariables(EFalse);
-    else
-        ResetVariables();
-    
-    InitVariables();
-    iActiveMode = EFileEditorViewAsHex;
-    
-    // store the buffer
-    if (aBuf != NULL)
-        iHexesBuffer = aBuf;
-    
-    // calculate amount of hex values fits to the screen
-    TUint charWidth = iFont->CharWidthInPixels('X');
-    iHexGrougWidth = charWidth*2 + TInt (KHexSeparatorMargin*iX_factor);
-    iAmountOfHexesFitsHorizontally = TUint( iDrawingWidth / iHexGrougWidth );
-
-    // calculate total number of files
-    iTotalNumberOfLines = iHexesBuffer->Length() / iAmountOfHexesFitsHorizontally + 1;
-
-    // count amount of lines fits to screen
-    iNumberOfLinesFitsScreen = TInt(iViewerRect.Height() / iFont->HeightInPixels()) - 1;
-
-    // update scroll bars
-    UpdateScrollBarL();
-
-    // update the screen
-    DrawNow();      
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::InitVariables()
-    {
-    iCurrentLine = 0;
-
-    // calculate layout data
-    TRect mainPaneRect;
-    TRect naviPaneRect;
-    
-    if (Layout_Meta_Data::IsLandscapeOrientation() ||
-        iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        }
-    else
-        {
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
-        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
-        mainPaneRect.iTl.iY = naviPaneRect.Height();   
-        }
-
-    iViewerRect = TRect(mainPaneRect.Size());
-
-    iX_factor = TReal(iViewerRect.Width()) / 176;
-    iY_factor = TReal(iViewerRect.Height()) / 144;
-
-
-    // define drawing width, some extra space needed for double span scrolling bar
-    if (AknLayoutUtils::LayoutMirrored())  // scroll bar on 'left'
-        {
-        iLeftDrawingPosition = KLeftMargin + 12;
-        iDrawingWidth = TUint( iViewerRect.Width() - iLeftDrawingPosition*iX_factor - (KRightMargin*iX_factor)); 
-        }
-    else // scroll bar on 'right'
-        {
-        iLeftDrawingPosition = KLeftMargin;  
-        iDrawingWidth = TUint( iViewerRect.Width() - iLeftDrawingPosition*iX_factor - (KRightMargin*iX_factor + 7*iX_factor)); 
-        } 
-
-
-    // set font
-    CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
-    const TSize screenSize = dev->SizeInPixels();
-    
-    TFontSpec fontSpec = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont)->FontSpecInTwips();
-    fontSpec.iHeight = IsQHD(screenSize) ? KViewerFontHeightQHD : KViewerFontHeight; // set height
-    dev->GetNearestFontInTwips(iFont, fontSpec);
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::ResetVariables(TBool aResetData)
-    {
-    if (iScrollBarFrame)
-        {
-        delete iScrollBarFrame;
-        iScrollBarFrame = NULL;
-        }
-        
-    if (iHexesBuffer && aResetData)
-        {
-        delete iHexesBuffer;
-        iHexesBuffer = NULL;
-        }    
-
-    if (iWrappedTextArray)
-        {
-        delete iWrappedTextArray;
-        iWrappedTextArray = NULL;
-        }
-
-    if (iTextBuf && aResetData)
-        {
-        delete iTextBuf;
-        iTextBuf = NULL;
-        }
-
-    if (iFont)
-        {
-        CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
-        dev->ReleaseFont(iFont);
-        iFont = NULL;
-        }
-    }
-    
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::UpdateScrollBarL()
-    {
-    TRect rect(iViewerRect);
-    
-    // init the scroll bar    
-    if (!iScrollBarFrame)
-        {
-        iScrollBarFrame = new(ELeave) CEikScrollBarFrame(this, this, ETrue);
-        iScrollBarFrame->CreateDoubleSpanScrollBarsL(ETrue, EFalse);            
-        iScrollBarFrame->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan);
-        iScrollBarFrame->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
-        }       
-
-
-    // update values
-	TEikScrollBarModel horizontalBar;
-    TEikScrollBarModel verticalBar;
-
-    if (iActiveMode == EFileEditorViewAsText)
-        {    
-        verticalBar.iThumbPosition = iCurrentLine;
-        verticalBar.iScrollSpan = iTotalNumberOfLines - iNumberOfLinesFitsScreen + 1;
-        verticalBar.iThumbSpan = 1;
-        }
-    
-    else if (iActiveMode == EFileEditorViewAsHex)
-        {    
-        verticalBar.iThumbPosition = iCurrentLine;
-        verticalBar.iScrollSpan = iTotalNumberOfLines;
-        verticalBar.iThumbSpan = 1;
-        }
-        
-    TEikScrollBarFrameLayout layout;
-	layout.iTilingMode = TEikScrollBarFrameLayout::EInclusiveRectConstant;
-
-    // do not let scrollbar values overflow
-    if (verticalBar.iThumbPosition + verticalBar.iThumbSpan > verticalBar.iScrollSpan)
-        verticalBar.iThumbPosition = verticalBar.iScrollSpan - verticalBar.iThumbSpan;
-	
-    TAknDoubleSpanScrollBarModel horizontalDSBar(horizontalBar);
-    TAknDoubleSpanScrollBarModel verticalDSBar(verticalBar);
-   
-    iScrollBarFrame->TileL(&horizontalDSBar, &verticalDSBar, rect, rect, layout);        
-    iScrollBarFrame->SetVFocusPosToThumbPos(verticalDSBar.FocusPosition());
-    }
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::Draw(const TRect& aRect) const
-    {
-    CWindowGc& gc = SystemGc();
-    gc.Clear(aRect);
-    gc.SetPenColor(KRgbBlack);
-    gc.UseFont(iFont);
-    
-    TInt fontHeight = iFont->HeightInPixels();
-
-    if (iActiveMode == EFileEditorViewAsText)
-        {
-        // draw the text
-        for (TInt i=0; i<iNumberOfLinesFitsScreen; i++)
-            {
-            // check for bounds and draw
-            if (iCurrentLine >= 0 && iTotalNumberOfLines > i+iCurrentLine)
-                gc.DrawText(iWrappedTextArray->At(i+iCurrentLine), TPoint(TInt(iLeftDrawingPosition*iX_factor), TInt(fontHeight*(i+1))));
-            }        
-        }
-
-    else if (iActiveMode == EFileEditorViewAsHex)
-        {
-        TInt hexesOffSet = iCurrentLine * iAmountOfHexesFitsHorizontally; 
-        TInt topLineHeight = 2*iY_factor + fontHeight;
-        
-        // draw the top line
-        gc.SetPenColor(KRgbWhite);
-        
-        gc.SetBrushColor(KRgbBlue);
-        gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
-        if (AknLayoutUtils::LayoutMirrored())  // scroll bar on 'left'
-            {
-            gc.DrawRect(TRect((KLeftMargin + 12)*iX_factor, 0, aRect.iBr.iX, topLineHeight));
-            }
-        else // scroll bar on 'right'
-            {
-            gc.DrawRect(TRect(0, 0, aRect.iBr.iX-(KRightMargin*iX_factor + 7*iX_factor), topLineHeight));
-            } 
-
-        TBuf<128> topLineBuf;
-        topLineBuf.AppendNum(hexesOffSet);
-        topLineBuf.Append(_L(": "));
-        
-        for (TInt i=0; i<iAmountOfHexesFitsHorizontally; i++)
-            {
-            TInt pos = hexesOffSet + i;
-            
-            if (pos < iHexesBuffer->Des().Length())
-                {
-                topLineBuf.Append(iHexesBuffer->Des()[pos]);
-                }
-            }
- 
-        gc.DrawText(topLineBuf, TPoint(TInt(iLeftDrawingPosition*iX_factor), TInt(fontHeight)));
-
- 
-        // draw hex values
-        gc.SetPenColor(KRgbBlack);
-        for (TInt i=0; i<iNumberOfLinesFitsScreen; i++)
-            {
-            for (TInt j=0; j<iAmountOfHexesFitsHorizontally; j++)
-                {
-                TInt pos = hexesOffSet + i*iAmountOfHexesFitsHorizontally + j;
-                
-                if (pos >= iHexesBuffer->Des().Length())
-                    return;
-                
-                TUint8* ptr = &iHexesBuffer->Des()[pos];
-                
-                _LIT(KHex, "%02x");
-                TBuf<5> hexBuf;
-                hexBuf.Format(KHex, ptr[0]);
-                hexBuf.UpperCase();
-
-                gc.DrawText(hexBuf, TPoint(TInt(iLeftDrawingPosition*iX_factor + j*iHexGrougWidth), TInt(topLineHeight + fontHeight*(i+1))));
-                }
-            }         
-        }
-
-    gc.DiscardFont();
-    }
-  
-// --------------------------------------------------------------------------------------------
-
-CCoeControl* CFileBrowserFileEditorViewControl::ComponentControl(TInt aIndex) const
-	{
-	if (aIndex == 0 && iScrollBarFrame)
-	    return iScrollBarFrame->VerticalScrollBar();
-	else
-	    return NULL;
-	}
-
-// --------------------------------------------------------------------------------------------
-
-TInt CFileBrowserFileEditorViewControl::CountComponentControls() const
-	{
-	if (iScrollBarFrame)
-	    return 1;
-	else
-	    return 0;
-	}
-
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType)
-    {
-    if ((aEventType == EEikScrollPageDown) || (aEventType == EEikScrollPageUp) || 
-       (aEventType == EEikScrollThumbDragVert) || (aEventType == EEikScrollUp) ||
-       (aEventType == EEikScrollDown))
-        {
-        iCurrentLine = aScrollBar->ThumbPosition();
-        UpdateScrollBarL();
-        DrawNow();
-        }
-    }
-
-// --------------------------------------------------------------------------------------------
- 
-TTypeUid::Ptr CFileBrowserFileEditorViewControl::MopSupplyObject(TTypeUid aId)
-    {
-    return CCoeControl::MopSupplyObject(aId);
-    }
-	   
-// --------------------------------------------------------------------------------------------
-
-void CFileBrowserFileEditorViewControl::HandleResourceChange(TInt aType)
-    {
-    if (aType == KEikDynamicLayoutVariantSwitch)
-        {
-        SetRect(Rect());
-        ActivateL();
-        
-        // reformat the text
-        if (iActiveMode == EFileEditorViewAsText)
-            {
-            FormatAsTextL();
-            }
-        else if (iActiveMode == EFileEditorViewAsHex)
-            {
-            FormatAsHexL();
-            }
-        }
-    else
-        {
-        CCoeControl::HandleResourceChange(aType);
-        }
-    }
-
-// --------------------------------------------------------------------------------------------
-
-// End of File
-