1. some patches from Janos Vegh to docview template detection

2. fixed reentrancy bug in wxGetTranslation/wxLogError resulting in infinite
   number of messageboxes
3. wxMenuItem::GetLabelFromText("&Foo") now returns "Foo", not "&Foo" in GTK
   as well
4. test for update region being NULL in wxPaintDC


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6655 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-03-13 15:48:03 +00:00
parent c9ce2da080
commit 5f170f33fd
9 changed files with 171 additions and 128 deletions

View File

@@ -333,6 +333,10 @@ public:
// Extend event processing to search the view's event table // Extend event processing to search the view's event table
virtual bool ProcessEvent(wxEvent& event); virtual bool ProcessEvent(wxEvent& event);
// called when file format detection didn't work, can be overridden to do
// something in this case
virtual void OnOpenFileFailure() { wxFAIL_MSG(_T("file format mismatch")); }
virtual wxDocument *CreateDocument(const wxString& path, long flags = 0); virtual wxDocument *CreateDocument(const wxString& path, long flags = 0);
virtual wxView *CreateView(wxDocument *doc, long flags = 0); virtual wxView *CreateView(wxDocument *doc, long flags = 0);
virtual void DeleteTemplate(wxDocTemplate *temp, long flags = 0); virtual void DeleteTemplate(wxDocTemplate *temp, long flags = 0);

View File

@@ -298,6 +298,12 @@ protected:
// empty everything // empty everything
void Clear(); void Clear();
// the translated titles for misc message boxes: only translate ones to
// avoid reentrancy problems later
wxString m_error,
m_warning,
m_info;
wxArrayString m_aMessages; // the log message texts wxArrayString m_aMessages; // the log message texts
wxArrayInt m_aSeverity; // one of wxLOG_XXX values wxArrayInt m_aSeverity; // one of wxLOG_XXX values
wxArrayLong m_aTimes; // the time of each message wxArrayLong m_aTimes; // the time of each message

View File

@@ -806,7 +806,10 @@ void wxDocManager::OnFileNew(wxCommandEvent& WXUNUSED(event))
void wxDocManager::OnFileOpen(wxCommandEvent& WXUNUSED(event)) void wxDocManager::OnFileOpen(wxCommandEvent& WXUNUSED(event))
{ {
CreateDocument(wxString(""), 0); if ( !CreateDocument(wxString(""), 0) )
{
OnOpenFileFailure();
}
} }
void wxDocManager::OnFileRevert(wxCommandEvent& WXUNUSED(event)) void wxDocManager::OnFileRevert(wxCommandEvent& WXUNUSED(event))

View File

@@ -79,7 +79,7 @@ typedef unsigned char size_t8;
{ {
// Asserting a sizeof directly causes some compilers to // Asserting a sizeof directly causes some compilers to
// issue a "using constant in a conditional expression" warning // issue a "using constant in a conditional expression" warning
size_t intsize = sizeof(int); size_t intsize = sizeof(int);
wxASSERT_MSG( intsize == 4, wxASSERT_MSG( intsize == 4,
"size_t32 is incorrectly defined!" ); "size_t32 is incorrectly defined!" );
@@ -97,7 +97,7 @@ const size_t32 MSGCATALOG_MAGIC = 0x950412de;
const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495; const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495;
// extension of ".mo" files // extension of ".mo" files
#define MSGCATALOG_EXTENSION ".mo" #define MSGCATALOG_EXTENSION _T(".mo")
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// global functions // global functions
@@ -290,14 +290,20 @@ static wxString GetFullSearchPath(const wxChar *lang)
<< wxPATH_SEP; << wxPATH_SEP;
} }
// LC_PATH is a standard env var containing the search path for the .mo
// files
const wxChar *pszLcPath = wxGetenv("LC_PATH");
if ( pszLcPath != NULL )
searchPath << GetAllMsgCatalogSubdirs(pszLcPath, lang);
// then take the current directory // then take the current directory
// FIXME it should be the directory of the executable // FIXME it should be the directory of the executable
searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang) << wxPATH_SEP; searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang) << wxPATH_SEP;
// and finally add some standard ones // and finally add some standard ones
searchPath searchPath
<< GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang) << wxPATH_SEP << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang)
<< GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang) << wxPATH_SEP << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang)
<< GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang); << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang);
return searchPath; return searchPath;
@@ -314,14 +320,6 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b
if(szName.Find(wxT('.')) != -1) // contains a dot if(szName.Find(wxT('.')) != -1) // contains a dot
szName = szName.Left(szName.Find(wxT('.'))); szName = szName.Left(szName.Find(wxT('.')));
// FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me?
// KB: search path where to find the mo files, probably : delimited
#if 0
const wxChar *pszLcPath = wxGetenv("LC_PATH");
if ( pszLcPath != NULL )
strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH;
#endif // 0
wxString searchPath = GetFullSearchPath(szDirPrefix); wxString searchPath = GetFullSearchPath(szDirPrefix);
const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_')); const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_'));
if ( sublocale ) if ( sublocale )
@@ -343,7 +341,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b
// (we're using an object because we have several return paths) // (we're using an object because we have several return paths)
NoTransErr noTransErr; NoTransErr noTransErr;
wxLogVerbose(wxT("looking for catalog '%s' in path '%s'."), wxLogVerbose(_("looking for catalog '%s' in path '%s'."),
szName.c_str(), searchPath.c_str()); szName.c_str(), searchPath.c_str());
wxString strFullName; wxString strFullName;
@@ -405,7 +403,8 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b
m_pszName = new wxChar[wxStrlen(szName) + 1]; m_pszName = new wxChar[wxStrlen(szName) + 1];
wxStrcpy(m_pszName, szName); wxStrcpy(m_pszName, szName);
if (bConvertEncoding) ConvertEncoding(); if (bConvertEncoding)
ConvertEncoding();
// everything is fine // everything is fine
return TRUE; return TRUE;

