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