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