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

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

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

File size: 4.9 KB
RevLine 
[475]1#include "stdafx.h"
2
[3]3#include "common.h"
4
5void TextEdit_UndoCommand(int WndNum){
6 int i;
7 TEXTEDIT_UNDOSTATE *pUndoState;
8
9 //自動インデント中のインデントを無効にする
[629]10 if(MdiInfo[WndNum]->IndentStr) CancelBeforeAutoIndent(WndNum);
[3]11
[629]12 pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
[3]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 //選択範囲をセット
[629]22 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]23 pUndoState->Range[pUndoState->NowPos].cpMin,
[629]24 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
25 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]26 pUndoState->Range[pUndoState->NowPos].cpMax,
[629]27 &MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
[3]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();
[24]44
45 //変更を通知
[629]46 MdiInfo[WndNum]->pMdiTextEdit->NofityUndoRedoToModify();
[3]47}
48void TextEdit_RedoCommand(int WndNum){
49 TEXTEDIT_UNDOSTATE *pUndoState;
50
[629]51 pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
[3]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 //選択範囲をセット
[629]61 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]62 pUndoState->Range[pUndoState->NowPos].cpMin,
[629]63 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
64 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]65 pUndoState->Range[pUndoState->NowPos].cpMin,
[629]66 &MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
[3]67
68 TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
69 break;
70 case TEXTEDIT_UNDO_SELKEY:
71 //選択範囲をセット
[629]72 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]73 pUndoState->DelRange[pUndoState->NowPos].cpMin,
[629]74 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
75 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
[3]76 pUndoState->DelRange[pUndoState->NowPos].cpMax,
[629]77 &MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
[3]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();
[24]91
92 //変更を通知
[629]93 MdiInfo[WndNum]->pMdiTextEdit->NofityUndoRedoToModify();
[3]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
[629]109 pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
[3]110
111 //Redoされた場合の不要なデータを削除する
112 for(i=pUndoState->NowPos;;i++){
113 if(i==MAX_UNDONUM) i=0;
114 if(pUndoState->Command[i]==0) break;
[24]115 TextEdit_DeleteUndoData(pUndoState,i);
[3]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 //一番古い情報を切り捨てる
[24]148 TextEdit_DeleteUndoData(pUndoState,pUndoState->NowPos);
[3]149 }
150
151 //元に戻す、やり直しメニューをリセット
152 ResetState_UndoMenu();
153}
154
[24]155void TextEdit_DeleteUndoData(TEXTEDIT_UNDOSTATE *pUndoState,int pos){
[3]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.