[BACK]Return to winfepDlg.cpp CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / windows / winfep

File: [local] / OpenXM_contrib2 / windows / winfep / winfepDlg.cpp (download)

Revision 1.6, Fri Nov 29 08:21:29 2013 UTC (10 years, 5 months ago) by noro
Branch: MAIN
CVS Tags: RELEASE_1_3_1_13b, HEAD
Changes since 1.5: +7 -0 lines

1. Fixed the incorrect behavior of Windows asirgui when Ctrl-C is sent.
2. Interruption is now handled during Hensel lifting int the univariate
   factorizor.

// winfepDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "winfep.h"
#include "winfepDlg.h"
#include <process.h>
#include <sys/stat.h>
#include <sys/types.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

HWND asirhwnd;
FILE *infile;
char *filebuf;
char *before,*after;
int nlines, currentline;
char **lineptr;

extern "C" { 
void get_asirhwnd()
{
	char *temp;
	if ( temp = getenv("TEMP") ) {
		int len;
		char *name;
		FILE *fp;
		len = strlen(temp);
		name = (char *)malloc(len+BUFSIZ);
		sprintf(name,"%s\\asirgui.hnd",temp);
		fp = fopen(name,"r");
		if ( fp ) {
			fscanf(fp,"%d",&asirhwnd);
			fclose(fp);
		}
	}
}


}

/////////////////////////////////////////////////////////////////////////////
// アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// ダイアログ データ
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard は仮想関数のオーバーライドを生成します
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサポート
	//}}AFX_VIRTUAL

// インプリメンテーション
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// メッセージ ハンドラがありません。
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinfepDlg ダイアログ

CWinfepDlg::CWinfepDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CWinfepDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CWinfepDlg)
	//}}AFX_DATA_INIT
	// メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
    get_asirhwnd();
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CWinfepDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CWinfepDlg)
	DDX_Control(pDX, IDC_CURRENTLINE, m_currentline);
	DDX_Control(pDX, IDC_AFTER, m_after);
	DDX_Control(pDX, IDC_BEFORE, m_before);
	DDX_Control(pDX, IDC_CURRENTFILE, m_currentfile);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CWinfepDlg, CDialog)
	//{{AFX_MSG_MAP(CWinfepDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(Send, OnSend)
	ON_BN_CLICKED(IDC_FILEOPEN, OnFileopen)
	ON_BN_CLICKED(IDC_BUTTON3, OnAsir)
	ON_BN_CLICKED(IDC_NEXT, OnNext)
	ON_BN_CLICKED(IDC_PREV, OnPrev)
	ON_BN_CLICKED(IDC_PREV10, OnPrev10)
	ON_BN_CLICKED(IDC_NEXT10, OnNext10)
	ON_BN_CLICKED(IDC_QUIT, OnQuit)
	ON_BN_CLICKED(IDC_INTR, OnIntr)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinfepDlg メッセージ ハンドラ

BOOL CWinfepDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// "バージョン情報..." メニュー項目をシステム メニューへ追加します。

	// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
	// ウィンドウがダイアログでない時は自動的に設定しません。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンを設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンを設定
	
	// TODO: 特別な初期化を行う時はこの場所に追加してください。
	
	return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

void CWinfepDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
// コードを以下に記述する必要があります。MFC アプリケーションは document/view
// モデルを使っているので、この処理はフレームワークにより自動的に処理されます。

void CWinfepDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画用のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// クライアントの矩形領域内の中央
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// アイコンを描画します。
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// システムは、ユーザーが最小化ウィンドウをドラッグしている間、
// カーソルを表示するためにここを呼び出します。
HCURSOR CWinfepDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CWinfepDlg::OnSend() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    int i;
    if ( !infile ) return;
    if ( currentline >= 0 && currentline < nlines ) {
	  CString str;
	  m_currentline.GetWindowText(str);
      LPCSTR line = (LPCSTR)str;
      for ( i = 0; line[i] && isspace(line[i]); i++ );
      if ( line[i] &&
        !strncmp(line+i,"end$",4) || !strncmp(line+i,"end;",4) ) return;

//      for ( i = 0; line[i]; i++ ) {
//	if ( line[i] == '\t' )
//       	::SendMessage(asirhwnd,WM_CHAR,' ',8);
//	else
//       	::SendMessage(asirhwnd,WM_CHAR,line[i],1);
//      }
//      ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
      if ( line[i] ) {
#if 0
        m_currentline.SetSel(0,str.GetLength());
        m_currentline.Copy();
#else
        int len=str.GetLength()+1;
        if (!::OpenClipboard(NULL) ) return;
        HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED,len);
        LPTSTR pMem = (LPTSTR)hMem;
        ::lstrcpy(pMem,(LPCTSTR)line);
        ::EmptyClipboard();
        ::SetClipboardData(CF_TEXT,hMem);
        ::CloseClipboard();
#endif
        ::SendMessage(asirhwnd,WM_CHAR,0x19,1);
      }
      ::SendMessage(asirhwnd,WM_CHAR,'\n',1);
      show_line(++currentline);
    } else
	show_line(currentline);
}

