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

Annotation of OpenXM_contrib2/windows/winfep/winfepDlg.cpp, Revision 1.6

1.1       noro        1: // winfepDlg.cpp : インプリメンテーション ファイル
                      2: //
                      3:
                      4: #include "stdafx.h"
                      5: #include "winfep.h"
                      6: #include "winfepDlg.h"
                      7: #include <process.h>
                      8: #include <sys/stat.h>
                      9: #include <sys/types.h>
                     10:
                     11: #ifdef _DEBUG
                     12: #define new DEBUG_NEW
                     13: #undef THIS_FILE
                     14: static char THIS_FILE[] = __FILE__;
                     15: #endif
                     16:
                     17: HWND asirhwnd;
                     18: FILE *infile;
                     19: char *filebuf;
                     20: char *before,*after;
                     21: int nlines, currentline;
                     22: char **lineptr;
                     23:
                     24: extern "C" {
                     25: void get_asirhwnd()
                     26: {
                     27:        char *temp;
                     28:        if ( temp = getenv("TEMP") ) {
                     29:                int len;
                     30:                char *name;
                     31:                FILE *fp;
                     32:                len = strlen(temp);
                     33:                name = (char *)malloc(len+BUFSIZ);
                     34:                sprintf(name,"%s\\asirgui.hnd",temp);
                     35:                fp = fopen(name,"r");
                     36:                if ( fp ) {
                     37:                        fscanf(fp,"%d",&asirhwnd);
                     38:                        fclose(fp);
                     39:                }
                     40:        }
                     41: }
                     42:
                     43:
                     44: }
                     45:
                     46: /////////////////////////////////////////////////////////////////////////////
                     47: // アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ
                     48:
                     49: class CAboutDlg : public CDialog
                     50: {
                     51: public:
                     52:        CAboutDlg();
                     53:
                     54: // ダイアログ データ
                     55:        //{{AFX_DATA(CAboutDlg)
                     56:        enum { IDD = IDD_ABOUTBOX };
                     57:        //}}AFX_DATA
                     58:
                     59:        // ClassWizard は仮想関数のオーバーライドを生成します
                     60:        //{{AFX_VIRTUAL(CAboutDlg)
                     61:        protected:
                     62:        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサポート
                     63:        //}}AFX_VIRTUAL
                     64:
                     65: // インプリメンテーション
                     66: protected:
                     67:        //{{AFX_MSG(CAboutDlg)
                     68:        //}}AFX_MSG
                     69:        DECLARE_MESSAGE_MAP()
                     70: };
                     71:
                     72: CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
                     73: {
                     74:        //{{AFX_DATA_INIT(CAboutDlg)
                     75:        //}}AFX_DATA_INIT
                     76: }
                     77:
                     78: void CAboutDlg::DoDataExchange(CDataExchange* pDX)
                     79: {
                     80:        CDialog::DoDataExchange(pDX);
                     81:        //{{AFX_DATA_MAP(CAboutDlg)
                     82:        //}}AFX_DATA_MAP
                     83: }
                     84:
                     85: BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
                     86:        //{{AFX_MSG_MAP(CAboutDlg)
                     87:                // メッセージ ハンドラがありません。
                     88:        //}}AFX_MSG_MAP
                     89: END_MESSAGE_MAP()
                     90:
                     91: /////////////////////////////////////////////////////////////////////////////
                     92: // CWinfepDlg ダイアログ
                     93:
                     94: CWinfepDlg::CWinfepDlg(CWnd* pParent /*=NULL*/)
                     95:        : CDialog(CWinfepDlg::IDD, pParent)
                     96: {
                     97:        //{{AFX_DATA_INIT(CWinfepDlg)
                     98:        //}}AFX_DATA_INIT
                     99:        // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
                    100:     get_asirhwnd();
                    101:        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
                    102: }
                    103:
                    104: void CWinfepDlg::DoDataExchange(CDataExchange* pDX)
                    105: {
                    106:        CDialog::DoDataExchange(pDX);
                    107:        //{{AFX_DATA_MAP(CWinfepDlg)
1.2       noro      108:        DDX_Control(pDX, IDC_CURRENTLINE, m_currentline);
1.1       noro      109:        DDX_Control(pDX, IDC_AFTER, m_after);
                    110:        DDX_Control(pDX, IDC_BEFORE, m_before);
                    111:        DDX_Control(pDX, IDC_CURRENTFILE, m_currentfile);
                    112:        //}}AFX_DATA_MAP
                    113: }
                    114:
                    115: BEGIN_MESSAGE_MAP(CWinfepDlg, CDialog)
                    116:        //{{AFX_MSG_MAP(CWinfepDlg)
                    117:        ON_WM_SYSCOMMAND()
                    118:        ON_WM_PAINT()
                    119:        ON_WM_QUERYDRAGICON()
                    120:        ON_BN_CLICKED(Send, OnSend)
                    121:        ON_BN_CLICKED(IDC_FILEOPEN, OnFileopen)
                    122:        ON_BN_CLICKED(IDC_BUTTON3, OnAsir)
                    123:        ON_BN_CLICKED(IDC_NEXT, OnNext)
                    124:        ON_BN_CLICKED(IDC_PREV, OnPrev)
                    125:        ON_BN_CLICKED(IDC_PREV10, OnPrev10)
                    126:        ON_BN_CLICKED(IDC_NEXT10, OnNext10)
