source: dev/ProjectEditor/TextEditor_UndoRedo.cpp@ 3

Last change on this file since 3 was 3, checked in by dai_9181, 17 years ago
File size: 4.7 KB
Line 
1#include "common.h"
2
3void TextEdit_UndoCommand(int WndNum){
4 extern MDIINFO MdiInfo[MAX_WNDNUM];
5 int i;
6 TEXTEDIT_UNDOSTATE *pUndoState;
7
8 //自動インデント中のインデントを無効にする
9 if(MdiInfo[WndNum].IndentStr) CancelBeforeAutoIndent(WndNum);
10
11 pUndoState=MdiInfo[WndNum].edit_undo;
12 i=pUndoState->NowPos-1;
13 if(i==-1) i=MAX_UNDONUM-1;
14 if(!pUndoState->Command[i]){
15 MessageBeep(0);
16 return;
17 }
18 pUndoState->NowPos=i;
19
20 //選択範囲をセット
21 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
22 pUndoState->Range[pUndoState->NowPos].cpMin,
23 &MdiInfo[WndNum].pmti->StartCaretPos);
24 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
25 pUndoState->Range[pUndoState->NowPos].cpMax,
26 &MdiInfo[WndNum].pmti->EndCaretPos);
27
28 switch(pUndoState->Command[pUndoState->NowPos]){
29 case TEXTEDIT_UNDO_KEY:
30 case TEXTEDIT_UNDO_PASTE:
31 TextEdit_Replace(WndNum,"",1);
32 break;
33 case TEXTEDIT_UNDO_SELKEY:
34 TextEdit_Replace(WndNum,pUndoState->DelStr[pUndoState->NowPos],1);
35 break;
36 }
37
38 TextEdit_ScrollCaret(WndNum,0);
39 ResetCaretPos(WndNum);
40
41 //元に戻す、やり直しメニューをリセット
42 ResetState_UndoMenu();
43}
44void TextEdit_RedoCommand(int WndNum){
45 extern MDIINFO MdiInfo[MAX_WNDNUM];
46 TEXTEDIT_UNDOSTATE *pUndoState;
47
48 pUndoState=MdiInfo[WndNum].edit_undo;
49 if(!pUndoState->Command[pUndoState->NowPos]){
50 MessageBeep(0);
51 return;
52 }
53
54 switch(pUndoState->Command[pUndoState->NowPos]){
55 case TEXTEDIT_UNDO_KEY:
56 case TEXTEDIT_UNDO_PASTE:
57 //選択範囲をセット
58 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
59 pUndoState->Range[pUndoState->NowPos].cpMin,
60 &MdiInfo[WndNum].pmti->StartCaretPos);
61 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
62 pUndoState->Range[pUndoState->NowPos].cpMin,
63 &MdiInfo[WndNum].pmti->EndCaretPos);
64
65 TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
66 break;
67 case TEXTEDIT_UNDO_SELKEY:
68 //選択範囲をセット
69 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
70 pUndoState->DelRange[pUndoState->NowPos].cpMin,
71 &MdiInfo[WndNum].pmti->StartCaretPos);
72 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
73 pUndoState->DelRange[pUndoState->NowPos].cpMax,
74 &MdiInfo[WndNum].pmti->EndCaretPos);
75
76 TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
77 break;
78 }
79
80 TextEdit_ScrollCaret(WndNum,0);
81 ResetCaretPos(WndNum);
82
83 pUndoState->NowPos++;
84 if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
85
86 //元に戻す、やり直しメニューをリセット
87 ResetState_UndoMenu();
88}
89
90BOOL bUndoDelimitation(char c){
91 if(c==' '||c=='\t'||
92 c=='\"'||
93 c==','||c==':'||c==';'||
94 c=='('||c==')'||
95 c=='+'||c=='-'||c=='*'||c=='/'||c=='^'||c=='\\'||c=='<'||c=='>'||c=='=') return 1;
96 return 0;
97}
98void TextEdit_NoticeChanging(int WndNum,int Command,char *KeyStr,char *DelStr,CHARRANGE *Range,CHARRANGE *DelRange){
99 extern HANDLE hHeap;
100 extern MDIINFO MdiInfo[MAX_WNDNUM];
101 int i;
102 TEXTEDIT_UNDOSTATE *pUndoState;
103
104 pUndoState=MdiInfo[WndNum].edit_undo;
105
106 //Redoされた場合の不要なデータを削除する
107 for(i=pUndoState->NowPos;;i++){
108 if(i==MAX_UNDONUM) i=0;
109 if(pUndoState->Command[i]==0) break;
110 TextEdit_DeleteUndoData(WndNum,i);
111 }
112
113 i=pUndoState->NowPos-1;
114 if(i==-1) i=MAX_UNDONUM-1;
115 if(pUndoState->Command[i]==Command&&
116 pUndoState->Command[i]==TEXTEDIT_UNDO_KEY){
117 if(pUndoState->Range[i].cpMax==Range->cpMin&&KeyStr[0]!='\r'){
118 if(!(bUndoDelimitation(pUndoState->KeyStr[i][0])^bUndoDelimitation(KeyStr[0]))){
119 pUndoState->KeyStr[i]=(char *)HeapReAlloc(hHeap,0,pUndoState->KeyStr[i],lstrlen(pUndoState->KeyStr[i])+lstrlen(KeyStr)+1);
120 lstrcat(pUndoState->KeyStr[i],KeyStr);
121 pUndoState->Range[i].cpMax+=lstrlen(KeyStr);
122
123 HeapDefaultFree(KeyStr);
124
125 //元に戻す、やり直しメニューをリセット
126 ResetState_UndoMenu();
127 return;
128 }
129 }
130 }
131
132 //データ更新
133 pUndoState->Command[pUndoState->NowPos]=Command;
134 pUndoState->KeyStr[pUndoState->NowPos]=KeyStr;
135 pUndoState->DelStr[pUndoState->NowPos]=DelStr;
136 pUndoState->Range[pUndoState->NowPos]=*Range;
137 if(DelRange) pUndoState->DelRange[pUndoState->NowPos]=*DelRange;
138
139 pUndoState->NowPos++;
140 if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
141 if(pUndoState->Command[pUndoState->NowPos]){
142 //一番古い情報を切り捨てる
143 TextEdit_DeleteUndoData(WndNum,pUndoState->NowPos);
144 }
145
146 //元に戻す、やり直しメニューをリセット
147 ResetState_UndoMenu();
148}
149
150void TextEdit_DeleteUndoData(int WndNum,int pos){
151 extern MDIINFO MdiInfo[MAX_WNDNUM];
152 TEXTEDIT_UNDOSTATE *pUndoState;
153
154 pUndoState=MdiInfo[WndNum].edit_undo;
155 if(pUndoState->KeyStr[pos]) HeapDefaultFree(pUndoState->KeyStr[pos]);
156 if(pUndoState->DelStr[pos]) HeapDefaultFree(pUndoState->DelStr[pos]);
157 pUndoState->Command[pos]=0;
158}
Note: See TracBrowser for help on using the repository browser.