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>