View Issue Details

IDProjectCategoryView StatusLast Update
0000677Far Manager 1.7x_Commonpublic2008-12-27 13:34
Reportersamlyukov Assigned Toalexy  
PrioritynormalSeverityminorReproducibilityhave not tried
Status closedResolutionfixed 
Fixed in Version1.75 
Summary0000677: Некоректный горизонтальный скрол в меню
Descriptionфункция HiStrlen() возвращает не верную длину:
если ручками подставим в строку символ '&' или
в коде сделаем например так: if (I<10) strNumText.Format (L"&%d. ",I);
то длина вернется на один символ меньше.
это можно посмотреть или в меню фильтров или в меню F12 на больших строках.
TagsNo tags attached.
Build2495

Activities

alexy

2008-12-19 19:08

administrator   bugnote:0002221

Ничего не понял из того что ты хотел сказать. HiStrlen считает длину именно без этих &.

samlyukov

2008-12-19 19:21

reporter   bugnote:0002223

ладно, поехали тогда дальше.
уникодный фар (для наглядности, т.к. в анси строки режутся),
окно 80х25, жмем Ctrl-I и создаем фильтр
вводим в имя: &t&e&s&t
в маску: 01234567890123456789012345678901234567890123456789012345678901234567890
ок.
теперь крутим в меню фильтров до упора вправо.

samlyukov

2008-12-19 19:33

reporter   bugnote:0002224

реализация HiStrlen() на мой взгляд кривая, она должна выбрасывать только первое вхождение & и считать дальше.

2008-12-20 06:34

 

!work.diff (3,091 bytes)   
Index: fn.hpp
===================================================================
--- fn.hpp	(revision 2319)
+++ fn.hpp	(working copy)
@@ -248,7 +248,7 @@
 void SaveConfig(int Ask);
 void SetColors();
 int GetColorDialog(unsigned int &Color,bool bCentered=false,bool bAddTransparent=false);
-int HiStrlen(const wchar_t *Str,BOOL Dup=TRUE);
+int HiStrlen(const wchar_t *Str,BOOL Dup=TRUE,BOOL AutoHighlight=TRUE);
 int GetErrorString (string &strErrStr);
 // �������� �� "�������������" ������������� ��... ��������, ������� ����� � ������ �������!
 BOOL CheckErrorForProcessed(DWORD Err);
Index: strmix.cpp
===================================================================
--- strmix.cpp	(revision 2319)
+++ strmix.cpp	(working copy)
@@ -723,27 +723,33 @@
 }
 
 
