source: dev/trunk/ab5.0/abdev/abdev/TextEditor_UndoRedo.cpp@ 648

Last change on this file since 648 was 629, checked in by dai_9181, 16 years ago

MDIINFO構造体をリファクタリング。

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