1. added wxHelpProvider and (unfinished) wxSimpleHelpProvider
2. added wxStringHashTable which wxStringHashTable uses git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8316 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,41 +1,52 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: cshelp.cpp
|
||||
// Name: src/common/cshelp.cpp
|
||||
// Purpose: Context sensitive help class implementation
|
||||
// Author: Julian Smart
|
||||
// Author: Julian Smart, Vadim Zeitlin
|
||||
// Modified by:
|
||||
// Created: 08/09/2000
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Copyright: (c) 2000 Julian Smart, Vadim Zeitlin
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "cshelp.h"
|
||||
#pragma implementation "cshelp.h"
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_HELP
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/defs.h"
|
||||
// FIXME: temporary needed for wxSimpleHelpProvider compilation, to be
|
||||
// removed later
|
||||
#include "wx/intl.h"
|
||||
#include "wx/msgdlg.h"
|
||||
#endif
|
||||
|
||||
#include "wx/app.h"
|
||||
|
||||
#if wxUSE_HELP
|
||||
|
||||
#include "wx/cshelp.h"
|
||||
|
||||
/*
|
||||
* Invokes context-sensitive help
|
||||
*/
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxContextHelpEvtHandler private class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// This class exists in order to eat events until the left mouse
|
||||
// button is pressed
|
||||
// This class exists in order to eat events until the left mouse button is
|
||||
// pressed
|
||||
class wxContextHelpEvtHandler: public wxEvtHandler
|
||||
{
|
||||
public:
|
||||
@@ -50,6 +61,19 @@ public:
|
||||
wxContextHelp* m_contextHelp;
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxContextHelp
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* Invokes context-sensitive help
|
||||
*/
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxContextHelp, wxObject)
|
||||
|
||||
wxContextHelp::wxContextHelp(wxWindow* win, bool beginHelp)
|
||||
@@ -182,6 +206,10 @@ bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt)
|
||||
return eventProcessed;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxContextHelpButton
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* wxContextHelpButton
|
||||
* You can add this to your dialogs (especially on non-Windows platforms)
|
||||
@@ -227,4 +255,65 @@ void wxContextHelpButton::OnContextHelp(wxCommandEvent& event)
|
||||
wxContextHelp contextHelp(GetParent());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxHelpProvider
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxHelpProvider *wxHelpProvider::ms_helpProvider = (wxHelpProvider *)NULL;
|
||||
|
||||
// trivial implementation of some methods which we don't want to make pure
|
||||
// virtual for convenience
|
||||
|
||||
void wxHelpProvider::AddHelp(wxWindowBase * WXUNUSED(window),
|
||||
const wxString& WXUNUSED(text))
|
||||
{
|
||||
}
|
||||
|
||||
void wxHelpProvider::AddHelp(wxWindowID WXUNUSED(id),
|
||||
const wxString& WXUNUSED(text))
|
||||
{
|
||||
}
|
||||
|
||||
wxHelpProvider::~wxHelpProvider()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxSimpleHelpProvider
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window)
|
||||
{
|
||||
bool wasFound;
|
||||
wxString text = m_hashWindows.Get((long)window, &wasFound);
|
||||
if ( !wasFound )
|
||||
text = m_hashIds.Get(window->GetId());
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
void wxSimpleHelpProvider::AddHelp(wxWindowBase *window, const wxString& text)
|
||||
{
|
||||
m_hashWindows.Put((long)window, text);
|
||||
}
|
||||
|
||||
void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text)
|
||||
{
|
||||
m_hashIds.Put(id, text);
|
||||
}
|
||||
|
||||
bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
|
||||
{
|
||||
wxString text = GetHelp(window);
|
||||
if ( !text.empty() )
|
||||
{
|
||||
wxMessageBox(text, _("Help"), wxICON_INFORMATION | wxOK,
|
||||
(wxWindow *)window);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif // wxUSE_HELP
|
||||
|
||||
@@ -226,6 +226,85 @@ long wxHashTableLong::Delete(long key)
|
||||
return wxNOT_FOUND;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxStringHashTable: more efficient than storing strings in a list
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxStringHashTable::wxStringHashTable(size_t sizeTable)
|
||||
{
|
||||
m_keys = new wxArrayLong *[sizeTable];
|
||||
m_values = new wxArrayString *[sizeTable];
|
||||
|
||||
m_hashSize = sizeTable;
|
||||
for ( size_t n = 0; n < m_hashSize; n++ )
|
||||
{
|
||||
m_values[n] = (wxArrayString *)NULL;
|
||||
m_keys[n] = (wxArrayLong *)NULL;
|
||||
}
|
||||
}
|
||||
|
||||
wxStringHashTable::~wxStringHashTable()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void wxStringHashTable::Destroy()
|
||||
{
|
||||
for ( size_t n = 0; n < m_hashSize; n++ )
|
||||
{
|
||||
delete m_values[n];
|
||||
delete m_keys[n];
|
||||
}
|
||||
|
||||
delete [] m_values;
|
||||
delete [] m_keys;
|
||||
m_hashSize = 0;
|
||||
}
|
||||
|
||||
void wxStringHashTable::Put(long key, const wxString& value)
|
||||
{
|
||||
wxCHECK_RET( m_hashSize, _T("must call Create() first") );
|
||||
|
||||
size_t slot = (size_t)abs((int)(key % (long)m_hashSize));
|
||||
|
||||
if ( !m_keys[slot] )
|
||||
{
|
||||
m_keys[slot] = new wxArrayLong;
|
||||
m_values[slot] = new wxArrayString;
|
||||
}
|
||||
|
||||
m_keys[slot]->Add(key);
|
||||
m_values[slot]->Add(value);
|
||||
}
|
||||
|
||||
wxString wxStringHashTable::Get(long key, bool *wasFound) const
|
||||
{
|
||||
wxCHECK_MSG( m_hashSize, _T(""), _T("must call Create() first") );
|
||||
|
||||
size_t slot = (size_t)abs((int)(key % (long)m_hashSize));
|
||||
|
||||
wxArrayLong *keys = m_keys[slot];
|
||||
if ( keys )
|
||||
{
|
||||
size_t count = keys->GetCount();
|
||||
for ( size_t n = 0; n < count; n++ )
|
||||
{
|
||||
if ( keys->Item(n) == key )
|
||||
{
|
||||
if ( wasFound )
|
||||
*wasFound = TRUE;
|
||||
|
||||
return m_values[slot]->Item(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( wasFound )
|
||||
*wasFound = FALSE;
|
||||
|
||||
return _T("");
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// old not type safe wxHashTable
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
#include "wx/dnd.h"
|
||||
#endif // wxUSE_DRAG_AND_DROP
|
||||
|
||||
#if wxUSE_HELP
|
||||
#include "wx/cshelp.h"
|
||||
#endif // wxUSE_HELP
|
||||
|
||||
#if wxUSE_TOOLTIPS
|
||||
#include "wx/tooltip.h"
|
||||
#endif // wxUSE_TOOLTIPS
|
||||
@@ -77,6 +81,11 @@ BEGIN_EVENT_TABLE(wxWindowBase, wxEvtHandler)
|
||||
EVT_SYS_COLOUR_CHANGED(wxWindowBase::OnSysColourChanged)
|
||||
EVT_INIT_DIALOG(wxWindowBase::OnInitDialog)
|
||||
EVT_MIDDLE_DOWN(wxWindowBase::OnMiddleClick)
|
||||
|
||||
#if wxUSE_HELP
|
||||
EVT_HELP(-1, wxWindowBase::OnHelp)
|
||||
#endif // wxUSE_HELP
|
||||
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// ============================================================================
|
||||
@@ -838,6 +847,64 @@ void wxWindowBase::InitDialog()
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// context-sensitive help support
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_HELP
|
||||
|
||||
// associate this help text with this window
|
||||
void wxWindowBase::SetHelpText(const wxString& text)
|
||||
{
|
||||
wxHelpProvider *helpProvider = wxHelpProvider::Get();
|
||||
if ( helpProvider )
|
||||
{
|
||||
helpProvider->AddHelp(this, text);
|
||||
}
|
||||
}
|
||||
|
||||
// associate this help text with all windows with the same id as this
|
||||
// one
|
||||
void wxWindowBase::SetHelpTextForId(const wxString& text)
|
||||
{
|
||||
wxHelpProvider *helpProvider = wxHelpProvider::Get();
|
||||
if ( helpProvider )
|
||||
{
|
||||
helpProvider->AddHelp(GetId(), text);
|
||||
}
|
||||
}
|
||||
|
||||
// get the help string associated with this window (may be empty)
|
||||
wxString wxWindowBase::GetHelpText() const
|
||||
{
|
||||
wxString text;
|
||||
wxHelpProvider *helpProvider = wxHelpProvider::Get();
|
||||
if ( helpProvider )
|
||||
{
|
||||
text = helpProvider->GetHelp(this);
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
// show help for this window
|
||||
void wxWindowBase::OnHelp(wxHelpEvent& event)
|
||||
{
|
||||
wxHelpProvider *helpProvider = wxHelpProvider::Get();
|
||||
if ( helpProvider )
|
||||
{
|
||||
if ( helpProvider->ShowHelp(this) )
|
||||
{
|
||||
// skip the event.Skip() below
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
#endif // wxUSE_HELP
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// tooltips
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user