Annotation of OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp, Revision 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>