-
Notifications
You must be signed in to change notification settings - Fork 163
/
CViewCommander_Search.cpp
1586 lines (1430 loc) · 56.7 KB
/
CViewCommander_Search.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*! @file
@brief CViewCommanderクラスのコマンド(検索系 基本形)関数群
2012/12/17 CViewCommander.cpp,CViewCommander_New.cppから分離
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, jepro, genta
Copyright (C) 2001, hor, YAZAKI
Copyright (C) 2002, hor, YAZAKI, novice, Azumaiya, Moca
Copyright (C) 2003, かろと
Copyright (C) 2004, Moca
Copyright (C) 2005, かろと, Moca, D.S.Koba
Copyright (C) 2006, genta, ryoji, かろと, yukihane
Copyright (C) 2007, ryoji, genta
Copyright (C) 2009, ryoji, genta
Copyright (C) 2010, ryoji
Copyright (C) 2011, Moca
This source code is designed for sakura editor.
Please contact the copyright holders to use this code for other purpose.
*/
#include "StdAfx.h"
#include "CViewCommander.h"
#include "CViewCommander_inline.h"
#include "dlg/CDlgCancel.h"// 2002/2/8 hor
#include "CSearchAgent.h"
#include "util/window.h"
#include "util/string_ex2.h"
#include <limits.h>
#include "sakura_rc.h"
/*!
検索(ボックス)コマンド実行.
ツールバーの検索ボックスにフォーカスを移動する.
@date 2006.06.04 yukihane 新規作成
*/
void CViewCommander::Command_SEARCH_BOX( void )
{
GetEditWindow()->m_cToolbar.SetFocusSearchBox();
}
/* 検索(単語検索ダイアログ) */
void CViewCommander::Command_SEARCH_DIALOG( void )
{
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
CNativeW cmemCurText;
m_pCommanderView->GetCurrentTextForSearchDlg( cmemCurText ); // 2006.08.23 ryoji ダイアログ専用関数に変更
/* 検索文字列を初期化 */
if( 0 < cmemCurText.GetStringLength() ){
GetEditWindow()->m_cDlgFind.m_strText = cmemCurText.GetStringPtr();
}
/* 検索ダイアログの表示 */
if( NULL == GetEditWindow()->m_cDlgFind.GetHwnd() ){
GetEditWindow()->m_cDlgFind.DoModeless( G_AppInstance(), m_pCommanderView->GetHwnd(), (LPARAM)&GetEditWindow()->GetActiveView() );
}
else{
/* アクティブにする */
ActivateFrameWindow( GetEditWindow()->m_cDlgFind.GetHwnd() );
::DlgItem_SetText( GetEditWindow()->m_cDlgFind.GetHwnd(), IDC_COMBO_TEXT, cmemCurText.GetStringT() );
}
return;
}
/*! 次を検索
@param bChangeCurRegexp 共有データの検索文字列を使う
@date 2003.05.22 かろと 無限マッチ対策.行頭・行末処理見直し.
@date 2004.05.30 Moca bChangeCurRegexp=trueで従来通り。falseで、CEditViewの現在設定されている検索パターンを使う
*/
void CViewCommander::Command_SEARCH_NEXT(
bool bChangeCurRegexp,
bool bRedraw,
bool bReplaceAll,
HWND hwndParent,
const WCHAR* pszNotFoundMessage,
CLogicRange* pcSelectLogic //!< [out] 選択範囲のロジック版。マッチ範囲を返す。すべて置換/高速モードで使用
)
{
bool bSelecting;
bool bFlag1 = false;
bool bSelectingLock_Old = false;
bool bFound = false;
bool bDisableSelect = false;
bool b0Match = false; //!< 長さ0でマッチしているか?フラグ by かろと
CLogicInt nIdx(0);
CLayoutInt nLineNum(0);
CLayoutRange sRangeA;
sRangeA.Set(GetCaret().GetCaretLayoutPos());
CLayoutRange sSelectBgn_Old;
CLayoutRange sSelect_Old;
CLayoutInt nLineNumOld(0);
// bFastMode
CLogicInt nLineNumLogic(0);
bool bRedo = false; // hor
int nIdxOld = 0; // hor
int nSearchResult;
if( pcSelectLogic ){
pcSelectLogic->Clear(-1);
}
bSelecting = false;
// 2002.01.16 hor
// 共通部分のくくりだし
// 2004.05.30 Moca CEditViewの現在設定されている検索パターンを使えるように
if(bChangeCurRegexp && !m_pCommanderView->ChangeCurRegexp())return;
if( 0 == m_pCommanderView->m_strCurSearchKey.size() ){
goto end_of_func;
}
// 検索開始位置を調整
bFlag1 = false;
if( NULL == pcSelectLogic && m_pCommanderView->GetSelectionInfo().IsTextSelected() ){ /* テキストが選択されているか */
/* 矩形範囲選択中でない & 選択状態のロック */
if( !m_pCommanderView->GetSelectionInfo().IsBoxSelecting() && m_pCommanderView->GetSelectionInfo().m_bSelectingLock ){
bSelecting = true;
bSelectingLock_Old = m_pCommanderView->GetSelectionInfo().m_bSelectingLock;
sSelectBgn_Old = m_pCommanderView->GetSelectionInfo().m_sSelectBgn; //範囲選択(原点)
sSelect_Old = GetSelect();
if( PointCompare(m_pCommanderView->GetSelectionInfo().m_sSelectBgn.GetFrom(),GetCaret().GetCaretLayoutPos()) >= 0 ){
// カーソル移動
GetCaret().SetCaretLayoutPos(GetSelect().GetFrom());
if (GetSelect().IsOne()) {
// 現在、長さ0でマッチしている場合は1文字進める(無限マッチ対策) by かろと
b0Match = true;
}
bFlag1 = true;
}
else{
// カーソル移動
GetCaret().SetCaretLayoutPos(GetSelect().GetTo());
if (GetSelect().IsOne()) {
// 現在、長さ0でマッチしている場合は1文字進める(無限マッチ対策) by かろと
b0Match = true;
}
}
}
else{
/* カーソル移動 */
GetCaret().SetCaretLayoutPos(GetSelect().GetTo());
if (GetSelect().IsOne()) {
// 現在、長さ0でマッチしている場合は1文字進める(無限マッチ対策) by かろと
b0Match = true;
}
/* 現在の選択範囲を非選択状態に戻す */
m_pCommanderView->GetSelectionInfo().DisableSelectArea( bRedraw, false );
bDisableSelect = true;
}
}
if( NULL == pcSelectLogic ){
nLineNum = GetCaret().GetCaretLayoutPos().GetY2();
CLogicInt nLineLen = CLogicInt(0); // 2004.03.17 Moca NULL == pLineのとき、nLineLenが未設定になり落ちるバグ対策
const CLayout* pcLayout;
const wchar_t* pLine = GetDocument()->m_cLayoutMgr.GetLineStr(nLineNum, &nLineLen, &pcLayout);
/* 指定された桁に対応する行のデータ内の位置を調べる */
// 2002.02.08 hor EOFのみの行からも次検索しても再検索可能に (2/2)
nIdx = pcLayout ? m_pCommanderView->LineColumnToIndex( pcLayout, GetCaret().GetCaretLayoutPos().GetX2() ) : CLogicInt(0);
if( b0Match ) {
// 現在、長さ0でマッチしている場合は物理行で1文字進める(無限マッチ対策)
if( nIdx < nLineLen ) {
// 2005-09-02 D.S.Koba GetSizeOfChar
nIdx += CLogicInt(CNativeW::GetSizeOfChar(pLine, nLineLen, nIdx) == 2 ? 2 : 1);
} else {
// 念のため行末は別処理
++nIdx;
}
}
}else{
nLineNumLogic = GetCaret().GetCaretLogicPos().GetY2();
nIdx = GetCaret().GetCaretLogicPos().GetX2();
}
nLineNumOld = nLineNum; // hor
bRedo = true; // hor
nIdxOld = nIdx; // hor
re_do:;
/* 現在位置より後ろの位置を検索する */
// 2004.05.30 Moca 引数をGetShareData()からメンバ変数に変更。他のプロセス/スレッドに書き換えられてしまわないように。
if( NULL == pcSelectLogic ){
nSearchResult = GetDocument()->m_cLayoutMgr.SearchWord(
nLineNum, // 検索開始レイアウト行
nIdx, // 検索開始データ位置
SEARCH_FORWARD, // 前方検索
&sRangeA, // マッチレイアウト範囲
m_pCommanderView->m_sSearchPattern
);
}else{
nSearchResult = CSearchAgent(&GetDocument()->m_cDocLineMgr).SearchWord(
CLogicPoint(nIdx, nLineNumLogic),
SEARCH_FORWARD, // 前方検索
pcSelectLogic,
m_pCommanderView->m_sSearchPattern
);
}
if( nSearchResult ){
// 指定された行のデータ内の位置に対応する桁の位置を調べる
if( bFlag1 && sRangeA.GetFrom()==GetCaret().GetCaretLayoutPos() ){
CLogicRange sRange_Logic;
GetDocument()->m_cLayoutMgr.LayoutToLogic(sRangeA,&sRange_Logic);
nLineNum = sRangeA.GetTo().GetY2();
nIdx = sRange_Logic.GetTo().GetX2();
if( sRange_Logic.GetFrom() == sRange_Logic.GetTo() ) { // 幅0マッチでの無限ループ対策。
nIdx += 1; // wchar_t一個分進めるだけでは足りないかもしれないが。
}
goto re_do;
}
if( bSelecting ){
/* 現在のカーソル位置によって選択範囲を変更 */
m_pCommanderView->GetSelectionInfo().ChangeSelectAreaByCurrentCursor( sRangeA.GetTo() );
m_pCommanderView->GetSelectionInfo().m_bSelectingLock = bSelectingLock_Old; /* 選択状態のロック */
}else if( NULL == pcSelectLogic ){
/* 選択範囲の変更 */
// 2005.06.24 Moca
m_pCommanderView->GetSelectionInfo().SetSelectArea( sRangeA );
if( bRedraw ){
/* 選択領域描画 */
m_pCommanderView->GetSelectionInfo().DrawSelectArea();
}
}
/* カーソル移動 */
// Sep. 8, 2000 genta
if ( !bReplaceAll ) m_pCommanderView->AddCurrentLineToHistory(); // 2002.02.16 hor すべて置換のときは不要
if( NULL == pcSelectLogic ){
GetCaret().MoveCursor( sRangeA.GetFrom(), bRedraw );
GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2();
}else{
GetCaret().MoveCursorFastMode( pcSelectLogic->GetFrom() );
}
bFound = TRUE;
}
else{
if( bSelecting ){
m_pCommanderView->GetSelectionInfo().m_bSelectingLock = bSelectingLock_Old; /* 選択状態のロック */
/* 選択範囲の変更 */
m_pCommanderView->GetSelectionInfo().m_sSelectBgn = sSelectBgn_Old; //範囲選択(原点)
m_pCommanderView->GetSelectionInfo().m_sSelectOld = sSelect_Old; // 2011.12.24
GetSelect().SetFrom(sSelect_Old.GetFrom());
GetSelect().SetTo(sRangeA.GetFrom());
/* カーソル移動 */
GetCaret().MoveCursor( sRangeA.GetFrom(), bRedraw );
GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2();
if( bRedraw ){
/* 選択領域描画 */
m_pCommanderView->GetSelectionInfo().DrawSelectArea();
}
}else{
if( bDisableSelect ){
// 2011.12.21 ロジックカーソル位置の修正/カーソル線・対括弧の表示
CLogicPoint ptLogic;
GetDocument()->m_cLayoutMgr.LayoutToLogic(GetCaret().GetCaretLayoutPos(), &ptLogic);
GetCaret().SetCaretLogicPos(ptLogic);
m_pCommanderView->DrawBracketCursorLine(bRedraw);
}
}
}
end_of_func:;
// From Here 2002.01.26 hor 先頭(末尾)から再検索
if(GetDllShareData().m_Common.m_sSearch.m_bSearchAll){
if(!bFound && // 見つからなかった
bRedo && // 最初の検索
!bReplaceAll // 全て置換の実行中じゃない
){
nLineNum = CLayoutInt(0);
nIdx = CLogicInt(0);
bRedo = false;
goto re_do; // 先頭から再検索
}
}
if(bFound){
if(NULL == pcSelectLogic && ((nLineNumOld > nLineNum)||(nLineNumOld == nLineNum && nIdxOld > nIdx)))
m_pCommanderView->SendStatusMessage(LS(STR_ERR_SRNEXT1));
}
else{
GetCaret().ShowEditCaret(); // 2002/04/18 YAZAKI
GetCaret().ShowCaretPosInfo(); // 2002/04/18 YAZAKI
if( !bReplaceAll ){
m_pCommanderView->SendStatusMessage(LS(STR_ERR_SRNEXT2));
}
// To Here 2002.01.26 hor
/* 検索/置換 見つからないときメッセージを表示 */
if( NULL == pszNotFoundMessage ){
CNativeW KeyName;
LimitStringLengthW(m_pCommanderView->m_strCurSearchKey.c_str(), m_pCommanderView->m_strCurSearchKey.size(),
_MAX_PATH, KeyName);
if( (size_t)KeyName.GetStringLength() < m_pCommanderView->m_strCurSearchKey.size() ){
KeyName.AppendString( L"..." );
}
AlertNotFound(
hwndParent,
bReplaceAll,
LS(STR_ERR_SRNEXT3),
KeyName.GetStringPtr()
);
}
else{
AlertNotFound(hwndParent, bReplaceAll, _T("%ls"), pszNotFoundMessage);
}
}
}
/* 前を検索 */
void CViewCommander::Command_SEARCH_PREV( bool bReDraw, HWND hwndParent )
{
bool bSelecting;
bool bSelectingLock_Old = false;
bool bFound = false;
bool bRedo = false; // hor
bool bDisableSelect = false;
CLayoutInt nLineNumOld(0);
CLogicInt nIdxOld(0);
const CLayout* pcLayout = NULL;
CLayoutInt nLineNum(0);
CLogicInt nIdx(0);
CLayoutRange sRangeA;
sRangeA.Set(GetCaret().GetCaretLayoutPos());
CLayoutRange sSelectBgn_Old;
CLayoutRange sSelect_Old;
bSelecting = false;
// 2002.01.16 hor
// 共通部分のくくりだし
if(!m_pCommanderView->ChangeCurRegexp()){
return;
}
if( 0 == m_pCommanderView->m_strCurSearchKey.size() ){
goto end_of_func;
}
if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){ /* テキストが選択されているか */
sSelectBgn_Old = m_pCommanderView->GetSelectionInfo().m_sSelectBgn; //範囲選択(原点)
sSelect_Old = GetSelect();
bSelectingLock_Old = m_pCommanderView->GetSelectionInfo().m_bSelectingLock;
/* 矩形範囲選択中か */
if( !m_pCommanderView->GetSelectionInfo().IsBoxSelecting() && m_pCommanderView->GetSelectionInfo().m_bSelectingLock ){ /* 選択状態のロック */
bSelecting = true;
}
else{
/* 現在の選択範囲を非選択状態に戻す */
m_pCommanderView->GetSelectionInfo().DisableSelectArea( bReDraw, false );
bDisableSelect = true;
}
}
nLineNum = GetCaret().GetCaretLayoutPos().GetY2();
pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( nLineNum );
if( NULL == pcLayout ){
// pcLayoutはNULLとなるのは、[EOF]から前検索した場合
// 1行前に移動する処理
nLineNum--;
if( nLineNum < 0 ){
goto end_of_func;
}
pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( nLineNum );
if( NULL == pcLayout ){
goto end_of_func;
}
// カーソル左移動はやめて nIdxは行の長さとしないと[EOF]から改行を前検索した時に最後の改行を検索できない 2003.05.04 かろと
const CLayout* pCLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( nLineNum );
nIdx = CLogicInt(pCLayout->GetDocLineRef()->GetLengthWithEOL() + 1); // 行末のヌル文字(\0)にマッチさせるために+1 2003.05.16 かろと
} else {
/* 指定された桁に対応する行のデータ内の位置を調べる */
nIdx = m_pCommanderView->LineColumnToIndex( pcLayout, GetCaret().GetCaretLayoutPos().GetX2() );
}
bRedo = true; // hor
nLineNumOld = nLineNum; // hor
nIdxOld = nIdx; // hor
re_do:; // hor
/* 現在位置より前の位置を検索する */
if( GetDocument()->m_cLayoutMgr.SearchWord(
nLineNum, // 検索開始レイアウト行
nIdx, // 検索開始データ位置
SEARCH_BACKWARD, // 後方検索
&sRangeA, // マッチレイアウト範囲
m_pCommanderView->m_sSearchPattern
) ){
if( bSelecting ){
/* 現在のカーソル位置によって選択範囲を変更 */
m_pCommanderView->GetSelectionInfo().ChangeSelectAreaByCurrentCursor( sRangeA.GetFrom() );
m_pCommanderView->GetSelectionInfo().m_bSelectingLock = bSelectingLock_Old; /* 選択状態のロック */
}else{
/* 選択範囲の変更 */
// 2005.06.24 Moca
m_pCommanderView->GetSelectionInfo().SetSelectArea( sRangeA );
if( bReDraw ){
/* 選択領域描画 */
m_pCommanderView->GetSelectionInfo().DrawSelectArea();
}
}
/* カーソル移動 */
// Sep. 8, 2000 genta
m_pCommanderView->AddCurrentLineToHistory();
GetCaret().MoveCursor( sRangeA.GetFrom(), bReDraw );
GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2();
bFound = TRUE;
}else{
if( bSelecting ){
m_pCommanderView->GetSelectionInfo().m_bSelectingLock = bSelectingLock_Old; /* 選択状態のロック */
/* 選択範囲の変更 */
m_pCommanderView->GetSelectionInfo().m_sSelectBgn = sSelectBgn_Old;
GetSelect() = sSelect_Old;
/* カーソル移動 */
GetCaret().MoveCursor( sRangeA.GetFrom(), bReDraw );
GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2();
/* 選択領域描画 */
m_pCommanderView->GetSelectionInfo().DrawSelectArea();
}else{
if( bDisableSelect ){
m_pCommanderView->DrawBracketCursorLine(bReDraw);
}
}
}
end_of_func:;
// From Here 2002.01.26 hor 先頭(末尾)から再検索
if(GetDllShareData().m_Common.m_sSearch.m_bSearchAll){
if(!bFound && // 見つからなかった
bRedo // 最初の検索
){
nLineNum = GetDocument()->m_cLayoutMgr.GetLineCount()-CLayoutInt(1);
nIdx = CLogicInt(MAXLINEKETAS); // ロジック折り返し < レイアウト折り返しという前提
bRedo = false;
goto re_do; // 末尾から再検索
}
}
if(bFound){
if((nLineNumOld < nLineNum)||(nLineNumOld == nLineNum && nIdxOld < nIdx))
m_pCommanderView->SendStatusMessage(LS(STR_ERR_SRPREV1));
}else{
m_pCommanderView->SendStatusMessage(LS(STR_ERR_SRPREV2));
// To Here 2002.01.26 hor
/* 検索/置換 見つからないときメッセージを表示 */
CNativeW KeyName;
LimitStringLengthW(m_pCommanderView->m_strCurSearchKey.c_str(), m_pCommanderView->m_strCurSearchKey.size(),
_MAX_PATH, KeyName);
if( (size_t)KeyName.GetStringLength() < m_pCommanderView->m_strCurSearchKey.size() ){
KeyName.AppendString( L"..." );
}
AlertNotFound(
hwndParent,
false,
LS(STR_ERR_SRPREV3), //Jan. 25, 2001 jepro メッセージを若干変更
KeyName.GetStringPtr()
);
}
return;
}
//置換(置換ダイアログ)
void CViewCommander::Command_REPLACE_DIALOG( void )
{
BOOL bSelected = FALSE;
/* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */
CNativeW cmemCurText;
m_pCommanderView->GetCurrentTextForSearchDlg( cmemCurText ); // 2006.08.23 ryoji ダイアログ専用関数に変更
/* 検索文字列を初期化 */
if( 0 < cmemCurText.GetStringLength() ){
GetEditWindow()->m_cDlgReplace.m_strText = cmemCurText.GetStringPtr();
}
if( 0 < GetDllShareData().m_sSearchKeywords.m_aReplaceKeys.size() ){
if( GetEditWindow()->m_cDlgReplace.m_nReplaceKeySequence < GetDllShareData().m_Common.m_sSearch.m_nReplaceKeySequence ){
GetEditWindow()->m_cDlgReplace.m_strText2 = GetDllShareData().m_sSearchKeywords.m_aReplaceKeys[0]; // 2006.08.23 ryoji 前回の置換後文字列を引き継ぐ
}
}
if ( m_pCommanderView->GetSelectionInfo().IsTextSelected() && !GetSelect().IsLineOne() ) {
bSelected = TRUE; //選択範囲をチェックしてダイアログ表示
}else{
bSelected = FALSE; //ファイル全体をチェックしてダイアログ表示
}
/* 置換オプションの初期化 */
GetEditWindow()->m_cDlgReplace.m_nReplaceTarget=0; /* 置換対象 */
GetEditWindow()->m_cDlgReplace.m_nPaste=FALSE; /* 貼り付ける? */
// To Here 2001.12.03 hor
/* 置換ダイアログの表示 */
// From Here Jul. 2, 2001 genta 置換ウィンドウの2重開きを抑止
if( !::IsWindow( GetEditWindow()->m_cDlgReplace.GetHwnd() ) ){
GetEditWindow()->m_cDlgReplace.DoModeless( G_AppInstance(), m_pCommanderView->GetHwnd(), (LPARAM)m_pCommanderView, bSelected );
}
else {
/* アクティブにする */
ActivateFrameWindow( GetEditWindow()->m_cDlgReplace.GetHwnd() );
::DlgItem_SetText( GetEditWindow()->m_cDlgReplace.GetHwnd(), IDC_COMBO_TEXT, cmemCurText.GetStringT() );
}
// To Here Jul. 2, 2001 genta 置換ウィンドウの2重開きを抑止
return;
}
/*! 置換実行
@date 2002/04/08 親ウィンドウを指定するように変更。
@date 2003.05.17 かろと 長さ0マッチの無限置換回避など
@date 2011.12.18 Moca オプション・検索キーをDllShareDataからm_cDlgReplace/EditViewベースに変更。文字列長制限の撤廃
*/
void CViewCommander::Command_REPLACE( HWND hwndParent )
{
// m_sSearchOption選択のための先に適用
if( !m_pCommanderView->ChangeCurRegexp(false) ){
return;
}
if ( hwndParent == NULL ){ // 親ウィンドウが指定されていなければ、CEditViewが親。
hwndParent = m_pCommanderView->GetHwnd();
}
//2002.02.10 hor
int nPaste = GetEditWindow()->m_cDlgReplace.m_nPaste;
int nReplaceTarget = GetEditWindow()->m_cDlgReplace.m_nReplaceTarget;
if( nPaste && nReplaceTarget == 3 ){
// 置換対象:行削除のときは、クリップボードから貼り付けを無効にする
nPaste = FALSE;
}
// From Here 2001.12.03 hor
if( nPaste && !GetDocument()->m_cDocEditor.IsEnablePaste()){
OkMessage( hwndParent, LS(STR_ERR_CEDITVIEW_CMD10) );
::CheckDlgButton( GetEditWindow()->m_cDlgReplace.GetHwnd(), IDC_CHK_PASTE, FALSE );
::EnableWindow( ::GetDlgItem( GetEditWindow()->m_cDlgReplace.GetHwnd(), IDC_COMBO_TEXT2 ), TRUE );
return; // 失敗return;
}
// 2002.01.09 hor
// 選択エリアがあれば、その先頭にカーソルを移す
if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){
if( m_pCommanderView->GetSelectionInfo().IsBoxSelecting() ){
GetCaret().MoveCursor( GetSelect().GetFrom(), true );
} else {
Command_LEFT( false, false );
}
}
// To Here 2002.01.09 hor
// 矩形選択?
// bBeginBoxSelect = m_pCommanderView->GetSelectionInfo().IsBoxSelecting();
/* カーソル左移動 */
//HandleCommand( F_LEFT, true, 0, 0, 0, 0 ); //???
// To Here 2001.12.03 hor
/* テキスト選択解除 */
/* 現在の選択範囲を非選択状態に戻す */
m_pCommanderView->GetSelectionInfo().DisableSelectArea( true );
// 2004.06.01 Moca 検索中に、他のプロセスによってm_aReplaceKeysが書き換えられても大丈夫なように
const CNativeW cMemRepKey( GetEditWindow()->m_cDlgReplace.m_strText2.c_str() );
/* 次を検索 */
Command_SEARCH_NEXT( true, true, false, hwndParent, NULL );
BOOL bRegularExp = m_pCommanderView->m_sCurSearchOption.bRegularExp;
int nFlag = m_pCommanderView->m_sCurSearchOption.bLoHiCase ? 0x01 : 0x00;
/* テキストが選択されているか */
if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){
// From Here 2001.12.03 hor
CLayoutPoint ptTmp(0,0);
if ( nPaste || !bRegularExp ) {
// 正規表現時は 後方参照($&)で実現するので、正規表現は除外
if(nReplaceTarget==1){ //挿入位置へ移動
ptTmp = GetSelect().GetTo() - GetSelect().GetFrom();
GetSelect().Clear(-1);
}
else if(nReplaceTarget==2){ //追加位置へ移動
// 正規表現を除外したので、「検索後の文字が改行やったら次の行の先頭へ移動」の処理を削除
GetCaret().MoveCursor(GetSelect().GetTo(), false);
GetSelect().Clear(-1);
}
else{
// 位置指定ないので、何もしない
}
}
// 行削除 選択範囲を行全体に拡大。カーソル位置を行頭へ(正規表現でも実行)
if( nReplaceTarget == 3 ){
CLogicPoint lineHome;
GetDocument()->m_cLayoutMgr.LayoutToLogic(GetSelect().GetFrom(), &lineHome);
lineHome.x = CLogicXInt(0); // 行頭
CLayoutRange selectFix;
GetDocument()->m_cLayoutMgr.LogicToLayout(lineHome, selectFix.GetFromPointer());
lineHome.y++; // 次行の行頭
GetDocument()->m_cLayoutMgr.LogicToLayout(lineHome, selectFix.GetToPointer());
GetCaret().GetAdjustCursorPos(selectFix.GetToPointer());
m_pCommanderView->GetSelectionInfo().SetSelectArea(selectFix);
m_pCommanderView->GetSelectionInfo().DrawSelectArea();
GetCaret().MoveCursor(selectFix.GetFrom(), false);
GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2();
}
/* コマンドコードによる処理振り分け */
/* テキストを貼り付け */
if(nPaste){
Command_PASTE(0);
} else if( nReplaceTarget == 3 ){
// 行削除
Command_INSTEXT( false, L"", CLogicInt(0), TRUE );
} else if ( bRegularExp ) { /* 検索/置換 1==正規表現 */
// 先読みに対応するために物理行末までを使うように変更 2005/03/27 かろと
// 2002/01/19 novice 正規表現による文字列置換
CBregexp cRegexp;
if( !InitRegexp( m_pCommanderView->GetHwnd(), cRegexp, true ) ){
return; // 失敗return;
}
// 物理行、物理行長、物理行での検索マッチ位置
const CLayout* pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY(GetSelect().GetFrom().GetY2());
const wchar_t* pLine = pcLayout->GetDocLineRef()->GetPtr();
CLogicInt nIdx = m_pCommanderView->LineColumnToIndex( pcLayout, GetSelect().GetFrom().GetX2() ) + pcLayout->GetLogicOffset();
CLogicInt nLen = pcLayout->GetDocLineRef()->GetLengthWithEOL();
// 正規表現で選択始点・終点への挿入を記述
// Jun. 6, 2005 かろと
// →これでは「検索の後ろの文字が改行だったら次の行頭へ移動」が処理できない
// → Oct. 30, 「検索の後ろの文字が改行だったら・・」の処理をやめる(誰もしらないみたいなので)
// Nov. 9, 2005 かろと 正規表現で選択始点・終点への挿入方法を変更(再)
CNativeW cMemMatchStr; cMemMatchStr.SetString(L"$&");
CNativeW cMemRepKey2;
if (nReplaceTarget == 1) { //選択始点へ挿入
cMemRepKey2 = cMemRepKey;
cMemRepKey2 += cMemMatchStr;
} else if (nReplaceTarget == 2) { // 選択終点へ挿入
cMemRepKey2 = cMemMatchStr;
cMemRepKey2 += cMemRepKey;
} else {
cMemRepKey2 = cMemRepKey;
}
cRegexp.Compile( m_pCommanderView->m_strCurSearchKey.c_str(), cMemRepKey2.GetStringPtr(), nFlag);
if( cRegexp.Replace(pLine, nLen, nIdx) ){
// From Here Jun. 6, 2005 かろと
// 物理行末までINSTEXTする方法は、キャレット位置を調整する必要があり、
// キャレット位置の計算が複雑になる。(置換後に改行がある場合に不具合発生)
// そこで、INSTEXTする文字列長を調整する方法に変更する(実はこっちの方がわかりやすい)
CLayoutMgr& rLayoutMgr = GetDocument()->m_cLayoutMgr;
CLogicInt matchLen = cRegexp.GetMatchLen();
CLogicInt nIdxTo = nIdx + matchLen; // 検索文字列の末尾
if (matchLen == 0) {
// 0文字マッチの時(無限置換にならないように1文字進める)
if (nIdxTo < nLen) {
// 2005-09-02 D.S.Koba GetSizeOfChar
nIdxTo += CLogicInt(CNativeW::GetSizeOfChar(pLine, nLen, nIdxTo) == 2 ? 2 : 1);
}
// 無限置換しないように、1文字増やしたので1文字選択に変更
// 選択始点・終点への挿入の場合も0文字マッチ時は動作は同じになるので
rLayoutMgr.LogicToLayout( CLogicPoint(nIdxTo, pcLayout->GetLogicLineNo()), GetSelect().GetToPointer() ); // 2007.01.19 ryoji 行位置も取得する
}
// 行末から検索文字列末尾までの文字数
CLogicInt colDiff = nLen - nIdxTo;
// Oct. 22, 2005 Karoto
// \rを置換するとその後ろの\nが消えてしまう問題の対応
if (colDiff < pcLayout->GetDocLineRef()->GetEol().GetLen()) {
// 改行にかかっていたら、行全体をINSTEXTする。
colDiff = CLogicInt(0);
rLayoutMgr.LogicToLayout( CLogicPoint(nLen, pcLayout->GetLogicLineNo()), GetSelect().GetToPointer() ); // 2007.01.19 ryoji 追加
}
// 置換後文字列への書き換え(行末から検索文字列末尾までの文字を除く)
Command_INSTEXT( false, cRegexp.GetString(), cRegexp.GetStringLen() - colDiff, TRUE );
// To Here Jun. 6, 2005 かろと
}
}else{
Command_INSTEXT( false, cMemRepKey.GetStringPtr(), cMemRepKey.GetStringLength(), TRUE );
}
// 挿入後の検索開始位置を調整
if(nReplaceTarget==1){
GetCaret().SetCaretLayoutPos(GetCaret().GetCaretLayoutPos()+ptTmp);
}
// To Here 2001.12.03 hor
/* 最後まで置換した時にOK押すまで置換前の状態が表示されるので、
** 置換後、次を検索する前に書き直す 2003.05.17 かろと
*/
m_pCommanderView->Redraw();
/* 次を検索 */
Command_SEARCH_NEXT( true, true, false, hwndParent, LSW(STR_ERR_CEDITVIEW_CMD11) );
}
}
/*! すべて置換実行
@date 2003.05.22 かろと 無限マッチ対策.行頭・行末処理など見直し
@date 2006.03.31 かろと 行置換機能追加
@date 2007.01.16 ryoji 行置換機能を全置換のオプションに変更
@date 2009.09.20 genta 左下~右上で矩形選択された領域の置換が行われない
@date 2010.09.17 ryoji ラインモード貼り付け処理を追加
@date 2011.12.18 Moca オプション・検索キーをDllShareDataからm_cDlgReplace/EditViewベースに変更。文字列長制限の撤廃
@date 2013.05.10 Moca fastMode
*/
void CViewCommander::Command_REPLACE_ALL()
{
// m_sSearchOption選択のための先に適用
if( !m_pCommanderView->ChangeCurRegexp() ){
return;
}
//2002.02.10 hor
BOOL nPaste = GetEditWindow()->m_cDlgReplace.m_nPaste;
BOOL nReplaceTarget = GetEditWindow()->m_cDlgReplace.m_nReplaceTarget;
BOOL bRegularExp = m_pCommanderView->m_sCurSearchOption.bRegularExp;
BOOL bSelectedArea = GetEditWindow()->m_cDlgReplace.m_bSelectedArea;
BOOL bConsecutiveAll = GetEditWindow()->m_cDlgReplace.m_bConsecutiveAll; /* 「すべて置換」は置換の繰返し */ // 2007.01.16 ryoji
if( nPaste && nReplaceTarget == 3 ){
// 置換対象:行削除のときは、クリップボードから貼り付けを無効にする
nPaste = FALSE;
}
GetEditWindow()->m_cDlgReplace.m_bCanceled=false;
GetEditWindow()->m_cDlgReplace.m_nReplaceCnt=0;
// From Here 2001.12.03 hor
if( nPaste && !GetDocument()->m_cDocEditor.IsEnablePaste() ){
OkMessage( m_pCommanderView->GetHwnd(), LS(STR_ERR_CEDITVIEW_CMD10) );
::CheckDlgButton( GetEditWindow()->m_cDlgReplace.GetHwnd(), IDC_CHK_PASTE, FALSE );
::EnableWindow( ::GetDlgItem( GetEditWindow()->m_cDlgReplace.GetHwnd(), IDC_COMBO_TEXT2 ), TRUE );
return; // TRUE;
}
// To Here 2001.12.03 hor
bool bBeginBoxSelect; // 矩形選択?
if(m_pCommanderView->GetSelectionInfo().IsTextSelected()){
bBeginBoxSelect=m_pCommanderView->GetSelectionInfo().IsBoxSelecting();
}
else{
bSelectedArea=FALSE;
bBeginBoxSelect=false;
}
/* 表示処理ON/OFF */
bool bDisplayUpdate = false;
const bool bDrawSwitchOld = m_pCommanderView->SetDrawSwitch(bDisplayUpdate);
bool bFastMode = false;
if( ((Int)GetDocument()->m_cDocLineMgr.GetLineCount() * 10 < (Int)GetDocument()->m_cLayoutMgr.GetLineCount())
&& !(bSelectedArea || nPaste) ){
// 1行あたり10レイアウト行以上で、選択・ペーストでない場合
bFastMode = true;
}
int nAllLineNum; // $$単位混在
if( bFastMode ){
nAllLineNum = (Int)GetDocument()->m_cDocLineMgr.GetLineCount();
}else{
nAllLineNum = (Int)GetDocument()->m_cLayoutMgr.GetLineCount();
}
int nAllLineNumOrg = nAllLineNum;
int nAllLineNumLogicOrg = (Int)GetDocument()->m_cDocLineMgr.GetLineCount();
/* 進捗表示&中止ダイアログの作成 */
CDlgCancel cDlgCancel;
HWND hwndCancel = cDlgCancel.DoModeless( G_AppInstance(), m_pCommanderView->GetHwnd(), IDD_REPLACERUNNING );
::EnableWindow( m_pCommanderView->GetHwnd(), FALSE );
::EnableWindow( ::GetParent( m_pCommanderView->GetHwnd() ), FALSE );
::EnableWindow( ::GetParent( ::GetParent( m_pCommanderView->GetHwnd() ) ), FALSE );
//<< 2002/03/26 Azumaiya
// 割り算掛け算をせずに進歩状況を表せるように、シフト演算をする。
int nShiftCount;
for ( nShiftCount = 0; 300 < nAllLineNum; nShiftCount++ )
{
nAllLineNum/=2;
}
//>> 2002/03/26 Azumaiya
/* プログレスバー初期化 */
HWND hwndProgress = ::GetDlgItem( hwndCancel, IDC_PROGRESS_REPLACE );
Progress_SetRange( hwndProgress, 0, nAllLineNum + 1 );
int nNewPos = 0;
int nOldPos = -1;
Progress_SetPos( hwndProgress, nNewPos);
/* 置換個数初期化 */
int nReplaceNum = 0;
HWND hwndStatic = ::GetDlgItem( hwndCancel, IDC_STATIC_KENSUU );
TCHAR szLabel[64];
_itot( nReplaceNum, szLabel, 10 );
::SendMessage( hwndStatic, WM_SETTEXT, 0, (LPARAM)szLabel );
CLayoutRange sRangeA; //選択範囲
CLogicPoint ptColLineP;
// From Here 2001.12.03 hor
if (bSelectedArea){
/* 選択範囲置換 */
/* 選択範囲開始位置の取得 */
sRangeA = GetSelect();
// From Here 2007.09.20 genta 矩形範囲の選択置換ができない
// 左下~右上と選択した場合,m_nSelectColumnTo < m_nSelectColumnFrom となるが,
// 範囲チェックで colFrom < colTo を仮定しているので,
// 矩形選択の場合は左上~右下指定になるよう桁を入れ換える.
if( bBeginBoxSelect && sRangeA.GetTo().x < sRangeA.GetFrom().x )
std::swap(sRangeA.GetFromPointer()->x,sRangeA.GetToPointer()->x);
// To Here 2007.09.20 genta 矩形範囲の選択置換ができない
GetDocument()->m_cLayoutMgr.LayoutToLogic(
sRangeA.GetTo(),
&ptColLineP
);
//選択範囲開始位置へ移動
GetCaret().MoveCursor( sRangeA.GetFrom(), bDisplayUpdate );
}
else{
/* ファイル全体置換 */
/* ファイルの先頭に移動 */
// HandleCommand( F_GOFILETOP, bDisplayUpdate, 0, 0, 0, 0 );
Command_GOFILETOP(bDisplayUpdate);
}
CLayoutPoint ptLast = GetCaret().GetCaretLayoutPos();
CLogicPoint ptLastLogic = GetCaret().GetCaretLogicPos();
/* テキスト選択解除 */
/* 現在の選択範囲を非選択状態に戻す */
m_pCommanderView->GetSelectionInfo().DisableSelectArea( bDisplayUpdate );
CLogicRange cSelectLogic; // 置換文字列GetSelect()のLogic単位版
/* 次を検索 */
Command_SEARCH_NEXT( true, bDisplayUpdate, true, 0, NULL, bFastMode ? &cSelectLogic : NULL );
// To Here 2001.12.03 hor
//<< 2002/03/26 Azumaiya
// 速く動かすことを最優先に組んでみました。
// ループの外で文字列の長さを特定できるので、一時変数化。
const wchar_t *szREPLACEKEY; // 置換後文字列。
bool bColumnSelect = false; // 矩形貼り付けを行うかどうか。
bool bLineSelect = false; // ラインモード貼り付けを行うかどうか
CNativeW cmemClip; // 置換後文字列のデータ(データを格納するだけで、ループ内ではこの形ではデータを扱いません)。
// クリップボードからのデータ貼り付けかどうか。
if( nPaste != 0 )
{
// クリップボードからデータを取得。
if ( !m_pCommanderView->MyGetClipboardData( cmemClip, &bColumnSelect, GetDllShareData().m_Common.m_sEdit.m_bEnableLineModePaste? &bLineSelect: NULL ) )
{
ErrorBeep();
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld);
::EnableWindow( m_pCommanderView->GetHwnd(), TRUE );
::EnableWindow( ::GetParent( m_pCommanderView->GetHwnd() ), TRUE );
::EnableWindow( ::GetParent( ::GetParent( m_pCommanderView->GetHwnd() ) ), TRUE );
return;
}
// 矩形貼り付けが許可されていて、クリップボードのデータが矩形選択のとき。
if ( GetDllShareData().m_Common.m_sEdit.m_bAutoColumnPaste && bColumnSelect )
{
// マウスによる範囲選択中
if( m_pCommanderView->GetSelectionInfo().IsMouseSelecting() )
{
ErrorBeep();
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld);
::EnableWindow( m_pCommanderView->GetHwnd(), TRUE );
::EnableWindow( ::GetParent( m_pCommanderView->GetHwnd() ), TRUE );
::EnableWindow( ::GetParent( ::GetParent( m_pCommanderView->GetHwnd() ) ), TRUE );
return;
}
// 現在のフォントは固定幅フォントである
if( !GetDllShareData().m_Common.m_sView.m_bFontIs_FIXED_PITCH )
{
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld);
::EnableWindow( m_pCommanderView->GetHwnd(), TRUE );
::EnableWindow( ::GetParent( m_pCommanderView->GetHwnd() ), TRUE );
::EnableWindow( ::GetParent( ::GetParent( m_pCommanderView->GetHwnd() ) ), TRUE );
return;
}
}
else
// クリップボードからのデータは普通に扱う。
{
bColumnSelect = false;
}
}
else
{
// 2004.05.14 Moca 全置換の途中で他のウィンドウで置換されるとまずいのでコピーする
cmemClip.SetString( GetEditWindow()->m_cDlgReplace.m_strText2.c_str() );
}
CLogicInt nREPLACEKEY; // 置換後文字列の長さ。
szREPLACEKEY = cmemClip.GetStringPtr(&nREPLACEKEY);
// 行コピー(MSDEVLineSelect形式)のテキストで末尾が改行になっていなければ改行を追加する
// ※レイアウト折り返しの行コピーだった場合は末尾が改行になっていない
if( bLineSelect ){
if( !WCODE::IsLineDelimiter(szREPLACEKEY[nREPLACEKEY - 1], GetDllShareData().m_Common.m_sEdit.m_bEnableExtEol) ){
cmemClip.AppendString(GetDocument()->m_cDocEditor.GetNewLineCode().GetValue2());
szREPLACEKEY = cmemClip.GetStringPtr( &nREPLACEKEY );
}
}
if( GetDllShareData().m_Common.m_sEdit.m_bConvertEOLPaste ){
CLogicInt nConvertedTextLen = ConvertEol(szREPLACEKEY, nREPLACEKEY, NULL);
wchar_t *pszConvertedText = new wchar_t[nConvertedTextLen];
ConvertEol(szREPLACEKEY, nREPLACEKEY, pszConvertedText);
cmemClip.SetString(pszConvertedText, nConvertedTextLen);
szREPLACEKEY = cmemClip.GetStringPtr(&nREPLACEKEY);
delete [] pszConvertedText;
}
// 取得にステップがかかりそうな変数などを、一時変数化する。
// とはいえ、これらの操作をすることによって得をするクロック数は合わせても 1 ループで数十だと思います。
// 数百クロック毎ループのオーダーから考えてもそんなに得はしないように思いますけど・・・。
BOOL &bCANCEL = cDlgCancel.m_bCANCEL;
CDocLineMgr& rDocLineMgr = GetDocument()->m_cDocLineMgr;
CLayoutMgr& rLayoutMgr = GetDocument()->m_cLayoutMgr;
// クラス関係をループの中で宣言してしまうと、毎ループごとにコンストラクタ、デストラクタが
// 呼ばれて遅くなるので、ここで宣言。
CBregexp cRegexp;
// 初期化も同様に毎ループごとにやると遅いので、最初に済ましてしまう。
if( bRegularExp && nPaste == 0 )
{
if ( !InitRegexp( m_pCommanderView->GetHwnd(), cRegexp, true ) )
{
m_pCommanderView->SetDrawSwitch(bDrawSwitchOld);
::EnableWindow( m_pCommanderView->GetHwnd(), TRUE );
::EnableWindow( ::GetParent( m_pCommanderView->GetHwnd() ), TRUE );
::EnableWindow( ::GetParent( ::GetParent( m_pCommanderView->GetHwnd() ) ), TRUE );
return;
}
// Nov. 9, 2005 かろと 正規表現で選択始点・終点への挿入方法を変更(再)
CNativeW cMemRepKey2;
CNativeW cMemMatchStr;
cMemMatchStr.SetString(L"$&");
if (nReplaceTarget == 1 ) { //選択始点へ挿入
cMemRepKey2 = cmemClip;
cMemRepKey2 += cMemMatchStr;
} else if (nReplaceTarget == 2) { // 選択終点へ挿入
cMemRepKey2 = cMemMatchStr;
cMemRepKey2 += cmemClip;
} else {
cMemRepKey2 = cmemClip;
}
// 正規表現オプションの設定2006.04.01 かろと
int nFlag = (m_pCommanderView->m_sCurSearchOption.bLoHiCase ? CBregexp::optCaseSensitive : CBregexp::optNothing);
nFlag |= (bConsecutiveAll ? CBregexp::optNothing : CBregexp::optGlobal); // 2007.01.16 ryoji
cRegexp.Compile(m_pCommanderView->m_strCurSearchKey.c_str(), cMemRepKey2.GetStringPtr(), nFlag);
}
//$$ 単位混在
CLayoutPoint ptOld(0, -1); // 検索後の選択範囲(xはいつもLogic。yは矩形はLayout,通常はLogic)
/*CLogicInt*/int lineCnt = 0; //置換前の行数
/*CLayoutInt*/int linDif = (0); //置換後の行調整
CLogicXInt colDif(0); // 置換後の桁調整
CLogicPoint boxRight; // 矩形選択の現在の行の右端。sRangeA.GetTo().x ではなく boxRight.x + colDif を使う。
/*CLogicInt*/int linOldLen = (0); //検査後の行の長さ
int nLoopCnt = -1;
/* テキストが選択されているか */
while( (!bFastMode && m_pCommanderView->GetSelectionInfo().IsTextSelected())
|| ( bFastMode && cSelectLogic.IsValid() ) )
{
/* キャンセルされたか */
if( bCANCEL )