This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
491 lines
13 KiB
C++
491 lines
13 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: helpview.h
|
|
// Purpose: HelpView application
|
|
// A standalone viewer for wxHTML Help (.htb) files
|
|
// Author: Vaclav Slavik, Julian Smart
|
|
// Modified by:
|
|
// Created: 2002-07-09
|
|
// Copyright: (c) 2002 Vaclav Slavik, Julian Smart and others
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
// for all others, include the necessary headers (this file is usually all you
|
|
// need because it includes almost all "standard" wxWidgets headers
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "wx/filename.h"
|
|
#include "wx/image.h"
|
|
#include "wx/wxhtml.h"
|
|
#include "wx/fs_zip.h"
|
|
#include "wx/log.h"
|
|
#include "wx/artprov.h"
|
|
#include "wx/filedlg.h"
|
|
|
|
#include "helpview.h"
|
|
|
|
class AlternateArtProvider : public wxArtProvider
|
|
{
|
|
protected:
|
|
virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client,
|
|
const wxSize& size);
|
|
};
|
|
|
|
IMPLEMENT_APP(hvApp)
|
|
|
|
hvApp::hvApp()
|
|
{
|
|
#if wxUSE_IPC
|
|
m_server = NULL;
|
|
#endif
|
|
}
|
|
|
|
bool hvApp::OnInit()
|
|
{
|
|
#ifdef __WXMOTIF__
|
|
delete wxLog::SetActiveTarget(new wxLogStderr); // So dialog boxes aren't used
|
|
#endif
|
|
|
|
wxArtProvider::Push(new AlternateArtProvider);
|
|
|
|
#if defined( __WXOSX_MAC__ ) && wxOSX_USE_CARBON
|
|
wxApp::s_macAboutMenuItemId = wxID_ABOUT;
|
|
wxFileName::MacRegisterDefaultTypeAndCreator( wxT("htb") , 'HTBD' , 'HTBA' ) ;
|
|
#endif
|
|
|
|
int istyle = wxHF_DEFAULT_STYLE;
|
|
|
|
wxString service, windowName, titleFormat, argStr;
|
|
wxString book[10];
|
|
int bookCount = 0;
|
|
int i;
|
|
bool hasService = false;
|
|
bool hasWindowName = false;
|
|
bool createServer = false;
|
|
|
|
#if wxUSE_IPC
|
|
m_server = NULL;
|
|
#endif
|
|
|
|
// Help books are recognized by extension ".hhp" ".htb" or ".zip".
|
|
// Service and window_name can occur anywhere in arguments,
|
|
// but service must be first
|
|
// Other arguments (topic?) could be added
|
|
|
|
// modes of operation:
|
|
// 1) no arguments - stand alone, prompt user for book
|
|
// 2) books only - stand alone, open books
|
|
// 3) "--server" as (any) arg - start connection with default service;
|
|
// also open any books passed as other arguments
|
|
// 4) at least one argument which is not book, and not "--server" - take first
|
|
// such argument as service, second (if present) as window name,
|
|
// start service, open any books
|
|
|
|
for( i=1; i<argc; i++ )
|
|
{
|
|
argStr = argv[i];
|
|
|
|
if ( argStr.Find( wxT(".hhp") ) >= 0
|
|
|| argStr.Find( wxT(".htb") ) >= 0
|
|
|| argStr.Find( wxT(".zip") ) >= 0 )
|
|
{
|
|
book[bookCount] = argStr;
|
|
bookCount++;
|
|
}
|
|
else if ( argStr == wxT("--server") )
|
|
{
|
|
createServer = true;
|
|
#if defined(__WXMSW__)
|
|
service = wxT("generic_helpservice");
|
|
#elif defined(__UNIX__)
|
|
service = wxT("/tmp/") + wxString(wxT("generic_helpservice"));
|
|
#else
|
|
service = wxT("4242");
|
|
#endif
|
|
}
|
|
else if ( !hasService )
|
|
{
|
|
service = argStr;
|
|
hasService = true;
|
|
createServer = true;
|
|
}
|
|
else if ( !hasWindowName )
|
|
{
|
|
windowName = argStr;
|
|
hasWindowName = true;
|
|
}
|
|
else if ( argStr.Find( wxT("--Style") ) >= 0 )
|
|
{
|
|
long i;
|
|
wxString numb = argStr.AfterLast(wxT('e'));
|
|
if ( !(numb.ToLong(&i) ) )
|
|
{
|
|
wxLogError( wxT("Integer conversion failed for --Style") );
|
|
}
|
|
else
|
|
{
|
|
istyle = i;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//unknown - could be topic?
|
|
}
|
|
}
|
|
|
|
// No book - query user; but not on Mac, since there
|
|
// may be an AppleEvent to open a document on the way
|
|
#ifndef __WXMAC__
|
|
if ( bookCount < 1 )
|
|
{
|
|
wxString s = wxFileSelector( wxT("Open help file"),
|
|
wxGetCwd(),
|
|
wxEmptyString,
|
|
wxEmptyString,
|
|
wxT("Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|HTML Help Project (*.hhp)|*.hhp"),
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST,
|
|
NULL);
|
|
|
|
if (!s.empty())
|
|
{
|
|
book[0] = s;
|
|
bookCount = 1;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if wxUSE_IPC
|
|
|
|
if ( createServer )
|
|
{
|
|
// Create a new server
|
|
m_server = new hvServer;
|
|
|
|
if ( !m_server->Create(service) )
|
|
{
|
|
wxString wxm = wxT("Server Create failed - service: ");
|
|
wxString xxm = wxm << service;
|
|
wxLogError( xxm );
|
|
//if MSW quits here, probably another copy already exists
|
|
return false;
|
|
}
|
|
createServer = false;
|
|
wxUnusedVar(createServer);
|
|
}
|
|
|
|
#endif // wxUSE_IPC
|
|
|
|
//now add help
|
|
wxInitAllImageHandlers();
|
|
wxFileSystem::AddHandler(new wxZipFSHandler);
|
|
|
|
SetVendorName(wxT("wxWidgets") );
|
|
SetAppName(wxT("wxHTMLHelpServer") );
|
|
wxConfig::Get(); // create an instance
|
|
|
|
m_helpController = new wxHtmlHelpController( istyle );
|
|
|
|
if ( !hasWindowName )
|
|
{
|
|
titleFormat = wxT("Help: %s") ;
|
|
}
|
|
else
|
|
{
|
|
//remove underscores
|
|
windowName.Replace( wxT("_"), wxT(" ") );
|
|
titleFormat = windowName;
|
|
}
|
|
|
|
m_helpController->SetTitleFormat( titleFormat );
|
|
|
|
for( i=0; i<bookCount; i++ )
|
|
{
|
|
wxFileName fileName(book[i]);
|
|
m_helpController->AddBook(fileName);
|
|
}
|
|
|
|
#ifdef __WXMOTIF__
|
|
delete wxLog::SetActiveTarget(new wxLogGui);
|
|
#endif
|
|
|
|
m_helpController->DisplayContents();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
int hvApp::OnExit()
|
|
{
|
|
#if wxUSE_IPC
|
|
wxObjectList::compatibility_iterator node = m_connections.GetFirst();
|
|
while (node)
|
|
{
|
|
wxObjectList::compatibility_iterator next = node->GetNext();
|
|
hvConnection* connection = (hvConnection*) node->GetData();
|
|
connection->Disconnect();
|
|
delete connection;
|
|
node = next;
|
|
}
|
|
m_connections.Clear();
|
|
|
|
if (m_server)
|
|
{
|
|
delete m_server;
|
|
m_server = NULL;
|
|
}
|
|
#endif
|
|
|
|
delete m_helpController;
|
|
delete wxConfig::Set(NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool hvApp::OpenBook(wxHtmlHelpController* controller)
|
|
{
|
|
wxString s = wxFileSelector(_("Open help file"),
|
|
wxGetCwd(),
|
|
wxEmptyString,
|
|
wxEmptyString,
|
|
_(
|
|
"Help books (*.htb)|*.htb|Help books (*.zip)|*.zip|\
|
|
HTML Help Project (*.hhp)|*.hhp"),
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST,
|
|
NULL);
|
|
|
|
if ( !s.empty() )
|
|
{
|
|
wxString ext = s.Right(4).Lower();
|
|
if (ext == wxT(".zip") || ext == wxT(".htb") || ext == wxT(".hhp"))
|
|
{
|
|
wxBusyCursor bcur;
|
|
wxFileName fileName(s);
|
|
controller->AddBook(fileName);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#ifdef __WXMAC__
|
|
/// Respond to Apple Event for opening a document
|
|
void hvApp::MacOpenFiles(const wxArrayString& fileNames)
|
|
{
|
|
wxBusyCursor bcur;
|
|
wxFileName fileName(fileNames[0]);
|
|
m_helpController->AddBook(fileName);
|
|
m_helpController->DisplayContents();
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Art provider class
|
|
*/
|
|
|
|
// ---------------------------------------------------------------------
|
|
// helper macros
|
|
// ---------------------------------------------------------------------
|
|
|
|
// Standard macro for getting a resource from XPM file:
|
|
#define ART(artId, xpmRc) \
|
|
if ( id == artId ) return wxBitmap(xpmRc##_xpm);
|
|
|
|
#define GET_STD_ICON_FROM_APP(iconId)
|
|
|
|
// There are two ways of getting the standard icon: either via XPMs or via
|
|
// wxIcon ctor. This depends on the platform:
|
|
#if defined(__WXUNIVERSAL__)
|
|
#define CREATE_STD_ICON(iconId, xpmRc) return wxNullBitmap;
|
|
#elif defined(__WXGTK__) || defined(__WXMOTIF__)
|
|
#define CREATE_STD_ICON(iconId, xpmRc) return wxBitmap(xpmRc##_xpm);
|
|
#else
|
|
#define CREATE_STD_ICON(iconId, xpmRc) \
|
|
{ \
|
|
wxIcon icon(wxT(iconId)); \
|
|
wxBitmap bmp; \
|
|
bmp.CopyFromIcon(icon); \
|
|
return bmp; \
|
|
}
|
|
#endif
|
|
|
|
// Macro used in CreateBitmap to get wxICON_FOO icons:
|
|
#define ART_MSGBOX(artId, iconId, xpmRc) \
|
|
if ( id == artId ) \
|
|
{ \
|
|
GET_STD_ICON_FROM_APP(iconId) \
|
|
CREATE_STD_ICON(#iconId, xpmRc) \
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
// XPMs with the art
|
|
// ---------------------------------------------------------------------
|
|
|
|
// XPM hack: make the arrays const
|
|
//#define static static const
|
|
|
|
#include "bitmaps/helpback.xpm"
|
|
#include "bitmaps/helpbook.xpm"
|
|
#include "bitmaps/helpdown.xpm"
|
|
#include "bitmaps/helpforward.xpm"
|
|
#include "bitmaps/helpoptions.xpm"
|
|
#include "bitmaps/helppage.xpm"
|
|
#include "bitmaps/helpsidepanel.xpm"
|
|
#include "bitmaps/helpup.xpm"
|
|
#include "bitmaps/helpuplevel.xpm"
|
|
#include "bitmaps/helpicon.xpm"
|
|
#include "bitmaps/helpopen.xpm"
|
|
|
|
//#undef static
|
|
|
|
// ---------------------------------------------------------------------
|
|
// CreateBitmap routine
|
|
// ---------------------------------------------------------------------
|
|
|
|
wxBitmap AlternateArtProvider::CreateBitmap(const wxArtID& id,
|
|
const wxArtClient& client,
|
|
const wxSize& WXUNUSED(size))
|
|
{
|
|
ART(wxART_HELP_SIDE_PANEL, helpsidepanel)
|
|
ART(wxART_HELP_SETTINGS, helpoptions)
|
|
ART(wxART_HELP_BOOK, helpbook)
|
|
ART(wxART_HELP_FOLDER, helpbook)
|
|
ART(wxART_HELP_PAGE, helppage)
|
|
//ART(wxART_ADD_BOOKMARK, addbookm)
|
|
//ART(wxART_DEL_BOOKMARK, delbookm)
|
|
ART(wxART_GO_BACK, helpback)
|
|
ART(wxART_GO_FORWARD, helpforward)
|
|
ART(wxART_GO_UP, helpup)
|
|
ART(wxART_GO_DOWN, helpdown)
|
|
ART(wxART_GO_TO_PARENT, helpuplevel)
|
|
ART(wxART_FILE_OPEN, helpopen)
|
|
if (client == wxART_HELP_BROWSER)
|
|
{
|
|
//ART(wxART_FRAME_ICON, helpicon)
|
|
ART(wxART_HELP, helpicon)
|
|
}
|
|
|
|
//ART(wxART_GO_HOME, home)
|
|
|
|
// Any wxWidgets icons not implemented here
|
|
// will be provided by the default art provider.
|
|
return wxNullBitmap;
|
|
}
|
|
|
|
#if wxUSE_IPC
|
|
|
|
wxConnectionBase *hvServer::OnAcceptConnection(const wxString& topic)
|
|
{
|
|
if (topic == wxT("HELP"))
|
|
return new hvConnection();
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// hvConnection
|
|
// ----------------------------------------------------------------------------
|
|
|
|
hvConnection::hvConnection()
|
|
: wxConnection()
|
|
{
|
|
wxGetApp().GetConnections().Append(this);
|
|
}
|
|
|
|
hvConnection::~hvConnection()
|
|
{
|
|
wxGetApp().GetConnections().DeleteObject(this);
|
|
}
|
|
|
|
bool hvConnection::OnExec(const wxString& WXUNUSED(topic),
|
|
const wxString& data)
|
|
{
|
|
// wxLogStatus("Execute command: %s", data);
|
|
|
|
if ( data == "--intstring" )
|
|
{
|
|
long i;
|
|
wxString argStr = data;
|
|
wxString numb = argStr.AfterLast(wxT('g'));
|
|
if ( !(numb.ToLong(&i) ) )
|
|
{
|
|
wxLogError( wxT("Integer conversion failed for --intstring") );
|
|
}
|
|
else
|
|
{
|
|
wxGetApp().GetHelpController()->Display(int(i));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wxGetApp().GetHelpController()->Display(data);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool hvConnection::OnPoke(const wxString& WXUNUSED(topic),
|
|
const wxString& item,
|
|
const void *buf,
|
|
size_t size,
|
|
wxIPCFormat format)
|
|
{
|
|
const wxString data = GetTextFromData(buf, size, format);
|
|
|
|
// wxLogStatus("Poke command: %s = %s", item.c_str(), data);
|
|
//topic is not tested
|
|
|
|
if ( wxGetApp().GetHelpController() )
|
|
{
|
|
if ( item == wxT("--AddBook") )
|
|
{
|
|
wxGetApp().GetHelpController()->AddBook(data);
|
|
}
|
|
else if ( item == wxT("--DisplayContents") )
|
|
{
|
|
wxGetApp().GetHelpController()->DisplayContents();
|
|
}
|
|
else if ( item == wxT("--DisplayIndex") )
|
|
{
|
|
wxGetApp().GetHelpController()->DisplayIndex();
|
|
}
|
|
else if ( item == wxT("--KeywordSearch") )
|
|
{
|
|
wxGetApp().GetHelpController()->KeywordSearch(data);
|
|
}
|
|
else if ( item == wxT("--SetTitleFormat") )
|
|
{
|
|
wxString newname = data;
|
|
newname.Replace( wxT("_"), wxT(" ") );
|
|
wxGetApp().GetHelpController()->SetTitleFormat(newname);
|
|
//does not redraw title bar?
|
|
//wxGetApp().GetHelpController()->ReFresh(); - or something
|
|
}
|
|
else if ( item == wxT("--SetTempDir") )
|
|
{
|
|
wxGetApp().GetHelpController()->SetTempDir(data);
|
|
}
|
|
else if ( item == wxT("--YouAreDead") )
|
|
{
|
|
// don't really know how to kill app from down here...
|
|
// use wxKill from client instead
|
|
//wxWindow *win = wxTheApp->GetTopWindow();
|
|
//if ( win )
|
|
// win->Destroy();
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
#endif // #if wxUSE_IPC
|