From 19193a2c85987b595932957e73013e7ea100f0e8 Mon Sep 17 00:00:00 2001 From: Kendall Bennett Date: Wed, 17 Oct 2001 22:25:56 +0000 Subject: [PATCH] Mutiple updates from SciTech for wxWindows including the following: 1. Updates to HTML applet classes in client side include syntax 2. Updates to wxUniversal for OS/2 3. Updates for better palette management on Windows 4. Misc other fixes and changes to fix build system for Watcom 11.0 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12045 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/applet/prepinclude.h | 8 +- contrib/include/wx/applet/window.h | 54 +-- contrib/src/applet/appletwindow.cpp | 123 +++++-- contrib/src/applet/prepecho.cpp | 7 +- contrib/src/applet/prepifelse.cpp | 243 +++++++++++-- contrib/src/applet/prepinclude.cpp | 15 +- include/wx/defs.h | 30 +- include/wx/generic/panelg.h | 2 + include/wx/html/htmlwin.h | 1 + include/wx/html/winpars.h | 7 +- include/wx/msw/private.h | 2 +- include/wx/os2/app.h | 9 + include/wx/os2/colour.h | 2 + include/wx/os2/dialog.h | 1 + include/wx/os2/font.h | 14 +- include/wx/os2/frame.h | 5 +- include/wx/os2/notebook.h | 1 - include/wx/os2/region.h | 2 +- include/wx/os2/window.h | 6 + include/wx/popupwin.h | 4 +- include/wx/univ/setup.h | 160 ++++++++- samples/minimal/minimal.rcO | 6 +- src/common/event.cpp | 2 + src/common/extended.c | 1 + src/common/file.cpp | 3 + src/common/filefn.cpp | 79 +++-- src/common/imagtiff.cpp | 20 +- src/common/quantize.cpp | 365 ++++++++++--------- src/common/timercmn.cpp | 4 +- src/common/unzip.c | 6 +- src/generic/panelg.cpp | 7 + src/html/htmlwin.cpp | 4 +- src/msw/bitmap.cpp | 3 + src/msw/dc.cpp | 25 +- src/msw/gaugemsw.cpp | 50 +-- src/msw/ownerdrw.cpp | 2 +- src/msw/utilsexc.cpp | 6 +- src/os2/app.cpp | 33 +- src/os2/clipbrd.cpp | 4 + src/os2/dc.cpp | 3 +- src/os2/dcclient.cpp | 4 +- src/os2/dialog.cpp | 2 +- src/os2/dir.cpp | 1 + src/os2/dirdlg.cpp | 1 - src/os2/font.cpp | 15 + src/os2/fontenum.cpp | 3 + src/os2/fontutil.cpp | 6 +- src/os2/frame.cpp | 22 +- src/os2/gdiimage.cpp | 2 + src/os2/gsocket.c | 41 +-- src/os2/pnghand.cpp | 8 +- src/os2/region.cpp | 14 +- src/os2/settings.cpp | 1 + src/os2/textctrl.cpp | 3 +- src/os2/thread.cpp | 3 + src/os2/utils.cpp | 53 ++- src/os2/window.cpp | 454 +++++++++++++++--------- src/os2/xpmhand.cpp | 2 +- src/univ/framuniv.cpp | 9 +- src/univ/scrarrow.cpp | 4 +- src/univ/theme.cpp | 2 + src/univ/winuniv.cpp | 2 + 62 files changed, 1311 insertions(+), 660 deletions(-) diff --git a/contrib/include/wx/applet/prepinclude.h b/contrib/include/wx/applet/prepinclude.h index 12cb6d7e79..21178334d1 100644 --- a/contrib/include/wx/applet/prepinclude.h +++ b/contrib/include/wx/applet/prepinclude.h @@ -41,10 +41,9 @@ wxIncludePrep class Definition class wxIncludePrep : public wxHtmlProcessor { private: //DECLARE_DYNAMIC_CLASS(wxIncludePrep); - wxString DOC_ROOT; - + wxFileSystem *m_FS; public: - wxIncludePrep() : wxHtmlProcessor() {DOC_ROOT = wxString("");} + wxIncludePrep() : wxHtmlProcessor() {} ~wxIncludePrep() {} // Process input text and return processed result @@ -54,8 +53,7 @@ public: // is the processor applied to the text. int GetPriority() const { return wxHTML_PRIORITY_SYSTEM; } - void ChangeDirectory(const wxString &dir); - wxString GetDirectory() { return DOC_ROOT; } + void ChangeDirectory(wxFileSystem *); }; diff --git a/contrib/include/wx/applet/window.h b/contrib/include/wx/applet/window.h index 753fac62d6..e8aac05b14 100644 --- a/contrib/include/wx/applet/window.h +++ b/contrib/include/wx/applet/window.h @@ -5,23 +5,19 @@ * Copyright (C) 1991-2001 SciTech Software, Inc. * All rights reserved. * -* ====================================================================== -* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| -* | | -* |This copyrighted computer code is a proprietary trade secret of | -* |SciTech Software, Inc., located at 505 Wall Street, Chico, CA 95928 | -* |USA (www.scitechsoft.com). ANY UNAUTHORIZED POSSESSION, USE, | -* |VIEWING, COPYING, MODIFICATION OR DISSEMINATION OF THIS CODE IS | -* |STRICTLY PROHIBITED BY LAW. Unless you have current, express | -* |written authorization from SciTech to possess or use this code, you | -* |may be subject to civil and/or criminal penalties. | -* | | -* |If you received this code in error or you would like to report | -* |improper use, please immediately contact SciTech Software, Inc. at | -* |530-894-8400. | -* | | -* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| -* ====================================================================== +* ======================================================================== +* +* The contents of this file are subject to the wxWindows License +* Version 3.0 (the "License"); you may not use this file except in +* compliance with the License. You may obtain a copy of the License at +* http://www.wxwindows.org/licence3.txt +* +* Software distributed under the License is distributed on an +* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +* implied. See the License for the specific language governing +* rights and limitations under the License. +* +* ======================================================================== * * Language: ANSI C++ * Environment: Any @@ -66,6 +62,8 @@ public: wxString& group, wxString& href ); + VirtualData(); + // Gets wxString GetName(){ return m_name;}; wxString GetGroup(){ return m_group;}; @@ -88,15 +86,21 @@ private: DECLARE_CLASS(wxHtmlAppletWindow); DECLARE_EVENT_TABLE(); - bool m_mutexLock; - wxIncludePrep *incPreprocessor; // deleted by list it is added too in constructor + bool m_mutexLock; + wxIncludePrep *incPreprocessor; // deleted by list it is added too in constructor + protected: wxAppletList m_AppletList; static wxHashTable m_Cookies; + bool m_NavBarEnabled; wxToolBarBase *m_NavBar; int m_NavBackId; int m_NavForwardId; - wxString m_DocRoot; + wxPalette m_globalPalette; + + // Override this so we can do proper palette management!! + virtual void OnDraw(wxDC& dc); + public: // Constructor wxHtmlAppletWindow( @@ -109,7 +113,7 @@ public: const wxSize& size = wxDefaultSize, long style = wxHW_SCROLLBAR_AUTO, const wxString& name = "htmlAppletWindow", - const wxString& docroot = "" ); + const wxPalette& globalPalette = wxNullPalette); // Destructor ~wxHtmlAppletWindow(); @@ -142,6 +146,14 @@ public: // Handles backwards navigation within the HTML stack bool HistoryBack(); + // Disables Nav bars + void DisableNavBar(); + + // Enables Nav bars + void EnableNavBar(); + + void SetNavBar(wxToolBarBase *navBar); + // Broadcast a message to all applets on the page void SendMessage(wxEvent& msg); diff --git a/contrib/src/applet/appletwindow.cpp b/contrib/src/applet/appletwindow.cpp index 6c6d5895da..cd9cc4e7dc 100644 --- a/contrib/src/applet/appletwindow.cpp +++ b/contrib/src/applet/appletwindow.cpp @@ -5,23 +5,19 @@ * Copyright (C) 1991-2001 SciTech Software, Inc. * All rights reserved. * -* ====================================================================== -* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| -* | | -* |This copyrighted computer code is a proprietary trade secret of | -* |SciTech Software, Inc., located at 505 Wall Street, Chico, CA 95928 | -* |USA (www.scitechsoft.com). ANY UNAUTHORIZED POSSESSION, USE, | -* |VIEWING, COPYING, MODIFICATION OR DISSEMINATION OF THIS CODE IS | -* |STRICTLY PROHIBITED BY LAW. Unless you have current, express | -* |written authorization from SciTech to possess or use this code, you | -* |may be subject to civil and/or criminal penalties. | -* | | -* |If you received this code in error or you would like to report | -* |improper use, please immediately contact SciTech Software, Inc. at | -* |530-894-8400. | -* | | -* |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| -* ====================================================================== +* ======================================================================== +* +* The contents of this file are subject to the wxWindows License +* Version 3.0 (the "License"); you may not use this file except in +* compliance with the License. You may obtain a copy of the License at +* http://www.wxwindows.org/licence3.txt +* +* Software distributed under the License is distributed on an +* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +* implied. See the License for the specific language governing +* rights and limitations under the License. +* +* ======================================================================== * * Language: ANSI C++ * Environment: Any @@ -88,24 +84,27 @@ wxHtmlAppletWindow::wxHtmlAppletWindow( const wxSize& size, long style, const wxString& name, - const wxString& docroot ) - : wxHtmlWindow(parent,id,pos,size,style,name) + const wxPalette& globalPalette) + : wxHtmlWindow(parent,id,pos,size,style,name), m_globalPalette(globalPalette) { // Init our locks UnLock(); // setup client navbars if (navBar) { + m_NavBarEnabled = true; m_NavBar = navBar; m_NavBackId = navBackId; m_NavForwardId = navForwardId; } else { + m_NavBarEnabled = false; m_NavBar = NULL; } - // Set up docroot - m_DocRoot = docroot; + m_NavBackId = navBackId; + m_NavForwardId = navForwardId; + // Set the key_type for applets m_AppletList = wxAppletList(wxKEY_STRING); @@ -114,7 +113,7 @@ wxHtmlAppletWindow::wxHtmlAppletWindow( // deleting preprocessors is done by the code within the window incPreprocessor = new wxIncludePrep(); // #include preprocessor - incPreprocessor->ChangeDirectory(m_DocRoot); + incPreprocessor->ChangeDirectory(m_FS); // give it access to our filesys object wxEchoPrep * echoPreprocessor = new wxEchoPrep(); // #echo preprocessor wxIfElsePrep * ifPreprocessor = new wxIfElsePrep(); @@ -132,6 +131,27 @@ wxHtmlAppletWindow::~wxHtmlAppletWindow() { } +#include "scitech.h" + +/**************************************************************************** +PARAMETERS: +dc - wxDC object to draw on + +REMARKS: +This function handles drawing the HTML applet window. Because the standard +wxWindows classes don't properly handle palette management, we add code +in here to properly select the global palette that we use for all drawing +into the DC before we allow the regular wxWindows code to finish the +drawing process. +****************************************************************************/ +void wxHtmlAppletWindow::OnDraw( + wxDC& dc) +{ + // TODO: Only do this for <= 8bpp modes! + dc.SetPalette(m_globalPalette); + wxHtmlWindow::OnDraw(dc); +} + /**************************************************************************** PARAMETERS: className - Name of the applet class to create an object for @@ -263,24 +283,11 @@ True if page loaded successfully, false if not REMARKS: Remove an applet from the manager. Called during applet destruction ****************************************************************************/ -#include "scitech" bool wxHtmlAppletWindow::LoadPage( const wxString& link) { wxString href(link); - // TODO: technically we allow no relative paths - - // Check to see if it is a real url, if not it is a file - if (link.Mid(0, 5).CmpNoCase("http:") != 0) { - - // Check for abs path. If it is not then tack on the path - // supplied at creation. - // TODO: Abs paths are only used in testing (remove this) - if (link.GetChar(1) != ':') - href = m_DocRoot + href; - } - if (link.GetChar(0) == '?'){ wxString cmd = link.BeforeFirst('='); wxString cmdValue = link.AfterFirst('='); @@ -329,11 +336,12 @@ bool wxHtmlAppletWindow::LoadPage( for (wxAppletList::Node *node = m_AppletList.GetFirst(); node; node = node->GetNext()) (node->GetData())->OnLinkClicked(wxHtmlLinkInfo(href)); Show(false); + bool stat = wxHtmlWindow::LoadPage(href); Show(true); // Enable/Dis the navbar tools - if (m_NavBar) { + if (m_NavBarEnabled) { m_NavBar->EnableTool(m_NavForwardId,HistoryCanForward()); m_NavBar->EnableTool(m_NavBackId,HistoryCanBack()); } @@ -388,6 +396,37 @@ bool wxHtmlAppletWindow::HistoryBack() return wxHtmlWindow::HistoryBack(); } +/**************************************************************************** +REMARKS: +This function is used to disable the navigation bars. If you want to +toggle to the navbars off you must call this function. +****************************************************************************/ +void wxHtmlAppletWindow::DisableNavBar() +{ + m_NavBarEnabled = false; +} + +/**************************************************************************** +REMARKS: +This function is used to enable the nav bars. If you toggle the nav bars on +you must call this function. +****************************************************************************/ +void wxHtmlAppletWindow::EnableNavBar() +{ + m_NavBarEnabled = true; +} + +/**************************************************************************** +REMARKS: +This function is used to set the nav bar to a new nav bar if you deleted the +one that you were useing. Usally this happens when you toggle a nav bar +on or off. +****************************************************************************/ +void wxHtmlAppletWindow::SetNavBar(wxToolBarBase *navBar) +{ + m_NavBar = navBar; +} + /**************************************************************************** PARAMETERS: msg - wxEvent message to be sent to all wxApplets @@ -570,6 +609,18 @@ VirtualData::VirtualData( m_href = href; } +/**************************************************************************** +PARAMETERS: +REMARKS: +VirtualData is used to store information on the virtual links. +****************************************************************************/ +VirtualData::VirtualData() +{ + m_name.Empty(); + m_group.Empty(); + m_href.Empty(); +} + /**************************************************************************** PARAMETERS: REMARKS: diff --git a/contrib/src/applet/prepecho.cpp b/contrib/src/applet/prepecho.cpp index 85f7198f72..67b38016fe 100644 --- a/contrib/src/applet/prepecho.cpp +++ b/contrib/src/applet/prepecho.cpp @@ -115,9 +115,14 @@ wxString wxEchoPrep::Process( // grab the value from the class, put it in tag since the data is no longer needed tag = wxEchoVariable::FindValue(cname, parms.c_str()); - } + } + // remove ampersands and <> chars + tag.Replace("&", "&"); + tag.Replace("<", "<"); + tag.Replace(">", ">"); + output = (output.Mid(0,i) + tag + output.Mid(i)); } diff --git a/contrib/src/applet/prepifelse.cpp b/contrib/src/applet/prepifelse.cpp index 2880af3bef..7cda90bc5f 100644 --- a/contrib/src/applet/prepifelse.cpp +++ b/contrib/src/applet/prepifelse.cpp @@ -49,12 +49,17 @@ do not correctly pass the given return value. ****************************************************************************/ int ReverseFind( const wxString &tstr, - const wxString &str) + const wxString &str, + int start = -1) { wxASSERT( str.GetStringData()->IsValid() ); // TODO could be made much quicker than that int p = tstr.Len()-str.Len()-1; + int p2 = start-str.Len(); + + // if the user supplied a valid start point, use it + if (start != -1 && p > p2) p = p2; while ( p >= 0 ) { if ( wxStrncmp(tstr.c_str() + p, str.c_str(), str.Len()) == 0 ) return p; @@ -64,6 +69,131 @@ int ReverseFind( return -1; } +/**************************************************************************** +PARAMETERS: +str - text of #if statement + +RETURNS: +true or false depending on how it evaluated + +REMARKS: + +SEE ALSO: +wxIfElseVariable +****************************************************************************/ +bool ParseIfStatementValue(wxString &str) { + + // Find out if the tag has parenthesis + // recursive to parse the text within the parenthesis, + // replacing the text with 1 or 0, (hardcoded true or false) + int b; + while ((b = str.Find('(')) != -1) { + int e; + // Find the matching parenthesis + int nextbeg, nextend; + int parencount = 1, min = b+1; + do { + + nextbeg = str.find('(', min); + nextend = str.find(')', min); + if (nextbeg < nextend && nextbeg != wxString::npos) { + parencount++; + min = nextbeg+1; + } + else { + parencount--; + min = nextend+1; + } + + if (nextend == wxString::npos) { + #ifdef CHECKED + wxMessageBox("wxHTML #if\\else error: Unmatched parenthesis in #if expression.","Error",wxICON_ERROR); + #endif + return true; + } + // once parencount reaches 0 again we have found our matchin ) + } while (parencount > 0); + + e = nextend; + + // Extract the expression from the parenthesis block and recurse + // to solve it. + wxString tag; + tag = str.Mid(b+1, e-b-1); + bool val = ParseIfStatementValue(tag); + // Add extra spaces just in case of NOT(VAL) + if (val) str = str.Mid(0, b) + " 1" + str.Mid(e+1); + else str = str.Mid(0, b) + " 0" + str.Mid(e+1); + + } + + // Remove spaces from left and right + str.Trim(false); + str.Trim(true); + + // Convert text method of operators "AND" and "OR" to c style + // this makes only one special case necessary for each later on + str.Replace(" AND ", "&&"); + str.Replace(" OR ", "||"); + + // We use ReverseFind so that the whole left expression gets evaluated agains + // the right single item, creating a left -> right evaluation + // Search for || operators, recurse to solve (so we don't have to handle special cases here) + int and, or; + and = ReverseFind(str, "&&"); + or = ReverseFind(str, "||"); + if ( (and != -1) || (or != -1) ) { + wxString tag1, tag2; + // handle the rightmost first to force left->right evaluation + if (and > or) { + return ( + ParseIfStatementValue(tag2 = str.Mid(and+2)) && + ParseIfStatementValue(tag1 = str.Mid(0, and)) ); + } + else { + return ( + ParseIfStatementValue(tag2 = str.Mid(or+2)) || + ParseIfStatementValue(tag1 = str.Mid(0, or)) ); + } + + } + + // By the time we get to this place in the function we are guarenteed to have a single + // variable operation, perhaps with a NOT or ! operator + bool notval = false; + + // search for a NOT or ! operator + if (str.Mid(0, 1) == "!") { + str.Remove(0, 1); + str.Trim(false); // trim spaces from left + notval = true; + } + else if (str.Mid(0,4).CmpNoCase("NOT ") == 0) { + str.Remove(0, 4); + str.Trim(false); // trim any extra spaces from left + notval = true; + } + + // now all we have left is the name of the class or a hardcoded 0 or 1 + + if (str == "") { + #ifdef CHECKED + wxMessageBox("wxHTML #if\\else error: Empty expression in #if\\#elif statement.","Error",wxICON_ERROR); + #endif + return true; + } + + // check for hardcoded 0 and 1 cases, (these are used by parenthesis catcher) + // this just decomplicates the recursion algorithm + if (str == "0") return notval; + if (str == "1") return !notval; + + // Grab the value from the variable class identified by cname + bool value = wxIfElseVariable::FindValue(str); + if (notval) value = !value; + return value; + +} /**************************************************************************** PARAMETERS: text - HTML to process for if/else blocks @@ -72,7 +202,7 @@ RETURNS: The string containing the processed HTML REMARKS: -This function replaces #if, #else, and #endif directives with the text +This function replaces #if, #else, #elif, and #endif directives with the text contained within the blocks, dependant on the value of the given boolean variable. The variable is created by making a sub class of wxIfElseVariable. Dynamic class construction is used at run time internally to create an instance @@ -86,19 +216,81 @@ wxString wxIfElsePrep::Process( { int b; char ft[] = ""; + char ftelse[] = ""; + char ftnot[] = "", b + strlen(ftelif)); + + if (e == wxString::npos) { + #ifdef CHECKED + wxMessageBox("wxHTML #elif error: Premature end of file while parsing #elif.","Error",wxICON_ERROR); + #endif + break; + } + + // Convert to lower case so find is easy, grab everything after #elif tag + wxString remains = (output.Mid(e+strlen("-->"))).Lower(); + + // find matching else or endif + int nextif, nextendif; + int ifcount = 1, min = 0; + do { + nextif = remains.find(ft, min); + nextendif = remains.find(ftend, min); + if (nextif < nextendif && nextif != wxString::npos) { + ifcount++; + min = nextif+1; + } + else { + ifcount--; + min = nextendif+1; + } + + if (nextendif == wxString::npos) { + #ifdef CHECKED + wxMessageBox("wxHTML #elif error: Premature end of file before finding #endif.","Error",wxICON_ERROR); + #endif + break; + } + // once ifcount reaches 0 again we have found our matchin #endif + } while (ifcount > 0); + + // If it couldn't be found die gracefully + if (nextendif == wxString::npos) { + // We already displayed a message, just break all the way out + break; + } + + int elifsize = e - (b + strlen(ftelif)) + strlen("-->"); + // Create the #if/else block, removing the #elif code + output = output.Mid(0, b) + + wxString(wxString(ftelse)+wxString(ft)) + + output.Mid(b+strlen(ftelif), elifsize+nextendif) + + wxString(ftend) + + output.Mid(b+strlen(ftelif)+elifsize+nextendif); + + } + + // Parse out the if else blocks themselves while ((b = ReverseFind(output.Lower(), ft)) != -1) { // Loop until every #if directive is found // We search from the end of the string so that #if statements will properly recurse // and we avoid the hassle of matching statements with the correct bool notval = false; int off = 0; - int end, c, n; + int end; wxString usecode, code; wxString cname; wxString tag; @@ -106,15 +298,6 @@ wxString wxIfElsePrep::Process( code = wxString(""); - if (output.Mid(b, strlen(ftnot) ).CmpNoCase(ftnot) == 0 ) { - notval = true; - off = 4; - } - else if (output.Mid(b, strlen(ftnot2) ).CmpNoCase(ftnot2) == 0 ) { - notval = true; - off = 1; - } - // grab the tag and get the name of the variable end = (output.Mid(b)).Find("-->"); if (end == -1) { @@ -125,30 +308,14 @@ wxString wxIfElsePrep::Process( } end += 3; - tag = output.Mid(b, end); + // remove the sections from the tag before passing it on to be parsed + tag = output.Mid(b+strlen(ft), end-strlen(ft)-3); output.Remove(b, end); - c = tag.Find("-->"); - n = c; - - // find the classname - c = (tag.Mid(8+off, n-(8+off))).Find(" "); - if (c == -1) n -= (8+off); - else n = c; - cname = tag.Mid(8+off, n); - - cname.Trim(false); - c = cname.Find("\""); - if (c != -1) cname = cname.Mid(c+1); - c = cname.Find("\""); - if (c != -1) cname = cname.Mid(0, c); - - // Grab the value from the variable class identified by cname - value = wxIfElseVariable::FindValue(cname); - if (notval) value = !value; + value = ParseIfStatementValue(tag); // Find the end of the tag () and copy it all into the variable code - end = ((output.Mid(b)).Lower()).Find(""); + end = ((output.Mid(b)).Lower()).Find(ftend); if (end == -1) { #ifdef CHECKED wxMessageBox("wxHTML #if error: Premature end of file while searching for matching #endif.","Error",wxICON_ERROR); @@ -157,14 +324,14 @@ wxString wxIfElsePrep::Process( } code = output.Mid(b, end); - output.Remove(b, end+13); // remove the entire #if block from original document + output.Remove(b, end+strlen(ftend)); // remove the entire #if block from original document // Find out if there is an else statement - end = (code.Lower()).Find(""); + end = (code.Lower()).Find(ftelse); if (end != -1) { if (!value) { // Use the else statement - usecode = code.Mid(end+12); + usecode = code.Mid(end+strlen(ftelse)); } else { // Use statement before #else diff --git a/contrib/src/applet/prepinclude.cpp b/contrib/src/applet/prepinclude.cpp index b9678148a7..83d494875e 100644 --- a/contrib/src/applet/prepinclude.cpp +++ b/contrib/src/applet/prepinclude.cpp @@ -59,8 +59,6 @@ wxString wxIncludePrep::Process( int i; char ft[] = "