View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000872 | Wishes | RegExp | public | 2009-05-21 09:55 | 2013-02-03 00:34 |
| Reporter | topmo3 | Assigned To | vskirdin | ||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | closed | Resolution | fixed | ||
| Product Version | 2.0 | ||||
| Fixed in Version | 2.0 | ||||
| Summary | 0000872: RegExp support in Editor and Viewer | ||||
| Description | Хорошо бы иметь возможность поиска во Viewer и поиска/замены в Editor без использования плагинов (например добавочный чекбокс [x]RegExp в диалоге поиска/замены) | ||||
| Tags | No tags attached. | ||||
| Build | 1094 | ||||
|
|
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(
|
|
|
чекбокс в редакторе, см. патч |
|
|
гы-гы... 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... |
|
|
Манипуляции с HeightDialog точно неверны, т.к. колонок с чекбоксами в диалоге уже две — нужно что-то вроде HeightCol1, HeightCol2 - так что, если определить макрос WORK_HELP_FIND, в хелпе появится кривой диалог поиска. Пока макрос не включен, при вызовах GetSearchReplaceString параметры Position..Regexp нигде не принимают значений NULL, поэтому оставил исправление ситуации на потом. |
|
|
Но, раз зашла об этом речь, сейчас я этот баг исправлю. |
|
|
заодно сделай так, чтобы 1. во второй колонке сверху вниз, сначала шел RegExp, а потом Select 2. в диалоге замены тоже добавь RegExp, но пока сделай ему DIF_DISABLE (yа будущее :-)) + в edit.cpp если уж попали в регулярку, то нужно проверить наличие '/' в начале и в конце (функцию, что-то типа InsertSlash, по аналогии с InsertQuote - если их нет, то добавить) |
|
|
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);
|
|
|
Done. Функция InsertRegexpQuote() не дополняет слэшем строку, если она начинается на «/», чтобы не ломать регэкспы вида /xxx/i. |
|
|
Небольшая поправка к функции string& InsertRegexpQuote(string &): - if (strStr.GetLength()!=0 && strStr[0] != L'/') + if (strStr.GetLength()==0 || strStr[0] != L'/') (пустую строку превращаем в «//») |
|
|
принято |
|
|
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
$ #Редактор: Открыть/создать файл#
|
|
|
вдогонку — правка файлов помощи и немного перевода. |
|
|
опоздал :-) ...но гляну |
|
|
see build 1094 (с моими правками :-) |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2009-05-21 09:55 | topmo3 | New Issue | |
| 2009-08-27 21:50 | igor_yudincev | File Added: RegexpChkBox.patch | |
| 2009-08-27 21:51 | igor_yudincev | Note Added: 0003965 | |
| 2009-08-28 03:55 | vskirdin | Note Added: 0003966 | |
| 2009-08-28 09:49 | igor_yudincev | Note Added: 0003967 | |
| 2009-08-28 10:24 | igor_yudincev | Note Added: 0003969 | |
| 2009-08-28 10:42 | igor_yudincev | Note Edited: 0003969 | |
| 2009-08-28 11:02 | vskirdin | Note Added: 0003970 | |
| 2009-08-28 11:44 | igor_yudincev | File Added: RegexpChkBox2.patch | |
| 2009-08-28 11:47 | igor_yudincev | Note Added: 0003971 | |
| 2009-08-28 13:29 | vskirdin | Status | new => assigned |
| 2009-08-28 13:29 | vskirdin | Assigned To | => vskirdin |
| 2009-08-28 13:50 | igor_yudincev | Note Added: 0003976 | |
| 2009-08-28 14:14 | vskirdin | Note Added: 0003977 | |
| 2009-08-28 14:31 | igor_yudincev | File Added: RegexpChkBox_lng.patch | |
| 2009-08-28 14:32 | igor_yudincev | Note Added: 0003978 | |
| 2009-08-28 15:08 | vskirdin | Note Added: 0003980 | |
| 2009-08-28 15:15 | vskirdin | Note Added: 0003982 | |
| 2009-08-28 15: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 |