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