From 8ec2b48446fa4f17187dcd73c3a314e4030333f6 Mon Sep 17 00:00:00 2001 From: Harco de Hilster Date: Sun, 12 Sep 1999 17:45:34 +0000 Subject: [PATCH] New HTML help system. The old controller class has been split in three parts; basic data, a frame and a controller. Docs will appear shortly... All Makefiles should be correctly updated. To be sure, I put an #error pragma in the old files, which will be removed in a few days. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3620 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 23 +- distrib/msw/tmake/filelist.txt | 9 +- distrib/msw/tmake/vc.t | 5 +- include/wx/html/helpctrl.h | 77 +++ include/wx/html/helpdata.h | 192 +++++++ include/wx/html/helpfrm.h | 180 +++++++ samples/html/help/help.cpp | 8 +- samples/html/help/helpfiles/another.hhc | 24 + samples/html/help/helpfiles/another.hhp | 9 + samples/html/help/helpfiles/another.htm | 24 + src/html/helpctrl.cpp | 108 ++++ src/html/helpdata.cpp | 577 +++++++++++++++++++++ src/html/helpfrm.cpp | 652 ++++++++++++++++++++++++ src/html/htmlhelp.cpp | 4 + src/html/htmlhelp_io.cpp | 5 + src/html/search.cpp | 2 +- src/msw/makefile.b32 | 5 +- src/msw/makefile.bcc | 28 +- src/msw/makefile.dos | 8 +- src/msw/makefile.g95 | 10 +- src/msw/makefile.sc | 3 +- src/msw/makefile.vc | 13 +- src/msw/makefile.wat | 7 +- 23 files changed, 1924 insertions(+), 49 deletions(-) create mode 100644 include/wx/html/helpctrl.h create mode 100644 include/wx/html/helpdata.h create mode 100644 include/wx/html/helpfrm.h create mode 100644 samples/html/help/helpfiles/another.hhc create mode 100644 samples/html/help/helpfiles/another.hhp create mode 100644 samples/html/help/helpfiles/another.htm create mode 100644 src/html/helpctrl.cpp create mode 100644 src/html/helpdata.cpp create mode 100644 src/html/helpfrm.cpp diff --git a/Makefile.in b/Makefile.in index a69e429835..495881099f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,5 @@ # -# This file was automatically generated by tmake at 14:36, 1999/09/03 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T! # @@ -516,8 +516,7 @@ MSW_HEADERS = \ msw/xpmhand.h UNIX_HEADERS = \ - unix/execute.h \ - unix/gsockunx.h + unix/execute.h GENERIC_HEADERS = \ generic/caret.h \ @@ -557,10 +556,12 @@ PROTOCOL_HEADERS = \ HTML_HEADERS = \ html/forcelink.h \ + html/helpctrl.h \ + html/helpdata.h \ + html/helpfrm.h \ html/htmlcell.h \ html/htmldefs.h \ html/htmlfilter.h \ - html/htmlhelp.h \ html/htmlparser.h \ html/htmltag.h \ html/htmlwin.h \ @@ -1521,6 +1522,7 @@ MSW_GUIOBJS = \ frame.o \ gauge95.o \ gdiobj.o \ + gsocket.o \ helpwin.o \ icon.o \ imaglist.o \ @@ -1606,6 +1608,7 @@ MSW_GUIDEPS = \ frame.d \ gauge95.d \ gdiobj.d \ + gsocket.d \ helpwin.d \ icon.d \ imaglist.d \ @@ -1657,10 +1660,11 @@ MSW_GUIDEPS = \ xpmhand.d HTMLOBJS = \ + helpctrl.o \ + helpdata.o \ + helpfrm.o \ htmlcell.o \ htmlfilter.o \ - htmlhelp.o \ - htmlhelp_io.o \ htmlparser.o \ htmltag.o \ htmlwin.o \ @@ -1676,10 +1680,11 @@ HTMLOBJS = \ search.o HTMLDEPS = \ + helpctrl.d \ + helpdata.d \ + helpfrm.d \ htmlcell.d \ htmlfilter.d \ - htmlhelp.d \ - htmlhelp_io.d \ htmlparser.d \ htmltag.d \ htmlwin.d \ @@ -2262,6 +2267,6 @@ clean: $(RM) *.d $(RM) parser.c $(RM) lexer.c - $(RM) ./lib/*.a ./lib/*.so* + $(RM) ./lib/* cleanall: clean diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 50b1d1a584..10e28ca84e 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -384,10 +384,11 @@ timer.cpp X utils.cpp X window.cpp X +helpdata.cpp H +helpfrm.cpp H +helpctrl.cpp H htmlcell.cpp H htmlfilter.cpp H -htmlhelp.cpp H -htmlhelp_io.cpp H htmlparser.cpp H htmltag.cpp H htmlwin.cpp H @@ -821,10 +822,12 @@ http.h P protocol.h P forcelink.h L +helpdata.h L +helpfrm.h L +helpctrl.h L htmlcell.h L htmldefs.h L htmlfilter.h L -htmlhelp.h L htmlparser.h L htmltag.h L htmlwin.h L diff --git a/distrib/msw/tmake/vc.t b/distrib/msw/tmake/vc.t index 8d2c17b8b3..83b63e6b54 100644 --- a/distrib/msw/tmake/vc.t +++ b/distrib/msw/tmake/vc.t @@ -135,10 +135,11 @@ COMMONOBJS = \ MSWOBJS = #$ ExpandList("WXMSWOBJS"); HTMLOBJS = \ + ..\html\$D\helpdata.obj \ + ..\html\$D\helpfrm.obj \ + ..\html\$D\helpctrl.obj \ ..\html\$D\htmlcell.obj \ ..\html\$D\htmlfilter.obj \ - ..\html\$D\htmlhelp.obj \ - ..\html\$D\htmlhelp_io.obj \ ..\html\$D\htmlparser.obj \ ..\html\$D\htmltag.obj \ ..\html\$D\htmlwin.obj \ diff --git a/include/wx/html/helpctrl.h b/include/wx/html/helpctrl.h new file mode 100644 index 0000000000..77e84f1e95 --- /dev/null +++ b/include/wx/html/helpctrl.h @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpctrl.h +// Purpose: wxHtmlHelpController +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPCTRL_H_ +#define _WX_HELPCTRL_H_ + +#include "wx/defs.h" + +#ifdef __GNUG__ +#pragma interface "helpctrl.h" +#endif + +#if wxUSE_HTML + +#include "helpfrm.h" + +class WXDLLEXPORT wxHtmlHelpController : public wxEvtHandler +{ +public: + wxHtmlHelpController(); + virtual ~wxHtmlHelpController(); + + void SetTitleFormat(const wxString& format); + void SetTempDir(const wxString& path) { m_helpData.SetTempDir(path); } + bool AddBook(const wxString& book, bool show_wait_msg = FALSE); + bool Display(const wxString& x) { + CreateHelpWindow(); return m_helpFrame->Display(x); + } + bool Display(int id) { + CreateHelpWindow(); return m_helpFrame->Display(id); + } + bool DisplayContents() { + CreateHelpWindow(); return m_helpFrame->DisplayContents(); + } + bool DisplayIndex() { + CreateHelpWindow(); return m_helpFrame->DisplayIndex(); + } + bool KeywordSearch(const wxString& keyword) { + CreateHelpWindow(); return KeywordSearch(keyword); + } + wxHtmlHelpFrame* GetFrame() { return m_helpFrame; } + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString) { + m_Config = config; m_ConfigRoot = rootpath; + ReadCustomization(config, rootpath); + } + // Assigns config object to the Ctrl. This config is then + // used in subsequent calls to Read/WriteCustomization of both help + // Ctrl and it's wxHtmlWindow + virtual void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + virtual void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + virtual void CreateHelpWindow(bool show_progress = FALSE); + virtual void DestroyHelpWindow() { + //if (m_Config) WriteCustomization(m_Config, m_ConfigRoot); + if (m_helpFrame) m_helpFrame->Destroy(); + } +protected: + void OnCloseFrame(wxCloseEvent& evt) { m_helpFrame = NULL; evt.Skip(); } + wxHtmlHelpData m_helpData; + wxHtmlHelpFrame* m_helpFrame; + wxConfigBase *m_Config; + wxString m_ConfigRoot; + wxString m_titleFormat; + DECLARE_EVENT_TABLE() +}; + +#endif + +#endif // _WX_HELPCTRL_H_ diff --git a/include/wx/html/helpdata.h b/include/wx/html/helpdata.h new file mode 100644 index 0000000000..22c3d7ccf7 --- /dev/null +++ b/include/wx/html/helpdata.h @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpdata.h +// Purpose: wxHtmlHelpData +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPDATA_H_ +#define _WX_HELPDATA_H_ + +#ifdef __GNUG__ +#pragma interface "helpdata.h" +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/filesys.h" +#include "wx/dynarray.h" + +//-------------------------------------------------------------------------------- +// helper classes & structs +//-------------------------------------------------------------------------------- + +class WXDLLEXPORT wxHtmlBookRecord : public wxObject +{ +public: + wxHtmlBookRecord(const wxString& basepath, const wxString& title, + const wxString& start) { + m_BasePath = basepath; m_Title = title; m_Start = start; + // for debugging, give the contents index obvious default values + contents_start = contents_end = -1; + } + wxString GetTitle() const {return m_Title;} + wxString GetStart() const {return m_Start;} + wxString GetBasePath() const {return m_BasePath;} + /* SetContentsRange: store in the bookrecord where in the index/contents lists the + * book's records are stored. This to facilitate searching in a specific book. + * This code will have to be revised when loading/removing books becomes dynamic. + * (as opposed to appending only) + * Note that storing index range is pointless, because the index is alphab. sorted. */ + void SetContentsRange(int start, int end) { contents_start = start; contents_end = end; } + GetContentsStart() const { return contents_start; } + GetContentsEnd() const { return contents_end; } +protected: + wxString m_BasePath; + wxString m_Title; + wxString m_Start; + int contents_start; + int contents_end; +}; + + +#undef WXDLLEXPORTLOCAL +#define WXDLLEXPORTLOCAL WXDLLEXPORT + // ?? Don't know why - but Allen Van Sickel reported it to fix problems with DLL +WX_DECLARE_OBJARRAY(wxHtmlBookRecord, wxHtmlBookRecArray); + +#undef WXDLLEXPORTLOCAL +#define WXDLLEXPORTLOCAL + + +typedef struct +{ + short int m_Level; + int m_ID; + char* m_Name; + char* m_Page; + wxHtmlBookRecord *m_Book; +} wxHtmlContentsItem; + +//------------------------------------------------------------------------------ +// wxSearchEngine +// This class takes input streams and scans them for occurence +// of keyword(s) +//------------------------------------------------------------------------------ +class wxSearchEngine : public wxObject +{ +private: + char *m_Keyword; + +public: + wxSearchEngine() : wxObject() {m_Keyword = NULL;} + ~wxSearchEngine() {if (m_Keyword) free(m_Keyword);} + + virtual void LookFor(const wxString& keyword); + // Sets the keyword we will be searching for + + virtual bool Scan(wxInputStream *stream); + // Scans the stream for the keyword. + // Returns TRUE if the stream contains keyword, fALSE otherwise +}; + +class wxHtmlHelpData; + +// State information of a search action. I'd have prefered to make this a nested +// class inside wxHtmlHelpData, but that's against coding standards :-( +// Never construct this class yourself, obtain a copy from +// wxHtmlHelpData::PrepareKeywordSearch(const wxString& key) +class WXDLLEXPORT wxHtmlSearchStatus +{ +public: + // constructor; supply wxHtmlHelpData ptr, the keyword and (optionally) the + // title of the book to search. By default, all books are searched. + wxHtmlSearchStatus(wxHtmlHelpData* base, const wxString& keyword, + const wxString& book = wxEmptyString); + bool Search(); // do the next iteration + bool IsActive() { return m_Active; } + int GetCurIndex() { return m_CurIndex; } + int GetMaxIndex() { return m_MaxIndex; } + const wxString& GetName() { return m_Name; } + wxHtmlContentsItem* GetContentsItem() { return m_ContentsItem; } +private: + wxHtmlHelpData* m_Data; + wxSearchEngine m_Engine; + wxString m_Keyword, m_Name, m_LastPage; + wxHtmlContentsItem* m_ContentsItem; + bool m_Active; // search is not finished + int m_CurIndex; // where we are now + int m_MaxIndex; // number of files we search + // For progress bar: 100*curindex/maxindex = % complete +}; + +class WXDLLEXPORT wxHtmlHelpData : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpData) + + friend class wxHtmlSearchStatus; + +public: + wxHtmlHelpData(); + ~wxHtmlHelpData(); + + void SetTempDir(const wxString& path); + // Sets directory where temporary files are stored. + // These temp files are index & contents file in binary (much faster to read) + // form. These files are NOT deleted on program's exit. + + bool AddBook(const wxString& book); + // Adds new book. 'book' is location of .htb file (stands for "html book"). + // See documentation for details on its format. + // Returns success. + bool AddBookParam(const wxString& title, const wxString& contfile, + const wxString& indexfile=wxEmptyString, + const wxString& deftopic=wxEmptyString, + const wxString& path=wxEmptyString); + + // Some accessing stuff + wxString FindPageByName(const wxString& page); + // returns URL of page on basis of (file)name + wxString FindPageById(int id); + // returns URL of page on basis of MS id + + const wxHtmlBookRecArray& GetBookRecArray() { return m_BookRecords; } + wxHtmlContentsItem* GetContents() { return m_Contents; } + int GetContentsCnt() { return m_ContentsCnt; } + wxHtmlContentsItem* GetIndex() { return m_Index; } + int GetIndexCnt() { return m_IndexCnt; } + +protected: + wxString m_TempPath; + + wxHtmlBookRecArray m_BookRecords; + // each book has one record in this array + wxHtmlContentsItem* m_Contents; + int m_ContentsCnt; + // list of all available books and pages. + wxHtmlContentsItem* m_Index; + int m_IndexCnt; + // list of index items + +protected: + bool LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, + const wxString& indexfile, const wxString& contentsfile); + // Imports .hhp files (MS HTML Help Workshop) + bool LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f); + // Reads binary book + bool SaveCachedBook(wxHtmlBookRecord *book, wxOutputStream *f); + // Writes binary book +}; + +#endif + +#endif diff --git a/include/wx/html/helpfrm.h b/include/wx/html/helpfrm.h new file mode 100644 index 0000000000..8dca2c6889 --- /dev/null +++ b/include/wx/html/helpfrm.h @@ -0,0 +1,180 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpfrm.h +// Purpose: wxHtmlHelpFrame +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPFRM_H_ +#define _WX_HELPFRM_H_ + +#ifdef __GNUG__ +#pragma interface "helpfrm.h" +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "helpdata.h" +#include "wx/window.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/html/htmlwin.h" + +// style flags for the Help Frame +const int wxHF_TOOLBAR = 1; +const int wxHF_CONTENTS = 2; +const int wxHF_INDEX = 4; +const int wxHF_SEARCH = 8; +const int wxHF_DEFAULTSTYLE = -1; + +// Command IDs : +enum { + wxID_HTML_PANEL = wxID_HIGHEST + 1, + wxID_HTML_BACK, + wxID_HTML_FORWARD, + wxID_HTML_TREECTRL, + wxID_HTML_INDEXPAGE, + wxID_HTML_INDEXLIST, + wxID_HTML_NOTEBOOK, + wxID_HTML_SEARCHPAGE, + wxID_HTML_SEARCHTEXT, + wxID_HTML_SEARCHLIST, + wxID_HTML_SEARCHBUTTON, + wxID_HTML_SEARCHCHOICE, + wxID_HTML_HELPFRAME // the id of wxHtmlHelpController's helpframe +}; + +class WXDLLEXPORT wxHtmlHelpFrame : public wxFrame +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpFrame) + +public: + wxHtmlHelpFrame(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpFrame(wxWindow* parent, int wxWindowID, + const wxString& title = wxEmptyString, + int style = wxHF_DEFAULTSTYLE, wxHtmlHelpData* data = NULL); + bool Create(wxWindow* parent, wxWindowID id, const wxString& title = wxEmptyString, + int style = wxHF_DEFAULTSTYLE); + ~wxHtmlHelpFrame(); + + wxHtmlHelpData* GetData() { return m_Data; } + + void SetTitleFormat(const wxString& format) { + if (m_HtmlWin) + m_HtmlWin->SetRelatedFrame(this, format); + m_TitleFormat = format; + } + // Sets format of title of the frame. Must contain exactly one "%s" + // (for title of displayed HTML page) + + bool Display(const wxString& x); + // Displays page x. If not found it will offect the user a choice of + // searching books. + // Looking for the page runs in these steps: + // 1. try to locate file named x (if x is for example "doc/howto.htm") + // 2. try to open starting page of book x + // 3. try to find x in contents (if x is for example "How To ...") + // 4. try to find x in index (if x is for example "How To ...") + bool Display(const int id); + // Alternative version that works with numeric ID. + // (uses extension to MS format, , see docs) + + bool DisplayContents(); + // Displays help window and focuses contents. + + bool DisplayIndex(); + // Displays help window and focuses index. + + bool KeywordSearch(const wxString& keyword); + // Searches for keyword. Returns TRUE and display page if found, return + // FALSE otherwise + // Syntax of keyword is Altavista-like: + // * words are separated by spaces + // (but "\"hello world\"" is only one world "hello world") + // * word may be pretended by + or - + // (+ : page must contain the word ; - : page can't contain the word) + // * if there is no + or - before the word, + is default + void RefreshLists(bool show_progress = FALSE); + // Refreshes Contents and Index tabs + void CreateContents(bool show_progress = FALSE); + // Adds items to m_Contents tree control + void CreateIndex(bool show_progress = FALSE); + // Adds items to m_IndexList + void CreateSearch(); + // Add books to search choice panel + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString) { + m_Config = config; m_ConfigRoot = rootpath; + ReadCustomization(config, rootpath); + } + void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + // saves custom settings into cfg config. it will use the path 'path' + // if given, otherwise it will save info into currently selected path. + // saved values : things set by SetFonts, SetBorders. + void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + // ... + void OnToolbar(wxCommandEvent& event); + void OnContentsSel(wxTreeEvent& event); + void OnIndexSel(wxCommandEvent& event); + void OnSearchSel(wxCommandEvent& event); + void OnSearch(wxCommandEvent& event); + void OnCloseWindow(wxCloseEvent& event); + + // Images: + enum { + IMG_Book = 0, + IMG_Folder, + IMG_Page + }; + +protected: + wxHtmlHelpData* m_Data; + bool m_DataCreated; // m_Data created by frame, or supplied? + wxString m_TitleFormat; // title of the help frame + // below are various pointers to GUI components + wxHtmlWindow *m_HtmlWin; + wxSplitterWindow *m_Splitter; + wxNotebook *m_NavigPan; + wxTreeCtrl *m_ContentsBox; + wxImageList *m_ContentsImageList; + wxListBox *m_IndexBox; + wxTextCtrl *m_SearchText; + wxButton *m_SearchButton; + wxListBox *m_SearchList; + wxChoice *m_SearchChoice; + + struct { + long x, y, w, h; + long sashpos; + bool navig_on; + int style; // flags given to wxHtmlHelpFrame ctor + wxString titleformat; + } m_Cfg; + // settings (window size, position, sash pos etc..) + wxConfigBase *m_Config; + wxString m_ConfigRoot; + + // pagenumbers of controls in notebook (usually 0,1,2) + int m_ContentsPage; + int m_IndexPage; + int m_SearchPage; + +protected: + void Init(wxHtmlHelpData* data = NULL); + + DECLARE_EVENT_TABLE() +}; + +#endif + +#endif diff --git a/samples/html/help/help.cpp b/samples/html/help/help.cpp index 6a0e3d3cdd..fc9e3d71a3 100644 --- a/samples/html/help/help.cpp +++ b/samples/html/help/help.cpp @@ -153,7 +153,13 @@ config = new wxConfig("wxHTMLhelp"); help.UseConfig(config); - help.AddBook("helpfiles/testing.hhp"); + bool ret; + ret = help.AddBook("helpfiles/testing.hhp"); + if (! ret) + wxMessageBox("Failed adding book helpfiles/testing.hhp"); + ret = help.AddBook("helpfiles/another.hhp"); + if (! ret) + wxMessageBox("Failed adding book helpfiles/another.hhp"); } diff --git a/samples/html/help/helpfiles/another.hhc b/samples/html/help/helpfiles/another.hhc new file mode 100644 index 0000000000..2f84feacb5 --- /dev/null +++ b/samples/html/help/helpfiles/another.hhc @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/samples/html/help/helpfiles/another.hhp b/samples/html/help/helpfiles/another.hhp new file mode 100644 index 0000000000..7f808a5ea2 --- /dev/null +++ b/samples/html/help/helpfiles/another.hhp @@ -0,0 +1,9 @@ +[OPTIONS] +Compatibility=1.1 +Contents file=another.hhc +Display compile progress=No +Title=Another book +Default topic=another.htm +Embarassment=extra line because project parsing is slightly buggy + + diff --git a/samples/html/help/helpfiles/another.htm b/samples/html/help/helpfiles/another.htm new file mode 100644 index 0000000000..4532dc8c40 --- /dev/null +++ b/samples/html/help/helpfiles/another.htm @@ -0,0 +1,24 @@ + + + + Another HTML Help book + + + +