-int HiStrlen(const wchar_t *Str,BOOL Dup)
+int HiStrlen(const wchar_t *Str,BOOL Dup, BOOL AutoHighlight)
 {
   int Length=0;
+  // �.�. ������ ����� �� ����� ���� - ������� ������� ���� - AutoHighlight=TRUE
+  // ���� �� ������������ ���������� � ������ '&' - AutoHighlight=FALSE
+  BOOL Skip=AutoHighlight;
 
   if (Str && *Str)
   {
     while (*Str)
     {
-      if (*Str!=L'&')
+      if (*Str==L'&')
       {
-        Length++;
-      }
-      else
-      {
         if (Dup && Str[1] == L'&')
         {
-          Length++;
           ++Str;
         }
+        else if (Skip)
+        {
+          Skip=FALSE;
+          ++Str;
+        }
       }
-      Str++;
+      Length++;
+      // ��������, ���� �� ���� �� �����
+      if (*Str) Str++;
+      else break;
     }
   }
   return(Length);
Index: vmenu.cpp
===================================================================
--- vmenu.cpp	(revision 2319)
+++ vmenu.cpp	(working copy)
@@ -585,7 +585,7 @@
         if(VMFlags.Check(VMENU_SHOWAMPERSAND))
           Len_MItemPtr=StrLength(_MItemPtr);
         else
-          Len_MItemPtr=HiStrlen(_MItemPtr,TRUE);
+          Len_MItemPtr=HiStrlen(_MItemPtr);
 
         swprintf(TmpStrW,L"%c ",Check);
         xwcsncat(TmpStrW,_MItemPtr,countof(TmpStrW)-1-StrLength(TmpStrW));
@@ -764,7 +764,7 @@
   if(VMFlags.Check(VMENU_SHOWAMPERSAND))
     _len=StrLength(Item[Pos]->strName);
   else
-    _len=HiStrlen(Item[Pos]->strName,TRUE);
+    _len=HiStrlen(Item[Pos]->strName,TRUE,VMFlags.Check(VMENU_AUTOHIGHLIGHT));
 
   if(_len < _OWidth ||
      (Direct < 0 && ItemShowPos==0) ||
@@ -1027,7 +1027,7 @@
           if(VMFlags.Check(VMENU_SHOWAMPERSAND))
             _len=StrLength(Item[I]->strName);
           else
-            _len=HiStrlen(Item[I]->strName,TRUE);
+            _len=HiStrlen(Item[I]->strName,TRUE,VMFlags.Check(VMENU_AUTOHIGHLIGHT));
 
           if(_len >= _OWidth)
             Item[I]->ShowPos=_len-_OWidth;
@@ -1460,7 +1460,7 @@
   if(VMFlags.Check(VMENU_SHOWAMPERSAND))
     Length=(int)Item[PosAdd]->strName.GetLength();
   else
-    Length=HiStrlen(Item[PosAdd]->strName,TRUE);
+    Length=HiStrlen(Item[PosAdd]->strName);
 
   if (Length>MaxLength)
     MaxLength=Length;
!work.diff (3,091 bytes)   

samlyukov

2008-12-20 06:34

reporter   bugnote:0002226

fix в аттаче

samlyukov

2008-12-20 08:16

reporter   bugnote:0002227

Last edited: 2008-12-20 08:19

длина с '&' теперь определяется правильно.
но тут параллельный баг обнаружился:
фар 1,75 (или 2,0) создаем файл "test&&&.cpp" - стоим на нем - F12 - см.

 0. Panels D:\!Develop!\fardev\test&&&.

окончания нет! это вроде бы как-то связано с подсветкой ХотКиев

alexy

2008-12-26 12:31

administrator   bugnote:0002254

695

samlyukov

2008-12-27 03:32

reporter   bugnote:0002261

проверить не могу, ругается на это:
execute.cpp(179) : error C2065: 'IApplicationAssociationRegistration' : undeclared identifier
execute.cpp(179) : error C2065: 'pAAR' : undeclared identifier
execute.cpp(180) : error C2065: 'IID_IApplicationAssociationRegistration' : undeclared identifier
execute.cpp(184) : error C2227: left of '->QueryCurrentDefault' must point to class/struct/union/generic type
        type is ''unknown-type''
execute.cpp(184) : error C2065: 'AT_FILEEXTENSION' : undeclared identifier
execute.cpp(184) : error C2065: 'AL_EFFECTIVE' : undeclared identifier
execute.cpp(190) : error C2227: left of '->Release' must point to class/struct/union/generic type
        type is ''unknown-type''

samlyukov

2008-12-27 03:33

reporter   bugnote:0002262

Last edited: 2008-12-27 03:33

студия 2005 без SP

alexy

2008-12-27 09:39

administrator   bugnote:0002263

Ну это как бы твои личный проблемы. Качай nightly.

samlyukov

2008-12-27 13:30

reporter   bugnote:0002264

скачал. вроде нормально.

Issue History

Date Modified Username Field Change
2008-12-19 17:17 samlyukov New Issue
2008-12-19 19:08 alexy Note Added: 0002221
2008-12-19 19:21 samlyukov Note Added: 0002223
2008-12-19 19:33 samlyukov Note Added: 0002224
2008-12-19 21:17 alexy Status new => assigned
2008-12-19 21:17 alexy Assigned To => vskirdin
2008-12-20 06:34 samlyukov File Added: !work.diff
2008-12-20 06:34 samlyukov Note Added: 0002226
2008-12-20 08:16 samlyukov Note Added: 0002227
2008-12-20 08:19 samlyukov Note Edited: 0002227
2008-12-26 12:07 alexy Assigned To vskirdin => alexy
2008-12-26 12:07 alexy Summary HiStrlen() возвращает меньшую длину чем надо => Некоректный горизонтальный скрол в меню
2008-12-26 12:31 alexy Note Added: 0002254
2008-12-26 12:31 alexy Status assigned => feedback
2008-12-27 03:32 samlyukov Note Added: 0002261
2008-12-27 03:33 samlyukov Note Added: 0002262
2008-12-27 03:33 samlyukov Note Edited: 0002262
2008-12-27 09:39 alexy Note Added: 0002263
2008-12-27 13:30 samlyukov Note Added: 0002264
2008-12-27 13:31 samlyukov Status feedback => resolved
2008-12-27 13:31 samlyukov Resolution open => fixed
2008-12-27 13:34 alexy Build => 2495
2008-12-27 13:34 alexy Status resolved => closed
2008-12-27 13:34 alexy Fixed in Version => 1.75