1.2       noro      127:        ON_BN_CLICKED(IDC_QUIT, OnQuit)
1.6     ! noro      128:        ON_BN_CLICKED(IDC_INTR, OnIntr)
1.1       noro      129:        //}}AFX_MSG_MAP
                    130: END_MESSAGE_MAP()
                    131:
                    132: /////////////////////////////////////////////////////////////////////////////
                    133: // CWinfepDlg メッセージ ハンドラ
                    134:
                    135: BOOL CWinfepDlg::OnInitDialog()
                    136: {
                    137:        CDialog::OnInitDialog();
                    138:
                    139:        // "バージョン情報..." メニュー項目をシステム メニューへ追加します。
                    140:
                    141:        // IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
                    142:        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
                    143:        ASSERT(IDM_ABOUTBOX < 0xF000);
                    144:
                    145:        CMenu* pSysMenu = GetSystemMenu(FALSE);
                    146:        if (pSysMenu != NULL)
                    147:        {
                    148:                CString strAboutMenu;
                    149:                strAboutMenu.LoadString(IDS_ABOUTBOX);
                    150:                if (!strAboutMenu.IsEmpty())
                    151:                {
                    152:                        pSysMenu->AppendMenu(MF_SEPARATOR);
                    153:                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                    154:                }
                    155:        }
                    156:
                    157:        // このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
                    158:        // ウィンドウがダイアログでない時は自動的に設定しません。
                    159:        SetIcon(m_hIcon, TRUE);                 // 大きいアイコンを設定
                    160:        SetIcon(m_hIcon, FALSE);                // 小さいアイコンを設定
                    161:
                    162:        // TODO: 特別な初期化を行う時はこの場所に追加してください。
                    163:
                    164:        return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
                    165: }
                    166:
                    167: void CWinfepDlg::OnSysCommand(UINT nID, LPARAM lParam)
                    168: {
                    169:        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
                    170:        {
                    171:                CAboutDlg dlgAbout;
                    172:                dlgAbout.DoModal();
                    173:        }
                    174:        else
                    175:        {
                    176:                CDialog::OnSysCommand(nID, lParam);
                    177:        }
                    178: }
                    179:
                    180: // もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
                    181: // コードを以下に記述する必要があります。MFC アプリケーションは document/view
                    182: // モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
                    183:
                    184: void CWinfepDlg::OnPaint()
                    185: {
                    186:        if (IsIconic())
                    187:        {
                    188:                CPaintDC dc(this); // 描画用のデバイス コンテキスト
                    189:
                    190:                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
                    191:
                    192:                // クライアントの矩形領域内の中央
                    193:                int cxIcon = GetSystemMetrics(SM_CXICON);
                    194:                int cyIcon = GetSystemMetrics(SM_CYICON);
                    195:                CRect rect;
                    196:                GetClientRect(&rect);
                    197:                int x = (rect.Width() - cxIcon + 1) / 2;
                    198:                int y = (rect.Height() - cyIcon + 1) / 2;
                    199:
                    200:                // アイコンを描画します。
                    201:                dc.DrawIcon(x, y, m_hIcon);
                    202:        }
                    203:        else
                    204:        {
                    205:                CDialog::OnPaint();
                    206:        }
                    207: }
                    208:
                    209: // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
                    210: // カーソルを表示するためにここを呼び出します。
                    211: HCURSOR CWinfepDlg::OnQueryDragIcon()
                    212: {
                    213:        return (HCURSOR) m_hIcon;
                    214: }
                    215:
                    216: void CWinfepDlg::OnSend()
                    217: {
                    218:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
1.3       noro      219:     int i;
                    220:     if ( !infile ) return;
1.1       noro      221:     if ( currentline >= 0 && currentline < nlines ) {
1.2       noro      222:          CString str;
                    223:          m_currentline.GetWindowText(str);
                    224:       LPCSTR line = (LPCSTR)str;
1.3       noro      225:       for ( i = 0; line[i] && isspace(line[i]); i++ );
                    226:       if ( line[i] &&
                    227:         !strncmp(line+i,"end$",4) || !strncmp(line+i,"end;",4) ) return;
1.5       noro      228:
                    229: //      for ( i = 0; line[i]; i++ ) {
                    230: //     if ( line[i] == '\t' )
                    231: //             ::SendMessage(asirhwnd,WM_CHAR,' ',8);
                    232: //     else
                    233: //             ::SendMessage(asirhwnd,WM_CHAR,line[i],1);
                    234: //      }
                    235: //      ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
                    236:       if ( line[i] ) {
                    237: #if 0
                    238:         m_currentline.SetSel(0,str.GetLength());
                    239:         m_currentline.Copy();
                    240: #else
                    241:         int len=str.GetLength()+1;
                    242:         if (!::OpenClipboard(NULL) ) return;
                    243:         HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED,len);
                    244:         LPTSTR pMem = (LPTSTR)hMem;
                    245:         ::lstrcpy(pMem,(LPCTSTR)line);
                    246:         ::EmptyClipboard();
                    247:         ::SetClipboardData(CF_TEXT,hMem);
                    248:         ::CloseClipboard();
                    249: #endif
                    250:         ::SendMessage(asirhwnd,WM_CHAR,0x19,1);
1.1       noro      251:       }
                    252:       ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
                    253:       show_line(++currentline);
                    254:     } else
                    255:        show_line(currentline);
                    256: }
                    257:
                    258: void CWinfepDlg::OnChangeFilename()
                    259: {
                    260:        // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
                    261:        // 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
                    262:        // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
                    263:        // ライドしない限りこの通知を送りません。
                    264:
                    265:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    266:
                    267:
                    268: }
                    269:
                    270: void CWinfepDlg::OnFileopen()
                    271: {
                    272:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    273:        CFileDialog fileDialog(TRUE);
                    274:        char *prev;
                    275:        struct _stat fs;
                    276:        int i,j,n,nl;
                    277:        if ( fileDialog.DoModal() == IDOK ) {
                    278:                CString pathName = fileDialog.GetPathName();
                    279:                if ( infile ) fclose(infile);
                    280:                infile = fopen(pathName,"r");
                    281:                m_currentfile.SetWindowText(pathName);
                    282:                _fstat(_fileno(infile),&fs);
                    283:                filebuf = (char *)realloc(filebuf,fs.st_size+1);
                    284:                before = (char *)realloc(before,fs.st_size+1);
                    285:                after = (char *)realloc(after,fs.st_size+1);
                    286:                n = fread(filebuf,1,fs.st_size,infile);
                    287:                filebuf[n] = 0;
                    288:                for ( nl = 0, i = 0; i < n; i++ )
                    289:                        if ( filebuf[i] == '\n' ) nl++;
                    290:                nlines = nl;
                    291:                lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
                    292:                prev = filebuf;
                    293:                for ( i = 0, j = 0; i < n; i++ )
                    294:                        if ( filebuf[i] == '\n' ) {
                    295:                                filebuf[i] = 0;
                    296:                                lineptr[j++] = prev;
                    297:                                prev = filebuf+i+1;
                    298:                        }
                    299:                currentline = 0;
                    300:                show_line(0);
                    301:        }
                    302: }
                    303:
                    304: void CWinfepDlg::OnAsir()
                    305: {
                    306:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CFileDialog fileDialog(TRUE);
                    307:        CFileDialog fileDialog(TRUE);
                    308:        if ( fileDialog.DoModal() == IDOK ) {
                    309:                CString pathName = fileDialog.GetPathName();
1.4       noro      310:                _spawnl(_P_NOWAIT,pathName,"asirgui",NULL);
1.1       noro      311:                Sleep(5000);
                    312:                get_asirhwnd();
                    313:        }
                    314: }
                    315:
                    316: #define MAX(a,b) ((a)>(b)?(a):(b))
                    317: #define MIN(a,b) ((a)<(b)?(a):(b))
                    318:
                    319: void CWinfepDlg::show_line(int i)
                    320: {
                    321:        int j,nafter,nbefore;
                    322:        char *cur;
                    323:
                    324:        before[0] = after[0] = 0;
                    325:        nbefore = MIN(5,i);
                    326:        if ( nbefore < 0 ) nbefore = 0;
                    327:        for ( j = 0; j < 5-nbefore; j++ )
                    328:                strcat(before,"\n");
                    329:        for ( j = i-nbefore; j<i; j++ ) {
                    330:                strcat(before,lineptr[j]); strcat(before,"\n");
                    331:        }
                    332:        nafter = MIN(5,nlines-i-1);
                    333:        if ( nafter < 0 ) nafter = 0;
                    334:        for ( j = i+1; j < i+1+nafter; j++ ) {
                    335:                strcat(after,lineptr[j]); strcat(after,"\n");
                    336:        }
                    337:        m_before.SetWindowText(before);
                    338:        if ( i < 0 ) cur = "<Beginning of File>";
                    339:        else if ( i == nlines ) cur = "<End of File>";
                    340:        else cur = lineptr[i];
                    341:        m_currentline.SetWindowText(cur);
                    342:        m_after.SetWindowText(after);
                    343: }
                    344:
                    345:
                    346: void CWinfepDlg::OnNext()
                    347: {
                    348:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    349:        if ( !infile ) return;
                    350:     if ( currentline == nlines ) return;
                    351:     show_line(++currentline);
                    352: }
                    353:
                    354: void CWinfepDlg::OnPrev()
                    355: {
                    356:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    357:        if ( !infile ) return;
                    358:        if ( currentline < 0 ) return;
                    359:        show_line(--currentline);
                    360: }
                    361:
                    362: void CWinfepDlg::OnPrev10()
                    363: {
                    364:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    365:        if ( !infile ) return;
                    366:        currentline -= 10;
                    367:        if ( currentline < 0 ) currentline = -1;
                    368:        show_line(currentline);
                    369: }
                    370:
                    371: void CWinfepDlg::OnNext10()
                    372: {
                    373:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    374:        if ( !infile ) return;
                    375:     currentline += 10;
                    376:        if ( currentline >= nlines ) currentline = nlines;
                    377:        show_line(currentline);
                    378: }
1.2       noro      379:
                    380: void CWinfepDlg::OnOK()
                    381: {
                    382:        // TODO: この位置にその他の検証用のコードを追加してください
                    383:     OnSend();
                    384: }
                    385:
                    386: void CWinfepDlg::OnQuit()
                    387: {
                    388:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    389:        CDialog::OnOK();
                    390:
                    391: }
1.6     ! noro      392:
        !           393: void CWinfepDlg::OnIntr()
        !           394: {
        !           395:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           396:        ::SendMessage(asirhwnd,WM_CHAR,0x3,1);
        !           397: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>