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>