+ ReleaseDC((HWND) NULL, dc);
+}
+
+bool wxDirExists(const wxString& dir)
+{
+ /* MATTHEW: [6] Always use same code for Win32, call FindClose */
+#if defined(__WIN32__)
+ WIN32_FIND_DATA fileInfo;
+#else
+#ifdef __BORLANDC__
+ struct ffblk fileInfo;
+#else
+ struct find_t fileInfo;
+#endif
+#endif
+
+#if defined(__WIN32__)
+ HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo);
+
+ if (h==INVALID_HANDLE_VALUE)
+ return FALSE;
+ else {
+ FindClose(h);
+ return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
+ }
+#else
+ // In Borland findfirst has a different argument
+ // ordering from _dos_findfirst. But _dos_findfirst
+ // _should_ be ok in both MS and Borland... why not?
+#ifdef __BORLANDC__
+ return ((findfirst(WXSTRINGCAST dir, &fileInfo, _A_SUBDIR) == 0 && (fileInfo.ff_attrib & _A_SUBDIR) != 0));
+#else
+ return (((_dos_findfirst(WXSTRINGCAST dir, _A_SUBDIR, &fileInfo) == 0) && (fileInfo.attrib & _A_SUBDIR)) != 0);
+#endif
+#endif
+}
+
+// ---------------------------------------------------------------------------
+// window information functions
+// ---------------------------------------------------------------------------
+
+wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd)
+{
+ wxString str;
+ int len = GetWindowTextLength((HWND)hWnd) + 1;
+ GetWindowText((HWND)hWnd, str.GetWriteBuf(len), len);
+ str.UngetWriteBuf();
+
+ return str;
+}
+
+wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd)
+{
+ wxString str;
+
+ int len = 256; // some starting value
+
+ for ( ;; )
+ {
+ // as we've #undefined GetClassName we must now manually choose the
+ // right function to call
+ int count =
+
+ #ifndef __WIN32__
+ GetClassName
+ #else // Win32
+ #ifdef UNICODE
+ GetClassNameW
+ #else // !Unicode
+ #ifdef __TWIN32__
+ GetClassName
+ #else // !Twin32
+ GetClassNameA
+ #endif // Twin32/!Twin32
+ #endif // Unicode/ANSI
+ #endif // Win16/32
+ ((HWND)hWnd, str.GetWriteBuf(len), len);
+
+ str.UngetWriteBuf();
+ if ( count == len )
+ {
+ // the class name might have been truncated, retry with larger
+ // buffer
+ len *= 2;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return str;
+}
+
+WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd)
+{
+#ifndef __WIN32__
+ return GetWindowWord((HWND)hWnd, GWW_ID);
+#else // Win32
+ return GetWindowLong((HWND)hWnd, GWL_ID);
+#endif // Win16/32
+}
+
+#if 0
+//------------------------------------------------------------------------
+// wild character routines
+//------------------------------------------------------------------------
+
+bool wxIsWild( const wxString& pattern )
+{
+ wxString tmp = pattern;
+ char *pat = WXSTRINGCAST(tmp);
+ while (*pat) {
+ switch (*pat++) {
+ case '?': case '*': case '[': case '{':
+ return TRUE;
+ case '\\':
+ if (!*pat++)
+ return FALSE;
+ }
+ }
+ return FALSE;
+};
+
+
+bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
+{
+ wxString tmp1 = pat;
+ char *pattern = WXSTRINGCAST(tmp1);
+ wxString tmp2 = text;
+ char *str = WXSTRINGCAST(tmp2);
+ char c;
+ char *cp;
+ bool done = FALSE, ret_code, ok;
+ // Below is for vi fans
+ const char OB = '{', CB = '}';
+
+ // dot_special means '.' only matches '.'
+ if (dot_special && *str == '.' && *pattern != *str)
+ return FALSE;
+
+ while ((*pattern != '\0') && (!done)
+ && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) {
+ switch (*pattern) {
+ case '\\':
+ pattern++;
+ if (*pattern != '\0')
+ pattern++;
+ break;
+ case '*':
+ pattern++;
+ ret_code = FALSE;
+ while ((*str!='\0')
+ && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
+ /*loop*/;
+ if (ret_code) {
+ while (*str != '\0')
+ str++;
+ while (*pattern != '\0')
+ pattern++;
+ }
+ break;
+ case '[':
+ pattern++;
+ repeat:
+ if ((*pattern == '\0') || (*pattern == ']')) {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == '\\') {
+ pattern++;
+ if (*pattern == '\0') {
+ done = TRUE;
+ break;
+ }
+ }
+ if (*(pattern + 1) == '-') {
+ c = *pattern;
+ pattern += 2;
+ if (*pattern == ']') {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == '\\') {
+ pattern++;
+ if (*pattern == '\0') {
+ done = TRUE;
+ break;
+ }
+ }
+ if ((*str < c) || (*str > *pattern)) {
+ pattern++;
+ goto repeat;
+ }
+ } else if (*pattern != *str) {
+ pattern++;
+ goto repeat;
+ }
+ pattern++;
+ while ((*pattern != ']') && (*pattern != '\0')) {
+ if ((*pattern == '\\') && (*(pattern + 1) != '\0'))
+ pattern++;
+ pattern++;
+ }
+ if (*pattern != '\0') {
+ pattern++, str++;
+ }
+ break;
+ case '?':
+ pattern++;
+ str++;
+ break;
+ case OB:
+ pattern++;
+ while ((*pattern != CB) && (*pattern != '\0')) {
+ cp = str;
+ ok = TRUE;
+ while (ok && (*cp != '\0') && (*pattern != '\0')
+ && (*pattern != ',') && (*pattern != CB)) {
+ if (*pattern == '\\')
+ pattern++;
+ ok = (*pattern++ == *cp++);
+ }
+ if (*pattern == '\0') {
+ ok = FALSE;
+ done = TRUE;
+ break;
+ } else if (ok) {
+ str = cp;
+ while ((*pattern != CB) && (*pattern != '\0')) {
+ if (*++pattern == '\\') {
+ if (*++pattern == CB)
+ pattern++;
+ }
+ }
+ } else {
+ while (*pattern!=CB && *pattern!=',' && *pattern!='\0') {
+ if (*++pattern == '\\') {
+ if (*++pattern == CB || *pattern == ',')
+ pattern++;
+ }
+ }
+ }
+ if (*pattern != '\0')
+ pattern++;
+ }
+ break;
+ default:
+ if (*str == *pattern) {
+ str++, pattern++;
+ } else {
+ done = TRUE;
+ }
+ }
+ }
+ while (*pattern == '*')
+ pattern++;
+ return ((*str == '\0') && (*pattern == '\0'));
+};
+
+#endif
+
+#if defined(__WIN95__) && defined(__WXDEBUG__) && wxUSE_DBWIN32
+
+/*
+When I started programming with Visual C++ v4.0, I missed one of my favorite
+tools -- DBWIN. Finding the code for a simple debug trace utility, DBMON,
+on MSDN was a step in the right direction, but it is a console application
+and thus has limited features and extensibility. DBWIN32 is my creation
+to solve this problem.
+
+The code is essentially a merging of a stripped down version of the DBWIN code
+from VC 1.5 and DBMON.C with a few 32 bit changes.
+
+As of version 1.2B, DBWIN32 supports both Win95 and NT. The NT support is
+built into the operating system and works just by running DBWIN32. The Win95
+team decided not to support this hook, so I have provided code that will do
+this for you. See the file WIN95.TXT for instructions on installing this.
+
+If you have questions, problems or suggestions about DBWIN32, I welcome your
+feedback and plan to actively maintain the code.
+
+Andrew Tucker
+ast@halcyon.com
+
+To download dbwin32, see e.g.:
+
+http://ftp.digital.com/pub/micro/NT/WinSite/programr/dbwin32.zip
+*/
+
+#if !defined(__MWERKS__) && !defined(__SALFORDC__) && !defined(__TWIN32__)
+#include <process.h>
+#endif
+
+void OutputDebugStringW95(const wxChar* lpOutputString, ...)
+{
+ HANDLE heventDBWIN; /* DBWIN32 synchronization object */
+ HANDLE heventData; /* data passing synch object */
+ HANDLE hSharedFile; /* memory mapped file shared data */
+ LPSTR lpszSharedMem;
+ wxChar achBuffer[500];
+
+ /* create the output buffer */
+ va_list args;
+ va_start(args, lpOutputString);
+ wxVsprintf(achBuffer, lpOutputString, args);
+ va_end(args);
+
+ /*
+ Do a regular OutputDebugString so that the output is
+ still seen in the debugger window if it exists.
+
+ This ifdef is necessary to avoid infinite recursion
+ from the inclusion of W95TRACE.H
+ */
+#ifdef _UNICODE
+ ::OutputDebugStringW(achBuffer);
+#else
+#ifdef __TWIN32__
+ ::OutputDebugString(achBuffer);
+#else
+ ::OutputDebugStringA(achBuffer);
+#endif
+#endif
+
+ /* bail if it's not Win95 */
+ {
+ OSVERSIONINFO VerInfo;
+ VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&VerInfo);
+ if ( VerInfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS )
+ return;
+ }
+
+ /* make sure DBWIN is open and waiting */
+ heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_BUFFER_READY"));
+ if ( !heventDBWIN )
+ {
+ //MessageBox(NULL, _T("DBWIN_BUFFER_READY nonexistent"), NULL, MB_OK);
+ return;
+ }
+
+ /* get a handle to the data synch object */
+ heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_DATA_READY"));
+ if ( !heventData )
+ {
+ // MessageBox(NULL, _T("DBWIN_DATA_READY nonexistent"), NULL, MB_OK);
+ CloseHandle(heventDBWIN);
+ return;
+ }
+
+ hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, _T("DBWIN_BUFFER"));
+ if (!hSharedFile)
+ {
+ //MessageBox(NULL, _T("DebugTrace: Unable to create file mapping object DBWIN_BUFFER"), _T("Error"), MB_OK);
+ CloseHandle(heventDBWIN);
+ CloseHandle(heventData);
+ return;
+ }
+
+ lpszSharedMem = (LPSTR)MapViewOfFile(hSharedFile, FILE_MAP_WRITE, 0, 0, 512);
+ if (!lpszSharedMem)
+ {
+ //MessageBox(NULL, _T("DebugTrace: Unable to map shared memory"), _T("Error"), MB_OK);
+ CloseHandle(heventDBWIN);
+ CloseHandle(heventData);
+ return;
+ }
+
+ /* wait for buffer event */
+ WaitForSingleObject(heventDBWIN, INFINITE);
+
+ /* write it to the shared memory */
+#if defined( __BORLANDC__ ) || defined( __MWERKS__ ) || defined(__SALFORDC__)
+ *((LPDWORD)lpszSharedMem) = getpid();
+#else
+ *((LPDWORD)lpszSharedMem) = _getpid();
+#endif
+
+ wsprintf((LPTSTR)(lpszSharedMem + sizeof(DWORD)), _T("%s"), achBuffer);
+
+ /* signal data ready event */
+ SetEvent(heventData);
+
+ /* clean up handles */
+ CloseHandle(hSharedFile);
+ CloseHandle(heventData);
+ CloseHandle(heventDBWIN);
+
+ return;
+}
+
+
+#endif
+
+
+#if 0
+
+// maximum mumber of lines the output console should have
+static const WORD MAX_CONSOLE_LINES = 500;
+
+BOOL WINAPI MyConsoleHandler( DWORD dwCtrlType ) { // control signal type
+ FreeConsole();
+ return TRUE;