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

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.1       noro      128:        //}}AFX_MSG_MAP
                    129: END_MESSAGE_MAP()
                    130:
                    131: /////////////////////////////////////////////////////////////////////////////
                    132: // CWinfepDlg メッセージ ハンドラ
                    133:
                    134: BOOL CWinfepDlg::OnInitDialog()
                    135: {
                    136:        CDialog::OnInitDialog();
                    137:
                    138:        // "バージョン情報..." メニュー項目をシステム メニューへ追加します。
                    139:
                    140:        // IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
                    141:        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
                    142:        ASSERT(IDM_ABOUTBOX < 0xF000);
                    143:
                    144:        CMenu* pSysMenu = GetSystemMenu(FALSE);
                    145:        if (pSysMenu != NULL)
                    146:        {
                    147:                CString strAboutMenu;
                    148:                strAboutMenu.LoadString(IDS_ABOUTBOX);
                    149:                if (!strAboutMenu.IsEmpty())
                    150:                {
                    151:                        pSysMenu->AppendMenu(MF_SEPARATOR);
                    152:                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                    153:                }
                    154:        }
                    155:
                    156:        // このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
                    157:        // ウィンドウがダイアログでない時は自動的に設定しません。
                    158:        SetIcon(m_hIcon, TRUE);                 // 大きいアイコンを設定
                    159:        SetIcon(m_hIcon, FALSE);                // 小さいアイコンを設定
                    160:
                    161:        // TODO: 特別な初期化を行う時はこの場所に追加してください。
                    162:
                    163:        return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
                    164: }
                    165:
                    166: void CWinfepDlg::OnSysCommand(UINT nID, LPARAM lParam)
                    167: {
                    168:        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
                    169:        {
                    170:                CAboutDlg dlgAbout;
                    171:                dlgAbout.DoModal();
                    172:        }
                    173:        else
                    174:        {
                    175:                CDialog::OnSysCommand(nID, lParam);
                    176:        }
                    177: }
                    178:
                    179: // もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
                    180: // コードを以下に記述する必要があります。MFC アプリケーションは document/view
                    181: // モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
                    182:
                    183: void CWinfepDlg::OnPaint()
                    184: {
                    185:        if (IsIconic())
                    186:        {
                    187:                CPaintDC dc(this); // 描画用のデバイス コンテキスト
                    188:
                    189:                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
                    190:
                    191:                // クライアントの矩形領域内の中央
                    192:                int cxIcon = GetSystemMetrics(SM_CXICON);
                    193:                int cyIcon = GetSystemMetrics(SM_CYICON);
                    194:                CRect rect;
                    195:                GetClientRect(&rect);
                    196:                int x = (rect.Width() - cxIcon + 1) / 2;
                    197:                int y = (rect.Height() - cyIcon + 1) / 2;
                    198:
                    199:                // アイコンを描画します。
                    200:                dc.DrawIcon(x, y, m_hIcon);
                    201:        }
                    202:        else
                    203:        {
                    204:                CDialog::OnPaint();
                    205:        }
                    206: }
                    207:
                    208: // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
                    209: // カーソルを表示するためにここを呼び出します。
                    210: HCURSOR CWinfepDlg::OnQueryDragIcon()
                    211: {
                    212:        return (HCURSOR) m_hIcon;
                    213: }
                    214:
                    215: void CWinfepDlg::OnSend()
                    216: {
                    217:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
1.3       noro      218:     int i;
                    219:     if ( !infile ) return;
1.1       noro      220:     if ( currentline >= 0 && currentline < nlines ) {
1.2       noro      221:          CString str;
                    222:          m_currentline.GetWindowText(str);
                    223:       LPCSTR line = (LPCSTR)str;
1.3       noro      224:       for ( i = 0; line[i] && isspace(line[i]); i++ );
                    225:       if ( line[i] &&
                    226:         !strncmp(line+i,"end$",4) || !strncmp(line+i,"end;",4) ) return;
                    227:       for ( i = 0; line[i]; i++ ) {
1.1       noro      228:        if ( line[i] == '\t' )
                    229:                ::SendMessage(asirhwnd,WM_CHAR,' ',8);
                    230:        else
                    231:                ::SendMessage(asirhwnd,WM_CHAR,line[i],1);
                    232:       }
                    233:       ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
                    234:       show_line(++currentline);
                    235:     } else
                    236:        show_line(currentline);
                    237: }
                    238:
                    239: void CWinfepDlg::OnChangeFilename()
                    240: {
                    241:        // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
                    242:        // 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
                    243:        // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
                    244:        // ライドしない限りこの通知を送りません。
                    245:
                    246:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    247:
                    248:
                    249: }
                    250:
                    251: void CWinfepDlg::OnFileopen()
                    252: {
                    253:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    254:        CFileDialog fileDialog(TRUE);
                    255:        char *prev;
                    256:        struct _stat fs;
                    257:        int i,j,n,nl;
                    258:        if ( fileDialog.DoModal() == IDOK ) {
                    259:                CString pathName = fileDialog.GetPathName();
                    260:                if ( infile ) fclose(infile);
                    261:                infile = fopen(pathName,"r");
                    262:                m_currentfile.SetWindowText(pathName);
                    263:                _fstat(_fileno(infile),&fs);
                    264:                filebuf = (char *)realloc(filebuf,fs.st_size+1);
                    265:                before = (char *)realloc(before,fs.st_size+1);
                    266:                after = (char *)realloc(after,fs.st_size+1);
                    267:                n = fread(filebuf,1,fs.st_size,infile);
                    268:                filebuf[n] = 0;
                    269:                for ( nl = 0, i = 0; i < n; i++ )
                    270:                        if ( filebuf[i] == '\n' ) nl++;
                    271:                nlines = nl;
                    272:                lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
                    273:                prev = filebuf;
                    274:                for ( i = 0, j = 0; i < n; i++ )
                    275:                        if ( filebuf[i] == '\n' ) {
                    276:                                filebuf[i] = 0;
                    277:                                lineptr[j++] = prev;
                    278:                                prev = filebuf+i+1;
                    279:                        }
                    280:                currentline = 0;
                    281:                show_line(0);
                    282:        }
                    283: }
                    284:
                    285: void CWinfepDlg::OnAsir()
                    286: {
                    287:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CFileDialog fileDialog(TRUE);
                    288:        CFileDialog fileDialog(TRUE);
                    289:        if ( fileDialog.DoModal() == IDOK ) {
                    290:                CString pathName = fileDialog.GetPathName();
1.4     ! noro      291:                _spawnl(_P_NOWAIT,pathName,"asirgui",NULL);
1.1       noro      292:                Sleep(5000);
                    293:                get_asirhwnd();
                    294:        }
                    295: }
                    296:
                    297: #define MAX(a,b) ((a)>(b)?(a):(b))
                    298: #define MIN(a,b) ((a)<(b)?(a):(b))
                    299:
                    300: void CWinfepDlg::show_line(int i)
                    301: {
                    302:        int j,nafter,nbefore;
                    303:        char *cur;
                    304:
                    305:        before[0] = after[0] = 0;
                    306:        nbefore = MIN(5,i);
                    307:        if ( nbefore < 0 ) nbefore = 0;
                    308:        for ( j = 0; j < 5-nbefore; j++ )
                    309:                strcat(before,"\n");
                    310:        for ( j = i-nbefore; j<i; j++ ) {
                    311:                strcat(before,lineptr[j]); strcat(before,"\n");
                    312:        }
                    313:        nafter = MIN(5,nlines-i-1);
                    314:        if ( nafter < 0 ) nafter = 0;
                    315:        for ( j = i+1; j < i+1+nafter; j++ ) {
                    316:                strcat(after,lineptr[j]); strcat(after,"\n");
                    317:        }
                    318:        m_before.SetWindowText(before);
                    319:        if ( i < 0 ) cur = "<Beginning of File>";
                    320:        else if ( i == nlines ) cur = "<End of File>";
                    321:        else cur = lineptr[i];
                    322:        m_currentline.SetWindowText(cur);
                    323:        m_after.SetWindowText(after);
                    324: }
                    325:
                    326:
                    327: void CWinfepDlg::OnNext()
                    328: {
                    329:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    330:        if ( !infile ) return;
                    331:     if ( currentline == nlines ) return;
                    332:     show_line(++currentline);
                    333: }
                    334:
                    335: void CWinfepDlg::OnPrev()
                    336: {
                    337:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    338:        if ( !infile ) return;
                    339:        if ( currentline < 0 ) return;
                    340:        show_line(--currentline);
                    341: }
                    342:
                    343: void CWinfepDlg::OnPrev10()
                    344: {
                    345:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    346:        if ( !infile ) return;
                    347:        currentline -= 10;
                    348:        if ( currentline < 0 ) currentline = -1;
                    349:        show_line(currentline);
                    350: }
                    351:
                    352: void CWinfepDlg::OnNext10()
                    353: {
                    354:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    355:        if ( !infile ) return;
                    356:     currentline += 10;
                    357:        if ( currentline >= nlines ) currentline = nlines;
                    358:        show_line(currentline);
                    359: }
1.2       noro      360:
                    361: void CWinfepDlg::OnOK()
                    362: {
                    363:        // TODO: この位置にその他の検証用のコードを追加してください
                    364:     OnSend();
                    365: }
                    366:
                    367: void CWinfepDlg::OnQuit()
                    368: {
                    369:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    370:        CDialog::OnOK();
                    371:
                    372: }

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