diff options
Diffstat (limited to 'app/wlib/mswlib/mswtext.c')
-rw-r--r-- | app/wlib/mswlib/mswtext.c | 636 |
1 files changed, 348 insertions, 288 deletions
diff --git a/app/wlib/mswlib/mswtext.c b/app/wlib/mswlib/mswtext.c index 95f6268..293e2b4 100644 --- a/app/wlib/mswlib/mswtext.c +++ b/app/wlib/mswlib/mswtext.c @@ -1,3 +1,25 @@ +/** \file mswtext.c +* Text entry field +*/ + +/* XTrkCad - Model Railroad CAD +* Copyright (C) 2005 Dave Bullis +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + #include <windows.h> #include <string.h> #include <malloc.h> @@ -16,368 +38,406 @@ */ static LOGFONT fixedFont = { - /* Initial default values */ - -18, 0, /* H, W */ - 0, /* A */ - 0, - FW_REGULAR, - 0, 0, 0,/* I, U, SO */ - ANSI_CHARSET, - 0, /* OP */ - 0, /* CP */ - 0, /* Q */ - FIXED_PITCH|FF_MODERN, /* P&F */ - "Courier" }; + /* Initial default values */ + -18, 0, /* H, W */ + 0, /* A */ + 0, + FW_REGULAR, + 0, 0, 0,/* I, U, SO */ + ANSI_CHARSET, + 0, /* OP */ + 0, /* CP */ + 0, /* Q */ + FIXED_PITCH|FF_MODERN, /* P&F */ + "Courier" +}; static HFONT fixedTextFont, prevTextFont; struct wText_t { - WOBJ_COMMON - HANDLE hText; - }; + WOBJ_COMMON + HANDLE hText; +}; BOOL_T textPrintAbort = FALSE; void wTextClear( - wText_p b ) + wText_p b) { - long rc; - rc = SendMessage( b->hWnd, EM_SETREADONLY, 0, 0L ); + long rc; + rc = SendMessage(b->hWnd, EM_SETREADONLY, 0, 0L); #ifdef WIN32 - rc = SendMessage( b->hWnd, EM_SETSEL, 0, -1 ); + rc = SendMessage(b->hWnd, EM_SETSEL, 0, -1); #else - rc = SendMessage( b->hWnd, EM_SETSEL, 1, MAKELONG( 0, -1 ) ); + rc = SendMessage(b->hWnd, EM_SETSEL, 1, MAKELONG(0, -1)); #endif - rc = SendMessage( b->hWnd, WM_CLEAR, 0, 0L ); - if ( b->option&BO_READONLY ) - rc = SendMessage( b->hWnd, EM_SETREADONLY, 1, 0L ); + rc = SendMessage(b->hWnd, WM_CLEAR, 0, 0L); + + if (b->option&BO_READONLY) { + rc = SendMessage(b->hWnd, EM_SETREADONLY, 1, 0L); + } } +/** + * Append text to a multiline text box: + * For every \n a \r is added + * the current text is retrieved from the control + * the new text is appended and then set + * + * \param b IN text box handle + * \param text IN text to add to text box + * \return + */ void wTextAppend( - wText_p b, - const char * text ) + wText_p b, + const char * text) { - HANDLE hMem; - char * pMem, *cp; - int len, textSize; - long rc; - long lc; - len = strlen(text); - if (len <= 0) - return; - for (cp= CAST_AWAY_CONST text; *cp; cp++) { - if ( *cp == '\n' ) - len++; - } - hMem = GlobalAlloc( GHND, (DWORD)len+10+1 ); - pMem = (char*)GlobalLock( hMem ); - for (cp=pMem; *text; cp++,text++) { - if (*text == '\n') { - *cp++ = '\r'; - *cp = '\n'; - } else - *cp = *text; - } - textSize = LocalSize( b->hText ); - if ((long)textSize+(long)len > 10000L) { - if (len < 1024) - len = 1024; -#ifdef WIN32 - rc = SendMessage( b->hWnd, EM_SETSEL, 0, len ); -#else - rc = SendMessage( b->hWnd, EM_SETSEL, 0, MAKELONG( 0, len ) ); -#endif - rc = SendMessage( b->hWnd, WM_CLEAR, 0, 0L ); -#ifdef WIN32 - rc = SendMessage( b->hWnd, EM_SCROLLCARET, 0, 0 ); -#else - rc = SendMessage( b->hWnd, EM_SETSEL, 0, MAKELONG( 32767, 32767 ) ); -#endif - } - lc = SendMessage( b->hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L ); - if ( lc < 0 ) - lc = 0; - GlobalUnlock( hMem ); - rc = OpenClipboard( b->hWnd ); - rc = EmptyClipboard(); - rc = (long)SetClipboardData( CF_TEXT, hMem ); - rc = CloseClipboard(); - rc = SendMessage( b->hWnd, EM_SETREADONLY, 0, 0L ); - rc = SendMessage( b->hWnd, WM_PASTE, 0, 0L ); - lc -= SendMessage( b->hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L ); -#ifdef LATER - if ( lc < 0 ) - SendMessage( b->hWnd, EM_LINESCROLL, 0, MAKELPARAM((WPARAM)lc,0) ); -#endif - lc = GetWindowTextLength( b->hWnd ); - if ( b->option&BO_READONLY ) - rc = SendMessage( b->hWnd, EM_SETREADONLY, 1, 0L ); + char *cp; + char *buffer; + char *extText; + int textSize; + int len = strlen(text); + + if (!len) { + return; + } + + for (cp = (char *)text; *cp; cp++) { + if (*cp == '\n') { + len++; + } + } + + extText = malloc(len + 1 + 10); + + for (cp=extText; *text; cp++,text++) { + if (*text == '\n') { + *cp++ = '\r'; + *cp = '\n'; + } else { + *cp = *text; + } + } + + *cp = '\0'; + textSize = GetWindowTextLength(b->hWnd); + buffer = malloc((textSize + len + 1) * sizeof(char)); + + if (buffer) { + GetWindowText(b->hWnd, buffer, textSize + 1); + strcat(buffer, extText); + SetWindowText(b->hWnd, buffer); + free(extText); + free(buffer); + } else { + abort(); + } + + if (b->option&BO_READONLY) { + SendMessage(b->hWnd, EM_SETREADONLY, 1, 0L); + } } BOOL_T wTextSave( - wText_p b, - const char * fileName ) + wText_p b, + const char * fileName) { - FILE * f; - int lc, l, len; - char line[255]; - - f = wFileOpen( fileName, "w" ); - if (f == NULL) { - MessageBox( ((wControl_p)(b->parent))->hWnd, "TextSave", "", MB_OK|MB_ICONHAND ); - return FALSE; - } - - lc = (int)SendMessage( b->hWnd, EM_GETLINECOUNT, 0, 0L ); - - for ( l=0; l<lc; l++ ) { - *(WORD*)line = sizeof(line)-1; - len = (int)SendMessage( b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line ); - line[len] = '\0'; - fprintf( f, "%s\n", line ); - } - fclose( f ); - return TRUE; + FILE * f; + int lc, l, len; + char line[255]; + f = wFileOpen(fileName, "w"); + + if (f == NULL) { + MessageBox(((wControl_p)(b->parent))->hWnd, "TextSave", "", MB_OK|MB_ICONHAND); + return FALSE; + } + + lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L); + + for (l=0; l<lc; l++) { + *(WORD*)line = sizeof(line)-1; + len = (int)SendMessage(b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line); + line[len] = '\0'; + fprintf(f, "%s\n", line); + } + + fclose(f); + return TRUE; } BOOL_T wTextPrint( - wText_p b ) + wText_p b) { - int lc, l, len; - char line[255]; - HDC hDc; - int lineSpace; - int linesPerPage; - int currentLine; - int IOStatus; - TEXTMETRIC textMetric; - DOCINFO docInfo; - - hDc = mswGetPrinterDC(); - if (hDc == (HDC)0) { - MessageBox( ((wControl_p)(b->parent))->hWnd, "Print", "Cannot print", MB_OK|MB_ICONHAND ); - return FALSE; - } - docInfo.cbSize = sizeof(DOCINFO); - docInfo.lpszDocName = "XTrkcad Log"; - docInfo.lpszOutput = (LPSTR)NULL; - if (StartDoc(hDc, &docInfo) < 0) { - MessageBox( ((wControl_p)(b->parent))->hWnd, "Unable to start print job", NULL, MB_OK|MB_ICONHAND ); - DeleteDC( hDc ); - return FALSE; - } - StartPage( hDc ); - GetTextMetrics( hDc, &textMetric ); - lineSpace = textMetric.tmHeight + textMetric.tmExternalLeading; - linesPerPage = GetDeviceCaps( hDc, VERTRES ) / lineSpace; - currentLine = 1; - - lc = (int)SendMessage( b->hWnd, EM_GETLINECOUNT, 0, 0L ); - - IOStatus = 0; - for ( l=0; l<lc; l++ ) { - *(WORD*)line = sizeof(line)-1; - len = (int)SendMessage( b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line ); - TextOut( hDc, 0, currentLine*lineSpace, line, len ); - if (++currentLine > linesPerPage) { - EndPage( hDc ); + int lc, l, len; + char line[255]; + HDC hDc; + int lineSpace; + int linesPerPage; + int currentLine; + int IOStatus; + TEXTMETRIC textMetric; + DOCINFO docInfo; + hDc = mswGetPrinterDC(); + HFONT hFont, hOldFont; + + if (hDc == (HDC)0) { + MessageBox(((wControl_p)(b->parent))->hWnd, "Print", "Cannot print", + MB_OK|MB_ICONHAND); + return FALSE; + } + + docInfo.cbSize = sizeof(DOCINFO); + docInfo.lpszDocName = "XTrkcad Log"; + docInfo.lpszOutput = (LPSTR)NULL; + + // Retrieve a handle to the monospaced stock font. + hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT); + hOldFont = (HFONT)SelectObject(hDc, hFont); + + if (StartDoc(hDc, &docInfo) < 0) { + MessageBox(((wControl_p)(b->parent))->hWnd, "Unable to start print job", NULL, + MB_OK|MB_ICONHAND); + DeleteDC(hDc); + return FALSE; + } + + StartPage(hDc); + + GetTextMetrics(hDc, &textMetric); + lineSpace = textMetric.tmHeight + textMetric.tmExternalLeading; + linesPerPage = GetDeviceCaps(hDc, VERTRES) / lineSpace; + currentLine = 1; + lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L); + IOStatus = 0; + + for (l=0; l<lc; l++) { + *(WORD*)line = sizeof(line)-1; + len = (int)SendMessage(b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line); + TextOut(hDc, 0, currentLine*lineSpace, line, len); + + if (++currentLine > linesPerPage) { + IOStatus = EndPage(hDc); + if (IOStatus < 0 || textPrintAbort) { + break; + } + StartPage(hDc); currentLine = 1; - IOStatus = EndPage(hDc); - if (IOStatus < 0 || textPrintAbort ) - break; - StartPage( hDc ); } - } - if (IOStatus >= 0 && !textPrintAbort ) { - EndPage( hDc ); - EndDoc( hDc ); - } - DeleteDC( hDc ); - return TRUE; + } + + if (IOStatus >= 0 && !textPrintAbort) { + EndPage(hDc); + EndDoc(hDc); + } + + SelectObject(hDc, hOldFont); + DeleteDC(hDc); + return TRUE; } wBool_t wTextGetModified( - wText_p b ) + wText_p b) { - int rc; - rc = (int)SendMessage( b->hWnd, EM_GETMODIFY, 0, 0L ); - return (wBool_t)rc; + int rc; + rc = (int)SendMessage(b->hWnd, EM_GETMODIFY, 0, 0L); + return (wBool_t)rc; } int wTextGetSize( - wText_p b ) + wText_p b) { - int lc, l, li, len=0; - lc = (int)SendMessage( b->hWnd, EM_GETLINECOUNT, 0, 0L ); - for ( l=0; l<lc ; l++ ) { - li = (int)SendMessage( b->hWnd, EM_LINEINDEX, l, 0L ); - len += (int)SendMessage( b->hWnd, EM_LINELENGTH, l, 0L ) + 1; - } - if ( len == 1 ) - len = 0; - return len; + int lc, l, len=0; + lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L); + + for (l=0; l<lc ; l++) { + int charIndex = (int)SendMessage(b->hWnd, EM_LINEINDEX, l, 0L); + len += (int)SendMessage(b->hWnd, EM_LINELENGTH, charIndex, 0L) + 1; + } + + if (len == 1) { + len = 0; + } + + return len; } void wTextGetText( - wText_p b, - char * t, - int s ) + wText_p b, + char * t, + int s) { - int lc, l, len; - s--; - lc = (int)SendMessage( b->hWnd, EM_GETLINECOUNT, 0, 0L ); - for ( l=0; l<lc && s>=0; l++ ) { - *(WORD*)t = s; - len = (int)SendMessage( b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)t ); - t += len; - *t++ = '\n'; - s -= len+1; - } - *t++ = '\0'; + int lc, l, len; + s--; + lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L); + + for (l=0; l<lc && s>=0; l++) { + *(WORD*)t = s; + len = (int)SendMessage(b->hWnd, EM_GETLINE, l, (LPARAM)t); + t += len; + *t++ = '\n'; + s -= len+1; + } + + *(t - 1) = '\0'; // overwrite the last \n added } void wTextSetReadonly( - wText_p b, - wBool_t ro ) + wText_p b, + wBool_t ro) { - if (ro) - b->option |= BO_READONLY; - else - b->option &= ~BO_READONLY; - SendMessage( b->hWnd, EM_SETREADONLY, ro, 0L ); + if (ro) { + b->option |= BO_READONLY; + } else { + b->option &= ~BO_READONLY; + } + + SendMessage(b->hWnd, EM_SETREADONLY, ro, 0L); } void wTextSetSize( - wText_p bt, - wPos_t width, - wPos_t height ) + wText_p bt, + wPos_t width, + wPos_t height) { - bt->w = width; - bt->h = height; - if (!SetWindowPos( bt->hWnd, HWND_TOP, 0, 0, - bt->w, bt->h, SWP_NOMOVE|SWP_NOZORDER)) { - mswFail("wTextSetSize: SetWindowPos"); - } + bt->w = width; + bt->h = height; + + if (!SetWindowPos(bt->hWnd, HWND_TOP, 0, 0, + bt->w, bt->h, SWP_NOMOVE|SWP_NOZORDER)) { + mswFail("wTextSetSize: SetWindowPos"); + } } void wTextComputeSize( - wText_p bt, - int rows, - int lines, - wPos_t * w, - wPos_t * h ) + wText_p bt, + int rows, + int lines, + wPos_t * w, + wPos_t * h) { - static wPos_t scrollV_w = -1; - static wPos_t scrollH_h = -1; - HDC hDc; - TEXTMETRIC metrics; - - if (scrollV_w < 0) - scrollV_w = GetSystemMetrics( SM_CXVSCROLL ); - if (scrollH_h < 0) - scrollH_h = GetSystemMetrics( SM_CYHSCROLL ); - hDc = GetDC( bt->hWnd ); - GetTextMetrics( hDc, &metrics ); - *w = rows * metrics.tmAveCharWidth + scrollV_w; - *h = lines * (metrics.tmHeight + metrics.tmExternalLeading); - ReleaseDC( bt->hWnd, hDc ); - if (bt->option&BT_HSCROLL) - *h += scrollH_h; + static wPos_t scrollV_w = -1; + static wPos_t scrollH_h = -1; + HDC hDc; + TEXTMETRIC metrics; + + if (scrollV_w < 0) { + scrollV_w = GetSystemMetrics(SM_CXVSCROLL); + } + + if (scrollH_h < 0) { + scrollH_h = GetSystemMetrics(SM_CYHSCROLL); + } + + hDc = GetDC(bt->hWnd); + GetTextMetrics(hDc, &metrics); + *w = rows * metrics.tmAveCharWidth + scrollV_w; + *h = lines * (metrics.tmHeight + metrics.tmExternalLeading); + ReleaseDC(bt->hWnd, hDc); + + if (bt->option&BT_HSCROLL) { + *h += scrollH_h; + } } void wTextSetPosition( - wText_p bt, - int pos ) + wText_p bt, + int pos) { - long rc; - rc = SendMessage( bt->hWnd, EM_LINESCROLL, 0, MAKELONG( -65535, 0 ) ); + long rc; + rc = SendMessage(bt->hWnd, EM_LINESCROLL, 0, MAKELONG(-65535, 0)); } -static void textDoneProc( wControl_p b ) +static void textDoneProc(wControl_p b) { - wText_p t = (wText_p)b; - HDC hDc; - hDc = GetDC( t->hWnd ); - SelectObject( hDc, mswOldTextFont ); - ReleaseDC( t->hWnd, hDc ); + wText_p t = (wText_p)b; + HDC hDc; + hDc = GetDC(t->hWnd); + SelectObject(hDc, mswOldTextFont); + ReleaseDC(t->hWnd, hDc); } static callBacks_t textCallBacks = { - mswRepaintLabel, - textDoneProc, - NULL }; + mswRepaintLabel, + textDoneProc, + NULL +}; wText_p wTextCreate( - wWin_p parent, - POS_T x, - POS_T y, - const char * helpStr, - const char * labelStr, - long option, - POS_T width, - POS_T height ) + wWin_p parent, + POS_T x, + POS_T y, + const char * helpStr, + const char * labelStr, + long option, + POS_T width, + POS_T height) { - wText_p b; - DWORD style; - RECT rect; - int index; - - b = mswAlloc( parent, B_TEXT, labelStr, sizeof *b, NULL, &index ); - mswComputePos( (wControl_p)b, x, y ); - b->option = option; - style = ES_MULTILINE | ES_LEFT | ES_AUTOVSCROLL | ES_WANTRETURN | - WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL; + wText_p b; + DWORD style; + RECT rect; + int index; + b = mswAlloc(parent, B_TEXT, labelStr, sizeof *b, NULL, &index); + mswComputePos((wControl_p)b, x, y); + b->option = option; + style = ES_MULTILINE | ES_LEFT | ES_AUTOVSCROLL | ES_WANTRETURN | + WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL; #ifdef BT_HSCROLL - if (option & BT_HSCROLL) - style |= WS_HSCROLL | ES_AUTOHSCROLL; + + if (option & BT_HSCROLL) { + style |= WS_HSCROLL | ES_AUTOHSCROLL; + } + #endif -/* if (option & BO_READONLY) - style |= ES_READONLY;*/ - - b->hWnd = CreateWindow( "EDIT", NULL, - style, b->x, b->y, - width, height, - ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL ); - if (b->hWnd == NULL) { - mswFail("CreateWindow(TEXT)"); - return b; - } + /* if (option & BO_READONLY) + style |= ES_READONLY;*/ + b->hWnd = CreateWindow("EDIT", NULL, + style, b->x, b->y, + width, height, + ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL); + + if (b->hWnd == NULL) { + mswFail("CreateWindow(TEXT)"); + return b; + } + #ifdef CONTROL3D - Ctl3dSubclassCtl( b->hWnd ); + Ctl3dSubclassCtl(b->hWnd); #endif - if (option & BT_FIXEDFONT) { - if (fixedTextFont == (HFONT)0) - fixedTextFont = CreateFontIndirect( &fixedFont ); - SendMessage( b->hWnd, WM_SETFONT, (WPARAM)fixedTextFont, (LPARAM)MAKELONG( 1, 0 ) ); - } else if ( !mswThickFont ) { - SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L ); - } - - b->hText = (HANDLE)SendMessage( b->hWnd, EM_GETHANDLE, 0, 0L ); - - if (option & BT_CHARUNITS) { - wPos_t w, h; - wTextComputeSize( b, width, height, &w, &h ); - if (!SetWindowPos( b->hWnd, HWND_TOP, 0, 0, - w, h, SWP_NOMOVE|SWP_NOZORDER)) { - mswFail("wTextCreate: SetWindowPos"); - } - } - - GetWindowRect( b->hWnd, &rect ); - b->w = rect.right - rect.left; - b->h = rect.bottom - rect.top; - - mswAddButton( (wControl_p)b, FALSE, helpStr ); - mswCallBacks[B_TEXT] = &textCallBacks; - return b; + if (option & BT_FIXEDFONT) { + if (fixedTextFont == (HFONT)0) { + fixedTextFont = CreateFontIndirect(&fixedFont); + } + + SendMessage(b->hWnd, WM_SETFONT, (WPARAM)fixedTextFont, (LPARAM)MAKELONG(1, 0)); + } else if (!mswThickFont) { + SendMessage(b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L); + } + + b->hText = (HANDLE)SendMessage(b->hWnd, EM_GETHANDLE, 0, 0L); + + if (option & BT_CHARUNITS) { + wPos_t w, h; + wTextComputeSize(b, width, height, &w, &h); + + if (!SetWindowPos(b->hWnd, HWND_TOP, 0, 0, + w, h, SWP_NOMOVE|SWP_NOZORDER)) { + mswFail("wTextCreate: SetWindowPos"); + } + } + + GetWindowRect(b->hWnd, &rect); + b->w = rect.right - rect.left; + b->h = rect.bottom - rect.top; + mswAddButton((wControl_p)b, FALSE, helpStr); + mswCallBacks[B_TEXT] = &textCallBacks; + return b; } |