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