View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001901 | Far Manager | Editor | public | 2011-10-03 19:33 | 2011-10-12 07:38 |
| Reporter | 2useven10 | Assigned To | 2useven10 | ||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Product Version | 3.0 | ||||
| Fixed in Version | 3.0 | ||||
| Summary | 0001901: Текущая позиция не сохраняется при переключении между View/Edit по F6 на неоднобайтных кодировках | ||||
| Description | Редактор считает позицию в символах, вьювер в байтах (теперь и в юникоде тоже). Результат стартовая позиция 'едет'. Вьювер может неверно показывать символы, лечится через AdjustFilePos, но от дребезга позиции не спасает. | ||||
| Steps To Reproduce | Открыть utf-8 файл во вьювере (FarRus.hlf) сместиь позицию за строку содержащую русский текст. F6 F6 | ||||
| Additional Information | поместил в раздел редактора, т.к. для вьювера единственный способ посчитать символы - прочесть весь файл от начала, что пожалуй не годится. | ||||
| Tags | No tags attached. | ||||
| Build | 2217 | ||||
|
|
F6.diff (3,577 bytes)
Index: editor.hpp
===================================================================
--- editor.hpp (revision 6749)
+++ editor.hpp (working copy)
@@ -283,7 +283,7 @@
public:
- void SetCacheParams(EditorPosCache &pc);
+ void SetCacheParams(EditorPosCache &pc, bool count_bom=false);
void GetCacheParams(EditorPosCache &pc);
bool SetCodePage(UINT codepage); //BUGBUG
@@ -301,7 +301,7 @@
BOOL IsFileModified() const;
BOOL IsFileChanged() const;
void SetTitle(const wchar_t *Title);
- long GetCurPos();
+ long GetCurPos( bool file_pos=false, bool add_bom=false );
int EditorControl(int Command,void *Param);
void SetHostFileEditor(FileEditor *Editor) {HostFileEditor=Editor;};
static void SetReplaceMode(int Mode);
Index: editor.cpp
===================================================================
--- editor.cpp (revision 6749)
+++ editor.cpp (working copy)
@@ -4807,21 +4807,35 @@
}
// ���������� � FileEditor
-long Editor::GetCurPos()
+long Editor::GetCurPos( bool file_pos, bool add_bom )
{
Edit *CurPtr=TopList;
long TotalSize=0;
+ int mult = 1, bom = 0;
+ if ( file_pos ) {
+ if ( m_codepage == CP_UNICODE || m_codepage == CP_REVERSEBOM ) {
+ mult = 2;
+ if ( add_bom ) bom += 2;
+ }
+ else if ( m_codepage == CP_UTF8 ) {
+ mult = -1;
+ if ( add_bom ) bom += 3;
+ }
+ }
while (CurPtr!=TopScreen)
{
const wchar_t *SaveStr,*EndSeq;
int Length;
CurPtr->GetBinaryString(&SaveStr,&EndSeq,Length);
- TotalSize+=Length+StrLength(EndSeq);
+ if ( mult > 0 )
+ TotalSize += Length + StrLength(EndSeq);
+ else
+ TotalSize -= WideCharToMultiByte(CP_UTF8,0,SaveStr,Length,nullptr,0,nullptr,nullptr)+StrLength(EndSeq);
CurPtr=CurPtr->m_next;
}
- return(TotalSize);
+ return TotalSize * mult + bom;
}
@@ -6903,7 +6917,7 @@
}
-void Editor::SetCacheParams(EditorPosCache &pc)
+void Editor::SetCacheParams(EditorPosCache &pc, bool count_bom)
{
bool translateTabs=false;
SavePos=pc.bm;
@@ -6913,14 +6927,29 @@
{
Edit *CurPtr=TopList;
long TotalSize=0;
+ bool utf8 = false;
+ if ( m_codepage == CP_UNICODE || m_codepage == CP_REVERSEBOM ) {
+ StartChar /= 2;
+ if ( count_bom )
+ --StartChar;
+ }
+ else if ( m_codepage == CP_UTF8 ) {
+ utf8 = true;
+ if ( count_bom )
+ StartChar -= 3;
+ }
+
while (CurPtr && CurPtr->m_next)
{
const wchar_t *SaveStr,*EndSeq;
int Length;
CurPtr->GetBinaryString(&SaveStr,&EndSeq,Length);
- TotalSize+=Length+StrLength(EndSeq);
+ if ( utf8 )
+ Length = WideCharToMultiByte(CP_UTF8,0, SaveStr,Length, nullptr,0, nullptr,nullptr);
+ TotalSize += Length + StrLength(EndSeq);
+
if (TotalSize > StartChar)
break;
Index: fileedit.cpp
===================================================================
--- fileedit.cpp (revision 6749)
+++ fileedit.cpp (working copy)
@@ -902,7 +902,7 @@
if (!FirstSave || m_editor->IsFileChanged() || apiGetFileAttributes(strFullFileName)!=INVALID_FILE_ATTRIBUTES)
{
- long FilePos=m_editor->GetCurPos();
+ long FilePos=m_editor->GetCurPos(true, m_bAddSignature);
/* $ 01.02.2001 IS
! �������� ��� � ��������� �������� ����� �����, � �� ���������
@@ -1642,7 +1642,7 @@
EditFile.Close();
//if ( bCached )
- m_editor->SetCacheParams(pc);
+ m_editor->SetCacheParams(pc, m_bAddSignature);
SysErrorCode=GetLastError();
apiGetFindDataEx(Name, FileInfo);
EditorGetFileAttributes(Name);
|
|
|
F6.diff - фикс |
|
|
F6.for.Far2.bis.diff (5,646 bytes)
diff --git a/Far2bis/editor.cpp b/Far2bis/editor.cpp
index e6a8803..af7732b 100644
--- a/Far2bis/editor.cpp
+++ b/Far2bis/editor.cpp
@@ -4715,21 +4715,35 @@ BOOL Editor::IsFileModified() const
}
// ���������� � FileEditor
-long Editor::GetCurPos()
+long Editor::GetCurPos(bool file_pos, bool add_bom)
{
Edit *CurPtr=TopList;
long TotalSize=0;
+ int mult = 1, bom = 0;
+ if ( file_pos ) {
+ if ( m_codepage == CP_UNICODE || m_codepage == CP_REVERSEBOM ) {
+ mult = 2;
+ if ( add_bom ) bom += 2;
+ }
+ else if ( m_codepage == CP_UTF8 ) {
+ mult = -1;
+ if ( add_bom ) bom += 3;
+ }
+ }
while (CurPtr!=TopScreen)
{
const wchar_t *SaveStr,*EndSeq;
int Length;
CurPtr->GetBinaryString(&SaveStr,&EndSeq,Length);
- TotalSize+=Length+StrLength(EndSeq);
+ if ( mult > 0 )
+ TotalSize += Length + StrLength(EndSeq);
+ else
+ TotalSize -= WideCharToMultiByte(CP_UTF8,0,SaveStr,Length,nullptr,0,nullptr,nullptr)+StrLength(EndSeq);
CurPtr=CurPtr->m_next;
}
- return(TotalSize);
+ return TotalSize * mult + bom;
}
@@ -6797,7 +6811,7 @@ Edit *Editor::InsertString(const wchar_t *lpwszStr, int nLength, Edit *pAfter, i
}
-void Editor::SetCacheParams(EditorCacheParams *pp)
+void Editor::SetCacheParams(EditorCacheParams *pp, bool count_bom)
{
bool translateTabs=false;
SavePos=pp->SavePos;
@@ -6807,13 +6821,28 @@ void Editor::SetCacheParams(EditorCacheParams *pp)
{
Edit *CurPtr=TopList;
long TotalSize=0;
+ bool utf8 = false;
+
+ if ( m_codepage == CP_UNICODE || m_codepage == CP_REVERSEBOM ) {
+ StartChar /= 2;
+ if ( count_bom )
+ --StartChar;
+ }
+ else if ( m_codepage == CP_UTF8 ) {
+ utf8 = true;
+ if ( count_bom )
+ StartChar -= 3;
+ }
while (CurPtr && CurPtr->m_next)
{
const wchar_t *SaveStr,*EndSeq;
int Length;
CurPtr->GetBinaryString(&SaveStr,&EndSeq,Length);
- TotalSize+=Length+StrLength(EndSeq);
+ if ( utf8 )
+ Length = WideCharToMultiByte(CP_UTF8,0, SaveStr,Length, nullptr, 0, nullptr,nullptr);
+
+ TotalSize += Length + StrLength(EndSeq);
if (TotalSize > StartChar)
break;
diff --git a/Far2bis/editor.hpp b/Far2bis/editor.hpp
index 7c04096..10aa3a6 100644
--- a/Far2bis/editor.hpp
+++ b/Far2bis/editor.hpp
@@ -303,7 +303,7 @@ class Editor:public ScreenObject
public:
- void SetCacheParams(EditorCacheParams *pp);
+ void SetCacheParams(EditorCacheParams *pp, bool count_bom=false);
void GetCacheParams(EditorCacheParams *pp);
bool SetCodePage(UINT codepage); //BUGBUG
@@ -321,7 +321,7 @@ class Editor:public ScreenObject
BOOL IsFileModified() const;
BOOL IsFileChanged() const;
void SetTitle(const wchar_t *Title);
- long GetCurPos();
+ long GetCurPos(bool file_pos=false, bool add_bom=false);
int EditorControl(int Command,void *Param);
void SetHostFileEditor(FileEditor *Editor) {HostFileEditor=Editor;};
static void SetReplaceMode(int Mode);
diff --git a/Far2bis/farversion.m4 b/Far2bis/farversion.m4
index fb940c4..26c5657 100644
--- a/Far2bis/farversion.m4
+++ b/Far2bis/farversion.m4
@@ -10,7 +10,7 @@ m4_define(BLD_MONTH,m4_substr(DATE,3,2))m4_dnl
m4_define(BLD_DAY,m4_substr(DATE,0,2))m4_dnl
m4_define(COPYRIGHTYEARS,m4_ifelse(`2000',BLD_YEAR,`2000',`2000-'BLD_YEAR))m4_dnl
m4_define(MAKEFULLVERSION,`m4_ifelse(
-`',$1,`MAJOR.MINOR (build BUILD bis21.6) $2',
+`',$1,`MAJOR.MINOR (build BUILD bis21.8) $2',
`RC',$1,`MAJOR.MINOR RC (build BUILD) $2',
`alpha',$1,`MAJOR.MINOR alpha (build BUILD) $2',
`beta',$1,`MAJOR.MINOR beta (build BUILD) $2',
diff --git a/Far2bis/fileedit.cpp b/Far2bis/fileedit.cpp
index 8a84b07..accc236 100644
--- a/Far2bis/fileedit.cpp
+++ b/Far2bis/fileedit.cpp
@@ -911,7 +911,7 @@ int FileEditor::ReProcessKey(int Key,int CalledFromControl)
if (!FirstSave || m_editor->IsFileChanged() || apiGetFileAttributes(strFullFileName)!=INVALID_FILE_ATTRIBUTES)
{
- long FilePos=m_editor->GetCurPos();
+ long FilePos=m_editor->GetCurPos(true, m_bAddSignature);
/* $ 01.02.2001 IS
! �������� ��� � ��������� �������� ����� �����, � �� ���������
@@ -1626,7 +1626,7 @@ int FileEditor::LoadFile(const wchar_t *Name,int &UserBreak)
EditFile.Close();
//if ( bCached )
- m_editor->SetCacheParams(&cp);
+ m_editor->SetCacheParams(&cp, m_bAddSignature);
SysErrorCode=GetLastError();
apiGetFindDataEx(Name, FileInfo);
EditorGetFileAttributes(Name);
diff --git a/Far2bis/viewer.cpp b/Far2bis/viewer.cpp
index 7bdbc50..c1d60ca 100644
--- a/Far2bis/viewer.cpp
+++ b/Far2bis/viewer.cpp
@@ -1449,6 +1449,7 @@ int Viewer::ProcessKey(int Key)
{
VM.CodePage = VM.CodePage==GetOEMCP() ? GetACP() : GetOEMCP();
lcache_ready = false;
+ AdjustFilePos();
ChangeViewKeyBar();
Show();
CodePageChangedByUser=TRUE;
@@ -1457,8 +1458,6 @@ int Viewer::ProcessKey(int Key)
case KEY_SHIFTF8:
{
UINT nCodePage = SelectCodePage(VM.CodePage, true, true, false, true);
- lcache_ready = false;
-
if (nCodePage != static_cast<UINT>(-1))
{
if (nCodePage == (CP_AUTODETECT & 0xffff))
@@ -1471,7 +1470,8 @@ int Viewer::ProcessKey(int Key)
}
CodePageChangedByUser=TRUE;
VM.CodePage=nCodePage;
- SetFileSize();
+ lcache_ready = false;
+ AdjustFilePos();
ChangeViewKeyBar();
Show();
}
@@ -3386,6 +3386,7 @@ void Viewer::SetTitle(const wchar_t *Title)
void Viewer::SetFilePos(__int64 Pos)
{
FilePos=Pos;
+ AdjustFilePos();
};
void Viewer::SetPluginData(const wchar_t *PluginData)
--
1.7.6.msysgit.0
|
|
|
Добавил тот же фикс, но для Far2.bis |
|
|
build 2217 |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2011-10-03 19:33 | 2useven10 | New Issue | |
| 2011-10-04 08:48 | 2useven10 | File Added: F6.diff | |
| 2011-10-04 08:49 | 2useven10 | Note Added: 0007826 | |
| 2011-10-04 10:49 | Denis | File Added: F6.for.Far2.bis.diff | |
| 2011-10-04 10:49 | Denis | Note Added: 0007827 | |
| 2011-10-11 10:21 | 2useven10 | Note Added: 0007863 | |
| 2011-10-11 10:21 | 2useven10 | Assigned To | => 2useven10 |
| 2011-10-11 10:21 | 2useven10 | Status | new => feedback |
| 2011-10-12 07:37 | 2useven10 | Status | feedback => resolved |
| 2011-10-12 07:38 | 2useven10 | Build | => 2217 |
| 2011-10-12 07:38 | 2useven10 | Status | resolved => closed |
| 2011-10-12 07:38 | 2useven10 | Resolution | open => fixed |
| 2011-10-12 07:38 | 2useven10 | Fixed in Version | => 3.0 |