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

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;
1.5     ! noro      227:
        !           228: //      for ( i = 0; line[i]; i++ ) {
        !           229: //     if ( line[i] == '\t' )
        !           230: //             ::SendMessage(asirhwnd,WM_CHAR,' ',8);
        !           231: //     else
        !           232: //             ::SendMessage(asirhwnd,WM_CHAR,line[i],1);
        !           233: //      }
        !           234: //      ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
        !           235:       if ( line[i] ) {
        !           236: #if 0
        !           237:         m_currentline.SetSel(0,str.GetLength());
        !           238:         m_currentline.Copy();
        !           239: #else
        !           240:         int len=str.GetLength()+1;
        !           241:         if (!::OpenClipboard(NULL) ) return;
        !           242:         HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED,len);
        !           243:         LPTSTR pMem = (LPTSTR)hMem;
        !           244:         ::lstrcpy(pMem,(LPCTSTR)line);
        !           245:         ::EmptyClipboard();
        !           246:         ::SetClipboardData(CF_TEXT,hMem);
        !           247:         ::CloseClipboard();
        !           248: #endif
        !           249:         ::SendMessage(asirhwnd,WM_CHAR,0x19,1);
1.1       noro      250:       }
                    251:       ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
                    252:       show_line(++currentline);
                    253:     } else
                    254:        show_line(currentline);
                    255: }
                    256:
                    257: void CWinfepDlg::OnChangeFilename()
                    258: {
                    259:        // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
                    260:        // 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
                    261:        // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
                    262:        // ライドしない限りこの通知を送りません。
                    263:
                    264:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    265:
                    266:
                    267: }
                    268:
                    269: void CWinfepDlg::OnFileopen()
                    270: {
                    271:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    272:        CFileDialog fileDialog(TRUE);
                    273:        char *prev;
                    274:        struct _stat fs;
                    275:        int i,j,n,nl;
                    276:        if ( fileDialog.DoModal() == IDOK ) {
                    277:                CString pathName = fileDialog.GetPathName();
                    278:                if ( infile ) fclose(infile);
                    279:                infile = fopen(pathName,"r");
                    280:                m_currentfile.SetWindowText(pathName);
                    281:                _fstat(_fileno(infile),&fs);
                    282:                filebuf = (char *)realloc(filebuf,fs.st_size+1);
                    283:                before = (char *)realloc(before,fs.st_size+1);
                    284:                after = (char *)realloc(after,fs.st_size+1);
                    285:                n = fread(filebuf,1,fs.st_size,infile);
                    286:                filebuf[n] = 0;
                    287:                for ( nl = 0, i = 0; i < n; i++ )
                    288:                        if ( filebuf[i] == '\n' ) nl++;
                    289:                nlines = nl;
                    290:                lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
                    291:                prev = filebuf;
                    292:                for ( i = 0, j = 0; i < n; i++ )
                    293:                        if ( filebuf[i] == '\n' ) {
                    294:                                filebuf[i] = 0;
                    295:                                lineptr[j++] = prev;
                    296:                                prev = filebuf+i+1;
                    297:                        }
                    298:                currentline = 0;
                    299:                show_line(0);
                    300:        }
                    301: }
                    302:
                    303: void CWinfepDlg::OnAsir()
                    304: {
                    305:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CFileDialog fileDialog(TRUE);
                    306:        CFileDialog fileDialog(TRUE);
                    307:        if ( fileDialog.DoModal() == IDOK ) {
                    308:                CString pathName = fileDialog.GetPathName();
1.4       noro      309:                _spawnl(_P_NOWAIT,pathName,"asirgui",NULL);
1.1       noro      310:                Sleep(5000);
                    311:                get_asirhwnd();
                    312:        }
                    313: }
                    314:
                    315: #define MAX(a,b) ((a)>(b)?(a):(b))
                    316: #define MIN(a,b) ((a)<(b)?(a):(b))
                    317:
                    318: void CWinfepDlg::show_line(int i)
                    319: {
                    320:        int j,nafter,nbefore;
                    321:        char *cur;
                    322:
                    323:        before[0] = after[0] = 0;
                    324:        nbefore = MIN(5,i);
                    325:        if ( nbefore < 0 ) nbefore = 0;
                    326:        for ( j = 0; j < 5-nbefore; j++ )
                    327:                strcat(before,"\n");
                    328:        for ( j = i-nbefore; j<i; j++ ) {
                    329:                strcat(before,lineptr[j]); strcat(before,"\n");
                    330:        }
                    331:        nafter = MIN(5,nlines-i-1);
                    332:        if ( nafter < 0 ) nafter = 0;
                    333:        for ( j = i+1; j < i+1+nafter; j++ ) {
                    334:                strcat(after,lineptr[j]); strcat(after,"\n");
                    335:        }
                    336:        m_before.SetWindowText(before);
                    337:        if ( i < 0 ) cur = "<Beginning of File>";
                    338:        else if ( i == nlines ) cur = "<End of File>";
                    339:        else cur = lineptr[i];
                    340:        m_currentline.SetWindowText(cur);
                    341:        m_after.SetWindowText(after);
                    342: }
                    343:
                    344:
                    345: void CWinfepDlg::OnNext()
                    346: {
                    347:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    348:        if ( !infile ) return;
                    349:     if ( currentline == nlines ) return;
                    350:     show_line(++currentline);
                    351: }
                    352:
                    353: void CWinfepDlg::OnPrev()
                    354: {
                    355:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    356:        if ( !infile ) return;
                    357:        if ( currentline < 0 ) return;
                    358:        show_line(--currentline);
                    359: }
                    360:
                    361: void CWinfepDlg::OnPrev10()
                    362: {
                    363:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    364:        if ( !infile ) return;
                    365:        currentline -= 10;
                    366:        if ( currentline < 0 ) currentline = -1;
                    367:        show_line(currentline);
                    368: }
                    369:
                    370: void CWinfepDlg::OnNext10()
                    371: {
                    372:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    373:        if ( !infile ) return;
                    374:     currentline += 10;
                    375:        if ( currentline >= nlines ) currentline = nlines;
                    376:        show_line(currentline);
                    377: }
1.2       noro      378:
                    379: void CWinfepDlg::OnOK()
                    380: {
                    381:        // TODO: この位置にその他の検証用のコードを追加してください
                    382:     OnSend();
                    383: }
                    384:
                    385: void CWinfepDlg::OnQuit()
                    386: {
                    387:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
                    388:        CDialog::OnOK();
                    389:
                    390: }

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