merged 2.2 branch
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -130,6 +130,7 @@ wxDocument::wxDocument(wxDocument *parent)
|
||||
m_documentModified = FALSE;
|
||||
m_documentParent = parent;
|
||||
m_documentTemplate = (wxDocTemplate *) NULL;
|
||||
m_commandProcessor = (wxCommandProcessor*) NULL;
|
||||
m_savedYet = FALSE;
|
||||
}
|
||||
|
||||
@@ -145,7 +146,8 @@ wxDocument::~wxDocument()
|
||||
if (m_commandProcessor)
|
||||
delete m_commandProcessor;
|
||||
|
||||
GetDocumentManager()->RemoveDocument(this);
|
||||
if (GetDocumentManager())
|
||||
GetDocumentManager()->RemoveDocument(this);
|
||||
|
||||
// Not safe to do here, since it'll invoke virtual view functions
|
||||
// expecting to see valid derived objects: and by the time we get here,
|
||||
@@ -172,6 +174,8 @@ bool wxDocument::OnCloseDocument()
|
||||
// deleted.
|
||||
bool wxDocument::DeleteAllViews()
|
||||
{
|
||||
wxDocManager* manager = GetDocumentManager();
|
||||
|
||||
wxNode *node = m_documentViews.First();
|
||||
while (node)
|
||||
{
|
||||
@@ -184,6 +188,11 @@ bool wxDocument::DeleteAllViews()
|
||||
delete view; // Deletes node implicitly
|
||||
node = next;
|
||||
}
|
||||
// If we haven't yet deleted the document (for example
|
||||
// if there were no views) then delete it.
|
||||
if (manager && manager->GetDocuments().Member(this))
|
||||
delete this;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -196,7 +205,7 @@ wxView *wxDocument::GetFirstView() const
|
||||
|
||||
wxDocManager *wxDocument::GetDocumentManager() const
|
||||
{
|
||||
return m_documentTemplate->GetDocumentManager();
|
||||
return (m_documentTemplate ? m_documentTemplate->GetDocumentManager() : (wxDocManager*) NULL);
|
||||
}
|
||||
|
||||
bool wxDocument::OnNewDocument()
|
||||
@@ -287,7 +296,7 @@ bool wxDocument::OnSaveDocument(const wxString& file)
|
||||
msgTitle = wxString(_("File error"));
|
||||
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
ofstream store(wxString(file.fn_str()));
|
||||
ofstream store(wxString(file.fn_str()).mb_str());
|
||||
if (store.fail() || store.bad())
|
||||
#else
|
||||
wxFileOutputStream store(wxString(file.fn_str()));
|
||||
@@ -323,7 +332,7 @@ bool wxDocument::OnOpenDocument(const wxString& file)
|
||||
msgTitle = wxString(_("File error"));
|
||||
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
ifstream store(wxString(file.fn_str()));
|
||||
ifstream store(wxString(file.fn_str()).mb_str());
|
||||
if (store.fail() || store.bad())
|
||||
#else
|
||||
wxFileInputStream store(wxString(file.fn_str()));
|
||||
@@ -655,7 +664,8 @@ wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
|
||||
return doc;
|
||||
else
|
||||
{
|
||||
delete doc;
|
||||
if (GetDocumentManager()->GetDocuments().Member(doc))
|
||||
doc->DeleteAllViews();
|
||||
return (wxDocument *) NULL;
|
||||
}
|
||||
}
|
||||
@@ -1096,7 +1106,8 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
|
||||
newDoc->SetDocumentTemplate(temp);
|
||||
if (!newDoc->OnOpenDocument(path2))
|
||||
{
|
||||
delete newDoc;
|
||||
newDoc->DeleteAllViews();
|
||||
// delete newDoc; // Implicitly deleted by DeleteAllViews
|
||||
return (wxDocument *) NULL;
|
||||
}
|
||||
AddFileToHistory(path2);
|
||||
@@ -1294,6 +1305,28 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path)
|
||||
return theTemplate;
|
||||
}
|
||||
|
||||
// Try to get a more suitable parent frame than the top window,
|
||||
// for selection dialogs. Otherwise you may get an unexpected
|
||||
// window being activated when a dialog is shown.
|
||||
static wxWindow* wxFindSuitableParent()
|
||||
{
|
||||
wxWindow* parent = wxTheApp->GetTopWindow();
|
||||
|
||||
wxWindow* focusWindow = wxWindow::FindFocus();
|
||||
if (focusWindow)
|
||||
{
|
||||
while (focusWindow &&
|
||||
!focusWindow->IsKindOf(CLASSINFO(wxDialog)) &&
|
||||
!focusWindow->IsKindOf(CLASSINFO(wxFrame)))
|
||||
|
||||
focusWindow = focusWindow->GetParent();
|
||||
|
||||
if (focusWindow)
|
||||
parent = focusWindow;
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
|
||||
// Prompts user to open a file, using file specs in templates.
|
||||
// How to implement in wxWindows? Must extend the file selector
|
||||
// dialog or implement own; OR match the extension to the
|
||||
@@ -1332,16 +1365,33 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
|
||||
#endif
|
||||
|
||||
int FilterIndex = 0;
|
||||
|
||||
wxWindow* parent = wxFindSuitableParent();
|
||||
|
||||
wxString pathTmp = wxFileSelectorEx(_("Select a file"),
|
||||
m_lastDirectory,
|
||||
wxT(""),
|
||||
&FilterIndex,
|
||||
descrBuf,
|
||||
0,
|
||||
wxTheApp->GetTopWindow());
|
||||
parent);
|
||||
|
||||
if (!pathTmp.IsEmpty())
|
||||
{
|
||||
if (!wxFileExists(pathTmp))
|
||||
{
|
||||
wxString msgTitle;
|
||||
if (!wxTheApp->GetAppName().IsEmpty())
|
||||
msgTitle = wxTheApp->GetAppName();
|
||||
else
|
||||
msgTitle = wxString(_("File error"));
|
||||
|
||||
(void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK | wxICON_EXCLAMATION,
|
||||
parent);
|
||||
|
||||
path = wxT("");
|
||||
return (wxDocTemplate *) NULL;
|
||||
}
|
||||
m_lastDirectory = wxPathOnly(pathTmp);
|
||||
|
||||
path = pathTmp;
|
||||
@@ -1414,8 +1464,10 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates,
|
||||
return temp;
|
||||
}
|
||||
|
||||
wxWindow* parent = wxFindSuitableParent();
|
||||
|
||||
wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document template"), _("Templates"), n,
|
||||
strings, (void **)data);
|
||||
strings, (void **)data, parent);
|
||||
delete[] strings;
|
||||
delete[] data;
|
||||
return theTemplate;
|
||||
@@ -1437,8 +1489,10 @@ wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates,
|
||||
n ++;
|
||||
}
|
||||
}
|
||||
wxWindow* parent = wxFindSuitableParent();
|
||||
|
||||
wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document view"), _("Views"), n,
|
||||
strings, (void **)data);
|
||||
strings, (void **)data, parent);
|
||||
delete[] strings;
|
||||
delete[] data;
|
||||
return theTemplate;
|
||||
@@ -1619,8 +1673,7 @@ void wxDocParentFrame::OnMRUFile(wxCommandEvent& event)
|
||||
// about it
|
||||
m_docManager->RemoveFileFromHistory(n);
|
||||
|
||||
wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\n"
|
||||
"It has been also removed from the MRU files list."),
|
||||
wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\nIt has been also removed from the MRU files list."),
|
||||
filename.c_str());
|
||||
}
|
||||
}
|
||||
@@ -2165,7 +2218,7 @@ bool wxTransferFileToStream(const wxString& filename, ostream& stream)
|
||||
FILE *fd1;
|
||||
int ch;
|
||||
|
||||
if ((fd1 = fopen (filename.fn_str(), "rb")) == NULL)
|
||||
if ((fd1 = wxFopen (filename.fn_str(), _T("rb"))) == NULL)
|
||||
return FALSE;
|
||||
|
||||
while ((ch = getc (fd1)) != EOF)
|
||||
@@ -2180,7 +2233,7 @@ bool wxTransferStreamToFile(istream& stream, const wxString& filename)
|
||||
FILE *fd1;
|
||||
int ch;
|
||||
|
||||
if ((fd1 = fopen (filename.fn_str(), "wb")) == NULL)
|
||||
if ((fd1 = wxFopen (filename.fn_str(), _T("wb"))) == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -2200,7 +2253,7 @@ bool wxTransferFileToStream(const wxString& filename, wxOutputStream& stream)
|
||||
FILE *fd1;
|
||||
int ch;
|
||||
|
||||
if ((fd1 = fopen (filename.fn_str(), "rb")) == NULL)
|
||||
if ((fd1 = wxFopen (filename.fn_str(), wxT("rb"))) == NULL)
|
||||
return FALSE;
|
||||
|
||||
while ((ch = getc (fd1)) != EOF)
|
||||
@@ -2215,7 +2268,7 @@ bool wxTransferStreamToFile(wxInputStream& stream, const wxString& filename)
|
||||
FILE *fd1;
|
||||
char ch;
|
||||
|
||||
if ((fd1 = fopen (filename.fn_str(), "wb")) == NULL)
|
||||
if ((fd1 = wxFopen (filename.fn_str(), wxT("wb"))) == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user