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