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 |