Another book...

+ Here's another book to demonstrate that + + You can also view the project file for this book. + + diff --git a/src/html/helpctrl.cpp b/src/html/helpctrl.cpp new file mode 100644 index 0000000000..d40ac14e76 --- /dev/null +++ b/src/html/helpctrl.cpp @@ -0,0 +1,108 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpctrl.cpp +// Purpose: wxHtmlHelpController +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "helpctrl.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/html/helpctrl.h" +#include "wx/wx.h" +#include "wx/busyinfo.h" + +BEGIN_EVENT_TABLE(wxHtmlHelpController, wxEvtHandler) + EVT_CLOSE(wxHtmlHelpController::OnCloseFrame) +END_EVENT_TABLE() + +wxHtmlHelpController::wxHtmlHelpController() +{ + m_helpFrame = NULL; + m_Config = NULL; + m_ConfigRoot = wxEmptyString; + m_titleFormat = _("Help: %s"); +} + +wxHtmlHelpController::~wxHtmlHelpController() +{ + WriteCustomization(m_Config, m_ConfigRoot); + if (m_helpFrame) + m_helpFrame->Close(); +} + +void wxHtmlHelpController::SetTitleFormat(const wxString& title) +{ + m_titleFormat = title; + if (m_helpFrame) + m_helpFrame->SetTitleFormat(title); +} + +bool wxHtmlHelpController::AddBook(const wxString& book, bool show_wait_msg) +{ + wxBusyCursor cur; +#if wxUSE_BUSYINFO + wxBusyInfo* busy; + wxString info; + if (show_wait_msg) { + info.Printf(_("Adding book %s"), book.c_str()); + busy = new wxBusyInfo(info); + } +#endif + bool retval = m_helpData.AddBook(book); +#if wxUSE_BUSYINFO + if (show_wait_msg) + delete busy; +#endif + return retval; +} + +void wxHtmlHelpController::CreateHelpWindow(bool show_progress) +{ + if (m_helpFrame) { + m_helpFrame->Raise(); + return; + } + m_helpFrame = new wxHtmlHelpFrame(&m_helpData); + m_helpFrame->PushEventHandler(this); + if (m_Config) + m_helpFrame->UseConfig(m_Config, m_ConfigRoot); + m_helpFrame->Create(NULL, wxID_HTML_HELPFRAME); + m_helpFrame->RefreshLists(show_progress); + m_helpFrame->SetTitleFormat(m_titleFormat); + m_helpFrame->Show(TRUE); +} + +void wxHtmlHelpController::ReadCustomization(wxConfigBase* cfg, const wxString& path) +{ + /* should not be called by the user; call UseConfig, and the controller + * will do the rest */ + if (m_helpFrame) + m_helpFrame->ReadCustomization(cfg, path); +} + +void wxHtmlHelpController::WriteCustomization(wxConfigBase* cfg, const wxString& path) +{ + /* typically called by the controllers OnCloseFrame handler */ + if (m_helpFrame) + m_helpFrame->WriteCustomization(cfg, path); +} + +#endif diff --git a/src/html/helpdata.cpp b/src/html/helpdata.cpp new file mode 100644 index 0000000000..fb87c1af12 --- /dev/null +++ b/src/html/helpdata.cpp @@ -0,0 +1,577 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpdata.cpp +// Purpose: wxHtmlHelpData +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "helpdata.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#ifndef WXPRECOMP +#include "wx/wx.h" +#endif + +#include "wx/html/helpdata.h" +#include "wx/tokenzr.h" +#include "wx/wfstream.h" +#include "wx/busyinfo.h" +#include "wx/html/htmlparser.h" +#include "wx/html/htmldefs.h" + +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(wxHtmlBookRecArray) + +//----------------------------------------------------------------------------- +// static helper functions +//----------------------------------------------------------------------------- + +// Reads one line, stores it into buf and returns pointer to new line or NULL. +static char* ReadLine(char *line, char *buf) +{ + char *writeptr = buf, *readptr = line; + + while (*readptr != 0 && *readptr != '\r' && *readptr != '\n') *(writeptr++) = *(readptr++); + *writeptr = 0; + while (*readptr == '\r' || *readptr == '\n') readptr++; + if (*readptr == 0) return NULL; + else return readptr; +} + + +static wxString SafeFileName(const wxString& s) +{ + wxString res = s; + res.Replace(":", "_", TRUE); + res.Replace(" ", "_", TRUE); + res.Replace("/", "_", TRUE); + res.Replace("\\", "_", TRUE); + res.Replace("#", "_", TRUE); + res.Replace(".", "_", TRUE); + return res; +} + + +static int IndexCompareFunc(const void *a, const void *b) +{ + return strcmp(((wxHtmlContentsItem*)a) -> m_Name, ((wxHtmlContentsItem*)b) -> m_Name); +} + + +//----------------------------------------------------------------------------- +// HP_Parser +//----------------------------------------------------------------------------- + +class HP_Parser : public wxHtmlParser +{ + public: + void AddText(const char* text) {} + wxObject* GetProduct() {return NULL;} +}; + + +//----------------------------------------------------------------------------- +// HP_TagHandler +//----------------------------------------------------------------------------- + +class HP_TagHandler : public wxHtmlTagHandler +{ + private: + wxString m_Name, m_Page; + int m_Level; + int m_ID; + int m_Index; + wxHtmlContentsItem *m_Items; + int m_ItemsCnt; + wxHtmlBookRecord *m_Book; + + public: + HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0;} + wxString GetSupportedTags() {return "UL,OBJECT,PARAM";} + bool HandleTag(const wxHtmlTag& tag); + void WriteOut(wxHtmlContentsItem*& array, int& size); + void ReadIn(wxHtmlContentsItem* array, int size); +}; + + +bool HP_TagHandler::HandleTag(const wxHtmlTag& tag) +{ + if (tag.GetName() == "UL") { + m_Level++; + ParseInner(tag); + m_Level--; + return TRUE; + } + + else if (tag.GetName() == "OBJECT") { + m_Name = m_Page = wxEmptyString; + ParseInner(tag); + if (m_Page != wxEmptyString) { + if (m_ItemsCnt % HTML_REALLOC_STEP == 0) + m_Items = (wxHtmlContentsItem*) realloc(m_Items, (m_ItemsCnt + HTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem)); + m_Items[m_ItemsCnt].m_Level = m_Level; + m_Items[m_ItemsCnt].m_ID = m_ID; + m_Items[m_ItemsCnt].m_Page = new char[m_Page.Length() + 1]; + strcpy(m_Items[m_ItemsCnt].m_Page, m_Page.c_str()); + m_Items[m_ItemsCnt].m_Name = new char [m_Name.Length() + 1]; + strcpy(m_Items[m_ItemsCnt].m_Name, m_Name.c_str()); + m_Items[m_ItemsCnt].m_Book = m_Book; + m_ItemsCnt++; + } + return TRUE; + } + + else { // "PARAM" + if (m_Name == wxEmptyString && tag.GetParam("NAME") == "Name") m_Name = tag.GetParam("VALUE"); + if (tag.GetParam("NAME") == "Local") m_Page = tag.GetParam("VALUE"); + if (tag.GetParam("NAME") == "ID") tag.ScanParam("VALUE", "%i", &m_ID); + return FALSE; + } +} + + + +void HP_TagHandler::WriteOut(wxHtmlContentsItem*& array, int& size) +{ + array = m_Items; + size = m_ItemsCnt; + m_Items = NULL; + m_ItemsCnt = 0; +} + +void HP_TagHandler::ReadIn(wxHtmlContentsItem* array, int size) +{ + m_Items = array; + m_ItemsCnt = size; +} + +//----------------------------------------------------------------------------- +// wxHtmlHelpData +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpData, wxObject) + +wxHtmlHelpData::wxHtmlHelpData() +{ + m_TempPath = wxEmptyString; + + m_Contents = NULL; + m_ContentsCnt = 0; + m_Index = NULL; + m_IndexCnt = 0; +} + +wxHtmlHelpData::~wxHtmlHelpData() +{ + int i; + + m_BookRecords.Empty(); + if (m_Contents) { + for (i = 0; i < m_ContentsCnt; i++) { + delete[] m_Contents[i].m_Page; + delete[] m_Contents[i].m_Name; + } + free(m_Contents); + } + if (m_Index) { + for (i = 0; i < m_IndexCnt; i++) { + delete[] m_Index[i].m_Page; + delete[] m_Index[i].m_Name; + } + free(m_Index); + } +} + +bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, const wxString& indexfile, const wxString& contentsfile) +{ + wxFSFile *f; + char *buf; + int sz; + wxString string; + + HP_Parser parser; + HP_TagHandler *handler = new HP_TagHandler(book); + parser.AddTagHandler(handler); + + f = ( contentsfile.IsEmpty() ? NULL : fsys.OpenFile(contentsfile) ); + if (f) { + sz = f -> GetStream() -> GetSize(); + buf = new char[sz+1]; + buf[sz] = 0; + f -> GetStream() -> Read(buf, sz); + delete f; + handler -> ReadIn(m_Contents, m_ContentsCnt); + parser.Parse(buf); + handler -> WriteOut(m_Contents, m_ContentsCnt); + delete[] buf; + } + + f = ( indexfile.IsEmpty() ? NULL : fsys.OpenFile(indexfile) ); + if (f) { + sz = f -> GetStream() -> GetSize(); + buf = new char[sz+1]; + buf[sz] = 0; + f -> GetStream() -> Read(buf, sz); + delete f; + handler -> ReadIn(m_Index, m_IndexCnt); + parser.Parse(buf); + handler -> WriteOut(m_Index, m_IndexCnt); + delete[] buf; + } + return TRUE; +} + + +bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) +{ + int i, st; + int x; + + /* load contents : */ + + f -> Read(&x, sizeof(x)); + st = m_ContentsCnt; + m_ContentsCnt += x; + m_Contents = (wxHtmlContentsItem*) realloc(m_Contents, (m_ContentsCnt / HTML_REALLOC_STEP + 1) * HTML_REALLOC_STEP * sizeof(wxHtmlContentsItem)); + for (i = st; i < m_ContentsCnt; i++) { + f -> Read(&x, sizeof(x)); + m_Contents[i].m_Level = x; + f -> Read(&x, sizeof(x)); + m_Contents[i].m_ID = x; + f -> Read(&x, sizeof(x)); + m_Contents[i].m_Name = new char[x]; + f -> Read(m_Contents[i].m_Name, x); + f -> Read(&x, sizeof(x)); + m_Contents[i].m_Page = new char[x]; + f -> Read(m_Contents[i].m_Page, x); + m_Contents[i].m_Book = book; + } + + /* load index : */ + + f -> Read(&x, sizeof(x)); + st = m_IndexCnt; + m_IndexCnt += x; + m_Index = (wxHtmlContentsItem*) realloc(m_Index, (m_IndexCnt / HTML_REALLOC_STEP + 1) * HTML_REALLOC_STEP * sizeof(wxHtmlContentsItem)); + for (i = st; i < m_IndexCnt; i++) { + f -> Read(&x, sizeof(x)); + m_Index[i].m_Name = new char[x]; + f -> Read(m_Index[i].m_Name, x); + f -> Read(&x, sizeof(x)); + m_Index[i].m_Page = new char[x]; + f -> Read(m_Index[i].m_Page, x); + m_Index[i].m_Book = book; + } + return TRUE; +} + + +bool wxHtmlHelpData::SaveCachedBook(wxHtmlBookRecord *book, wxOutputStream *f) +{ + int i; + int x; + + /* save contents : */ + + x = 0; + for (i = 0; i < m_ContentsCnt; i++) if (m_Contents[i].m_Book == book && m_Contents[i].m_Level > 0) x++; + f -> Write(&x, sizeof(x)); + for (i = 0; i < m_ContentsCnt; i++) { + if (m_Contents[i].m_Book != book || m_Contents[i].m_Level == 0) continue; + x = m_Contents[i].m_Level; + f -> Write(&x, sizeof(x)); + x = m_Contents[i].m_ID; + f -> Write(&x, sizeof(x)); + x = strlen(m_Contents[i].m_Name) + 1; + f -> Write(&x, sizeof(x)); + f -> Write(m_Contents[i].m_Name, x); + x = strlen(m_Contents[i].m_Page) + 1; + f -> Write(&x, sizeof(x)); + f -> Write(m_Contents[i].m_Page, x); + } + + /* save index : */ + + x = 0; + for (i = 0; i < m_IndexCnt; i++) if (m_Index[i].m_Book == book && m_Index[i].m_Level > 0) x++; + f -> Write(&x, sizeof(x)); + for (i = 0; i < m_IndexCnt; i++) { + if (m_Index[i].m_Book != book || m_Index[i].m_Level == 0) continue; + x = strlen(m_Index[i].m_Name) + 1; + f -> Write(&x, sizeof(x)); + f -> Write(m_Index[i].m_Name, x); + x = strlen(m_Index[i].m_Page) + 1; + f -> Write(&x, sizeof(x)); + f -> Write(m_Index[i].m_Page, x); + } + return TRUE; +} + + +void wxHtmlHelpData::SetTempDir(const wxString& path) +{ + if (path == wxEmptyString) m_TempPath = path; + else { + if (wxIsAbsolutePath(path)) m_TempPath = path; + else m_TempPath = wxGetCwd() + "/" + path; + + if (m_TempPath[m_TempPath.Length() - 1] != '/') + m_TempPath << "/"; + } +} + + +bool wxHtmlHelpData::AddBookParam(const wxString& title, const wxString& contfile, + const wxString& indexfile, const wxString& deftopic, + const wxString& path) +{ + wxFileSystem fsys; + wxFSFile *fi; + wxHtmlBookRecord *bookr; + wxString safetitle; + + if (! path.IsEmpty()) + // workaround for bug in ChangePathTo(name, TRUE) + fsys.ChangePathTo(path+"/gaga"); + + bookr = new wxHtmlBookRecord(path+'/', title, deftopic); + + if (m_ContentsCnt % HTML_REALLOC_STEP == 0) + m_Contents = (wxHtmlContentsItem*) realloc(m_Contents, (m_ContentsCnt + HTML_REALLOC_STEP) * sizeof(wxHtmlContentsItem)); + m_Contents[m_ContentsCnt].m_Level = 0; + m_Contents[m_ContentsCnt].m_ID = 0; + m_Contents[m_ContentsCnt].m_Page = new char[deftopic.Length() + 1]; + strcpy(m_Contents[m_ContentsCnt].m_Page, deftopic.c_str()); + m_Contents[m_ContentsCnt].m_Name = new char [title.Length() + 1]; + strcpy(m_Contents[m_ContentsCnt].m_Name, title.c_str()); + m_Contents[m_ContentsCnt].m_Book = bookr; + + // store the contents index for later + int cont_start = m_ContentsCnt++; + + // Try to find cached binary versions: + safetitle = SafeFileName(title); + fi = fsys.OpenFile(safetitle + ".cached"); + if (fi == NULL) fi = fsys.OpenFile(m_TempPath + safetitle + ".cached"); + if ((fi == NULL) || (m_TempPath == wxEmptyString)) { + LoadMSProject(bookr, fsys, indexfile, contfile); + if (m_TempPath != wxEmptyString) { + wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath + safetitle + ".cached"); + SaveCachedBook(bookr, outs); + delete outs; + } + } + else { + LoadCachedBook(bookr, fi -> GetStream()); + delete fi; + } + + // Now store the contents range + bookr->SetContentsRange(cont_start, m_ContentsCnt); + + m_BookRecords.Add(bookr); + if (m_IndexCnt > 0) + qsort(m_Index, m_IndexCnt, sizeof(wxHtmlContentsItem), IndexCompareFunc); + + return TRUE; +} + + +bool wxHtmlHelpData::AddBook(const wxString& book) +{ + wxFSFile *fi; + wxFileSystem fsys; + wxInputStream *s; + wxString bookFull; + + int sz; + char *buff, *lineptr; + char linebuf[300]; + + wxString title = _("noname"), + safetitle, + start = wxEmptyString, + contents = wxEmptyString, index = wxEmptyString; + + if (wxIsAbsolutePath(book)) bookFull = book; + else bookFull = wxGetCwd() + "/" + book; + + fi = fsys.OpenFile(bookFull); + if (fi == NULL) return FALSE; + fsys.ChangePathTo(bookFull); + s = fi -> GetStream(); + sz = s -> GetSize(); + buff = new char[sz+1]; + buff[sz] = 0; + s -> Read(buff, sz); + lineptr = buff; + delete fi; + + while ((lineptr = ReadLine(lineptr, linebuf)) != NULL) { + if (strstr(linebuf, "Title=") == linebuf) + title = linebuf + strlen("Title="); + if (strstr(linebuf, "Default topic=") == linebuf) + start = linebuf + strlen("Default topic="); + if (strstr(linebuf, "Index file=") == linebuf) + index = linebuf + strlen("Index file="); + if (strstr(linebuf, "Contents file=") == linebuf) + contents = linebuf + strlen("Contents file="); + } + delete[] buff; + + return AddBookParam(title, contents, index, start, fsys.GetPath()); +} + +wxString wxHtmlHelpData::FindPageByName(const wxString& x) +{ + int cnt; + int i; + wxFileSystem fsys; + wxFSFile *f; + wxString url(wxEmptyString); + + /* 1. try to open given file: */ + + cnt = m_BookRecords.GetCount(); + for (i = 0; i < cnt; i++) { + f = fsys.OpenFile(m_BookRecords[i].GetBasePath() + x); + if (f) { + url = m_BookRecords[i].GetBasePath() + x; + delete f; + return url; + } + } + + + /* 2. try to find a book: */ + + for (i = 0; i < cnt; i++) { + if (m_BookRecords[i].GetTitle() == x) { + url = m_BookRecords[i].GetBasePath() + m_BookRecords[i].GetStart(); + return url; + } + } + + /* 3. try to find in contents: */ + + cnt = m_ContentsCnt; + for (i = 0; i < cnt; i++) { + if (strcmp(m_Contents[i].m_Name, x) == 0) { + url = m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page; + return url; + } + } + + + /* 4. try to find in index: */ + + cnt = m_IndexCnt; + for (i = 0; i < cnt; i++) { + if (strcmp(m_Index[i].m_Name, x) == 0) { + url = m_Index[i].m_Book -> GetBasePath() + m_Index[i].m_Page; + return url; + } + } + + return url; +} + +wxString wxHtmlHelpData::FindPageById(int id) +{ + int i; + wxString url(wxEmptyString); + + for (i = 0; i < m_ContentsCnt; i++) { + if (m_Contents[i].m_ID == id) { + url = m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page; + return url; + } + } + + return url; +} + +//---------------------------------------------------------------------------------- +// wxHtmlSearchStatus functions +//---------------------------------------------------------------------------------- + +wxHtmlSearchStatus::wxHtmlSearchStatus(wxHtmlHelpData* data, const wxString& keyword, + const wxString& book = wxEmptyString) +{ + m_Data = data; + m_Keyword = keyword; + wxHtmlBookRecord* bookr = NULL; + if (book != wxEmptyString) { + // we have to search in a specific book. Find it first + int i,cnt = data->m_BookRecords.GetCount(); + for (i=0; im_BookRecords[i].GetTitle() == book) { + bookr = &(data->m_BookRecords[i]); + m_CurIndex = bookr->GetContentsStart(); + m_MaxIndex = bookr->GetContentsEnd(); + break; + } + // check; we won't crash if the book doesn't exist, but it's Bad Anyway. + wxASSERT(bookr); + } + if (! bookr) { + // no book specified; search all books + m_CurIndex = 0; + m_MaxIndex = m_Data->m_ContentsCnt; + } + m_Engine.LookFor(keyword); + m_Active = (m_CurIndex < m_MaxIndex); + m_LastPage = wxEmptyString; +} + +bool wxHtmlSearchStatus::Search() +{ + wxFileSystem fsys; + wxFSFile *file; + int i = m_CurIndex; // shortcut + bool found = FALSE; + + if (! m_Active) { + // sanity check. Illegal use, but we'll try to prevent a crash anyway + wxASSERT(0); + return FALSE; + } + + m_ContentsItem = NULL; + m_Name = wxEmptyString; + + file = fsys.OpenFile(m_Data->m_Contents[i].m_Book -> GetBasePath() + + m_Data->m_Contents[i].m_Page); + if (file) { + if (m_LastPage != file->GetLocation()) { + m_LastPage = file->GetLocation(); + if (m_Engine.Scan(file -> GetStream())) { + m_Name = m_Data->m_Contents[i].m_Name; + m_ContentsItem = m_Data->m_Contents + i; + found = true; + } + } + delete file; + } + m_Active = (++m_CurIndex < m_MaxIndex); + return found; +} + +#endif diff --git a/src/html/helpfrm.cpp b/src/html/helpfrm.cpp new file mode 100644 index 0000000000..2cc721054d --- /dev/null +++ b/src/html/helpfrm.cpp @@ -0,0 +1,652 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpfrm.cpp +// Purpose: wxHtmlHelpFrame +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// Created: +// RCS-ID: +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "helpfrm.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#include "wx/defs.h" + +#if wxUSE_HTML + +#ifndef WXPRECOMP +#include +#endif + +#include "wx/html/helpfrm.h" +#include "wx/notebook.h" +#include "wx/imaglist.h" +#include "wx/treectrl.h" +#include "wx/tokenzr.h" +#include "wx/wfstream.h" +#include "wx/html/htmlwin.h" +#include "wx/busyinfo.h" +#include "wx/progdlg.h" + +// Bitmaps: + +#ifndef __WXMSW__ +#include "bitmaps/panel.xpm" +#include "bitmaps/back.xpm" +#include "bitmaps/forward.xpm" +#include "bitmaps/book.xpm" +#include "bitmaps/folder.xpm" +#include "bitmaps/page.xpm" +#endif + +#include "wx/stream.h" + +// number of times that the contents/index creation progress dialog +// is updated. +static const int PROGRESS_STEP = 40; + +//-------------------------------------------------------------------------- +// wxHtmlHelpTreeItemData +//-------------------------------------------------------------------------- + +class wxHtmlHelpTreeItemData : public wxTreeItemData +{ + private: + wxString m_Page; + + public: + wxHtmlHelpTreeItemData(wxHtmlContentsItem *it) : wxTreeItemData() + { + m_Page = it -> m_Book -> GetBasePath() + it -> m_Page; + } + const wxString& GetPage() {return m_Page;} +}; + +//--------------------------------------------------------------------------- +// wxHtmlHelpFrame +//--------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpFrame, wxFrame) + +wxHtmlHelpFrame::wxHtmlHelpFrame(wxWindow* parent, wxWindowID id, const wxString& title, + int style, wxHtmlHelpData* data) +{ + Init(data); + Create(parent, id, title, style); +} + +void wxHtmlHelpFrame::Init(wxHtmlHelpData* data) +{ + if (data) { + m_Data = data; + m_DataCreated = FALSE; + } + else { + m_Data = new wxHtmlHelpData(); + m_DataCreated = TRUE; + } + + m_ContentsImageList = new wxImageList(12, 12); + m_ContentsImageList -> Add(wxICON(book)); + m_ContentsImageList -> Add(wxICON(folder)); + m_ContentsImageList -> Add(wxICON(page)); + + m_ContentsBox = NULL; + m_IndexBox = NULL; + m_SearchList = NULL; + m_SearchButton = NULL; + m_SearchText = NULL; + m_SearchChoice = NULL; + m_Splitter = NULL; + m_NavigPan = NULL; + m_HtmlWin = NULL; + m_Config = NULL; + m_ConfigRoot = wxEmptyString; + + m_Cfg.x = m_Cfg.y = 0; + m_Cfg.w = 700; m_Cfg.h = 480; + m_Cfg.sashpos = 240; + m_Cfg.navig_on = TRUE; + m_Cfg.titleformat = _("Help: %s"); + m_Cfg.style = wxHF_TOOLBAR | wxHF_CONTENTS | wxHF_INDEX | wxHF_SEARCH; +} + +/* Create: builds the GUI components. + * with the style flag it's possible to toggle the toolbar, contents, index and search + * controls. + * m_HtmlWin will *always* be created, but it's important to realize that + * m_ContentsBox, m_IndexBox, m_SearchList, m_SearchButton, m_SearchText and + * m_SearchButton may be NULL. + * moreover, if no contents, index or searchpage is needed, m_Splitter and + * m_NavigPan will be NULL too (with m_HtmlWin directly connected to the frame) + */ +bool wxHtmlHelpFrame::Create(wxWindow* parent, wxWindowID id, const wxString& title, + int style) +{ + // Do the config in two steps. We read the HtmlWindow customization after we + // create the window. + if (m_Config) + ReadCustomization(m_Config, m_ConfigRoot); + + wxFrame::Create(parent, id, "", wxPoint(m_Cfg.x, m_Cfg.y), wxSize(m_Cfg.w, m_Cfg.h)); + + if (style == wxHF_DEFAULTSTYLE) + style = m_Cfg.style; + + if (! title.IsEmpty()) // overridden? + m_Cfg.titleformat = title; + + int notebook_page = 0; + + CreateStatusBar(); + + // toolbar? + if (style & wxHF_TOOLBAR) { + wxToolBar *toolBar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT | + wxTB_DOCKABLE); + toolBar -> SetMargins(2, 2); + wxBitmap* toolBarBitmaps[3]; + +#ifdef __WXMSW__ + toolBarBitmaps[0] = new wxBitmap("panel"); + toolBarBitmaps[1] = new wxBitmap("back"); + toolBarBitmaps[2] = new wxBitmap("forward"); + int width = 24; +#else + toolBarBitmaps[0] = new wxBitmap(panel_xpm); + toolBarBitmaps[1] = new wxBitmap(back_xpm); + toolBarBitmaps[2] = new wxBitmap(forward_xpm); + int width = 16; +#endif + + int currentX = 5; + + toolBar -> AddTool(wxID_HTML_PANEL, *(toolBarBitmaps[0]), wxNullBitmap, + FALSE, currentX, -1, (wxObject *) NULL, + _("Show/hide navigation panel")); + currentX += width + 5; + toolBar -> AddSeparator(); + toolBar -> AddTool(wxID_HTML_BACK, *(toolBarBitmaps[1]), wxNullBitmap, + FALSE, currentX, -1, (wxObject *) NULL, + _("Go back to the previous HTML page")); + currentX += width + 5; + toolBar -> AddTool(wxID_HTML_FORWARD, *(toolBarBitmaps[2]), wxNullBitmap, + FALSE, currentX, -1, (wxObject *) NULL, + _("Go forward to the next HTML page")); + currentX += width + 5; + + toolBar -> Realize(); + + // Can delete the bitmaps since they're reference counted + for (int i = 0; i < 3; i++) + delete toolBarBitmaps[i]; + } + + if (style & (wxHF_CONTENTS | wxHF_INDEX | wxHF_SEARCH)) { + // traditional help controller; splitter window with html page on the + // right and a notebook containing various pages on the left + m_Splitter = new wxSplitterWindow(this); + + m_HtmlWin = new wxHtmlWindow(m_Splitter); + m_NavigPan = new wxNotebook(m_Splitter, wxID_HTML_NOTEBOOK, + wxDefaultPosition, wxDefaultSize); + } + else { // only html window, no notebook with index,contents etc + m_HtmlWin = new wxHtmlWindow(this); + } + + m_HtmlWin -> SetRelatedFrame(this, m_TitleFormat); + m_HtmlWin -> SetRelatedStatusBar(0); + if (m_Config) + m_HtmlWin -> ReadCustomization(m_Config, m_ConfigRoot); + + // contents tree panel? + if (style & wxHF_CONTENTS) { + m_ContentsBox = new wxTreeCtrl(m_NavigPan, wxID_HTML_TREECTRL, + wxDefaultPosition, wxDefaultSize, + wxTR_HAS_BUTTONS | wxSUNKEN_BORDER); + m_ContentsBox -> SetImageList(m_ContentsImageList); + m_NavigPan -> AddPage(m_ContentsBox, _("Contents")); + m_ContentsPage = notebook_page++; + } + + // index listbox panel? + if (style & wxHF_INDEX) { + wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_INDEXPAGE); + wxLayoutConstraints *b1 = new wxLayoutConstraints; + b1 -> top.SameAs (dummy, wxTop, 0); + b1 -> left.SameAs (dummy, wxLeft, 0); + b1 -> width.PercentOf (dummy, wxWidth, 100); + b1 -> bottom.SameAs (dummy, wxBottom, 0); + m_IndexBox = new wxListBox(dummy, wxID_HTML_INDEXLIST, wxDefaultPosition, + wxDefaultSize, 0, NULL, wxLB_SINGLE |wxLB_ALWAYS_SB); + m_IndexBox -> SetConstraints(b1); + dummy -> SetAutoLayout(TRUE); + m_NavigPan -> AddPage(dummy, _("Index")); + m_IndexPage = notebook_page++; + } + + // search list panel? + if (style & wxHF_SEARCH) { + wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_SEARCHPAGE); + + wxLayoutConstraints *b1 = new wxLayoutConstraints; + m_SearchText = new wxTextCtrl(dummy, wxID_HTML_SEARCHTEXT); + b1 -> top.SameAs (dummy, wxTop, 10); + b1 -> left.SameAs (dummy, wxLeft, 10); + b1 -> right.SameAs (dummy, wxRight, 10); + b1 -> height.AsIs(); + m_SearchText -> SetConstraints(b1); + + wxLayoutConstraints *b2 = new wxLayoutConstraints; + m_SearchButton = new wxButton(dummy, wxID_HTML_SEARCHBUTTON, _("Search")); + b2 -> top.Below (m_SearchText, 10); + b2 -> left.SameAs (dummy, wxLeft, 10); + b2 -> width.AsIs(); + b2 -> height.AsIs(); + m_SearchButton -> SetConstraints(b2); + + wxLayoutConstraints *b3 = new wxLayoutConstraints; + m_SearchList = new wxListBox(dummy, wxID_HTML_SEARCHLIST, wxDefaultPosition, wxDefaultSize, 0); + b3 -> top.Below (m_SearchButton, 10); + b3 -> left.SameAs (dummy, wxLeft, 0); + b3 -> right.SameAs (dummy, wxRight, 0); + b3 -> bottom.SameAs (dummy, wxBottom, 0); + m_SearchList -> SetConstraints(b3); + + wxLayoutConstraints *b4 = new wxLayoutConstraints; + m_SearchChoice = new wxChoice(dummy, wxID_HTML_SEARCHCHOICE, wxDefaultPosition, + wxDefaultSize); + b4 -> top.Below (m_SearchText, 10); + b4 -> left.SameAs (m_SearchButton, wxRight, 10); + b4 -> right.SameAs (dummy, wxRight, 10); + b4 -> height.AsIs(); + m_SearchChoice -> SetConstraints(b4); + + dummy -> SetAutoLayout(TRUE); + dummy -> Layout(); + m_NavigPan -> AddPage(dummy, _("Search")); + m_SearchPage = notebook_page++; + } + + //RefreshLists(); + + // showtime + if (m_NavigPan && m_Splitter) { + m_NavigPan -> Show(TRUE); + m_Splitter -> SetMinimumPaneSize(20); + if (m_Cfg.navig_on) + m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); + } + m_HtmlWin -> Show(TRUE); + return TRUE; +} + +wxHtmlHelpFrame::~wxHtmlHelpFrame() +{ + delete m_ContentsImageList; + if (m_DataCreated) + delete m_Data; +} + +bool wxHtmlHelpFrame::Display(const wxString& x) +{ + wxString url = m_Data->FindPageByName(x); + if (! url.IsEmpty()) { + m_HtmlWin->LoadPage(url); + return TRUE; + } + return FALSE; +} + +bool wxHtmlHelpFrame::Display(const int id) +{ + wxString url = m_Data->FindPageById(id); + if (! url.IsEmpty()) { + m_HtmlWin->LoadPage(url); + return TRUE; + } + return FALSE; +} + + + +bool wxHtmlHelpFrame::DisplayContents() +{ + if (! m_ContentsBox) + return FALSE; + if (!m_Splitter -> IsSplit()) { + m_NavigPan -> Show(TRUE); + m_HtmlWin -> Show(TRUE); + m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); + } + m_NavigPan -> SetSelection(0); + return TRUE; +} + + + +bool wxHtmlHelpFrame::DisplayIndex() +{ + if (! m_IndexBox) + return FALSE; + if (!m_Splitter -> IsSplit()) { + m_NavigPan -> Show(TRUE); + m_HtmlWin -> Show(TRUE); + m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); + } + m_NavigPan -> SetSelection(1); + return TRUE; +} + +bool wxHtmlHelpFrame::KeywordSearch(const wxString& keyword) +{ + if (! (m_SearchList && m_SearchButton && m_SearchText && m_SearchChoice)) + return FALSE; + + int foundcnt = 0; + wxString foundstr; + wxString book = wxEmptyString; + + if (!m_Splitter -> IsSplit()) { + m_NavigPan -> Show(TRUE); + m_HtmlWin -> Show(TRUE); + m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); + } + m_NavigPan -> SetSelection(m_SearchPage); + m_SearchList -> Clear(); + m_SearchText -> SetValue(keyword); + m_SearchButton -> Enable(FALSE); + + if (m_SearchChoice->GetSelection() != 0) + book = m_SearchChoice->GetStringSelection(); + + wxHtmlSearchStatus status(m_Data, keyword, book); + + wxProgressDialog progress(_("Searching..."), _("No matching page found yet"), + status.GetMaxIndex(), this, + wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_AUTO_HIDE); + + while (status.IsActive()) { + if (progress.Update(status.GetCurIndex()) == FALSE) + break; + if (status.Search()) { + foundstr.Printf(_("Found %i matches"), ++foundcnt); + progress.Update(status.GetCurIndex(), foundstr); + m_SearchList -> Append(status.GetName(), status.GetContentsItem()); + } + wxYield(); + } + + m_SearchButton -> Enable(TRUE); + m_SearchText -> SetSelection(0, keyword.Length()); + m_SearchText -> SetFocus(); + if (foundcnt) { + wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList -> GetClientData(0); + if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page); + } + return (foundcnt > 0); +} + +#define MAX_ROOTS 64 + +void wxHtmlHelpFrame::CreateContents(bool show_progress) +{ + if (! m_ContentsBox) + return; + + wxProgressDialog *progress; + wxString proginfo; + + m_ContentsBox->Clear(); + + int cnt = m_Data->GetContentsCnt(); + int div = (cnt / PROGRESS_STEP) + 1; + int i; + + wxHtmlContentsItem *it = m_Data->GetContents(); + + if (show_progress) + progress = new wxProgressDialog(_("Building contents tree..."), wxEmptyString, + cnt, this, wxPD_APP_MODAL | wxPD_CAN_ABORT | + wxPD_AUTO_HIDE); + + wxTreeItemId roots[MAX_ROOTS]; + bool imaged[MAX_ROOTS]; + + m_ContentsBox -> DeleteAllItems(); + roots[0] = m_ContentsBox -> AddRoot(_("(Help)")); + imaged[0] = TRUE; + + for (i = 0; i < cnt; i++, it++) { + if (show_progress && ((i % div) == 0)) { + proginfo.Printf("Added %d/%d items", i, cnt); + if (! progress->Update(i, proginfo)) + break; + wxYield(); + } + roots[it -> m_Level + 1] = m_ContentsBox -> AppendItem( + roots[it -> m_Level], it -> m_Name, IMG_Page, -1, + new wxHtmlHelpTreeItemData(it)); + + if (it -> m_Level == 0) { + m_ContentsBox -> SetItemBold(roots[1], TRUE); + m_ContentsBox -> SetItemImage(roots[1], IMG_Book); + m_ContentsBox -> SetItemSelectedImage(roots[1], IMG_Book); + imaged[1] = TRUE; + } + else imaged[it -> m_Level + 1] = FALSE; + + if (!imaged[it -> m_Level]) { + m_ContentsBox -> SetItemImage(roots[it -> m_Level], IMG_Folder); + m_ContentsBox -> SetItemSelectedImage(roots[it -> m_Level], IMG_Folder); + imaged[it -> m_Level] = TRUE; + } + } + if (show_progress) + delete progress; + m_ContentsBox -> Expand(roots[0]); +} + + +void wxHtmlHelpFrame::CreateIndex(bool show_progress) +{ + if (! m_IndexBox) + return; + + wxProgressDialog *progress; + wxString proginfo; + + m_IndexBox->Clear(); + + int cnt = m_Data->GetIndexCnt(); + int div = (cnt / PROGRESS_STEP) + 1; + + wxHtmlContentsItem* index = m_Data->GetIndex(); + + if (show_progress) + progress = new wxProgressDialog(_("Building index list..."), wxEmptyString, + cnt, this, wxPD_APP_MODAL | wxPD_CAN_ABORT | + wxPD_AUTO_HIDE); + for (int i = 0; i < cnt; i++) { + if (show_progress && ((i % div) == 0)) { + proginfo.Printf("Added %d/%d items", i, cnt); + if (! progress->Update(i, proginfo)) + break; + wxYield(); + } + m_IndexBox -> Append(index[i].m_Name, (char*)(index + i)); + } + + if (show_progress) + delete progress; +} + +void wxHtmlHelpFrame::CreateSearch() +{ + if (! (m_SearchList && m_SearchChoice)) + return; + m_SearchList -> Clear(); + m_SearchChoice -> Clear(); + m_SearchChoice -> Append(_("all books")); + const wxHtmlBookRecArray& bookrec = m_Data->GetBookRecArray(); + int i, cnt = bookrec.GetCount(); + for (i=0; iAppend(bookrec[i].GetTitle()); + m_SearchChoice->SetSelection(0); +} + + +void wxHtmlHelpFrame::RefreshLists(bool show_progress) +{ + CreateContents(show_progress); + CreateIndex(show_progress); + CreateSearch(); +} + +void wxHtmlHelpFrame::ReadCustomization(wxConfigBase *cfg, const wxString& path) +{ + wxString oldpath; + wxString tmp; + + if (path != wxEmptyString) { + oldpath = cfg -> GetPath(); + cfg -> SetPath(path); + } + + m_Cfg.navig_on = cfg -> Read("hcNavigPanel", m_Cfg.navig_on) != 0; + m_Cfg.sashpos = cfg -> Read("hcSashPos", m_Cfg.sashpos); + m_Cfg.x = cfg -> Read("hcX", m_Cfg.x); + m_Cfg.y = cfg -> Read("hcY", m_Cfg.y); + m_Cfg.w = cfg -> Read("hcW", m_Cfg.w); + m_Cfg.h = cfg -> Read("hcH", m_Cfg.h); + m_Cfg.titleformat = cfg -> Read("hcTitleFormat", m_Cfg.titleformat); + m_Cfg.style = (int)cfg -> Read("hcStyle", (long)m_Cfg.style); + + if (m_HtmlWin) + m_HtmlWin->ReadCustomization(cfg, path); + + if (path != wxEmptyString) + cfg -> SetPath(oldpath); +} + +void wxHtmlHelpFrame::WriteCustomization(wxConfigBase *cfg, const wxString& path) +{ + wxString oldpath; + wxString tmp; + //printf("wxHtmlHelpFrame. Writing config to %s\n", (const char*)path); + + if (path != wxEmptyString) { + oldpath = cfg -> GetPath(); + cfg -> SetPath(path); + } + + cfg -> Write("hcNavigPanel", m_Cfg.navig_on); + cfg -> Write("hcSashPos", (long)m_Cfg.sashpos); + cfg -> Write("hcX", (long)m_Cfg.x); + cfg -> Write("hcY", (long)m_Cfg.y); + cfg -> Write("hcW", (long)m_Cfg.w); + cfg -> Write("hcH", (long)m_Cfg.h); + cfg -> Write("hcTitleFormat", m_Cfg.titleformat); + cfg -> Write("hcStyle", (long)m_Cfg.style); + + if (m_HtmlWin) + m_HtmlWin->WriteCustomization(cfg, path); + + if (path != wxEmptyString) + cfg -> SetPath(oldpath); +} + + +/* +EVENT HANDLING : +*/ + + +void wxHtmlHelpFrame::OnToolbar(wxCommandEvent& event) +{ + switch (event.GetId()) { + case wxID_HTML_BACK : + m_HtmlWin -> HistoryBack(); + break; + case wxID_HTML_FORWARD : + m_HtmlWin -> HistoryForward(); + break; + case wxID_HTML_PANEL : + if (! (m_Splitter && m_NavigPan)) + return; + if (m_Splitter -> IsSplit()) { + m_Cfg.sashpos = m_Splitter -> GetSashPosition(); + m_Splitter -> Unsplit(m_NavigPan); + } + else { + m_NavigPan -> Show(TRUE); + m_HtmlWin -> Show(TRUE); + m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos); + } + break; + } +} + + + +void wxHtmlHelpFrame::OnContentsSel(wxTreeEvent& event) +{ + wxHtmlHelpTreeItemData *pg; + + pg = (wxHtmlHelpTreeItemData*) m_ContentsBox -> GetItemData(event.GetItem()); + if (pg) m_HtmlWin -> LoadPage(pg -> GetPage()); +} + + + +void wxHtmlHelpFrame::OnIndexSel(wxCommandEvent& event) +{ + wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_IndexBox -> GetClientData(m_IndexBox -> GetSelection()); + if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page); +} + + + +void wxHtmlHelpFrame::OnSearchSel(wxCommandEvent& event) +{ + wxHtmlContentsItem *it = (wxHtmlContentsItem*) m_SearchList -> GetClientData(m_SearchList -> GetSelection()); + if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page); +} + +void wxHtmlHelpFrame::OnSearch(wxCommandEvent& event) +{ + wxString sr = m_SearchText -> GetLineText(0); + + if (sr != wxEmptyString) KeywordSearch(sr); +} + +void wxHtmlHelpFrame::OnCloseWindow(wxCloseEvent& evt) +{ + if (m_Config) + WriteCustomization(m_Config, m_ConfigRoot); + evt.Skip(); +} + +BEGIN_EVENT_TABLE(wxHtmlHelpFrame, wxFrame) + EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_FORWARD, wxHtmlHelpFrame::OnToolbar) + EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpFrame::OnContentsSel) + EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpFrame::OnIndexSel) + EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpFrame::OnSearchSel) + EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpFrame::OnSearch) + EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpFrame::OnSearch) + EVT_CLOSE(wxHtmlHelpFrame::OnCloseWindow) +END_EVENT_TABLE() + +#endif diff --git a/src/html/htmlhelp.cpp b/src/html/htmlhelp.cpp index 71898962a1..f263f88d7d 100644 --- a/src/html/htmlhelp.cpp +++ b/src/html/htmlhelp.cpp @@ -5,6 +5,10 @@ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// +#error This file should not be compiled! Update your build system! \ +(configure users, rerun configure to get a new Makefile) \ +Instead of htmlhelp[_io], use helpdata, helpfrm and helpctrl. This \ +file is only left to point out the problem and will be removed r.s.n. #ifdef __GNUG__ #pragma implementation "htmlhelp.h" diff --git a/src/html/htmlhelp_io.cpp b/src/html/htmlhelp_io.cpp index 89f9fb1194..fa9a4c39fc 100644 --- a/src/html/htmlhelp_io.cpp +++ b/src/html/htmlhelp_io.cpp @@ -6,6 +6,11 @@ // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// +#error This file should not be compiled! Update your build system! \ +(configure users, rerun configure to get a new Makefile) \ +Instead of htmlhelp[_io], use helpdata, helpfrm and helpctrl. This \ +file is only left to point out the problem and will be removed r.s.n. + //#ifdef __GNUG__ //#pragma implementation "htmlhelp.h" diff --git a/src/html/search.cpp b/src/html/search.cpp index 175e50d44d..73b317620f 100644 --- a/src/html/search.cpp +++ b/src/html/search.cpp @@ -25,7 +25,7 @@ #include #endif -#include "search.h" +#include "wx/html/helpdata.h" diff --git a/src/msw/makefile.b32 b/src/msw/makefile.b32 index dfa1c71046..9761025d2d 100644 --- a/src/msw/makefile.b32 +++ b/src/msw/makefile.b32 @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 15:37, 1999/09/05 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE B32.T! # @@ -231,6 +231,7 @@ MSWOBJS = $(MSWDIR)\accel.obj \ $(MSWDIR)\frame.obj \ $(MSWDIR)\gauge95.obj \ $(MSWDIR)\gdiobj.obj \ + $(MSWDIR)\gsocket.obj \ $(MSWDIR)\helpwin.obj \ $(MSWDIR)\icon.obj \ $(MSWDIR)\imaglist.obj \ @@ -408,6 +409,8 @@ $(MSWDIR)\gauge95.obj: $(MSWDIR)\gauge95.$(SRCSUFF) $(MSWDIR)\gdiobj.obj: $(MSWDIR)\gdiobj.$(SRCSUFF) +$(MSWDIR)\gsocket.obj: $(MSWDIR)\gsocket.$(SRCSUFF) + $(MSWDIR)\helpwin.obj: $(MSWDIR)\helpwin.$(SRCSUFF) $(MSWDIR)\icon.obj: $(MSWDIR)\icon.$(SRCSUFF) diff --git a/src/msw/makefile.bcc b/src/msw/makefile.bcc index 0c5957ec31..e68593c8f4 100644 --- a/src/msw/makefile.bcc +++ b/src/msw/makefile.bcc @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 16:27, 1999/08/29 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE BCC.T! # @@ -130,10 +130,6 @@ COMMONOBJS = \ $(MSWDIR)\imagbmp.obj \ $(MSWDIR)\image.obj \ $(MSWDIR)\imaggif.obj \ - $(MSWDIR)\imagjpeg.obj \ - $(MSWDIR)\imagpcx.obj \ - $(MSWDIR)\imagpng.obj \ - $(MSWDIR)\imagpnm.obj \ $(MSWDIR)\intl.obj \ $(MSWDIR)\ipcbase.obj \ $(MSWDIR)\layout.obj \ @@ -207,6 +203,7 @@ MSWOBJS = $(MSWDIR)\accel.obj \ $(MSWDIR)\frame.obj \ $(MSWDIR)\gaugemsw.obj \ $(MSWDIR)\gdiobj.obj \ + $(MSWDIR)\gsocket.obj \ $(MSWDIR)\helpwin.obj \ $(MSWDIR)\icon.obj \ $(MSWDIR)\iniconf.obj \ @@ -224,7 +221,6 @@ MSWOBJS = $(MSWDIR)\accel.obj \ $(MSWDIR)\palette.obj \ $(MSWDIR)\pen.obj \ $(MSWDIR)\penwin.obj \ - $(MSWDIR)\pnghand.obj \ $(MSWDIR)\printdlg.obj \ $(MSWDIR)\printwin.obj \ $(MSWDIR)\radiobox.obj \ @@ -345,6 +341,8 @@ $(MSWDIR)\gaugemsw.obj: $(MSWDIR)\gaugemsw.$(SRCSUFF) $(MSWDIR)\gdiobj.obj: $(MSWDIR)\gdi$(SRCSUFF).obj +$(MSWDIR)\gsocket.obj: $(MSWDIR)\gsocket.$(SRCSUFF) + $(MSWDIR)\helpwin.obj: $(MSWDIR)\helpwin.$(SRCSUFF) $(MSWDIR)\icon.obj: $(MSWDIR)\icon.$(SRCSUFF) @@ -379,8 +377,6 @@ $(MSWDIR)\pen.obj: $(MSWDIR)\pen.$(SRCSUFF) $(MSWDIR)\penwin.obj: $(MSWDIR)\penwin.$(SRCSUFF) -$(MSWDIR)\pnghand.obj: $(MSWDIR)\pnghand.$(SRCSUFF) - $(MSWDIR)\printdlg.obj: $(MSWDIR)\printdlg.$(SRCSUFF) $(MSWDIR)\printwin.obj: $(MSWDIR)\printwin.$(SRCSUFF) @@ -492,14 +488,6 @@ $(MSWDIR)\image.obj: $(COMMDIR)\image.$(SRCSUFF) $(MSWDIR)\imaggif.obj: $(COMMDIR)\imaggif.$(SRCSUFF) -$(MSWDIR)\imagjpeg.obj: $(COMMDIR)\imagjpeg.$(SRCSUFF) - -$(MSWDIR)\imagpcx.obj: $(COMMDIR)\imagpcx.$(SRCSUFF) - -$(MSWDIR)\imagpng.obj: $(COMMDIR)\imagpng.$(SRCSUFF) - -$(MSWDIR)\imagpnm.obj: $(COMMDIR)\imagpnm.$(SRCSUFF) - $(MSWDIR)\intl.obj: $(COMMDIR)\intl.$(SRCSUFF) $(MSWDIR)\ipcbase.obj: $(COMMDIR)\ipcbase.$(SRCSUFF) @@ -735,7 +723,7 @@ cleanall: clean MFTYPE=bcc -#makefile.$(MFTYPE) : $(WXWIN)\distrib\msw\tmake\filelist.txt $(WXWIN)\distrib\msw\tmake\$(MFTYPE).t -# cd $(WXWIN)\distrib\msw\tmake -# tmake -t $(MFTYPE) wxwin.pro -o makefile.$(MFTYPE) -# copy makefile.$(MFTYPE) $(WXWIN)\src\msw +makefile.$(MFTYPE) : $(WXWIN)\distrib\msw\tmake\filelist.txt $(WXWIN)\distrib\msw\tmake\$(MFTYPE).t + cd $(WXWIN)\distrib\msw\tmake + tmake -t $(MFTYPE) wxwin.pro -o makefile.$(MFTYPE) + copy makefile.$(MFTYPE) $(WXWIN)\src\msw diff --git a/src/msw/makefile.dos b/src/msw/makefile.dos index c6196e6a82..5d9f005682 100644 --- a/src/msw/makefile.dos +++ b/src/msw/makefile.dos @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 22:42, 1999/09/05 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE DOS.T! # @@ -190,6 +190,7 @@ MSWOBJS = $(MSWDIR)\accel.obj \ $(MSWDIR)\frame.obj \ $(MSWDIR)\gaugemsw.obj \ $(MSWDIR)\gdiobj.obj \ + $(MSWDIR)\gsocket.obj \ $(MSWDIR)\helpwin.obj \ $(MSWDIR)\icon.obj \ $(MSWDIR)\iniconf.obj \ @@ -466,6 +467,11 @@ $(MSWDIR)/gdiobj.obj: $*.$(SRCSUFF) $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF) << +$(MSWDIR)/gsocket.obj: $*.$(SRCSUFF) + cl @<< +$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF) +<< + $(MSWDIR)/helpwin.obj: $*.$(SRCSUFF) cl @<< $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF) diff --git a/src/msw/makefile.g95 b/src/msw/makefile.g95 index 168e3e28ec..b00ea7a88b 100644 --- a/src/msw/makefile.g95 +++ b/src/msw/makefile.g95 @@ -1,5 +1,5 @@ -# This file was automatically generated by tmake at 16:27, 1999/08/29 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE G95.T! # @@ -143,10 +143,11 @@ COMMONOBJS = \ $(COMMDIR)/zstream.$(OBJSUFF) HTMLOBJS = \ - $(HTMLDIR)/htmlcell.$(OBJSUFF) \ + $(HTMLDIR)/helpctrl.$(OBJSUFF) \ + $(HTMLDIR)/helpdata.$(OBJSUFF) \ + $(HTMLDIR)/helpfrm.$(OBJSUFF) \ + $(HTMLDIR)/htmlcell.$(OBJSUFF) \ $(HTMLDIR)/htmlfilter.$(OBJSUFF) \ - $(HTMLDIR)/htmlhelp.$(OBJSUFF) \ - $(HTMLDIR)/htmlhelp_io.$(OBJSUFF) \ $(HTMLDIR)/htmlparser.$(OBJSUFF) \ $(HTMLDIR)/htmltag.$(OBJSUFF) \ $(HTMLDIR)/htmlwin.$(OBJSUFF) \ @@ -196,6 +197,7 @@ MSWOBJS = \ $(MSWDIR)/frame.$(OBJSUFF) \ $(MSWDIR)/gauge95.$(OBJSUFF) \ $(MSWDIR)/gdiobj.$(OBJSUFF) \ + $(MSWDIR)/gsocket.$(OBJSUFF) \ $(MSWDIR)/helpwin.$(OBJSUFF) \ $(MSWDIR)/icon.$(OBJSUFF) \ $(MSWDIR)/imaglist.$(OBJSUFF) \ diff --git a/src/msw/makefile.sc b/src/msw/makefile.sc index 6c675825d9..be506cb76e 100644 --- a/src/msw/makefile.sc +++ b/src/msw/makefile.sc @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 16:27, 1999/08/29 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE SC.T! # Symantec C++ makefile for the msw objects @@ -172,6 +172,7 @@ MSWOBJS = $(MSWDIR)\accel.obj \ $(MSWDIR)\gauge95.obj \ $(MSWDIR)\gaugemsw.obj \ $(MSWDIR)\gdiobj.obj \ + $(MSWDIR)\gsocket.obj \ $(MSWDIR)\helpwin.obj \ $(MSWDIR)\icon.obj \ $(MSWDIR)\iniconf.obj \ diff --git a/src/msw/makefile.vc b/src/msw/makefile.vc index 2a6b15d61c..6e7b7d4a27 100644 --- a/src/msw/makefile.vc +++ b/src/msw/makefile.vc @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 15:14, 1999/08/18 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE VC.T! # File: makefile.vc @@ -114,6 +114,7 @@ NONESSENTIALOBJS= ..\generic\$D\caret.obj \ ..\generic\$D\notebook.obj \ ..\generic\$D\printps.obj \ ..\generic\$D\prntdlgg.obj \ + ..\generic\$D\statline.obj \ ..\generic\$D\treectrl.obj COMMONOBJS = \ @@ -241,6 +242,7 @@ MSWOBJS = ..\msw\$D\accel.obj \ ..\msw\$D\frame.obj \ ..\msw\$D\gauge95.obj \ ..\msw\$D\gdiobj.obj \ + ..\msw\$D\gsocket.obj \ ..\msw\$D\helpwin.obj \ ..\msw\$D\icon.obj \ ..\msw\$D\imaglist.obj \ @@ -294,10 +296,11 @@ MSWOBJS = ..\msw\$D\accel.obj \ ..\msw\$D\xpmhand.obj HTMLOBJS = \ + ..\html\$D\helpdata.obj \ + ..\html\$D\helpfrm.obj \ + ..\html\$D\helpctrl.obj \ ..\html\$D\htmlcell.obj \ ..\html\$D\htmlfilter.obj \ - ..\html\$D\htmlhelp.obj \ - ..\html\$D\htmlhelp_io.obj \ ..\html\$D\htmlparser.obj \ ..\html\$D\htmltag.obj \ ..\html\$D\htmlwin.obj \ @@ -314,7 +317,7 @@ HTMLOBJS = \ # Add $(NONESSENTIALOBJS) if wanting generic dialogs, PostScript etc. # Add $(HTMLOBJS) if wanting wxHTML classes -OBJECTS = $(COMMONOBJS) $(GENERICOBJS) $(MSWOBJS) $(HTMLOBJS) +OBJECTS = $(COMMONOBJS) $(GENERICOBJS) $(MSWOBJS) # Normal, static library all: dirs $(DUMMYOBJ) $(OBJECTS) $(PERIPH_TARGET) png zlib xpm jpeg $(LIBTARGET) @@ -689,8 +692,8 @@ $(DOCDIR)/pdf/porting.rtf: $(DOCDIR)/latex/porting/porting.tex $(DOCDIR)/pdf/prop.rtf: $(DOCDIR)/latex/proplist/prop.tex $(DOCDIR)/latex/proplist/body.tex $(DOCDIR)/latex/proplist/classes.tex $(DOCDIR)/latex/proplist/changes.tex cd $(DOCDIR)\latex\proplist - -copy *.bmp $(DOCDIR)\pdf -copy *.wmf $(DOCDIR)\pdf + -copy *.bmp $(DOCDIR)\pdf -start $(WAITFLAG) tex2rtf $(DOCDIR)/latex/proplist/prop.tex $(DOCDIR)/pdf/prop.rtf -twice -rtf cd $(THISDIR) diff --git a/src/msw/makefile.wat b/src/msw/makefile.wat index 2c203a130b..6eb0c5d71d 100644 --- a/src/msw/makefile.wat +++ b/src/msw/makefile.wat @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 16:27, 1999/08/29 +# This file was automatically generated by tmake at 13:13, 1999/09/12 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE WAT.T! #!/binb/wmake.exe @@ -68,6 +68,7 @@ NONESSENTIALOBJS= caret.obj & notebook.obj & printps.obj & prntdlgg.obj & + statline.obj & treectrl.obj COMMONOBJS = & @@ -196,6 +197,7 @@ MSWOBJS = accel.obj & gauge95.obj & gaugemsw.obj & gdiobj.obj & + gsocket.obj & helpwin.obj & icon.obj & iniconf.obj & @@ -391,6 +393,9 @@ gaugemsw.obj: $(MSWDIR)\gaugemsw.cpp gdiobj.obj: $(MSWDIR)\gdiobj.cpp *$(CCC) $(CPPFLAGS) $(IFLAGS) $< +gsocket.obj: $(MSWDIR)\gsocket.cpp + *$(CCC) $(CPPFLAGS) $(IFLAGS) $< + helpwin.obj: $(MSWDIR)\helpwin.cpp *$(CCC) $(CPPFLAGS) $(IFLAGS) $< -- 2.45.2