View Issue Details

IDProjectCategoryView StatusLast Update
0000872WishesRegExppublic2013-02-03 00:34
Reportertopmo3 Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Product Version2.0 
Fixed in Version2.0 
Summary0000872: RegExp support in Editor and Viewer
DescriptionХорошо бы иметь возможность поиска во Viewer и поиска/замены в Editor без использования плагинов (например добавочный чекбокс [x]RegExp в диалоге поиска/замены)
TagsNo tags attached.
Build1094

Activities

igor_yudincev

2009-08-27 22:50

reporter  

RegexpChkBox.patch (10,724 bytes)   
Index: edit.cpp
===================================================================
--- edit.cpp	(revision 3393)
+++ edit.cpp	(working copy)
@@ -1985,7 +1985,7 @@
    ������� ������ �������� ��-�� ������������
    ��������� ������ ��� ����.
 */
-int Edit::Search(const string& Str,int Position,int Case,int WholeWords,int Reverse, int *SearchLength)
+int Edit::Search(const string& Str,int Position,int Case,int WholeWords,int Reverse,int Regexp, int *SearchLength)
 {
   *SearchLength = 0;
 
@@ -2000,7 +2000,7 @@
 
   if (Position<StrSize && !Str.IsEmpty() )
   {
-    if (!Reverse && Str[0] == L'/')
+    if (!Reverse && Regexp)
     {
       RegExp re;
 
Index: edit.hpp
===================================================================
--- edit.hpp	(revision 3393)
+++ edit.hpp	(working copy)
@@ -237,7 +237,7 @@
     void  InsertString(const wchar_t *Str);
     void  InsertBinaryString(const wchar_t *Str,int Length);
 
-    int   Search(const string& Str,int Position,int Case,int WholeWords,int Reverse, int *SearchLength);
+    int   Search(const string& Str,int Position,int Case,int WholeWords,int Reverse,int Regexp, int *SearchLength);
 
     void  SetClearFlag(int Flag) {Flags.Change(FEDITLINE_CLEARFLAG,Flag);}
 		int   GetClearFlag() {return Flags.Check(FEDITLINE_CLEARFLAG);}
Index: editor.cpp
===================================================================
--- editor.cpp	(revision 3393)
+++ editor.cpp	(working copy)
@@ -91,6 +91,7 @@
   LastSearchWholeWords=GlobalSearchWholeWords;
   LastSearchReverse=GlobalSearchReverse;
   LastSearchSelFound=GlobalSearchSelFound;
+  LastSearchRegexp=GlobalSearchRegexp;
   SuccessfulSearch=0;
 
   Pasting=0;
@@ -170,6 +171,7 @@
   GlobalSearchWholeWords=LastSearchWholeWords;
   GlobalSearchReverse=LastSearchReverse;
   GlobalSearchSelFound=LastSearchSelFound;
+  GlobalSearchRegexp=LastSearchRegexp;
 }
 
 /*
@@ -3770,7 +3772,7 @@
   static int LastSuccessfulReplaceMode=0;
   string strMsgStr;
   const wchar_t *TextHistoryName=L"SearchText",*ReplaceHistoryName=L"ReplaceText";
-  int CurPos,Case,WholeWords,ReverseSearch,SelectFound,Match,NewNumLine,UserBreak;
+  int CurPos,Case,WholeWords,ReverseSearch,SelectFound,Regexp,Match,NewNumLine,UserBreak;
   int iPosCorrection = 0;
 
   if (Next && strLastSearchStr.IsEmpty() )
@@ -3783,12 +3785,13 @@
   WholeWords=LastSearchWholeWords;
   ReverseSearch=LastSearchReverse;
   SelectFound=LastSearchSelFound;
+  Regexp=LastSearchRegexp;
 
   if (!Next)
     if(!GetSearchReplaceString(ReplaceMode,&strSearchStr,
                    &strReplaceStr,
                    TextHistoryName,ReplaceHistoryName,
-                   &Case,&WholeWords,&ReverseSearch,&SelectFound,L"EditorSearch"))
+                   &Case,&WholeWords,&ReverseSearch,&SelectFound,&Regexp,L"EditorSearch"))
       return FALSE;
 
   // Cheack if need to modify current pos
@@ -3802,6 +3805,7 @@
   LastSearchWholeWords=WholeWords;
   LastSearchReverse=ReverseSearch;
   LastSearchSelFound=SelectFound;
+  LastSearchRegexp=Regexp;
 
   if ( strSearchStr.IsEmpty() )
     return TRUE;
@@ -3885,7 +3889,7 @@
       }
 
       int SearchLength=0;
-      if (CurPtr->Search(strSearchStr,CurPos,Case,WholeWords,ReverseSearch,&SearchLength))
+      if (CurPtr->Search(strSearchStr,CurPos,Case,WholeWords,ReverseSearch,Regexp,&SearchLength))
       {
         if( SelectFound )
         {
Index: editor.hpp
===================================================================
--- editor.hpp	(revision 3393)
+++ editor.hpp	(working copy)
@@ -206,7 +206,7 @@
     /* $ 30.07.2000 KM
        ���� ��������� �� ������ "Whole words"
     */
-    int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchSelFound;
+    int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchSelFound,LastSearchRegexp;
     int SuccessfulSearch; // successful search indicator
 
     UINT m_codepage; //BUGBUG
Index: farlang.templ.m4
===================================================================
--- farlang.templ.m4	(revision 3393)
+++ farlang.templ.m4	(working copy)
@@ -3403,6 +3403,14 @@
 "&Találat kijelölése"
 "W&ybierz znalezione"
 
+MEditSearchRegexp
+"&Регулярные выражения"
+"&Regular expressions"
+upd:"&Regular expressions"
+upd:"&Regular expressions"
+upd:"&Regular expressions"
+upd:"&Regular expressions"
+
 MEditSearchSearch
 "Искать"
 "Search"
Index: global.cpp
===================================================================
--- global.cpp	(revision 3393)
+++ global.cpp	(working copy)
@@ -90,6 +90,7 @@
 int GlobalSearchCase=FALSE;
 int GlobalSearchWholeWords=FALSE; // ������� "Whole words" �� ������
 int GlobalSearchSelFound=FALSE; // ������� "Select found" �� ������
+int GlobalSearchRegexp=FALSE;   // ������� "Regular expressions" �� ������
 int GlobalSearchHex=FALSE;     // ������� "Search for hex" �� ������
 int GlobalSearchReverse=FALSE;
 
Index: global.hpp
===================================================================
--- global.hpp	(revision 3393)
+++ global.hpp	(working copy)
@@ -59,6 +59,7 @@
 extern int GlobalSearchCase;
 extern int GlobalSearchWholeWords; // ������� "Whole words" �� ������
 extern int GlobalSearchSelFound; //������� "Select found"  �� ������
+extern int GlobalSearchRegexp; //������� "Regular expressions"  �� ������
 extern int GlobalSearchHex; // ������� "Search for hex" �� ������
 
 extern int GlobalSearchReverse;
Index: stddlg.cpp
===================================================================
--- stddlg.cpp	(revision 3393)
+++ stddlg.cpp	(working copy)
@@ -53,6 +53,7 @@
          int *WholeWords,
          int *Reverse,
          int *SelectFound,
+         int *Regexp,
          const wchar_t *HelpTopic)
 {
   if(!pSearchStr || (IsReplaceMode && !pReplaceStr))
@@ -97,9 +98,10 @@
     /*  6 */DI_CHECKBOX,5,7,0,7,0,0,0,0,(const wchar_t *)MEditSearchCase,
     /*  7 */DI_CHECKBOX,5,8,0,8,0,0,0,0,(const wchar_t *)MEditSearchWholeWords,
     /*  8 */DI_CHECKBOX,5,9,0,9,0,0,0,0,(const wchar_t *)MEditSearchReverse,
-    /*  9 */DI_TEXT,3,10,0,10,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
-    /* 10 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditReplaceReplace,
-    /* 11 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
+    /*  9 */DI_CHECKBOX,70,6,0,6,0,0,0,0,(const wchar_t *)MEditSearchRegexp,
+    /* 10 */DI_TEXT,3,10,0,10,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
+    /* 11 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditReplaceReplace,
+    /* 12 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
     };
 
     HeightDialog=14;
@@ -167,10 +169,24 @@
       }
     }
 
+    if(Regexp)
+      ReplaceDlg[9].Selected=*Regexp;
+    else
+    {
+      HeightDialog--;
+      ReplaceDlg[0].Y2--;
+      ReplaceDlg[9].Type=DI_TEXT;
+      for(I=10; I < (int)countof(ReplaceDlg); ++I)
+      {
+        ReplaceDlg[I].Y1--;
+        ReplaceDlg[I].Y2--;
+      }
+    }
+
     // ��� �� ���� 2 ����������� �����
     if(HeightDialog == 11)
     {
-      for(I=9; I < (int)countof(ReplaceDlg); ++I)
+      for(I=10; I < (int)countof(ReplaceDlg); ++I)
       {
         ReplaceDlg[I].Y1--;
         ReplaceDlg[I].Y2--;
@@ -182,7 +198,7 @@
       if (HelpTopic && *HelpTopic)
         Dlg.SetHelp(HelpTopic);
       Dlg.Process();
-      if (Dlg.GetExitCode()!=10)
+      if (Dlg.GetExitCode()!=11)
         return FALSE;
     }
 
@@ -193,6 +209,7 @@
     if(Case)       *Case=ReplaceDlg[6].Selected;
     if(WholeWords) *WholeWords=ReplaceDlg[7].Selected;
     if(Reverse)    *Reverse=ReplaceDlg[8].Selected;
+    if(Regexp)     *Regexp=ReplaceDlg[9].Selected;
   }
   else
   {
@@ -220,9 +237,10 @@
     /*  5 */DI_CHECKBOX,5,6,0,6,0,0,0,0,(const wchar_t *)MEditSearchWholeWords,
     /*  6 */DI_CHECKBOX,5,7,0,7,0,0,0,0,(const wchar_t *)MEditSearchReverse,
     /*  7 */DI_CHECKBOX,40,5,0,5,0,0,0,0,(const wchar_t *)MEditSearchSelFound,
-    /*  8 */DI_TEXT,3,8,0,8,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
-    /*  9 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditSearchSearch,
-    /* 10 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
+    /*  8 */DI_CHECKBOX,40,6,0,6,0,0,0,0,(const wchar_t *)MEditSearchRegexp,
+    /*  9 */DI_TEXT,3,8,0,8,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
+    /* 10 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditSearchSearch,
+    /* 11 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel,
     };
     MakeDialogItemsEx(SearchDlgData,SearchDlg);
     HeightDialog=12;
@@ -293,10 +311,24 @@
       }
     }
 
+    if(Regexp)
+      SearchDlg[8].Selected=*Regexp;
+    else
+    {
+      HeightDialog--;
+      SearchDlg[0].Y2--;
+      SearchDlg[8].Type=DI_TEXT;
+      for(I=9; I < (int)countof(SearchDlgData); ++I)
+      {
+        SearchDlg[I].Y1--;
+        SearchDlg[I].Y2--;
+      }
+    }
+
     // ��� �� ���� 2 ����������� �����
     if(HeightDialog == 9)
     {
-      for(I=8; I < (int)countof(SearchDlgData); ++I)
+      for(I=9; I < (int)countof(SearchDlgData); ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
@@ -308,7 +340,7 @@
       if (HelpTopic && *HelpTopic)
         Dlg.SetHelp(HelpTopic);
       Dlg.Process();
-      if (Dlg.GetExitCode()!=9)
+      if (Dlg.GetExitCode()!=10)
         return FALSE;
     }
 
@@ -318,6 +350,7 @@
     if(WholeWords) *WholeWords=SearchDlg[5].Selected;
     if(Reverse)    *Reverse=SearchDlg[6].Selected;
     if(SelectFound) *SelectFound=SearchDlg[7].Selected;
+    if(Regexp)     *Regexp=SearchDlg[8].Selected;
   }
   return TRUE;
 }
Index: stddlg.hpp
===================================================================
--- stddlg.hpp	(revision 3393)
+++ stddlg.hpp	(working copy)
@@ -79,6 +79,10 @@
       �������� �� ���������, ������� �� ������� ���� "Select found"
       ���� = NULL, �� ���������� ������� 0 (�� ����� ���������)
 
+    *Regexp
+      �������� �� ���������, ������� �� ������� ���� "Regular expressions"
+      ���� = NULL, �� ���������� ������� 0 (�� ������)
+
     *HelpTopic
       �� ��� �����.
       ���� NULL ��� ����� ������ - ���� ����� �� ���������.
@@ -97,6 +101,7 @@
          int *WholeWords,
          int *Reverse,
          int *SelectFound,
+         int *Regexp,
          const wchar_t *HelpTopic=NULL);
 
 int __stdcall GetString(
RegexpChkBox.patch (10,724 bytes)   

igor_yudincev

2009-08-27 22:51

reporter   bugnote:0003965

чекбокс в редакторе, см. патч

vskirdin

2009-08-28 04:55

administrator   bugnote:0003966

гы-гы... copy/paste сработало...

Игорь, ты уверен, что вот это верно?
+ if(Regexp)
+ SearchDlg[8].Selected=*Regexp;
+ else
+ {
+ HeightDialog--;
+ SearchDlg[0].Y2--;
+ SearchDlg[8].Type=DI_TEXT;
+ for(I=9; I < (int)countof(SearchDlgData); ++I)
+ {
+ SearchDlg[I].Y1--;
+ SearchDlg[I].Y2--;
+ }
+ }

В прочем как и про SelectFound...

igor_yudincev

2009-08-28 10:49

reporter   bugnote:0003967

Манипуляции с HeightDialog точно неверны, т.к. колонок с чекбоксами в диалоге уже две — нужно что-то вроде HeightCol1, HeightCol2 - так что, если определить макрос WORK_HELP_FIND, в хелпе появится кривой диалог поиска. Пока макрос не включен, при вызовах GetSearchReplaceString параметры Position..Regexp нигде не принимают значений NULL, поэтому оставил исправление ситуации на потом.

igor_yudincev

2009-08-28 11:24

reporter   bugnote:0003969

Last edited: 2009-08-28 11:42

Но, раз зашла об этом речь, сейчас я этот баг исправлю.

vskirdin

2009-08-28 12:02

administrator   bugnote:0003970

заодно сделай так, чтобы
1. во второй колонке сверху вниз, сначала шел RegExp, а потом Select
2. в диалоге замены тоже добавь RegExp, но пока сделай ему DIF_DISABLE (yа будущее :-))

+ в edit.cpp
если уж попали в регулярку, то нужно проверить наличие '/' в начале и в конце (функцию, что-то типа InsertSlash, по аналогии с InsertQuote - если их нет, то добавить)

igor_yudincev

2009-08-28 12:44

reporter  

RegexpChkBox2.patch (18,493 bytes)   
Index: edit.cpp
===================================================================
--- edit.cpp	(revision 3397)
+++ edit.cpp	(working copy)
@@ -1985,7 +1985,7 @@
    ������� ������ �������� ��-�� ������������
    ��������� ������ ��� ����.
 */
-int Edit::Search(const string& Str,int Position,int Case,int WholeWords,int Reverse, int *SearchLength)
+int Edit::Search(const string& Str,int Position,int Case,int WholeWords,int Reverse,int Regexp, int *SearchLength)
 {
   *SearchLength = 0;
 
@@ -2000,11 +2000,13 @@
 
   if (Position<StrSize && !Str.IsEmpty() )
   {
-    if (!Reverse && Str[0] == L'/')
+    if (!Reverse && Regexp)
     {
       RegExp re;
+      string strSlash(Str);
+      InsertRegexpQuote(strSlash);
 
-      if (re.Compile(Str, OP_PERLSTYLE|OP_OPTIMIZE))
+      if (re.Compile(strSlash, OP_PERLSTYLE|OP_OPTIMIZE))
       {
         int n = re.GetBracketsCount();
         SMatch *m = (SMatch *)xf_malloc(n*sizeof(SMatch));
Index: edit.hpp
===================================================================
--- edit.hpp	(revision 3397)
+++ edit.hpp	(working copy)
@@ -237,7 +237,7 @@
     void  InsertString(const wchar_t *Str);
     void  InsertBinaryString(const wchar_t *Str,int Length);
 
-    int   Search(const string& Str,int Position,int Case,int WholeWords,int Reverse, int *SearchLength);
+    int   Search(const string& Str,int Position,int Case,int WholeWords,int Reverse,int Regexp, int *SearchLength);
 
     void  SetClearFlag(int Flag) {Flags.Change(FEDITLINE_CLEARFLAG,Flag);}
 		int   GetClearFlag() {return Flags.Check(FEDITLINE_CLEARFLAG);}
Index: editor.cpp
===================================================================
--- editor.cpp	(revision 3397)
+++ editor.cpp	(working copy)
@@ -91,6 +91,7 @@
   LastSearchWholeWords=GlobalSearchWholeWords;
   LastSearchReverse=GlobalSearchReverse;
   LastSearchSelFound=GlobalSearchSelFound;
+  LastSearchRegexp=GlobalSearchRegexp;
   SuccessfulSearch=0;
 
   Pasting=0;
@@ -170,6 +171,7 @@
   GlobalSearchWholeWords=LastSearchWholeWords;
   GlobalSearchReverse=LastSearchReverse;
   GlobalSearchSelFound=LastSearchSelFound;
+  GlobalSearchRegexp=LastSearchRegexp;
 }
 
 /*
@@ -3770,7 +3772,7 @@
   static int LastSuccessfulReplaceMode=0;
   string strMsgStr;
   const wchar_t *TextHistoryName=L"SearchText",*ReplaceHistoryName=L"ReplaceText";
-  int CurPos,Case,WholeWords,ReverseSearch,SelectFound,Match,NewNumLine,UserBreak;
+  int CurPos,Case,WholeWords,ReverseSearch,SelectFound,Regexp,Match,NewNumLine,UserBreak;
   int iPosCorrection = 0;
 
   if (Next && strLastSearchStr.IsEmpty() )
@@ -3783,12 +3785,13 @@
   WholeWords=LastSearchWholeWords;
   ReverseSearch=LastSearchReverse;
   SelectFound=LastSearchSelFound;
+  Regexp=LastSearchRegexp;
 
   if (!Next)
     if(!GetSearchReplaceString(ReplaceMode,&strSearchStr,
                    &strReplaceStr,
                    TextHistoryName,ReplaceHistoryName,
-                   &Case,&WholeWords,&ReverseSearch,&SelectFound,L"EditorSearch"))
+                   &Case,&WholeWords,&ReverseSearch,&SelectFound,&Regexp,L"EditorSearch"))
       return FALSE;
 
   // Cheack if need to modify current pos
@@ -3802,6 +3805,7 @@
   LastSearchWholeWords=WholeWords;
   LastSearchReverse=ReverseSearch;
   LastSearchSelFound=SelectFound;
+  LastSearchRegexp=Regexp;
 
   if ( strSearchStr.IsEmpty() )
     return TRUE;
@@ -3885,7 +3889,7 @@
       }
 
       int SearchLength=0;
-      if (CurPtr->Search(strSearchStr,CurPos,Case,WholeWords,ReverseSearch,&SearchLength))
+      if (CurPtr->Search(strSearchStr,CurPos,Case,WholeWords,ReverseSearch,Regexp,&SearchLength))
       {
         if( SelectFound )
         {
Index: editor.hpp
===================================================================
--- editor.hpp	(revision 3397)
+++ editor.hpp	(working copy)
@@ -206,7 +206,7 @@
     /* $ 30.07.2000 KM
        ���� ��������� �� ������ "Whole words"
     */
-    int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchSelFound;
+    int LastSearchCase,LastSearchWholeWords,LastSearchReverse,LastSearchSelFound,LastSearchRegexp;
     int SuccessfulSearch; // successful search indicator
 
     UINT m_codepage; //BUGBUG
Index: farlang.templ.m4
===================================================================
--- farlang.templ.m4	(revision 3397)
+++ farlang.templ.m4	(working copy)
@@ -3395,6 +3395,14 @@
 "&Találat kijelölése"
 "W&ybierz znalezione"
 
+MEditSearchRegexp
+"&Регулярные выражения"
+"&Regular expressions"
+"&Regular expressions"
+"&Regular expressions"
+"&Regular expressions"
+"&Regular expressions"
+
 MEditSearchSearch
 "Искать"
 "Search"
Index: stddlg.cpp
===================================================================
--- stddlg.cpp	(revision 3397)
+++ stddlg.cpp	(working copy)
@@ -53,6 +53,7 @@
          int *WholeWords,
          int *Reverse,
          int *SelectFound,
+         int *Regexp,
          const wchar_t *HelpTopic)
 {
   if(!pSearchStr || (IsReplaceMode && !pReplaceStr))
@@ -60,7 +61,7 @@
   static const wchar_t *TextHistoryName0    = L"SearchText",
                     *ReplaceHistoryName0 = L"ReplaceText";
 
-  int HeightDialog, I;
+  int HeightDialog, DeltaCol1, DeltaCol2, DeltaCol, I;
 
   if(!TextHistoryName)
     TextHistoryName=TextHistoryName0;
@@ -79,7 +80,7 @@
 04   | Replace with                                                       |
 05   |                                                                   |
 06   +--------------------------------------------------------------------+
-07   | [ ] Case sensitive                                                 |
+07   | [ ] Case sensitive                 [ ] Regular expressions         |
 08   | [ ] Whole words                                                    |
 09   | [ ] Reverse search                                                 |
 10   +--------------------------------------------------------------------+
@@ -97,12 +98,22 @@
     /*  6 */DI_CHECKBOX,5,7,0,7,0,0,0,0,(const wchar_t *)MEditSearchCase,
     /*  7 */DI_CHECKBOX,5,8,0,8,0,0,0,0,(const wchar_t *)MEditSearchWholeWords,
     /*  8 */DI_CHECKBOX,5,9,0,9,0,0,0,0,(const wchar_t *)MEditSearchReverse,
-    /*  9 */DI_TEXT,3,10,0,10,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
-    /* 10 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditReplaceReplace,
-    /* 11 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
+    /*  9 */DI_CHECKBOX,40,7,0,7,0,0,DIF_DISABLE,0,(const wchar_t *)MEditSearchRegexp,
+    /* 10 */DI_TEXT,3,10,0,10,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
+    /* 11 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditReplaceReplace,
+    /* 12 */DI_BUTTON,0,11,0,11,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
     };
 
+    //������ ������ ������� �������� ������ ������� � �������.
+    //������������, ��� ������� �� ������ Y+1 ����� ������, �� ������ �����
+    //�������� ��� �� ������� �� ������ Y.
+    static const int COL1_HIGH=8;
+    static const int COL2_HIGH=9;
+
     HeightDialog=14;
+    DeltaCol1=0;
+    DeltaCol2=0;
+
     MakeDialogItemsEx(ReplaceDlgData,ReplaceDlg);
 
     if(!*TextHistoryName)
@@ -129,10 +140,10 @@
       ReplaceDlg[6].Selected=*Case;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       ReplaceDlg[0].Y2--;
       ReplaceDlg[6].Type=DI_TEXT;
-      for(I=7; I < (int)countof(ReplaceDlg); ++I)
+      for(I=7; I <= COL1_HIGH; ++I)
       {
         ReplaceDlg[I].Y1--;
         ReplaceDlg[I].Y2--;
@@ -143,10 +154,10 @@
       ReplaceDlg[7].Selected=*WholeWords;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       ReplaceDlg[0].Y2--;
       ReplaceDlg[7].Type=DI_TEXT;
-      for(I=8; I < (int)countof(ReplaceDlg); ++I)
+      for(I=8; I <= COL1_HIGH; ++I)
       {
         ReplaceDlg[I].Y1--;
         ReplaceDlg[I].Y2--;
@@ -157,32 +168,57 @@
       ReplaceDlg[8].Selected=*Reverse;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       ReplaceDlg[0].Y2--;
       ReplaceDlg[8].Type=DI_TEXT;
-      for(I=9; I < (int)countof(ReplaceDlg); ++I)
+      for(I=9; I <= COL1_HIGH; ++I)
       {
         ReplaceDlg[I].Y1--;
         ReplaceDlg[I].Y2--;
       }
     }
 
+    if(Regexp)
+      ReplaceDlg[9].Selected=*Regexp;
+    else
+    {
+      DeltaCol2++;
+      ReplaceDlg[0].Y2--;
+      ReplaceDlg[9].Type=DI_TEXT;
+      for(I=10; I <= COL2_HIGH; ++I)
+      {
+        ReplaceDlg[I].Y1--;
+        ReplaceDlg[I].Y2--;
+      }
+    }
+
+    //�������� ������
+    DeltaCol=(DeltaCol1<DeltaCol2)?DeltaCol1:DeltaCol2;
+    if (DeltaCol>0) {
+        HeightDialog-=DeltaCol;
+        for(I=10; I < (int)countof(ReplaceDlgData); ++I)
+        {
+          ReplaceDlg[I].Y1-=DeltaCol;
+          ReplaceDlg[I].Y2-=DeltaCol;
+        }
+    }
+
     // ��� �� ���� 2 ����������� �����
     if(HeightDialog == 11)
     {
-      for(I=9; I < (int)countof(ReplaceDlg); ++I)
+      for(I=10; I < (int)countof(ReplaceDlgData); ++I)
       {
         ReplaceDlg[I].Y1--;
         ReplaceDlg[I].Y2--;
       }
     }
     {
-      Dialog Dlg(ReplaceDlg,countof(ReplaceDlg));
+      Dialog Dlg(ReplaceDlg,countof(ReplaceDlgData));
       Dlg.SetPosition(-1,-1,76,HeightDialog);
       if (HelpTopic && *HelpTopic)
         Dlg.SetHelp(HelpTopic);
       Dlg.Process();
-      if (Dlg.GetExitCode()!=10)
+      if (Dlg.GetExitCode()!=11)
         return FALSE;
     }
 
@@ -193,6 +229,7 @@
     if(Case)       *Case=ReplaceDlg[6].Selected;
     if(WholeWords) *WholeWords=ReplaceDlg[7].Selected;
     if(Reverse)    *Reverse=ReplaceDlg[8].Selected;
+    if(Regexp)     *Regexp=ReplaceDlg[9].Selected;
   }
   else
   {
@@ -204,8 +241,8 @@
 02   | Search for                                                         |
 03   |                                                                   |
 04   +--------------------------------------------------------------------+
-05   | [ ] Case sensitive                                                 |
-06   | [ ] Whole words                                                    |
+05   | [ ] Case sensitive                 [ ] Select found                |
+06   | [ ] Whole words                    [ ] Regular expressions         |
 07   | [ ] Reverse search                                                 |
 08   +--------------------------------------------------------------------+
 09   |                       [ Search ]  [ Cancel ]                       |
@@ -220,13 +257,24 @@
     /*  5 */DI_CHECKBOX,5,6,0,6,0,0,0,0,(const wchar_t *)MEditSearchWholeWords,
     /*  6 */DI_CHECKBOX,5,7,0,7,0,0,0,0,(const wchar_t *)MEditSearchReverse,
     /*  7 */DI_CHECKBOX,40,5,0,5,0,0,0,0,(const wchar_t *)MEditSearchSelFound,
-    /*  8 */DI_TEXT,3,8,0,8,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
-    /*  9 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditSearchSearch,
-    /* 10 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel
+    /*  8 */DI_CHECKBOX,40,6,0,6,0,0,0,0,(const wchar_t *)MEditSearchRegexp,
+    /*  9 */DI_TEXT,3,8,0,8,0,0,DIF_BOXCOLOR|DIF_SEPARATOR,0,L"",
+    /* 10 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,1,(const wchar_t *)MEditSearchSearch,
+    /* 11 */DI_BUTTON,0,9,0,9,0,0,DIF_CENTERGROUP,0,(const wchar_t *)MEditSearchCancel,
     };
-    MakeDialogItemsEx(SearchDlgData,SearchDlg);
+
+    //������ ������ ������� �������� ������ ������� � �������.
+    //������������, ��� ������� �� ������ Y+1 ����� ������, �� ������ �����
+    //�������� ��� �� ������� �� ������ Y.
+    static const int COL1_HIGH=6;
+    static const int COL2_HIGH=8;
+
     HeightDialog=12;
+    DeltaCol1=0;
+    DeltaCol2=0;
 
+    MakeDialogItemsEx(SearchDlgData,SearchDlg);
+
     if(!*TextHistoryName)
     {
       SearchDlg[2].History=0;
@@ -241,10 +289,10 @@
       SearchDlg[4].Selected=*Case;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       SearchDlg[0].Y2--;
       SearchDlg[4].Type=DI_TEXT;
-      for(I=5; I < (int)countof(SearchDlgData); ++I)
+      for(I=5; I <= COL1_HIGH; ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
@@ -255,10 +303,10 @@
       SearchDlg[5].Selected=*WholeWords;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       SearchDlg[0].Y2--;
       SearchDlg[5].Type=DI_TEXT;
-      for(I=6; I < (int)countof(SearchDlgData); ++I)
+      for(I=6; I <= COL1_HIGH; ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
@@ -269,10 +317,10 @@
       SearchDlg[6].Selected=*Reverse;
     else
     {
-      HeightDialog--;
+      DeltaCol1++;
       SearchDlg[0].Y2--;
       SearchDlg[6].Type=DI_TEXT;
-      for(I=7; I < (int)countof(SearchDlgData); ++I)
+      for(I=7; I <= COL1_HIGH; ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
@@ -283,20 +331,45 @@
       SearchDlg[7].Selected=*SelectFound;
     else
     {
-      HeightDialog--;
+      DeltaCol2++;
       SearchDlg[0].Y2--;
       SearchDlg[7].Type=DI_TEXT;
-      for(I=8; I < (int)countof(SearchDlgData); ++I)
+      for(I=8; I <= COL2_HIGH; ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
       }
     }
 
+    if(Regexp)
+      SearchDlg[8].Selected=*Regexp;
+    else
+    {
+      DeltaCol2++;
+      SearchDlg[0].Y2--;
+      SearchDlg[8].Type=DI_TEXT;
+      for(I=9; I <= COL2_HIGH; ++I)
+      {
+        SearchDlg[I].Y1--;
+        SearchDlg[I].Y2--;
+      }
+    }
+
+    //�������� ������
+    DeltaCol=(DeltaCol1<DeltaCol2)?DeltaCol1:DeltaCol2;
+    if (DeltaCol>0) {
+        HeightDialog-=DeltaCol;
+        for(I=10; I < (int)countof(SearchDlgData); ++I)
+        {
+          SearchDlg[I].Y1-=DeltaCol;
+          SearchDlg[I].Y2-=DeltaCol;
+        }
+    }
+
     // ��� �� ���� 2 ����������� �����
     if(HeightDialog == 9)
     {
-      for(I=8; I < (int)countof(SearchDlgData); ++I)
+      for(I=9; I < (int)countof(SearchDlgData); ++I)
       {
         SearchDlg[I].Y1--;
         SearchDlg[I].Y2--;
@@ -308,7 +381,7 @@
       if (HelpTopic && *HelpTopic)
         Dlg.SetHelp(HelpTopic);
       Dlg.Process();
-      if (Dlg.GetExitCode()!=9)
+      if (Dlg.GetExitCode()!=10)
         return FALSE;
     }
 
@@ -318,6 +391,7 @@
     if(WholeWords) *WholeWords=SearchDlg[5].Selected;
     if(Reverse)    *Reverse=SearchDlg[6].Selected;
     if(SelectFound) *SelectFound=SearchDlg[7].Selected;
+    if(Regexp)     *Regexp=SearchDlg[8].Selected;
   }
   return TRUE;
 }
Index: stddlg.hpp
===================================================================
--- stddlg.hpp	(revision 3397)
+++ stddlg.hpp	(working copy)
@@ -79,6 +79,10 @@
       �������� �� ���������, ������� �� ������� ���� "Select found"
       ���� = NULL, �� ���������� ������� 0 (�� ����� ���������)
 
+    *Regexp
+      �������� �� ���������, ������� �� ������� ���� "Regular expressions"
+      ���� = NULL, �� ���������� ������� 0 (�� ������)
+
     *HelpTopic
       �� ��� �����.
       ���� NULL ��� ����� ������ - ���� ����� �� ���������.
@@ -97,6 +101,7 @@
          int *WholeWords,
          int *Reverse,
          int *SelectFound,
+         int *Regexp,
          const wchar_t *HelpTopic=NULL);
 
 int __stdcall GetString(
Index: strmix.cpp
===================================================================
--- strmix.cpp	(revision 3397)
+++ strmix.cpp	(working copy)
@@ -96,44 +96,35 @@
 */
 }
 
-wchar_t * WINAPI InsertQuote(wchar_t *Str)
+static wchar_t * WINAPI InsertCustomQuote(wchar_t *Str,wchar_t QuoteChar)
 {
   size_t l = StrLength(Str);
-  if (*Str != L'"')
+  if (*Str != QuoteChar)
   {
     wmemmove(Str+1,Str,++l);
-    *Str=L'"';
+    *Str=QuoteChar;
   }
-  if ((l-1) == 0 || Str[l-1] != L'"')
+  if ((l-1) == 0 || Str[l-1] != QuoteChar)
   {
-    Str[l++] = L'\"';
+    Str[l++] = QuoteChar;
     Str[l] = 0;
   }
   return Str;
 }
 
-wchar_t* WINAPI QuoteSpace(wchar_t *Str)
+static string& InsertCustomQuote(string &strStr,wchar_t QuoteChar)
 {
-  if ( wcspbrk(Str, Opt.strQuotedSymbols) != NULL )
-    InsertQuote(Str);
-
-  return Str;
-}
-
-
-string& InsertQuote(string &strStr)
-{
   size_t l = strStr.GetLength();
   wchar_t *Str = strStr.GetBuffer (strStr.GetLength()+3);
 
-  if (*Str != L'"')
+  if (*Str != QuoteChar)
   {
     wmemmove(Str+1,Str,++l);
-    *Str=L'"';
+    *Str=QuoteChar;
   }
-  if((l-1) == 0 || Str[l-1] != L'"')
+  if((l-1) == 0 || Str[l-1] != QuoteChar)
   {
-    Str[l++] = L'\"';
+    Str[l++] = QuoteChar;
   }
 
   strStr.ReleaseBuffer (l);
@@ -141,6 +132,41 @@
   return strStr;
 }
 
+wchar_t * WINAPI InsertQuote(wchar_t *Str)
+{
+  return InsertCustomQuote(Str,L'\"');
+}
+
+wchar_t * WINAPI InsertRegexpQuote(wchar_t *Str)
+{
+  if (Str!=NULL && *Str != L'/')
+    return InsertCustomQuote(Str,L'/');
+  else          //�������� ���� /regexp/i �� �������� ����
+    return Str;
+}
+
+wchar_t* WINAPI QuoteSpace(wchar_t *Str)
+{
+  if ( wcspbrk(Str, Opt.strQuotedSymbols) != NULL )
+    InsertQuote(Str);
+
+  return Str;
+}
+
+
+string& InsertQuote(string &strStr)
+{
+  return InsertCustomQuote(strStr,L'\"');
+}
+
+string& InsertRegexpQuote(string &strStr)
+{
+  if (strStr.GetLength()!=0 && strStr[0] != L'/')
+    return InsertCustomQuote(strStr,L'/');
+  else          //�������� ���� /regexp/i �� �������� ����
+    return strStr;
+}
+
 string &QuoteSpace(string &strStr)
 {
 	if (wcspbrk(strStr, Opt.strQuotedSymbols) != NULL)
Index: strmix.hpp
===================================================================
--- strmix.hpp	(revision 3397)
+++ strmix.hpp	(working copy)
@@ -58,6 +58,8 @@
 string& InsertQuote(string& strStr);
 void WINAPI Unquote(string &strStr);
 void WINAPI Unquote(wchar_t *Str);
+wchar_t * WINAPI InsertRegexpQuote(wchar_t *Str);
+string& InsertRegexpQuote(string& strStr);
 void UnquoteExternal(string &strStr);
 wchar_t* WINAPI RemoveLeadingSpaces(wchar_t *Str);
 string& WINAPI RemoveLeadingSpaces(string &strStr);
RegexpChkBox2.patch (18,493 bytes)   

igor_yudincev

2009-08-28 12:47

reporter   bugnote:0003971

Done.
Функция InsertRegexpQuote() не дополняет слэшем строку, если она начинается на «/», чтобы не ломать регэкспы вида /xxx/i.

igor_yudincev

2009-08-28 14:50

reporter   bugnote:0003976

Небольшая поправка к функции string& InsertRegexpQuote(string &):

- if (strStr.GetLength()!=0 && strStr[0] != L'/')
+ if (strStr.GetLength()==0 || strStr[0] != L'/')

(пустую строку превращаем в «//»)

vskirdin

2009-08-28 15:14

administrator   bugnote:0003977

принято

igor_yudincev

2009-08-28 15:31

reporter  

RegexpChkBox_lng.patch (6,868 bytes)   
Index: FarEng.hlf.m4
===================================================================
--- FarEng.hlf.m4	(revision 3399)
+++ FarEng.hlf.m4	(working copy)
@@ -2177,9 +2177,9 @@
 display the current time in HH:MM format before the current
 drive and path
 
-   3. ^<wrap>Код "$+" отображает нужное число знаков плюс (+) в зависимости
-от текущей глубины стека каталогов ~PUSHD~@OSCommands@, по одному знаку на
-каждый сохраненный путь.
+   3. ^<wrap>Code "$+" displays the number of pluses (+) needed according to
+current ~PUSHD~@OSCommands@ directory stack depth, one character per each
+saved path.
 
 @Viewer
 $ #Viewer: control keys#
@@ -2446,42 +2446,42 @@
 
 @EditorSearch
 $ #Editor: search/replace#
-    Для поиска и замены в ~редакторе~@Editor@ вам доступны следующие режимы и опции:
+    The following options are available for search and replace in ~editor~@Editor@:
 
-      #Учитывать регистр#   - ^<wrap>при поиске будет учитываться регистр введенных символов
+      #Case sensitive#      - ^<wrap>the case of the characters entered will be taken into account while searching (so, for example,
+                              #Text# will not be found when searching for #text#).
 
-      #Только целые слова#  - ^<wrap>при поиске будет произведен поиск только целого слова
+      #Whole words#         - the given text will be found only if it occurs in the text as a whole word.
 
-      #Обратный поиск#      - ^<wrap>изменить поиск на обратный - искать от конца файла к началу
+      #Reverse search#      - ^<wrap>change the direction of search (from the end of file towards the beginning)
 
-    В режиме поиска так же доступна опция:
+      #Regular expressions# - ^<wrap>treat input as Perl regular expression
 
-      #Выделять найденное#  - ^<wrap>найденные последовательности будут выделены
+    The following option is available in search dialog only:
 
+      #Select found#        - ^<wrap>found text is selected
 
+
 @FileOpenCreate
-$ #Редактор: Открыть/создать файл#
-    С помощью комбинации #Shift-F4# можно открыть существующий или
-создать новый файл.
+$ #Editor: Open/Create file#
+    With #Shift-F4#, one can open the existing file or create a new file.
 
-    В зависимости от ~настроек редактора~@EditorSettings@ для нового файла
-выбирается кодовая страница OEM или ANSI. При необходимости из #списка#
-можно выбрать другую кодовую страницу.
+    According to ~editor settings~@EditorSettings@, newly created file
+is assigned to OEM or ANSI codepage. You can change the codepage with #Shift-F8#.
 
-    Для существующего файла изменять опцию #Кодовая страница:# имеет
-смысл тогда, когда при открытии она определилась неправильно.
+    For existing file, changing the codepage has sense if it hasn't been 
+correctly detected at open.
 
 
 @FileSaveAs
 $ #Editor: save file as...#
-    Редактируемый файл можно сохранить под другим именем - нажать #Shift-F2# и
-указать другое имя, кодовую страницу и формат представления символа перевода
-строки.
+    To save edited file with another name press #Shift-F2# and specify
+new name, codepage and carriage return symbols format.
 
-    Если для сохраняемого файла выбрана одна из кодовых страниц: UTF-8,
-UNICODE или REVERSEBOM, то при включенной опции #Добавить сигнатуру (BOM)#
-в начало файла добавляется специальный маркер, позволяющий другим приложениям
-однозначно идентифицировать этот файл.
+    If file has been edited in one of the following codepages: UTF-8,
+UNICODE or REVERSEBOM, then if the option #Add signature (BOM)# is on,
+the appropriate marker is inserted into the beginning of the file, which
+helps applications to identify the codepage of this file.
 
     You can also specify the format of the line break characters:
 
Index: FarRus.hlf.m4
===================================================================
--- FarRus.hlf.m4	(revision 3399)
+++ FarRus.hlf.m4	(working copy)
@@ -2507,15 +2507,17 @@
 $ #Редактор: поиск и замена#
     Для поиска и замены в ~редакторе~@Editor@ вам доступны следующие режимы и опции:
 
-      #Учитывать регистр#   - ^<wrap>при поиске будет учитываться регистр введенных символов
+      #Учитывать регистр#    - ^<wrap>при поиске будет учитываться регистр введенных символов.
 
-      #Только целые слова#  - ^<wrap>при поиске будет произведен поиск только целого слова
+      #Только целые слова#   - ^<wrap>при поиске будет произведен поиск только целого слова.
 
-      #Обратный поиск#      - ^<wrap>изменить поиск на обратный - искать от конца файла к началу
+      #Обратный поиск#       - ^<wrap>изменить поиск на обратный - искать от конца файла к началу.
 
+      #Регулярные выражения# - ^<wrap>рассматривать строку поиска, как регулярное выражение Perl.
+
     В режиме поиска так же доступна опция:
     
-      #Выделять найденное#  - ^<wrap>найденные последовательности будут выделены
+      #Выделять найденное#  - ^<wrap>найденные последовательности будут выделены.
 
 @FileOpenCreate
 $ #Редактор: Открыть/создать файл#
RegexpChkBox_lng.patch (6,868 bytes)   

igor_yudincev

2009-08-28 15:32

reporter   bugnote:0003978

вдогонку — правка файлов помощи и немного перевода.

vskirdin

2009-08-28 16:08

administrator   bugnote:0003980

опоздал :-)
...но гляну

vskirdin

2009-08-28 16:15

administrator   bugnote:0003982

see build 1094
(с моими правками :-)

Issue History

Date Modified Username Field Change
2009-05-21 10:55 topmo3 New Issue
2009-08-27 22:50 igor_yudincev File Added: RegexpChkBox.patch
2009-08-27 22:51 igor_yudincev Note Added: 0003965
2009-08-28 04:55 vskirdin Note Added: 0003966
2009-08-28 10:49 igor_yudincev Note Added: 0003967
2009-08-28 11:24 igor_yudincev Note Added: 0003969
2009-08-28 11:42 igor_yudincev Note Edited: 0003969
2009-08-28 12:02 vskirdin Note Added: 0003970
2009-08-28 12:44 igor_yudincev File Added: RegexpChkBox2.patch
2009-08-28 12:47 igor_yudincev Note Added: 0003971
2009-08-28 14:29 vskirdin Status new => assigned
2009-08-28 14:29 vskirdin Assigned To => vskirdin
2009-08-28 14:50 igor_yudincev Note Added: 0003976
2009-08-28 15:14 vskirdin Note Added: 0003977
2009-08-28 15:31 igor_yudincev File Added: RegexpChkBox_lng.patch
2009-08-28 15:32 igor_yudincev Note Added: 0003978
2009-08-28 16:08 vskirdin Note Added: 0003980
2009-08-28 16:15 vskirdin Note Added: 0003982
2009-08-28 16:15 vskirdin Status assigned => feedback
2009-11-03 19:07 alexy Build => 1094
2009-11-03 19:07 alexy Status feedback => closed
2009-11-03 19:07 alexy Fixed in Version => 2.0
2009-11-03 19:07 alexy Resolution open => fixed
2013-02-03 00:34 alexy Severity minor => feature