Committing in .
[wxWidgets.git] / src / generic / helpext.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: helpext.cpp
3 // Purpose: an external help controller for wxWindows
4 // Author: Karsten Ballueder
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Karsten Ballueder
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 # pragma implementation "wxexthlp.h"
14 #endif
15
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #if wxUSE_HELP
23
24 #ifndef WX_PRECOMP
25 #include "wx/setup.h"
26 #include "wx/string.h"
27 #include "wx/utils.h"
28 #include "wx/list.h"
29 #include "wx/intl.h"
30 #endif
31
32 #include "wx/helpbase.h"
33 #include "wx/generic/helpext.h"
34
35 #include <stdio.h>
36 #include <ctype.h>
37 #include <sys/stat.h>
38
39 #if !defined(__WINDOWS__) && !defined(__OS2__)
40 #include <unistd.h>
41 #endif
42
43 IMPLEMENT_CLASS(wxExtHelpController, wxHTMLHelpControllerBase)
44
45 /**
46 This class implements help via an external browser.
47 It requires the name of a directory containing the documentation
48 and a file mapping numerical Section numbers to relative URLS.
49 */
50
51 wxExtHelpController::wxExtHelpController(void)
52 {
53 m_BrowserName = WXEXTHELP_DEFAULTBROWSER;
54 m_BrowserIsNetscape = WXEXTHELP_DEFAULTBROWSER_IS_NETSCAPE;
55
56 char *browser = getenv(WXEXTHELP_ENVVAR_BROWSER);
57 if(browser)
58 {
59 m_BrowserName = browser;
60 browser = getenv(WXEXTHELP_ENVVAR_BROWSERISNETSCAPE);
61 m_BrowserIsNetscape = browser && (atoi(browser) != 0);
62 }
63 }
64
65
66 void
67 wxExtHelpController::SetBrowser(wxString const & browsername, bool isNetscape)
68 {
69 m_BrowserName = browsername;
70 m_BrowserIsNetscape = isNetscape;
71 }
72
73 // Set viewer: new, generic name for SetBrowser
74 void wxExtHelpController::SetViewer(const wxString& viewer, long flags)
75 {
76 SetBrowser(viewer, ((flags & wxHELP_NETSCAPE) == wxHELP_NETSCAPE));
77 }
78
79 bool
80 wxExtHelpController::DisplayHelp(wxString const &relativeURL)
81 {
82 wxBusyCursor b; // display a busy cursor
83
84
85 #if defined(__WXMSW__)
86 wxString url;
87 url << m_MapFile << '\\' << relativeURL.BeforeFirst('#');
88 bool bOk = (int)ShellExecute(NULL, "open", url,
89 NULL, NULL, SW_SHOWNORMAL ) > 32;
90 if ( !bOk )
91 {
92 wxLogSysError(_("Cannot open URL '%s'"), relativeURL.c_str());
93 return false;
94 }
95 else
96 return true;
97 #elif defined(__WXPM__)
98 wxString url;
99 url << m_MapFile << '\\' << relativeURL.BeforeFirst('#');
100 // will have to fix for OS/2, later.....DW
101 // bool bOk = (int)ShellExecute(NULL, "open", url,
102 // NULL, NULL, SW_SHOWNORMAL ) > 32;
103 // if ( !bOk )
104 // {
105 // wxLogSysError(_("Cannot open URL '%s'"), relativeURL.c_str());
106 // return false;
107 // }
108 // else
109 return TRUE;
110 #else
111 // assume UNIX
112 wxString command;
113
114 if(m_BrowserIsNetscape) // try re-loading first
115 {
116 wxString lockfile;
117 wxGetHomeDir(&lockfile);
118 #ifdef __VMS__
119 lockfile << WXEXTHELP_SEPARATOR << wxT(".netscape]lock.");
120 struct stat statbuf;
121 if(stat(lockfile.fn_str(), &statbuf) == 0)
122 #else
123 lockfile << WXEXTHELP_SEPARATOR << wxT(".netscape/lock");
124 struct stat statbuf;
125 if(lstat(lockfile.fn_str(), &statbuf) == 0)
126 // cannot use wxFileExists, because it's a link pointing to a
127 // non-existing location if(wxFileExists(lockfile))
128 #endif
129 {
130 long success;
131 command << m_BrowserName << wxT(" -remote openURL(")
132 << wxT("file://") << m_MapFile
133 << WXEXTHELP_SEPARATOR << relativeURL << wxT(")");
134 success = wxExecute(command);
135 if(success != 0 ) // returns PID on success
136 return TRUE;
137 }
138 }
139 command = m_BrowserName;
140 command << wxT(" file://")
141 << m_MapFile << WXEXTHELP_SEPARATOR << relativeURL;
142 return wxExecute(command) != 0;
143 #endif
144 }
145
146 #endif // wxUSE_HELP
147