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

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:                // メモ: この位置に ClassWizard によってメンバの初期化が追加されます。
        !            99:        //}}AFX_DATA_INIT
        !           100:        // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
        !           101:     get_asirhwnd();
        !           102:        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        !           103: }
        !           104:
        !           105: void CWinfepDlg::DoDataExchange(CDataExchange* pDX)
        !           106: {
        !           107:        CDialog::DoDataExchange(pDX);
        !           108:        //{{AFX_DATA_MAP(CWinfepDlg)
        !           109:        DDX_Control(pDX, IDC_AFTER, m_after);
        !           110:        DDX_Control(pDX, IDC_BEFORE, m_before);
        !           111:        DDX_Control(pDX, IDC_CURRENTLINE, m_currentline);
        !           112:        DDX_Control(pDX, IDC_CURRENTFILE, m_currentfile);
        !           113:        //}}AFX_DATA_MAP
        !           114: }
        !           115:
        !           116: BEGIN_MESSAGE_MAP(CWinfepDlg, CDialog)
        !           117:        //{{AFX_MSG_MAP(CWinfepDlg)
        !           118:        ON_WM_SYSCOMMAND()
        !           119:        ON_WM_PAINT()
        !           120:        ON_WM_QUERYDRAGICON()
        !           121:        ON_BN_CLICKED(Send, OnSend)
        !           122:        ON_BN_CLICKED(IDC_FILEOPEN, OnFileopen)
        !           123:        ON_BN_CLICKED(IDC_BUTTON3, OnAsir)
        !           124:        ON_BN_CLICKED(IDC_NEXT, OnNext)
        !           125:        ON_BN_CLICKED(IDC_PREV, OnPrev)
        !           126:        ON_BN_CLICKED(IDC_PREV10, OnPrev10)
        !           127:        ON_BN_CLICKED(IDC_NEXT10, OnNext10)
        !           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: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           218:        if ( !infile ) return;
        !           219:     if ( currentline >= 0 && currentline < nlines ) {
        !           220:       char *line = lineptr[currentline];
        !           221:       for ( int i = 0; line[i]; i++ ) {
        !           222:        if ( line[i] == '\t' )
        !           223:                ::SendMessage(asirhwnd,WM_CHAR,' ',8);
        !           224:        else
        !           225:                ::SendMessage(asirhwnd,WM_CHAR,line[i],1);
        !           226:       }
        !           227:       ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
        !           228:       show_line(++currentline);
        !           229:     } else
        !           230:        show_line(currentline);
        !           231: }
        !           232:
        !           233: void CWinfepDlg::OnChangeFilename()
        !           234: {
        !           235:        // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
        !           236:        // 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
        !           237:        // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
        !           238:        // ライドしない限りこの通知を送りません。
        !           239:
        !           240:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           241:
        !           242:
        !           243: }
        !           244:
        !           245: void CWinfepDlg::OnFileopen()
        !           246: {
        !           247:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           248:        CFileDialog fileDialog(TRUE);
        !           249:        char *prev;
        !           250:        struct _stat fs;
        !           251:        int i,j,n,nl;
        !           252:        if ( fileDialog.DoModal() == IDOK ) {
        !           253:                CString pathName = fileDialog.GetPathName();
        !           254:                if ( infile ) fclose(infile);
        !           255:                infile = fopen(pathName,"r");
        !           256:                m_currentfile.SetWindowText(pathName);
        !           257:                _fstat(_fileno(infile),&fs);
        !           258:                filebuf = (char *)realloc(filebuf,fs.st_size+1);
        !           259:                before = (char *)realloc(before,fs.st_size+1);
        !           260:                after = (char *)realloc(after,fs.st_size+1);
        !           261:                n = fread(filebuf,1,fs.st_size,infile);
        !           262:                filebuf[n] = 0;
        !           263:                for ( nl = 0, i = 0; i < n; i++ )
        !           264:                        if ( filebuf[i] == '\n' ) nl++;
        !           265:                nlines = nl;
        !           266:                lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
        !           267:                prev = filebuf;
        !           268:                for ( i = 0, j = 0; i < n; i++ )
        !           269:                        if ( filebuf[i] == '\n' ) {
        !           270:                                filebuf[i] = 0;
        !           271:                                lineptr[j++] = prev;
        !           272:                                prev = filebuf+i+1;
        !           273:                        }
        !           274:                currentline = 0;
        !           275:                show_line(0);
        !           276:        }
        !           277: }
        !           278:
        !           279: void CWinfepDlg::OnAsir()
        !           280: {
        !           281:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CFileDialog fileDialog(TRUE);
        !           282:        CFileDialog fileDialog(TRUE);
        !           283:        if ( fileDialog.DoModal() == IDOK ) {
        !           284:                CString pathName = fileDialog.GetPathName();
        !           285:                _spawnl(_P_NOWAIT,pathName,pathName,NULL);
        !           286:                Sleep(5000);
        !           287:                get_asirhwnd();
        !           288:        }
        !           289: }
        !           290:
        !           291: #define MAX(a,b) ((a)>(b)?(a):(b))
        !           292: #define MIN(a,b) ((a)<(b)?(a):(b))
        !           293:
        !           294: void CWinfepDlg::show_line(int i)
        !           295: {
        !           296:        int j,nafter,nbefore;
        !           297:        char *cur;
        !           298:
        !           299:        before[0] = after[0] = 0;
        !           300:        nbefore = MIN(5,i);
        !           301:        if ( nbefore < 0 ) nbefore = 0;
        !           302:        for ( j = 0; j < 5-nbefore; j++ )
        !           303:                strcat(before,"\n");
        !           304:        for ( j = i-nbefore; j<i; j++ ) {
        !           305:                strcat(before,lineptr[j]); strcat(before,"\n");
        !           306:        }
        !           307:        nafter = MIN(5,nlines-i-1);
        !           308:        if ( nafter < 0 ) nafter = 0;
        !           309:        for ( j = i+1; j < i+1+nafter; j++ ) {
        !           310:                strcat(after,lineptr[j]); strcat(after,"\n");
        !           311:        }
        !           312:        m_before.SetWindowText(before);
        !           313:        if ( i < 0 ) cur = "<Beginning of File>";
        !           314:        else if ( i == nlines ) cur = "<End of File>";
        !           315:        else cur = lineptr[i];
        !           316:        m_currentline.SetWindowText(cur);
        !           317:        m_after.SetWindowText(after);
        !           318: }
        !           319:
        !           320:
        !           321: void CWinfepDlg::OnNext()
        !           322: {
        !           323:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           324:        if ( !infile ) return;
        !           325:     if ( currentline == nlines ) return;
        !           326:     show_line(++currentline);
        !           327: }
        !           328:
        !           329: void CWinfepDlg::OnPrev()
        !           330: {
        !           331:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           332:        if ( !infile ) return;
        !           333:        if ( currentline < 0 ) return;
        !           334:        show_line(--currentline);
        !           335: }
        !           336:
        !           337: void CWinfepDlg::OnPrev10()
        !           338: {
        !           339:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           340:        if ( !infile ) return;
        !           341:        currentline -= 10;
        !           342:        if ( currentline < 0 ) currentline = -1;
        !           343:        show_line(currentline);
        !           344: }
        !           345:
        !           346: void CWinfepDlg::OnNext10()
        !           347: {
        !           348:        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        !           349:        if ( !infile ) return;
        !           350:     currentline += 10;
        !           351:        if ( currentline >= nlines ) currentline = nlines;
        !           352:        show_line(currentline);
        !           353: }

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