void CWinfepDlg::OnChangeFilename() 
{
	// TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
	// 内での論理和の ENM_CHANGE フラグ付きで CRichEditCrtl().SetEventMask()
	// メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
	// ライドしない限りこの通知を送りません。
	
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	
	
}

void CWinfepDlg::OnFileopen() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CFileDialog fileDialog(TRUE);
	char *prev;
	struct _stat fs;
	int i,j,n,nl;
	if ( fileDialog.DoModal() == IDOK ) {
		CString pathName = fileDialog.GetPathName();
		if ( infile ) fclose(infile);
		infile = fopen(pathName,"r");
		m_currentfile.SetWindowText(pathName);
		_fstat(_fileno(infile),&fs);
		filebuf = (char *)realloc(filebuf,fs.st_size+1);
		before = (char *)realloc(before,fs.st_size+1);
		after = (char *)realloc(after,fs.st_size+1);
		n = fread(filebuf,1,fs.st_size,infile);
		filebuf[n] = 0;
		for ( nl = 0, i = 0; i < n; i++ )
			if ( filebuf[i] == '\n' ) nl++;
		nlines = nl;
		lineptr = (char **)realloc(lineptr,(nl+1)*sizeof(char *));
		prev = filebuf;
		for ( i = 0, j = 0; i < n; i++ )
			if ( filebuf[i] == '\n' ) {
				filebuf[i] = 0;
				lineptr[j++] = prev;
				prev = filebuf+i+1;
			}
		currentline = 0;
		show_line(0);
	}
}

void CWinfepDlg::OnAsir() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください	CFileDialog fileDialog(TRUE);
	CFileDialog fileDialog(TRUE);
	if ( fileDialog.DoModal() == IDOK ) {
		CString pathName = fileDialog.GetPathName();
		_spawnl(_P_NOWAIT,pathName,"asirgui",NULL); 
		Sleep(5000);
		get_asirhwnd();
	}
}

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))

void CWinfepDlg::show_line(int i)
{
	int j,nafter,nbefore;
	char *cur;

	before[0] = after[0] = 0;
	nbefore = MIN(5,i);
	if ( nbefore < 0 ) nbefore = 0;
	for ( j = 0; j < 5-nbefore; j++ )
		strcat(before,"\n");
	for ( j = i-nbefore; j<i; j++ ) {
		strcat(before,lineptr[j]); strcat(before,"\n");
	} 
	nafter = MIN(5,nlines-i-1);
	if ( nafter < 0 ) nafter = 0;
	for ( j = i+1; j < i+1+nafter; j++ ) {
		strcat(after,lineptr[j]); strcat(after,"\n");
	}
	m_before.SetWindowText(before);
	if ( i < 0 ) cur = "<Beginning of File>";
	else if ( i == nlines ) cur = "<End of File>";
	else cur = lineptr[i];	
	m_currentline.SetWindowText(cur);
	m_after.SetWindowText(after);
}


void CWinfepDlg::OnNext() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	if ( !infile ) return;
    if ( currentline == nlines ) return;
    show_line(++currentline);	
}

void CWinfepDlg::OnPrev() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	if ( !infile ) return;
	if ( currentline < 0 ) return;
	show_line(--currentline);
}

void CWinfepDlg::OnPrev10() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	if ( !infile ) return;
	currentline -= 10;
	if ( currentline < 0 ) currentline = -1;
	show_line(currentline);
}

void CWinfepDlg::OnNext10() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	if ( !infile ) return;
    currentline += 10;
	if ( currentline >= nlines ) currentline = nlines;
	show_line(currentline);
}

void CWinfepDlg::OnOK() 
{
	// TODO: この位置にその他の検証用のコードを追加してください
    OnSend();
}

void CWinfepDlg::OnQuit() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CDialog::OnOK();
	
}

void CWinfepDlg::OnIntr() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	::SendMessage(asirhwnd,WM_CHAR,0x3,1);
}