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