]>
git.saurik.com Git - wxWidgets.git/blob - src/html/helpctrl.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHtmlHelpController
4 // Notes: Based on htmlhelp.cpp, implementing a monolithic
5 // HTML Help controller class, by Vaclav Slavik
6 // Author: Harm van der Heijden and Vaclav Slavik
8 // Copyright: (c) Harm van der Heijden and Vaclav Slavik
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
26 #include "wx/busyinfo.h"
27 #include "wx/html/helpctrl.h"
28 #include "wx/html/helpwnd.h"
29 #include "wx/html/helpfrm.h"
30 #include "wx/html/helpdlg.h"
33 #include "wx/tipwin.h"
37 #include "wx/html/forcelnk.h"
38 FORCE_LINK(wxhtml_chm_support
)
41 IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpController
, wxHelpControllerBase
)
43 wxHtmlHelpController::wxHtmlHelpController(int style
, wxWindow
* parentWindow
):
44 wxHelpControllerBase(parentWindow
)
50 m_ConfigRoot
= wxEmptyString
;
51 m_titleFormat
= _("Help: %s");
55 wxHtmlHelpController::~wxHtmlHelpController()
58 WriteCustomization(m_Config
, m_ConfigRoot
);
64 void wxHtmlHelpController::DestroyHelpWindow()
66 if (m_FrameStyle
& wxHF_EMBEDDED
)
69 // Find top-most parent window
71 wxWindow
* parent
= FindTopLevelWindow();
74 wxDialog
* dialog
= wxDynamicCast(parent
, wxDialog
);
75 if (dialog
&& dialog
->IsModal())
77 dialog
->EndModal(wxID_OK
);
86 void wxHtmlHelpController::OnCloseFrame(wxCloseEvent
& evt
)
89 WriteCustomization(m_Config
, m_ConfigRoot
);
95 m_helpWindow
->SetController(NULL
);
101 void wxHtmlHelpController::SetTitleFormat(const wxString
& title
)
103 m_titleFormat
= title
;
104 wxHtmlHelpFrame
* frame
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpFrame
);
105 wxHtmlHelpDialog
* dialog
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpDialog
);
108 frame
->SetTitleFormat(title
);
111 dialog
->SetTitleFormat(title
);
114 // Find the top-most parent window
115 wxWindow
* wxHtmlHelpController::FindTopLevelWindow()
117 wxWindow
* parent
= m_helpWindow
;
118 while (parent
&& !parent
->IsTopLevel())
120 parent
= parent
->GetParent();
125 bool wxHtmlHelpController::AddBook(const wxFileName
& book_file
, bool show_wait_msg
)
127 return AddBook(wxFileSystem::FileNameToURL(book_file
), show_wait_msg
);
130 bool wxHtmlHelpController::AddBook(const wxString
& book
, bool show_wait_msg
)
134 wxBusyInfo
* busy
= NULL
;
138 info
.Printf(_("Adding book %s"), book
.c_str());
139 busy
= new wxBusyInfo(info
);
142 bool retval
= m_helpData
.AddBook(book
);
147 wxUnusedVar(show_wait_msg
);
150 m_helpWindow
->RefreshLists();
154 wxHtmlHelpFrame
* wxHtmlHelpController::CreateHelpFrame(wxHtmlHelpData
*data
)
156 wxHtmlHelpFrame
* frame
= new wxHtmlHelpFrame(data
);
157 frame
->SetController(this);
158 frame
->SetTitleFormat(m_titleFormat
);
159 frame
->Create(m_parentWindow
, -1, wxEmptyString
, m_FrameStyle
);
164 wxHtmlHelpDialog
* wxHtmlHelpController::CreateHelpDialog(wxHtmlHelpData
*data
)
166 wxHtmlHelpDialog
* dialog
= new wxHtmlHelpDialog(data
);
167 dialog
->SetController(this);
168 dialog
->SetTitleFormat(m_titleFormat
);
169 dialog
->Create(m_parentWindow
, -1, wxEmptyString
, m_FrameStyle
);
170 m_helpDialog
= dialog
;
174 wxWindow
* wxHtmlHelpController::CreateHelpWindow()
178 if (m_FrameStyle
& wxHF_EMBEDDED
)
181 wxWindow
* topLevelWindow
= FindTopLevelWindow();
183 topLevelWindow
->Raise();
187 if (m_Config
== NULL
)
189 m_Config
= wxConfigBase::Get(false);
190 if (m_Config
!= NULL
)
191 m_ConfigRoot
= _T("wxWindows/wxHtmlHelpController");
194 if (m_FrameStyle
& wxHF_DIALOG
)
196 wxHtmlHelpDialog
* dialog
= CreateHelpDialog(&m_helpData
);
197 m_helpWindow
= dialog
->GetHelpWindow();
199 else if ((m_FrameStyle
& wxHF_EMBEDDED
) && m_parentWindow
)
201 m_helpWindow
= new wxHtmlHelpWindow(m_parentWindow
, -1, wxDefaultPosition
, wxDefaultSize
,
202 wxTAB_TRAVERSAL
|wxNO_BORDER
, m_FrameStyle
, &m_helpData
);
206 wxHtmlHelpFrame
* frame
= CreateHelpFrame(&m_helpData
);
207 m_helpWindow
= frame
->GetHelpWindow();
214 void wxHtmlHelpController::ReadCustomization(wxConfigBase
* cfg
, const wxString
& path
)
216 /* should not be called by the user; call UseConfig, and the controller
217 * will do the rest */
218 if (m_helpWindow
&& cfg
)
219 m_helpWindow
->ReadCustomization(cfg
, path
);
222 void wxHtmlHelpController::WriteCustomization(wxConfigBase
* cfg
, const wxString
& path
)
224 /* typically called by the controllers OnCloseFrame handler */
225 if (m_helpWindow
&& cfg
)
226 m_helpWindow
->WriteCustomization(cfg
, path
);
229 void wxHtmlHelpController::UseConfig(wxConfigBase
*config
, const wxString
& rootpath
)
232 m_ConfigRoot
= rootpath
;
233 if (m_helpWindow
) m_helpWindow
->UseConfig(config
, rootpath
);
234 ReadCustomization(config
, rootpath
);
237 //// Backward compatibility with wxHelpController API
239 bool wxHtmlHelpController::Initialize(const wxString
& file
)
241 wxString dir
, filename
, ext
;
242 wxSplitPath(file
, & dir
, & filename
, & ext
);
245 dir
= dir
+ wxFILE_SEP_PATH
;
247 // Try to find a suitable file
248 wxString actualFilename
= dir
+ filename
+ wxString(wxT(".zip"));
249 if (!wxFileExists(actualFilename
))
251 actualFilename
= dir
+ filename
+ wxString(wxT(".htb"));
252 if (!wxFileExists(actualFilename
))
254 actualFilename
= dir
+ filename
+ wxString(wxT(".hhp"));
255 if (!wxFileExists(actualFilename
))
258 actualFilename
= dir
+ filename
+ wxString(wxT(".chm"));
259 if (!wxFileExists(actualFilename
))
265 return AddBook(wxFileName(actualFilename
));
268 bool wxHtmlHelpController::LoadFile(const wxString
& WXUNUSED(file
))
270 // Don't reload the file or we'll have it appear again, presumably.
274 bool wxHtmlHelpController::DisplaySection(int sectionNo
)
276 return Display(sectionNo
);
279 bool wxHtmlHelpController::DisplayTextPopup(const wxString
& text
, const wxPoint
& WXUNUSED(pos
))
282 static wxTipWindow
* s_tipWindow
= NULL
;
286 // Prevent s_tipWindow being nulled in OnIdle,
287 // thereby removing the chance for the window to be closed by ShowHelp
288 s_tipWindow
->SetTipWindowPtr(NULL
);
289 s_tipWindow
->Close();
295 s_tipWindow
= new wxTipWindow(wxTheApp
->GetTopWindow(), text
, 100, & s_tipWindow
);
301 #endif // wxUSE_TIPWINDOW
306 void wxHtmlHelpController::SetHelpWindow(wxHtmlHelpWindow
* helpWindow
)
308 m_helpWindow
= helpWindow
;
310 helpWindow
->SetController(this);
313 void wxHtmlHelpController::SetFrameParameters(const wxString
& title
,
316 bool WXUNUSED(newFrameEachTime
))
318 SetTitleFormat(title
);
319 wxHtmlHelpFrame
* frame
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpFrame
);
320 wxHtmlHelpDialog
* dialog
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpDialog
);
322 frame
->SetSize(pos
.x
, pos
.y
, size
.x
, size
.y
);
324 dialog
->SetSize(pos
.x
, pos
.y
, size
.x
, size
.y
);
327 wxFrame
* wxHtmlHelpController::GetFrameParameters(wxSize
*size
,
329 bool *newFrameEachTime
)
331 if (newFrameEachTime
)
332 (* newFrameEachTime
) = false;
334 wxHtmlHelpFrame
* frame
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpFrame
);
335 wxHtmlHelpDialog
* dialog
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpDialog
);
339 (* size
) = frame
->GetSize();
341 (* pos
) = frame
->GetPosition();
347 (* size
) = dialog
->GetSize();
349 (* pos
) = dialog
->GetPosition();
355 bool wxHtmlHelpController::Quit()
361 // Make the help controller's frame 'modal' if
363 void wxHtmlHelpController::MakeModalIfNeeded()
365 if ((m_FrameStyle
& wxHF_EMBEDDED
) == 0)
367 wxHtmlHelpFrame
* frame
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpFrame
);
368 wxHtmlHelpDialog
* dialog
= wxDynamicCast(FindTopLevelWindow(), wxHtmlHelpDialog
);
370 frame
->AddGrabIfNeeded();
371 else if (dialog
&& (m_FrameStyle
& wxHF_MODAL
))
378 bool wxHtmlHelpController::Display(const wxString
& x
)
381 bool success
= m_helpWindow
->Display(x
);
386 bool wxHtmlHelpController::Display(int id
)
389 bool success
= m_helpWindow
->Display(id
);
394 bool wxHtmlHelpController::DisplayContents()
397 bool success
= m_helpWindow
->DisplayContents();
402 bool wxHtmlHelpController::DisplayIndex()
405 bool success
= m_helpWindow
->DisplayIndex();
410 bool wxHtmlHelpController::KeywordSearch(const wxString
& keyword
,
411 wxHelpSearchMode mode
)
414 bool success
= m_helpWindow
->KeywordSearch(keyword
, mode
);
421 * A convenience class, to use like this:
423 * wxHtmlModalHelp help(parent, helpFile, topic);
426 wxHtmlModalHelp::wxHtmlModalHelp(wxWindow
* parent
, const wxString
& helpFile
, const wxString
& topic
, int style
)
428 // Force some mandatory styles
429 style
|= wxHF_DIALOG
| wxHF_MODAL
;
431 wxHtmlHelpController
controller(style
, parent
);
432 controller
.Initialize(helpFile
);
435 controller
.DisplayContents();
437 controller
.DisplaySection(topic
);
440 #endif // wxUSE_WXHTML_HELP