[BACK]Return to asir32guiview.cpp CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / windows / asir32gui

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>