diff --git a/PowerEditor/src/MISC/Common/Common.h b/PowerEditor/src/MISC/Common/Common.h index 64df83bce..4adc1e79a 100644 --- a/PowerEditor/src/MISC/Common/Common.h +++ b/PowerEditor/src/MISC/Common/Common.h @@ -117,12 +117,7 @@ public: const wchar_t * strW = char2wchar(txt2Encode, fromCodepage); return wchar2char(strW, toCodepage); }; -/* - const char * encodeFromUtf8To(const char *txt2Encode) const { - const wchar_t * strW = wmc->char2wchar(txt2Encode, SC_CP_UTF8); - return wchar2char(strW, toCodepage); - }; -*/ + protected: WcharMbcsConvertor() : _multiByteStr(NULL), _wideCharStr(NULL), _multiByteAllocLen(0), _wideCharAllocLen(0), initSize(1024) { }; diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index b84471080..850112c03 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -567,7 +567,7 @@ bool Notepad_plus::loadSession(Session & session) continue; //skip session files, not supporting recursive sessions } if (PathFileExists(pFn)) { - lastOpened = doOpen(pFn); + lastOpened = doOpen(pFn, false, session._mainViewFiles[i]._encoding); } else { lastOpened = BUFFER_INVALID; } @@ -585,6 +585,7 @@ bool Notepad_plus::loadSession(Session & session) Buffer * buf = MainFileManager->getBufferByID(lastOpened); buf->setPosition(session._mainViewFiles[i], &_mainEditView); buf->setLangType(typeToSet, pLn); + buf->setEncoding(session._mainViewFiles[i]._encoding); //Force in the document so we can add the markers //Dont use default methods because of performance @@ -617,7 +618,7 @@ bool Notepad_plus::loadSession(Session & session) continue; //skip session files, not supporting recursive sessions } if (PathFileExists(pFn)) { - lastOpened = doOpen(pFn); + lastOpened = doOpen(pFn, false, session._subViewFiles[k]._encoding); //check if already open in main. If so, clone if (_mainDocTab.getIndexByBuffer(lastOpened) != -1) { loadBufferIntoView(lastOpened, SUB_VIEW); @@ -646,6 +647,7 @@ bool Notepad_plus::loadSession(Session & session) } } buf->setLangType(typeToSet, pLn); + buf->setEncoding(session._subViewFiles[k]._encoding); //Force in the document so we can add the markers //Dont use default methods because of performance @@ -688,7 +690,7 @@ bool Notepad_plus::loadSession(Session & session) return allSessionFilesLoaded; } -BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly) +BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encoding) { TCHAR longFileName[MAX_PATH]; @@ -775,7 +777,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly) scnN.nmhdr.idFrom = NULL; _pluginsManager.notify(&scnN); - BufferID buffer = MainFileManager->loadFile(longFileName); + BufferID buffer = MainFileManager->loadFile(longFileName, NULL, encoding); if (buffer != BUFFER_INVALID) { _isFileOpening = true; @@ -2079,7 +2081,7 @@ void Notepad_plus::checkDocState() enableCommand(IDM_FILE_RENAME, isFileExisting, MENU); enableConvertMenuItems(curBuf->getFormat()); - checkUnicodeMenuItems(curBuf->getUnicodeMode()); + checkUnicodeMenuItems(/*curBuf->getUnicodeMode()*/); checkLangsMenu(-1); } @@ -3113,7 +3115,29 @@ void Notepad_plus::setDisplayFormat(formatType f) _statusBar.setText(str.c_str(), STATUSBAR_EOF_FORMAT); } -void Notepad_plus::setUniModeText(/*UniMode um*/) +int Notepad_plus::getCmdIDFromEncoding(int encoding) const +{ + bool found = false; + size_t nbItem = sizeof(encoding_table)/sizeof(int); + size_t i = 0; + for ( ; i < nbItem ; i++) + { + if (encoding_table[i] == encoding) + { + found = true; + break; + } + + } + if (!found) + { + printStr(TEXT("Encoding problem. Encoding is not added in encoding_table?")); + return -1; + } + return i+IDM_FORMAT_ENCODE; +} + +void Notepad_plus::setUniModeText() { Buffer *buf = _pEditView->getCurrentBuffer(); int encoding = buf->getEncoding(); @@ -3143,26 +3167,12 @@ void Notepad_plus::setUniModeText(/*UniMode um*/) } else { - bool found = false; - size_t nbItem = sizeof(encoding_table)/sizeof(int); - size_t i = 0; - for ( ; i < nbItem ; i++) - { - if (encoding_table[i] == encoding) - { - found = true; - break; - } - - } - if (!found) - { - printStr(TEXT("Encoding problem. Encoding is not added in encoding_table?")); + int cmdID = getCmdIDFromEncoding(encoding); + if (cmdID == -1) return; - } const int itemSize = 64; TCHAR uniModeText[itemSize]; - ::GetMenuString(_mainMenuHandle, i+IDM_FORMAT_ENCODE, uniModeText, itemSize, MF_BYCOMMAND); + ::GetMenuString(_mainMenuHandle, cmdID, uniModeText, itemSize, MF_BYCOMMAND); uniModeTextString = uniModeText; } _statusBar.setText(uniModeTextString.c_str(), STATUSBAR_UNICODE_TYPE); @@ -4414,13 +4424,48 @@ void Notepad_plus::command(int id) um = uni8Bit; } - if (buf->getUnicodeMode() != um) + if (buf->getEncoding() != -1) { - buf->setUnicodeMode(um); - if (shoulBeDirty) - buf->setDirty(true); + if (buf->isDirty()) + { + int answer = ::MessageBox(NULL, TEXT("You should save the current modification.\rAll the saved modifications can not be undone.\r\rContinue?"), TEXT("Save Current Modification"), MB_YESNO); + if (answer == IDYES) + { + fileSave(); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + } + else + return; + } + + if (_pEditView->execute(SCI_CANUNDO) == TRUE) + { + int answer = ::MessageBox(NULL, TEXT("All the saved modifications can not be undone.\r\rContinue?"), TEXT("Lose Undo Ability Waning"), MB_YESNO); + if (answer == IDYES) + { + // Do nothing + } + else + return; + } + + buf->setEncoding(-1); + + if (um == uni8Bit) + _pEditView->execute(SCI_SETCODEPAGE, CP_ACP); + else + buf->setUnicodeMode(um); + fileReload(); + } + else + { + if (buf->getUnicodeMode() != um) + { + buf->setUnicodeMode(um); + if (shoulBeDirty) + buf->setDirty(true); + } } - buf->setEncoding(-1); break; } @@ -4455,7 +4500,7 @@ void Notepad_plus::command(int id) if (answer == IDYES) { fileSave(); - _pEditView->execute(SCI_EMPTYUNDOBUFFER); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); } else return; @@ -4463,7 +4508,7 @@ void Notepad_plus::command(int id) if (_pEditView->execute(SCI_CANUNDO) == TRUE) { - int answer = ::MessageBox(NULL, TEXT("All the saved modifications can not be undone.\r\rContinue?"), TEXT("Loss Undo Ability Waning"), MB_YESNO); + int answer = ::MessageBox(NULL, TEXT("All the saved modifications can not be undone.\r\rContinue?"), TEXT("Lose Undo Ability Waning"), MB_YESNO); if (answer == IDYES) { // Do nothing @@ -4474,21 +4519,9 @@ void Notepad_plus::command(int id) if (!buf->isDirty()) { - int len = _pEditView->getCurrentDocLen(); - char *content = new char[len+1]; - _pEditView->execute(SCI_GETTEXT, len+1, (LPARAM)content); - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - const char *newContent = wmc->encode(encoding_table[index], SC_CP_UTF8, content); - _pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8); - _pEditView->execute(SCI_SETTEXT, 0, (LPARAM)newContent); - Buffer *buf = _pEditView->getCurrentBuffer(); + Buffer *buf = _pEditView->getCurrentBuffer(); buf->setEncoding(encoding_table[index]); - delete [] content; - - buf->setUnicodeMode(uniEnd); - - _pEditView->execute(SCI_EMPTYUNDOBUFFER); - buf->setDirty(false); + fileReload(); } break; } @@ -6206,7 +6239,7 @@ void Notepad_plus::dynamicCheckMenuAndTB() const //Format conversion enableConvertMenuItems(_pEditView->getCurrentBuffer()->getFormat()); - checkUnicodeMenuItems(_pEditView->getCurrentBuffer()->getUnicodeMode()); + checkUnicodeMenuItems(/*_pEditView->getCurrentBuffer()->getUnicodeMode()*/); //Syncronized scrolling } @@ -6218,8 +6251,12 @@ void Notepad_plus::enableConvertMenuItems(formatType f) const enableCommand(IDM_FORMAT_TOMAC, (f != MAC_FORMAT), MENU); } -void Notepad_plus::checkUnicodeMenuItems(UniMode um) const +void Notepad_plus::checkUnicodeMenuItems(/*UniMode um*/) const { + Buffer *buf = _pEditView->getCurrentBuffer(); + UniMode um = buf->getUnicodeMode(); + int encoding = buf->getEncoding(); + int id = -1; switch (um) { @@ -6229,13 +6266,37 @@ void Notepad_plus::checkUnicodeMenuItems(UniMode um) const case uniCookie : id = IDM_FORMAT_AS_UTF_8; break; case uni8Bit : id = IDM_FORMAT_ANSI; break; } - if (id == -1) //um == uni16BE_NoBOM || um == uni16LE_NoBOM - { - ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, IDM_FORMAT_ANSI, MF_BYCOMMAND); - ::CheckMenuItem(_mainMenuHandle, IDM_FORMAT_ANSI, MF_UNCHECKED | MF_BYCOMMAND); - } - else - ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND); + + if (encoding == -1) + { + // Uncheck all in the sub encoding menu + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ENCODE, IDM_FORMAT_ENCODE_END, IDM_FORMAT_ENCODE, MF_BYCOMMAND); + ::CheckMenuItem(_mainMenuHandle, IDM_FORMAT_ENCODE, MF_UNCHECKED | MF_BYCOMMAND); + + if (id == -1) //um == uni16BE_NoBOM || um == uni16LE_NoBOM + { + // Uncheck all in the main encoding menu + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, IDM_FORMAT_ANSI, MF_BYCOMMAND); + ::CheckMenuItem(_mainMenuHandle, IDM_FORMAT_ANSI, MF_UNCHECKED | MF_BYCOMMAND); + } + else + { + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND); + } + } + else + { + int cmdID = getCmdIDFromEncoding(encoding); + if (cmdID == -1) + return; + + // Uncheck all in the main encoding menu + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, IDM_FORMAT_ANSI, MF_BYCOMMAND); + ::CheckMenuItem(_mainMenuHandle, IDM_FORMAT_ANSI, MF_UNCHECKED | MF_BYCOMMAND); + + // Check the encoding item + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ENCODE, IDM_FORMAT_ENCODE_END, cmdID, MF_BYCOMMAND); + } } void Notepad_plus::showAutoComp() { @@ -10282,7 +10343,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session) generic_string languageName = getLangFromMenu(buf); const TCHAR *langName = languageName.c_str(); - sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getPosition(&_mainEditView)); + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_mainEditView)); //_mainEditView.activateBuffer(buf->getID()); _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); @@ -10308,7 +10369,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session) generic_string languageName = getLangFromMenu( buf ); const TCHAR *langName = languageName.c_str(); - sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getPosition(&_subEditView)); + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_subEditView)); _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); int maxLine = _invisibleEditView.execute(SCI_GETLINECOUNT); @@ -10632,8 +10693,8 @@ void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask) { if (mask & (BufferChangeFormat|BufferChangeLanguage|BufferChangeUnicode)) { updateStatusBar(); - checkUnicodeMenuItems(buffer->getUnicodeMode()); - setUniModeText(/*buffer->getUnicodeMode()*/); + checkUnicodeMenuItems(/*buffer->getUnicodeMode()*/); + setUniModeText(); setDisplayFormat(buffer->getFormat()); enableConvertMenuItems(buffer->getFormat()); } @@ -10657,8 +10718,8 @@ void Notepad_plus::notifyBufferActivated(BufferID bufid, int view) { dynamicCheckMenuAndTB(); setLangStatus(buf->getLangType()); updateStatusBar(); - checkUnicodeMenuItems(buf->getUnicodeMode()); - setUniModeText(/*buf->getUnicodeMode()*/); + checkUnicodeMenuItems(/*buf->getUnicodeMode()*/); + setUniModeText(); setDisplayFormat(buf->getFormat()); enableConvertMenuItems(buf->getFormat()); generic_string dir(buf->getFullPathName()); diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index a67a3e2d9..df72bf7a4 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -191,7 +191,7 @@ public: // fileOperations //The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone - BufferID doOpen(const TCHAR *fileName, bool isReadOnly = false); + BufferID doOpen(const TCHAR *fileName, bool isReadOnly = false, int encoding = -1); bool doReload(BufferID id, bool alert = true); bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false); void doClose(BufferID, int whichOne); @@ -458,7 +458,7 @@ private: void getMainClientRect(RECT & rc) const; void dynamicCheckMenuAndTB() const; void enableConvertMenuItems(formatType f) const; - void checkUnicodeMenuItems(UniMode um) const; + void checkUnicodeMenuItems(/*UniMode um*/) const; generic_string getLangDesc(LangType langType, bool shortDesc = false); @@ -467,8 +467,8 @@ private: }; void setDisplayFormat(formatType f); - - void setUniModeText(/*UniMode um*/); + int getCmdIDFromEncoding(int encoding) const; + void setUniModeText(); void checkLangsMenu(int id) const ; void setLanguage(LangType langType); diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc index 5b6b77a70..0dc062060 100644 --- a/PowerEditor/src/Notepad_plus.rc +++ b/PowerEditor/src/Notepad_plus.rc @@ -403,7 +403,7 @@ BEGIN MENUITEM "Cyrillic(Windows)", IDM_FORMAT_WIN1251 MENUITEM "Central European(Windows)", IDM_FORMAT_WIN1250 MENUITEM "Chinese Traditional(Big5)", IDM_FORMAT_BIG5 - MENUITEM "Chinese Simplified(GB2312)", IDM_FORMAT_GB2312 + MENUITEM "Chinese Simplified(GB)", IDM_FORMAT_GB2312 MENUITEM "Greek(Windows)", IDM_FORMAT_WIN1253 MENUITEM "Hebrew(iso8859-8)", IDM_FORMAT_ISO_8859_8 MENUITEM "Hebrew(Windows)", IDM_FORMAT_WIN1255 diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index dc4a9697b..c66397f0d 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -1456,7 +1456,9 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p const TCHAR *langName; langName = (childNode->ToElement())->Attribute(TEXT("lang")); - sessionFileInfo sfi( fileName, langName, position ); + int encoding = -1; + const TCHAR *encStr = (childNode->ToElement())->Attribute(TEXT("encoding"), &encoding); + sessionFileInfo sfi(fileName, langName, encStr?encoding:-1, position); for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); markNode ; @@ -1501,7 +1503,10 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p const TCHAR *langName; langName = (childNode->ToElement())->Attribute(TEXT("lang")); - sessionFileInfo sfi( fileName, langName, position ); + int encoding = -1; + (childNode->ToElement())->Attribute(TEXT("encoding"), &encoding); + + sessionFileInfo sfi(fileName, langName, encoding, position); for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); markNode ; @@ -2092,6 +2097,7 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName) (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._mainViewFiles[i]._endPos); (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._mainViewFiles[i]._selMode); (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._mainViewFiles[i]._langName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("encoding"), session._mainViewFiles[i]._encoding); (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._mainViewFiles[i]._fileName.c_str()); for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++) @@ -2115,6 +2121,7 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName) (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._subViewFiles[i]._endPos); (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._subViewFiles[i]._selMode); (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._subViewFiles[i]._langName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("encoding"), session._subViewFiles[i]._encoding); (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._subViewFiles[i]._fileName.c_str()); for (size_t j = 0 ; j < session._subViewFiles[i].marks.size() ; j++) diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index b99f718dc..57d67be4f 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -126,20 +126,17 @@ struct Position }; struct sessionFileInfo : public Position { - sessionFileInfo(const TCHAR *fn) { - if (fn) _fileName = fn; - }; - sessionFileInfo(const TCHAR *fn, const TCHAR *ln, Position pos) : Position(pos) { + sessionFileInfo(const TCHAR *fn, const TCHAR *ln, int encoding, Position pos) : _encoding(encoding), Position(pos) { if (fn) _fileName = fn; if (ln) _langName = ln; }; - sessionFileInfo(generic_string fn) : _fileName(fn){}; - sessionFileInfo(generic_string fn, Position pos) : Position(pos), _fileName(fn){}; + sessionFileInfo(generic_string fn) : _fileName(fn), _encoding(-1){}; generic_string _fileName; generic_string _langName; vector marks; + int _encoding; }; struct Session { diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 9bec98892..8288efa0b 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -463,7 +463,8 @@ void FileManager::closeBuffer(BufferID id, ScintillaEditView * identifier) { } } -BufferID FileManager::loadFile(const TCHAR * filename, Document doc) { +BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encoding) +{ bool ownDoc = false; if (doc == NULL) { @@ -475,7 +476,7 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc) { ::GetFullPathName(filename, MAX_PATH, fullpath, NULL); ::GetLongPathName(fullpath, fullpath, MAX_PATH); Utf8_16_Read UnicodeConvertor; //declare here so we can get information after loading is done - bool res = loadFileData(doc, fullpath, &UnicodeConvertor, L_TXT); + bool res = loadFileData(doc, fullpath, &UnicodeConvertor, L_TXT, encoding); if (res) { Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); @@ -523,12 +524,13 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc) { } } -bool FileManager::reloadBuffer(BufferID id) { +bool FileManager::reloadBuffer(BufferID id) +{ Buffer * buf = getBufferByID(id); Document doc = buf->getDocument(); Utf8_16_Read UnicodeConvertor; buf->_canNotify = false; //disable notify during file load, we dont want dirty to be triggered - bool res = loadFileData(doc, buf->getFullPathName(), &UnicodeConvertor, buf->getLangType()); + bool res = loadFileData(doc, buf->getFullPathName(), &UnicodeConvertor, buf->getLangType(), buf->getEncoding()); buf->_canNotify = true; if (res) { if (UnicodeConvertor.getNewBuf()) { @@ -537,12 +539,12 @@ bool FileManager::reloadBuffer(BufferID id) { buf->determinateFormat(""); } buf->setUnicodeMode(UnicodeConvertor.getEncoding()); - // buf->setNeedsLexing(true); } return res; } -bool FileManager::reloadBufferDeferred(BufferID id) { +bool FileManager::reloadBufferDeferred(BufferID id) +{ Buffer * buf = getBufferByID(id); buf->setDeferredReload(); return true; @@ -694,7 +696,7 @@ BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool d return id; } -bool FileManager::loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language) +bool FileManager::loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language, int encoding) { const int blockSize = 128 * 1024; //128 kB char data[blockSize]; @@ -705,17 +707,22 @@ bool FileManager::loadFileData(Document doc, const TCHAR * filename, Utf8_16_Rea //Setup scratchtilla for new filedata _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, doc); bool ro = _pscratchTilla->execute(SCI_GETREADONLY) != 0; - if (ro) { + if (ro) + { _pscratchTilla->execute(SCI_SETREADONLY, false); } _pscratchTilla->execute(SCI_CLEARALL); - if (language < L_EXTERNAL) { + + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + if (language < L_EXTERNAL) + { _pscratchTilla->execute(SCI_SETLEXER, ScintillaEditView::langNames[language].lexerID); - } else { + } + else + { int id = language - L_EXTERNAL; TCHAR * name = NppParameters::getInstance()->getELCFromIndex(id)._name; #ifdef UNICODE - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const char *pName = wmc->wchar2char(name, CP_ACP); #else const char *pName = name; @@ -723,14 +730,29 @@ bool FileManager::loadFileData(Document doc, const TCHAR * filename, Utf8_16_Rea _pscratchTilla->execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)pName); } + if (encoding != -1) + { + _pscratchTilla->execute(SCI_SETCODEPAGE, SC_CP_UTF8); + } + bool success = true; __try { size_t lenFile = 0; size_t lenConvert = 0; //just in case conversion results in 0, but file not empty do { lenFile = fread(data, 1, blockSize, fp); - lenConvert = UnicodeConvertor->convert(data, lenFile); - _pscratchTilla->execute(SCI_APPENDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf())); + if (encoding != -1) + { + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char *newData = wmc->encode(encoding, SC_CP_UTF8, data); + _pscratchTilla->execute(SCI_APPENDTEXT, strlen(newData), (LPARAM)newData); + } + else + { + lenConvert = UnicodeConvertor->convert(data, lenFile); + _pscratchTilla->execute(SCI_APPENDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf())); + } + } while (lenFile > 0); } __except(filter(GetExceptionCode(), GetExceptionInformation())) { printStr(TEXT("File is too big to be opened by Notepad++")); diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h index 0b7348ee3..fa37d799e 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.h +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -79,7 +79,7 @@ public: void addBufferReference(BufferID id, ScintillaEditView * identifer); //called by Scintilla etc indirectly - BufferID loadFile(const TCHAR * filename, Document doc = NULL); //ID == BUFFER_INVALID on failure. If Doc == NULL, a new file is created, otherwise data is loaded in given document + BufferID loadFile(const TCHAR * filename, Document doc = NULL, int encoding = -1); //ID == BUFFER_INVALID on failure. If Doc == NULL, a new file is created, otherwise data is loaded in given document BufferID newEmptyDocument(); //create Buffer from existing Scintilla, used from new Scintillas. If dontIncrease = true, then the new document number isnt increased afterwards. //usefull for temporary but neccesary docs @@ -121,7 +121,7 @@ private: BufferID _nextBufferID; size_t _nrBufs; - bool loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language); + bool loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language, int encoding = -1); }; #define MainFileManager FileManager::getInstance() diff --git a/PowerEditor/src/menuCmdID.h b/PowerEditor/src/menuCmdID.h index a5acd1bf4..63f36022b 100644 --- a/PowerEditor/src/menuCmdID.h +++ b/PowerEditor/src/menuCmdID.h @@ -238,7 +238,7 @@ #define IDM_FORMAT_CONV2_UCS_2BE (IDM_FORMAT + 12) #define IDM_FORMAT_CONV2_UCS_2LE (IDM_FORMAT + 13) - #define IDM_FORMAT_ENCODE (IDM_FORMAT + 20) + #define IDM_FORMAT_ENCODE (IDM_FORMAT + 20) #define IDM_FORMAT_WIN1250 (IDM_FORMAT_ENCODE + 0) #define IDM_FORMAT_WIN1251 (IDM_FORMAT_ENCODE + 1) #define IDM_FORMAT_WIN1252 (IDM_FORMAT_ENCODE + 2) @@ -254,7 +254,8 @@ #define IDM_FORMAT_EUC_KR (IDM_FORMAT_ENCODE + 12) #define IDM_FORMAT_TIS_620 (IDM_FORMAT_ENCODE + 13) #define IDM_FORMAT_ISO_8859_8 (IDM_FORMAT_ENCODE + 14) - + #define IDM_FORMAT_ENCODE_END IDM_FORMAT_ISO_8859_8 + #define IDM_LANG (IDM + 6000) #define IDM_LANGSTYLE_CONFIG_DLG (IDM_LANG + 1) #define IDM_LANG_C (IDM_LANG + 2)