Annotation of OpenXM_contrib2/windows/winfep/winfepDlg.cpp, Revision 1.6
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.6 ! noro 128: ON_BN_CLICKED(IDC_INTR, OnIntr)
1.1 noro 129: //}}AFX_MSG_MAP
130: END_MESSAGE_MAP()
131:
132: /////////////////////////////////////////////////////////////////////////////
133: // CWinfepDlg メッセージ ハンドラ
134:
135: BOOL CWinfepDlg::OnInitDialog()
136: {
137: CDialog::OnInitDialog();
138:
139: // "バージョン情報..." メニュー項目をシステム メニューへ追加します。
140:
141: // IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
142: ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
143: ASSERT(IDM_ABOUTBOX < 0xF000);
144:
145: CMenu* pSysMenu = GetSystemMenu(FALSE);
146: if (pSysMenu != NULL)
147: {
148: CString strAboutMenu;
149: strAboutMenu.LoadString(IDS_ABOUTBOX);
150: if (!strAboutMenu.IsEmpty())
151: {
152: pSysMenu->AppendMenu(MF_SEPARATOR);
153: pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
154: }
155: }
156:
157: // このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
158: // ウィンドウがダイアログでない時は自動的に設定しません。
159: SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
160: SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定
161:
162: // TODO: 特別な初期化を行う時はこの場所に追加してください。
163:
164: return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
165: }
166:
167: void CWinfepDlg::OnSysCommand(UINT nID, LPARAM lParam)
168: {
169: if ((nID & 0xFFF0) == IDM_ABOUTBOX)
170: {
171: CAboutDlg dlgAbout;
172: dlgAbout.DoModal();
173: }
174: else
175: {
176: CDialog::OnSysCommand(nID, lParam);
177: }
178: }
179:
180: // もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
181: // コードを以下に記述する必要があります。MFC アプリケーションは document/view
182: // モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
183:
184: void CWinfepDlg::OnPaint()
185: {
186: if (IsIconic())
187: {
188: CPaintDC dc(this); // 描画用のデバイス コンテキスト
189:
190: SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
191:
192: // クライアントの矩形領域内の中央
193: int cxIcon = GetSystemMetrics(SM_CXICON);
194: int cyIcon = GetSystemMetrics(SM_CYICON);
195: CRect rect;
196: GetClientRect(&rect);
197: int x = (rect.Width() - cxIcon + 1) / 2;
198: int y = (rect.Height() - cyIcon + 1) / 2;
199:
200: // アイコンを描画します。
201: dc.DrawIcon(x, y, m_hIcon);
202: }
203: else
204: {
205: CDialog::OnPaint();
206: }
207: }
208:
209: // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
210: // カーソルを表示するためにここを呼び出します。
211: HCURSOR CWinfepDlg::OnQueryDragIcon()
212: {
213: return (HCURSOR) m_hIcon;
214: }
215:
216: void CWinfepDlg::OnSend()
217: {
218: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
1.3 noro 219: int i;
220: if ( !infile ) return;
1.1 noro 221: if ( currentline >= 0 && currentline < nlines ) {
1.2 noro 222: CString str;
223: m_currentline.GetWindowText(str);
224: LPCSTR line = (LPCSTR)str;
1.3 noro 225: for ( i = 0; line[i] && isspace(line[i]); i++ );
226: if ( line[i] &&
227: !strncmp(line+i,"end$",4) || !strncmp(line+i,"end;",4) ) return;
1.5 noro 228:
229: // for ( i = 0; line[i]; i++ ) {
230: // if ( line[i] == '\t' )
231: // ::SendMessage(asirhwnd,WM_CHAR,' ',8);
232: // else
233: // ::SendMessage(asirhwnd,WM_CHAR,line[i],1);
234: // }
235: // ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
236: if ( line[i] ) {
237: #if 0
238: m_currentline.SetSel(0,str.GetLength());
239: m_currentline.Copy();
240: #else
241: int len=str.GetLength()+1;
242: if (!::OpenClipboard(NULL) ) return;
243: HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED,len);
244: LPTSTR pMem = (LPTSTR)hMem;
245: ::lstrcpy(pMem,(LPCTSTR)line);
246: ::EmptyClipboard();
247: ::SetClipboardData(CF_TEXT,hMem);
248: ::CloseClipboard();
249: #endif
250: ::SendMessage(asirhwnd,WM_CHAR,0x19,1);
1.1 noro 251: }
252: ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
253: show_line(++currentline);
254: } else
255: show_line(currentline);
256: }
257:
258: void CWinfepDlg::OnChangeFilename()
259: {
260: // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
261: // 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
262: // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
263: // ライドしない限りこの通知を送りません。
264:
265: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
266:
267:
268: }
269:
270: void CWinfepDlg::OnFileopen()
271: {
272: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
273: CFileDialog fileDialog(TRUE);
274: char *prev;
275: struct _stat fs;
276: int i,j,n,nl;
277: if ( fileDialog.DoModal() == IDOK ) {
278: CString pathName = fileDialog.GetPathName();
279: if ( infile ) fclose(infile);
280: infile = fopen(pathName,"r");
281: m_currentfile.SetWindowText(pathName);
282: _fstat(_fileno(infile),&fs);
283: filebuf = (char *)realloc(filebuf,fs.st_size+1);
284: before = (char *)realloc(before,fs.st_size+1);
285: after = (char *)realloc(after,fs.st_size+1);
286: n = fread(filebuf,1,fs.st_size,infile);
287: filebuf[n] = 0;
288: for ( nl = 0, i = 0; i < n; i++ )
289: if ( filebuf[i] == '\n' ) nl++;
290: nlines = nl;
291: lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
292: prev = filebuf;
293: for ( i = 0, j = 0; i < n; i++ )
294: if ( filebuf[i] == '\n' ) {
295: filebuf[i] = 0;
296: lineptr[j++] = prev;
297: prev = filebuf+i+1;
298: }
299: currentline = 0;
300: show_line(0);
301: }
302: }
303:
304: void CWinfepDlg::OnAsir()
305: {
306: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CFileDialog fileDialog(TRUE);
307: CFileDialog fileDialog(TRUE);
308: if ( fileDialog.DoModal() == IDOK ) {
309: CString pathName = fileDialog.GetPathName();
1.4 noro 310: _spawnl(_P_NOWAIT,pathName,"asirgui",NULL);
1.1 noro 311: Sleep(5000);
312: get_asirhwnd();
313: }
314: }
315:
316: #define MAX(a,b) ((a)>(b)?(a):(b))
317: #define MIN(a,b) ((a)<(b)?(a):(b))
318:
319: void CWinfepDlg::show_line(int i)
320: {
321: int j,nafter,nbefore;
322: char *cur;
323:
324: before[0] = after[0] = 0;
325: nbefore = MIN(5,i);
326: if ( nbefore < 0 ) nbefore = 0;
327: for ( j = 0; j < 5-nbefore; j++ )
328: strcat(before,"\n");
329: for ( j = i-nbefore; j<i; j++ ) {
330: strcat(before,lineptr[j]); strcat(before,"\n");
331: }
332: nafter = MIN(5,nlines-i-1);
333: if ( nafter < 0 ) nafter = 0;
334: for ( j = i+1; j < i+1+nafter; j++ ) {
335: strcat(after,lineptr[j]); strcat(after,"\n");
336: }
337: m_before.SetWindowText(before);
338: if ( i < 0 ) cur = "<Beginning of File>";
339: else if ( i == nlines ) cur = "<End of File>";
340: else cur = lineptr[i];
341: m_currentline.SetWindowText(cur);
342: m_after.SetWindowText(after);
343: }
344:
345:
346: void CWinfepDlg::OnNext()
347: {
348: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
349: if ( !infile ) return;
350: if ( currentline == nlines ) return;
351: show_line(++currentline);
352: }
353:
354: void CWinfepDlg::OnPrev()
355: {
356: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
357: if ( !infile ) return;
358: if ( currentline < 0 ) return;
359: show_line(--currentline);
360: }
361:
362: void CWinfepDlg::OnPrev10()
363: {
364: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
365: if ( !infile ) return;
366: currentline -= 10;
367: if ( currentline < 0 ) currentline = -1;
368: show_line(currentline);
369: }
370:
371: void CWinfepDlg::OnNext10()
372: {
373: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
374: if ( !infile ) return;
375: currentline += 10;
376: if ( currentline >= nlines ) currentline = nlines;
377: show_line(currentline);
378: }
1.2 noro 379:
380: void CWinfepDlg::OnOK()
381: {
382: // TODO: この位置にその他の検証用のコードを追加してください
383: OnSend();
384: }
385:
386: void CWinfepDlg::OnQuit()
387: {
388: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
389: CDialog::OnOK();
390:
391: }
1.6 ! noro 392:
! 393: void CWinfepDlg::OnIntr()
! 394: {
! 395: // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
! 396: ::SendMessage(asirhwnd,WM_CHAR,0x3,1);
! 397: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>