View File

@@ -99,6 +99,9 @@ private:
// the listctrl (not shown initially) // the listctrl (not shown initially)
wxListCtrl *m_listctrl; wxListCtrl *m_listctrl;
// the translated "Details" string
static wxString ms_details;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@@ -170,12 +173,22 @@ void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
wxLogGui::wxLogGui() wxLogGui::wxLogGui()
{ {
// we must translate them here in the very beginning or we risk to have
// reentrancy problems when called from inside wxGetTranslation() leading
// to inifnite recursion
m_error = _("Error");
m_warning = _("Warning");
m_info = _("Information");
Clear(); Clear();
} }
void wxLogGui::Clear() void wxLogGui::Clear()
{ {
m_bErrors = m_bWarnings = FALSE; m_bErrors =
m_bWarnings =
m_bHasMessages = FALSE;
m_aMessages.Empty(); m_aMessages.Empty();
m_aSeverity.Empty(); m_aSeverity.Empty();
m_aTimes.Empty(); m_aTimes.Empty();
@@ -198,15 +211,15 @@ void wxLogGui::Flush()
long style; long style;
if ( m_bErrors ) { if ( m_bErrors ) {
title += _("Error"); title += m_error;
style = wxICON_STOP; style = wxICON_STOP;
} }
else if ( m_bWarnings ) { else if ( m_bWarnings ) {
title += _("Warning"); title += m_warning;
style = wxICON_EXCLAMATION; style = wxICON_EXCLAMATION;
} }
else { else {
title += _("Information"); title += m_info;
style = wxICON_INFORMATION; style = wxICON_INFORMATION;
} }
@@ -260,9 +273,6 @@ void wxLogGui::Flush()
// no undisplayed messages whatsoever // no undisplayed messages whatsoever
Clear(); Clear();
} }
// do it here again
m_bHasMessages = FALSE;
} }
// log all kinds of messages // log all kinds of messages
@@ -653,6 +663,8 @@ wxLogWindow::~wxLogWindow()
static const size_t MARGIN = 10; static const size_t MARGIN = 10;
wxString wxLogDialog::ms_details;
wxLogDialog::wxLogDialog(wxWindow *parent, wxLogDialog::wxLogDialog(wxWindow *parent,
const wxArrayString& messages, const wxArrayString& messages,
const wxArrayInt& severity, const wxArrayInt& severity,
@@ -661,6 +673,13 @@ wxLogDialog::wxLogDialog(wxWindow *parent,
long style) long style)
: wxDialog(parent, -1, caption ) : wxDialog(parent, -1, caption )
{ {
if ( ms_details )
{
// ensure that we won't try to call wxGetTranslation() twice
ms_details = _T("&Details");
ms_details = wxGetTranslation(ms_details);
}
size_t count = messages.GetCount(); size_t count = messages.GetCount();
m_messages.Alloc(count); m_messages.Alloc(count);
m_severity.Alloc(count); m_severity.Alloc(count);
@@ -690,9 +709,9 @@ wxLogDialog::wxLogDialog(wxWindow *parent,
wxBoxSizer *sizerButtons = new wxBoxSizer(wxVERTICAL); wxBoxSizer *sizerButtons = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *sizerAll = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *sizerAll = new wxBoxSizer(wxHORIZONTAL);
wxButton *btnOk = new wxButton(this, wxID_OK, _T("OK")); wxButton *btnOk = new wxButton(this, wxID_OK, _("OK"));
sizerButtons->Add(btnOk, 0, wxCENTRE|wxBOTTOM, MARGIN/2); sizerButtons->Add(btnOk, 0, wxCENTRE|wxBOTTOM, MARGIN/2);
m_btnDetails = new wxButton(this, wxID_MORE, _T("&Details >>")); m_btnDetails = new wxButton(this, wxID_MORE, ms_details + _T(" >>"));
sizerButtons->Add(m_btnDetails, 0, wxCENTRE|wxTOP, MARGIN/2 - 1); sizerButtons->Add(m_btnDetails, 0, wxCENTRE|wxTOP, MARGIN/2 - 1);
wxIcon icon = wxTheApp->GetStdIcon((int)(style & wxICON_MASK)); wxIcon icon = wxTheApp->GetStdIcon((int)(style & wxICON_MASK));
@@ -743,13 +762,13 @@ void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event))
if ( m_showingDetails ) if ( m_showingDetails )
{ {
m_btnDetails->SetLabel(_T("&Details >>")); m_btnDetails->SetLabel(ms_details + _T(">>"));
sizer->Remove(m_listctrl); sizer->Remove(m_listctrl);
} }
else // show details now else // show details now
{ {
m_btnDetails->SetLabel(_T("<< &Details")); m_btnDetails->SetLabel(wxString(_T("<< ")) + ms_details);
if ( !m_listctrl ) if ( !m_listctrl )
{ {
@@ -760,8 +779,10 @@ void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event))
wxLC_REPORT | wxLC_REPORT |
wxLC_NO_HEADER | wxLC_NO_HEADER |
wxLC_SINGLE_SEL); wxLC_SINGLE_SEL);
m_listctrl->InsertColumn(0, _("Message")); // no need to translate these strings as they're not shown to the
m_listctrl->InsertColumn(1, _("Time")); // user anyhow (we use wxLC_NO_HEADER style)
m_listctrl->InsertColumn(0, _T("Message"));
m_listctrl->InsertColumn(1, _T("Time"));
// prepare the imagelist // prepare the imagelist
static const int ICON_SIZE = 16; static const int ICON_SIZE = 16;

View File

@@ -2023,12 +2023,16 @@ wxPaintDC::wxPaintDC( wxWindow *win )
return; return;
m_paintClippingRegion = win->GetUpdateRegion(); m_paintClippingRegion = win->GetUpdateRegion();
m_currentClippingRegion.Union( m_paintClippingRegion ); GdkRegion *region = m_paintClippingRegion.GetRegion();
if ( region )
{
m_currentClippingRegion.Union( m_paintClippingRegion );
gdk_gc_set_clip_region( m_penGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_penGC, region );
gdk_gc_set_clip_region( m_brushGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_brushGC, region );
gdk_gc_set_clip_region( m_textGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_textGC, region );
gdk_gc_set_clip_region( m_bgGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_bgGC, region );
}
#endif #endif
} }

