mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-22 21:34:58 +02:00
[NEW] File Encoding is remembered in the session.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@567 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
10e6cbfb61
commit
de6f421c9c
@ -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) {
|
||||
};
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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++)
|
||||
|
@ -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<size_t> marks;
|
||||
int _encoding;
|
||||
};
|
||||
|
||||
struct Session {
|
||||
|
@ -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++"));
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user