[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.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>