=================================================================== RCS file: /home/cvs/OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp,v retrieving revision 1.4 retrieving revision 1.9 diff -u -p -r1.4 -r1.9 --- OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp 2001/04/05 03:09:47 1.4 +++ OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp 2005/03/09 07:34:20 1.9 @@ -8,6 +8,7 @@ #include "asir32guiView.h" #include "FatalDialog.h" #include +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -15,7 +16,8 @@ static char THIS_FILE[] = __FILE__; #endif -const TextBufferSize = 32768; +// const TextBufferSize = 32768; +const TextBufferSize = 16384; CAsir32guiView *theView; @@ -65,6 +67,9 @@ BEGIN_MESSAGE_MAP(CAsir32guiView, CEditView) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(IDR_FONT, OnFont) ON_WM_CREATE() + ON_COMMAND(ID_CONTRIBHELP, OnContribhelp) + ON_UPDATE_COMMAND_UI(ID_CONTRIBHELP, OnUpdateContribhelp) + ON_WM_SIZE() //}}AFX_MSG_MAP // 標準印刷コマンド // ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint) @@ -85,7 +90,7 @@ CAsir32guiView::CAsir32guiView() read_input_history(); DebugMode = 0; DebugInMain = 0; - MaxLineLength = 80; +// MaxLineLength = 80; LogStart = 0; Logging = 0; Logfp = NULL; @@ -164,14 +169,21 @@ CAsir32guiDoc* CAsir32guiView::GetDocument() // 非デバ void CAsir32guiView::PutChar(int c) { - int i; + int i,len; char buf[2]; + if ( EndPos >= sizeof(Buffer)-1 ) { + Beep(); return; + } for ( i = EndPos-1; i >= CurrentPos; i-- ) - Buffer[i+1] = Buffer[i]; + Buffer[i+1] = Buffer[i]; Buffer[CurrentPos] = (char)c; - buf[0] = (char)c; buf[1] = 0; - Insert(buf,FALSE); +// buf[0] = (char)c; buf[1] = 0; +// Insert(buf,FALSE); + len = GetWindowTextLength(); + if ( len+1 >= TextBufferSize ) + DeleteTop(); + CEditView::OnChar(c, 1, 0); CurrentPos++; EndPos++; } @@ -279,34 +291,37 @@ void CAsir32guiView::Beep(void) { } void CAsir32guiView::Paste(void) { - char buf[2*BUFSIZ]; - const char *src; - char c; - int i,j,l; - HGLOBAL hClip; + char buf[2*BUFSIZ]; + const char *src; + char c; + int i,j,l; + HGLOBAL hClip; - if ( asirgui_kind == ASIRGUI_MESSAGE ) { - Beep(); return; - } + if ( asirgui_kind == ASIRGUI_MESSAGE ) { + Beep(); return; + } - if ( OpenClipboard() == FALSE ) { - Beep(); return; + if ( OpenClipboard() == FALSE ) { + Beep(); return; } hClip = GetClipboardData(CF_TEXT); src = (const char *)::GlobalLock(hClip); - if ( !src || (l = strlen(src)) >= 2*BUFSIZ ) { + if ( !src || (l = strlen(src)) >= sizeof(Buffer) ) { ::CloseClipboard(); Beep(); return; } - for ( i = j = 0; i < l; i++ ) - if ( (c = src[i]) != '\n' && c != '\r' ) - buf[j++] = c; - buf[j] = 0; + for ( i = j = 0; i < l; i++ ) + if ( (c = src[i]) != '\n' && c != '\r' ) + buf[j++] = c; + buf[j] = 0; ::GlobalUnlock(hClip); ::CloseClipboard(); + if ( EndPos+j >= sizeof(Buffer)-1 ) { + Beep(); return; + } GetEditCtrl().ReplaceSel(buf); - strncpy(Buffer+EndPos,buf,j); - EndPos += j; CurrentPos = EndPos; + strncpy(Buffer+EndPos,buf,j); + EndPos += j; CurrentPos = EndPos; } #define CTRL(c) (c)&0x1f @@ -510,14 +525,28 @@ void CAsir32guiView::OnEditPaste() Paste(); } +void CAsir32guiView::UpdateMetrics() +{ + TEXTMETRIC tm; + RECT r; + + GetEditCtrl().GetRect(&r); + CDC *pDC = GetDC(); + pDC->SelectObject(GetFont()); + pDC->GetTextMetrics(&tm); + MaxLineLength = (r.right-r.left)/tm.tmAveCharWidth-1; +} + void CAsir32guiView::OnFont() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください int ret; - CFontDialog fd(NULL,CF_EFFECTS | CF_SCREENFONTS | CF_FIXEDPITCHONLY); - static CFont *f = 0; LOGFONT lf; + GetFont()->GetLogFont(&lf); + CFontDialog fd(&lf,CF_EFFECTS | CF_SCREENFONTS | CF_FIXEDPITCHONLY); + static CFont *f = 0; + ret = fd.DoModal(); if ( ret == IDOK ) { fd.GetCurrentFont(&lf); @@ -526,6 +555,7 @@ void CAsir32guiView::OnFont() f = new CFont; f->CreateFontIndirect(&lf); SetFont(f); + UpdateMetrics(); } } @@ -535,7 +565,7 @@ int CAsir32guiView::OnCreate(LPCREATESTRUCT lpCreateSt return -1; // TODO: この位置に固有の作成用コードを追加してください - + LOGFONT logFont; memset(&logFont, 0, sizeof(LOGFONT)); logFont.lfHeight = 20; logFont.lfCharSet = DEFAULT_CHARSET; @@ -543,8 +573,43 @@ int CAsir32guiView::OnCreate(LPCREATESTRUCT lpCreateSt CFont *f = new CFont; f->CreateFontIndirect(&logFont); SetFont(f); + UpdateMetrics(); GetEditCtrl().LimitText(nMaxSize); - GetEditCtrl().SetTabStops(m_nTabStops); + GetEditCtrl().SetTabStops(m_nTabStops); return 0; +} + +void CAsir32guiView::OnContribhelp() +{ + // TODO: この位置にコマンド ハンドラ用のコードを追加してください + char root[BUFSIZ],errmsg[BUFSIZ],helpfile[BUFSIZ]; + + get_rootdir(root,sizeof(root),errmsg); + sprintf(helpfile,"%s\\bin\\cmanhelp.chm",root); + HtmlHelp(NULL, helpfile, HH_DISPLAY_TOPIC, 0); +} + +void CAsir32guiView::OnUpdateContribhelp(CCmdUI* pCmdUI) +{ + // TODO: この位置に command update UI ハンドラ用のコードを追加してください + char root[BUFSIZ],errmsg[BUFSIZ],helpfile[BUFSIZ]; + + if ( getenv("OpenXM_WIN_ROOT") ) { + get_rootdir(root,sizeof(root),errmsg); + sprintf(helpfile,"%s\\bin\\cmanhelp.chm",root); + if ( _access(helpfile,04) != -1 ) { + pCmdUI->Enable( TRUE ); + return; + } + } + pCmdUI->Enable( FALSE ); +} + +void CAsir32guiView::OnSize(UINT nType, int cx, int cy) +{ + CEditView::OnSize(nType, cx, cy); + + // TODO: この位置にメッセージ ハンドラ用のコードを追加してください + UpdateMetrics(); }