Annotation of OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp, Revision 1.1.1.1
1.1 noro 1: // asir32guiView.cpp : CAsir32guiView クラスの動作の定義を行います。
2: //
3:
4: #include "stdafx.h"
5:
6: #include "asir32gui.h"
7: #include "asir32guiDoc.h"
8: #include "asir32guiView.h"
9: #include "FatalDialog.h"
10:
11: #ifdef _DEBUG
12: #define new DEBUG_NEW
13: #undef THIS_FILE
14: static char THIS_FILE[] = __FILE__;
15: #endif
16:
17: const WindowHeight = 200;
18: const WindowWidth = 400;
19: const TextBufferSize = 32768;
20:
21: CAsir32guiView *theView;
22:
23: extern "C"
24: {
25: char *prev_hist(void), *next_hist(void), *search_hist(char *p);
26: void read_input_history(),write_input_history();
27: void init_input_history();
28: void add_hist(char *p), reset_traverse(void);
29: void asir_terminate(void);
30: void Main(int,char*[]);
31: void loadfile(char *);
32: void put_line(char *);
33: void send_intr(void);
34: void insert_to_theView(char *);
35: void get_rootdir(char *,int,char *);
36: extern int bigfloat, prtime, prresult;
37: extern char *asir_libdir;
38:
39: void insert_to_theView(char *str)
40: {
41: (void)theView->Insert(str);
42: }
43: void flush_log()
44: {
45: if ( theView->Logging )
46: theView->OnFileLog();
47: }
48: }
49:
50: /////////////////////////////////////////////////////////////////////////////
51: // CAsir32guiView
52:
53: IMPLEMENT_DYNCREATE(CAsir32guiView, CEditView)
54:
55: BEGIN_MESSAGE_MAP(CAsir32guiView, CEditView)
56: //{{AFX_MSG_MAP(CAsir32guiView)
57: ON_WM_KEYDOWN()
58: ON_WM_CHAR()
59: ON_WM_LBUTTONUP()
60: ON_WM_RBUTTONDOWN()
61: ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
62: ON_COMMAND(ID_FILE_LOG, OnFileLog)
63: ON_COMMAND(ID_ASIRHELP, OnAsirhelp)
64: ON_UPDATE_COMMAND_UI(ID_FILE_LOG, OnUpdateFileLog)
65: ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
66: //}}AFX_MSG_MAP
67: // 標準印刷コマンド
68: // ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
69: // ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
70: // ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
71: END_MESSAGE_MAP()
72:
73: /////////////////////////////////////////////////////////////////////////////
74: // CAsir32guiView クラスの構築/消滅
75:
76: CAsir32guiView::CAsir32guiView()
77: {
78: // TODO: この場所に構築用のコードを追加してください。
79: static int tmpView_created = 0;
80: char errmsg[BUFSIZ];
81:
82: init_input_history();
83: read_input_history();
84: DebugMode = 0;
85: DebugInMain = 0;
86: MaxLineLength = 80;
87: LogStart = 0;
88: Logging = 0;
89: Logfp = NULL;
90: ResetIndex();
91: theView = this;
92: }
93:
94: CAsir32guiView::~CAsir32guiView()
95: {
96: write_input_history();
97: }
98:
99: BOOL CAsir32guiView::PreCreateWindow(CREATESTRUCT& cs)
100: {
101: // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
102: // 修正してください。
103:
104: m_dwDefaultStyle = dwStyleDefault & ~ES_AUTOHSCROLL ;
105: m_dwDefaultStyle &= ~WS_HSCROLL;
106: return CCtrlView::PreCreateWindow(cs);
107: }
108:
109: /////////////////////////////////////////////////////////////////////////////
110: // CAsir32guiView クラスの描画
111:
112: void CAsir32guiView::OnDraw(CDC* pDC)
113: {
114: CAsir32guiDoc* pDoc = GetDocument();
115: ASSERT_VALID(pDoc);
116:
117: // TODO: この場所にネイティブ データ用の描画コードを追加します。
118: }
119:
120: /////////////////////////////////////////////////////////////////////////////
121: // CAsir32guiView クラスの印刷
122:
123: BOOL CAsir32guiView::OnPreparePrinting(CPrintInfo* pInfo)
124: {
125: // デフォルトの印刷準備
126: return DoPreparePrinting(pInfo);
127: }
128:
129: void CAsir32guiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
130: {
131: // TODO: 印刷前の特別な初期化処理を追加してください。
132: }
133:
134: void CAsir32guiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
135: {
136: // TODO: 印刷後の後処理を追加してください。
137: }
138:
139: /////////////////////////////////////////////////////////////////////////////
140: // CAsir32guiView クラスの診断
141:
142: #ifdef _DEBUG
143: void CAsir32guiView::AssertValid() const
144: {
145: CEditView::AssertValid();
146: }
147:
148: void CAsir32guiView::Dump(CDumpContext& dc) const
149: {
150: CEditView::Dump(dc);
151: }
152:
153: CAsir32guiDoc* CAsir32guiView::GetDocument() // 非デバッグ バージョンはインラインです。
154: {
155: ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAsir32guiDoc)));
156: return (CAsir32guiDoc*)m_pDocument;
157: }
158: #endif //_DEBUG
159:
160: /////////////////////////////////////////////////////////////////////////////
161: // CAsir32guiView クラスのメッセージ ハンドラ
162:
163: void CAsir32guiView::PutChar(int c)
164: {
165: int i;
166: char buf[2];
167:
168: for ( i = EndPos-1; i >= CurrentPos; i-- )
169: Buffer[i+1] = Buffer[i];
170: Buffer[CurrentPos] = (char)c;
171: buf[0] = (char)c; buf[1] = 0;
172: Insert(buf,FALSE);
173: CurrentPos++;
174: EndPos++;
175: }
176:
177: void CAsir32guiView::DeleteChar(int count) {
178: int i,s,e;
179: char null = 0;
180:
181: if ( count > (EndPos-CurrentPos) )
182: count = EndPos - CurrentPos;
183: if ( count == 0 )
184: Beep();
185: else {
186: EndPos -= count;
187: for ( i = CurrentPos; i < EndPos; i++ )
188: Buffer[i] = Buffer[i+count];
189: GetEditCtrl().GetSel(s,e);
190: GetEditCtrl().SetSel(s,s+count);
191: GetEditCtrl().ReplaceSel(&null);
192: }
193: }
194:
195: void CAsir32guiView::Insert(char *buf,BOOL wrap)
196: {
197: char t[BUFSIZ*4];
198: char *p,*q,c;
199: int len;
200: int i;
201:
202: if ( wrap ) {
203: i = GetEditCtrl().LineLength(-1);
204: for ( p = t, q = buf; (c = *p++ = *q++) != 0; )
205: if ( c == '\r' ) {
206: *p++ = *q++; i = 0;
207: } else if ( (*q != '\r') && (++i == MaxLineLength) ) {
208: *p++ = '\r'; *p++ = '\r'; *p++ = '\n'; i = 0;
209: }
210: p = t;
211: } else
212: p = buf;
213: len = GetWindowTextLength();
214: if ( strlen(p) + len >= TextBufferSize )
215: DeleteTop();
216: GetEditCtrl().ReplaceSel(p);
217: }
218:
219: void CAsir32guiView::DeleteTop()
220: {
221: const char *p,*q;
222: const char *buf;
223: char null = 0;
224: int len,len0,len1;
225:
226: buf = LockBuffer();
227: len0 = len = strlen(buf);
228: for ( p = buf; len >= TextBufferSize/2; ) {
229: q = strchr(p,'\n');
230: if ( !q ) {
231: len = 0; break;
232: } else {
233: q++; len -= (q-p); p = q;
234: }
235: }
236: if ( Logging ) {
237: len1 = (len0 - len - LogStart);
238: if ( len1 > 0 ) {
239: fwrite(buf+LogStart,1,len1,Logfp);
240: LogStart = 0;
241: } else
242: LogStart = -len1;
243: }
244: UnlockBuffer();
245: if ( q ) {
246: GetEditCtrl().SetSel(0,len);
247: GetEditCtrl().ReplaceSel(&null);
248: }
249: UpdateCursor(EndPos);
250: }
251:
252: void CAsir32guiView::UpdateCursor(int pos)
253: {
254: int s;
255: int len;
256:
257: if ( pos < 0 || pos > EndPos )
258: Beep();
259: else {
260: len = GetWindowTextLength();
261: CurrentPos = pos;
262: s = len-EndPos+CurrentPos;
263: GetEditCtrl().SetSel(s,s);
264: }
265: }
266:
267: void CAsir32guiView::ReplaceString(char *str)
268: {
269: UpdateCursor(0); DeleteChar(EndPos);
270: Insert(str,FALSE);
271: strcpy(Buffer,str);
272: EndPos = CurrentPos = strlen(str);
273: }
274:
275: void CAsir32guiView::Beep(void) {
276: ::MessageBeep(0xffffffff);
277: }
278:
279: void CAsir32guiView::Paste(void) {
280: char buf[2*BUFSIZ];
281: const char *src;
282: char c;
283: int i,j,l;
284: HGLOBAL hClip;
285:
286: if ( OpenClipboard() == FALSE ) {
287: Beep(); return;
288: }
289: hClip = GetClipboardData(CF_TEXT);
290: src = (const char *)::GlobalLock(hClip);
291: if ( !src || (l = strlen(src)) >= 2*BUFSIZ ) {
292: ::CloseClipboard();
293: Beep(); return;
294: }
295: for ( i = j = 0; i < l; i++ )
296: if ( (c = src[i]) != '\n' && c != '\r' )
297: buf[j++] = c;
298: buf[j] = 0;
299: ::GlobalUnlock(hClip);
300: ::CloseClipboard();
301: GetEditCtrl().ReplaceSel(buf);
302: strncpy(Buffer+EndPos,buf,j);
303: EndPos += j; CurrentPos = EndPos;
304: }
305:
306: #define CTRL(c) (c)&0x1f
307:
308: void CAsir32guiView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
309: {
310: // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
311: char *exp_result;
312:
313: switch ( nChar ) {
314: case VK_LEFT:
315: UpdateCursor(CurrentPos-1); return;
316: case VK_RIGHT:
317: UpdateCursor(CurrentPos+1); return;
318: case VK_DELETE:
319: DeleteChar(1); return;
320: case VK_UP:
321: if ( (exp_result = prev_hist()) != 0 )
322: ReplaceString(exp_result);
323: else
324: Beep();
325: return;
326: case VK_DOWN:
327: if ( (exp_result = next_hist()) != 0 )
328: ReplaceString(exp_result);
329: else
330: Beep();
331: return;
332: default:
333: break;
334: }
335: CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
336: }
337:
338: void CAsir32guiView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
339: {
340: // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
341: char *exp_result;
342:
343: switch ( nChar ) {
344: case CTRL('M'): case CTRL('J'):
345: UpdateCursor(EndPos);
346: Buffer[EndPos] = 0;
347: reset_traverse();
348: if ( Buffer[0] == '!' ) {
349: exp_result = search_hist(Buffer+1);
350: if ( exp_result )
351: ReplaceString(exp_result);
352: else {
353: UpdateCursor(0); DeleteChar(EndPos); Beep();
354: }
355: return;
356: } else {
357: add_hist(Buffer);
358: put_line(Buffer);
359: ResetIndex();
360: nChar = CTRL('M');
361: }
362: break;
363: case CTRL('N'):
364: if ( (exp_result = next_hist()) != 0 )
365: ReplaceString(exp_result);
366: else
367: Beep();
368: return;
369: case CTRL('P'):
370: if ( (exp_result = prev_hist()) != 0 )
371: ReplaceString(exp_result);
372: else
373: Beep();
374: return;
375: case CTRL('A'):
376: UpdateCursor(0); return;
377: case CTRL('E'):
378: UpdateCursor(EndPos); return;
379: case CTRL('F'):
380: UpdateCursor(CurrentPos+1); return;
381: case CTRL('B'):
382: UpdateCursor(CurrentPos-1); return;
383: case CTRL('K'):
384: DeleteChar(EndPos-CurrentPos); return;
385: case CTRL('U'):
386: UpdateCursor(0); DeleteChar(EndPos); return;
387: case CTRL('D'):
388: DeleteChar(1); return;
389: case CTRL('H'):
390: if ( CurrentPos > 0 ) {
391: UpdateCursor(CurrentPos-1); DeleteChar(1);
392: } else
393: Beep();
394: return;
395: case CTRL('C'):
396: send_intr();
397: /* wake up the engine */
398: put_line("");
399: return;
400: default :
401: if ( nChar >= 0x20 && nChar < 0x7f )
402: PutChar(nChar);
403: else
404: Beep();
405: return;
406: }
407: CEditView::OnChar(nChar, nRepCnt, nFlags);
408: }
409:
410: void CAsir32guiView::OnLButtonUp(UINT nFlags, CPoint point)
411: {
412: // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
413: GetEditCtrl().Copy(); UpdateCursor(EndPos);
414: CEditView::OnLButtonUp(nFlags, point);
415: }
416:
417: void CAsir32guiView::OnRButtonDown(UINT nFlags, CPoint point)
418: {
419: // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
420: Paste();
421:
422: // CEditView::OnRButtonDown(nFlags, point);
423: }
424:
425: void CAsir32guiView::OnFileOpen()
426: {
427: // TODO: この位置にコマンド ハンドラ用のコードを追加してください
428: char cmd[BUFSIZ*2]; // XXX
429: char *p;
430:
431: CFileDialog fileDialog(TRUE);
432: if ( fileDialog.DoModal() == IDOK ) {
433: CString pathName = fileDialog.GetPathName();
434: sprintf(cmd,"load(\"%s\");",pathName);
435: for ( p = cmd; *p; p++ )
436: if ( *p == '\\' )
437: *p = '/';
438: put_line(cmd);
439: }
440: }
441:
442: void CAsir32guiView::OnAsirhelp()
443: {
444: // TODO: この位置にコマンド ハンドラ用のコードを追加してください
445: char root[BUFSIZ],errmsg[BUFSIZ],helpfile[BUFSIZ];
446:
447: get_rootdir(root,sizeof(root),errmsg);
448: sprintf(helpfile,"%s\\bin\\asirhelp.chm",root);
449: HtmlHelp(NULL, helpfile, HH_DISPLAY_TOPIC, 0);
450: }
451:
452: void CAsir32guiView::OnFileLog()
453: {
454: // TODO: この位置にコマンド ハンドラ用のコードを追加してください
455: if ( !Logging ) {
456: CFileDialog fileDialog(TRUE);
457: if ( fileDialog.DoModal() == IDOK ) {
458: CString logfile = fileDialog.GetPathName();
459: Logfp = fopen(logfile,"ab");
460: if ( Logfp ) {
461: LogStart = GetWindowTextLength();
462: Logging = 1;
463: }
464: }
465: } else {
466: const char *buf;
467: buf = LockBuffer();
468: fwrite(buf+LogStart,1,strlen(buf)-LogStart,Logfp);
469: UnlockBuffer();
470: fclose(Logfp);
471: Logging = 0;
472: }
473: }
474:
475: void CAsir32guiView::OnUpdateFileLog(CCmdUI* pCmdUI)
476: {
477: // TODO: この位置に command update UI ハンドラ用のコードを追加してください
478: if ( Logging )
479: pCmdUI->SetCheck(1);
480: else
481: pCmdUI->SetCheck(0);
482: }
483:
484: void CAsir32guiView::OnEditPaste()
485: {
486: // TODO: この位置にコマンド ハンドラ用のコードを追加してください
487: Paste();
488: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>