View File

@@ -641,9 +641,10 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
#if (GTK_MINOR_VERSION > 0) #if (GTK_MINOR_VERSION > 0)
for ( const wxChar *pc = text.c_str(); *pc; pc++ ) for ( const wxChar *pc = text.c_str(); *pc; pc++ )
{ {
if ( *pc == wxT('_') ) if ( *pc == wxT('_') || *pc == wxT('&') )
{ {
// this is the escape character for GTK+ - skip it // '_' is the escape character for GTK+ and '&' is the one for
// wxWindows - skip both of them
continue; continue;
} }

View File

@@ -2023,12 +2023,16 @@ wxPaintDC::wxPaintDC( wxWindow *win )
return; return;
m_paintClippingRegion = win->GetUpdateRegion(); m_paintClippingRegion = win->GetUpdateRegion();
m_currentClippingRegion.Union( m_paintClippingRegion ); GdkRegion *region = m_paintClippingRegion.GetRegion();
if ( region )
{
m_currentClippingRegion.Union( m_paintClippingRegion );
gdk_gc_set_clip_region( m_penGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_penGC, region );
gdk_gc_set_clip_region( m_brushGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_brushGC, region );
gdk_gc_set_clip_region( m_textGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_textGC, region );
gdk_gc_set_clip_region( m_bgGC, m_paintClippingRegion.GetRegion() ); gdk_gc_set_clip_region( m_bgGC, region );
}
#endif #endif
} }

View File

@@ -641,9 +641,10 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
#if (GTK_MINOR_VERSION > 0) #if (GTK_MINOR_VERSION > 0)
for ( const wxChar *pc = text.c_str(); *pc; pc++ ) for ( const wxChar *pc = text.c_str(); *pc; pc++ )
{ {
if ( *pc == wxT('_') ) if ( *pc == wxT('_') || *pc == wxT('&') )
{ {
// this is the escape character for GTK+ - skip it // '_' is the escape character for GTK+ and '&' is the one for
// wxWindows - skip both of them
continue; continue;
} }