docview.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,347 行 · 第 1/5 页
CPP
2,347 行
{
Modify(false);
return true;
}
else if (res == wxYES)
return Save();
else if (res == wxCANCEL)
return false;
}
return true;
}
bool wxDocument::Draw(wxDC& WXUNUSED(context))
{
return true;
}
bool wxDocument::AddView(wxView *view)
{
if (!m_documentViews.Member(view))
{
m_documentViews.Append(view);
OnChangedViewList();
}
return true;
}
bool wxDocument::RemoveView(wxView *view)
{
(void)m_documentViews.DeleteObject(view);
OnChangedViewList();
return true;
}
bool wxDocument::OnCreate(const wxString& WXUNUSED(path), long flags)
{
if (GetDocumentTemplate()->CreateView(this, flags))
return true;
else
return false;
}
// Called after a view is added or removed.
// The default implementation deletes the document if
// there are no more views.
void wxDocument::OnChangedViewList()
{
if (m_documentViews.GetCount() == 0)
{
if (OnSaveModified())
{
delete this;
}
}
}
void wxDocument::UpdateAllViews(wxView *sender, wxObject *hint)
{
wxList::compatibility_iterator node = m_documentViews.GetFirst();
while (node)
{
wxView *view = (wxView *)node->GetData();
if (view != sender)
view->OnUpdate(sender, hint);
node = node->GetNext();
}
}
void wxDocument::NotifyClosing()
{
wxList::compatibility_iterator node = m_documentViews.GetFirst();
while (node)
{
wxView *view = (wxView *)node->GetData();
view->OnClosingDocument();
node = node->GetNext();
}
}
void wxDocument::SetFilename(const wxString& filename, bool notifyViews)
{
m_documentFile = filename;
if ( notifyViews )
{
// Notify the views that the filename has changed
wxList::compatibility_iterator node = m_documentViews.GetFirst();
while (node)
{
wxView *view = (wxView *)node->GetData();
view->OnChangeFilename();
node = node->GetNext();
}
}
}
bool wxDocument::DoSaveDocument(const wxString& file)
{
wxString msgTitle;
if (!wxTheApp->GetAppName().empty())
msgTitle = wxTheApp->GetAppName();
else
msgTitle = wxString(_("File error"));
#if wxUSE_STD_IOSTREAM
wxSTD ofstream store(file.mb_str(), wxSTD ios::binary);
if (store.fail() || store.bad())
#else
wxFileOutputStream store(file);
if (store.GetLastError() != wxSTREAM_NO_ERROR)
#endif
{
(void)wxMessageBox(_("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION,
GetDocumentWindow());
// Saving error
return false;
}
if (!SaveObject(store))
{
(void)wxMessageBox(_("Sorry, could not save this file."), msgTitle, wxOK | wxICON_EXCLAMATION,
GetDocumentWindow());
// Saving error
return false;
}
return true;
}
bool wxDocument::DoOpenDocument(const wxString& file)
{
#if wxUSE_STD_IOSTREAM
wxSTD ifstream store(file.mb_str(), wxSTD ios::binary);
if (!store.fail() && !store.bad())
#else
wxFileInputStream store(file);
if (store.GetLastError() == wxSTREAM_NO_ERROR)
#endif
{
#if wxUSE_STD_IOSTREAM
LoadObject(store);
if ( !!store || store.eof() )
#else
int res = LoadObject(store).GetLastError();
if ( res == wxSTREAM_NO_ERROR || res == wxSTREAM_EOF )
#endif
return true;
}
wxLogError(_("Sorry, could not open this file."));
return false;
}
// ----------------------------------------------------------------------------
// Document view
// ----------------------------------------------------------------------------
wxView::wxView()
{
m_viewDocument = (wxDocument*) NULL;
m_viewFrame = (wxFrame *) NULL;
}
wxView::~wxView()
{
GetDocumentManager()->ActivateView(this, false);
m_viewDocument->RemoveView(this);
}
// Extend event processing to search the document's event table
bool wxView::ProcessEvent(wxEvent& event)
{
if ( !GetDocument() || !GetDocument()->ProcessEvent(event) )
return wxEvtHandler::ProcessEvent(event);
return true;
}
void wxView::OnActivateView(bool WXUNUSED(activate), wxView *WXUNUSED(activeView), wxView *WXUNUSED(deactiveView))
{
}
void wxView::OnPrint(wxDC *dc, wxObject *WXUNUSED(info))
{
OnDraw(dc);
}
void wxView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint))
{
}
void wxView::OnChangeFilename()
{
if (GetFrame() && GetDocument())
{
wxString title;
GetDocument()->GetPrintableName(title);
GetFrame()->SetTitle(title);
}
}
void wxView::SetDocument(wxDocument *doc)
{
m_viewDocument = doc;
if (doc)
doc->AddView(this);
}
bool wxView::Close(bool deleteWindow)
{
if (OnClose(deleteWindow))
return true;
else
return false;
}
void wxView::Activate(bool activate)
{
if (GetDocument() && GetDocumentManager())
{
OnActivateView(activate, this, GetDocumentManager()->GetCurrentView());
GetDocumentManager()->ActivateView(this, activate);
}
}
bool wxView::OnClose(bool WXUNUSED(deleteWindow))
{
return GetDocument() ? GetDocument()->Close() : true;
}
#if wxUSE_PRINTING_ARCHITECTURE
wxPrintout *wxView::OnCreatePrintout()
{
return new wxDocPrintout(this);
}
#endif // wxUSE_PRINTING_ARCHITECTURE
// ----------------------------------------------------------------------------
// wxDocTemplate
// ----------------------------------------------------------------------------
wxDocTemplate::wxDocTemplate(wxDocManager *manager,
const wxString& descr,
const wxString& filter,
const wxString& dir,
const wxString& ext,
const wxString& docTypeName,
const wxString& viewTypeName,
wxClassInfo *docClassInfo,
wxClassInfo *viewClassInfo,
long flags)
{
m_documentManager = manager;
m_description = descr;
m_directory = dir;
m_defaultExt = ext;
m_fileFilter = filter;
m_flags = flags;
m_docTypeName = docTypeName;
m_viewTypeName = viewTypeName;
m_documentManager->AssociateTemplate(this);
m_docClassInfo = docClassInfo;
m_viewClassInfo = viewClassInfo;
}
wxDocTemplate::~wxDocTemplate()
{
m_documentManager->DisassociateTemplate(this);
}
// Tries to dynamically construct an object of the right class.
wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
{
wxDocument *doc = DoCreateDocument();
if ( doc == NULL )
return (wxDocument *) NULL;
if (InitDocument(doc, path, flags))
{
return doc;
}
else
{
return (wxDocument *) NULL;
}
}
bool wxDocTemplate::InitDocument(wxDocument* doc, const wxString& path, long flags)
{
doc->SetFilename(path);
doc->SetDocumentTemplate(this);
GetDocumentManager()->AddDocument(doc);
doc->SetCommandProcessor(doc->OnCreateCommandProcessor());
if (doc->OnCreate(path, flags))
return true;
else
{
if (GetDocumentManager()->GetDocuments().Member(doc))
doc->DeleteAllViews();
return false;
}
}
wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags)
{
wxView *view = DoCreateView();
if ( view == NULL )
return (wxView *) NULL;
view->SetDocument(doc);
if (view->OnCreate(doc, flags))
{
return view;
}
else
{
delete view;
return (wxView *) NULL;
}
}
// The default (very primitive) format detection: check is the extension is
// that of the template
bool wxDocTemplate::FileMatchesTemplate(const wxString& path)
{
wxStringTokenizer parser (GetFileFilter(), wxT(";"));
wxString anything = wxT ("*");
while (parser.HasMoreTokens())
{
wxString filter = parser.GetNextToken();
wxString filterExt = FindExtension (filter);
if ( filter.IsSameAs (anything) ||
filterExt.IsSameAs (anything) ||
filterExt.IsSameAs (FindExtension (path)) )
return true;
}
return GetDefaultExtension().IsSameAs(FindExtension(path));
}
wxDocument *wxDocTemplate::DoCreateDocument()
{
if (!m_docClassInfo)
return (wxDocument *) NULL;
return (wxDocument *)m_docClassInfo->CreateObject();
}
wxView *wxDocTemplate::DoCreateView()
{
if (!m_viewClassInfo)
return (wxView *) NULL;
return (wxView *)m_viewClassInfo->CreateObject();
}
// ----------------------------------------------------------------------------
// wxDocManager
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler)
EVT_MENU(wxID_OPEN, wxDocManager::OnFileOpen)
EVT_MENU(wxID_CLOSE, wxDocManager::OnFileClose)
EVT_MENU(wxID_CLOSE_ALL, wxDocManager::OnFileCloseAll)
EVT_MENU(wxID_REVERT, wxDocManager::OnFileRevert)
EVT_MENU(wxID_NEW, wxDocManager::OnFileNew)
EVT_MENU(wxID_SAVE, wxDocManager::OnFileSave)
EVT_MENU(wxID_SAVEAS, wxDocManager::OnFileSaveAs)
EVT_MENU(wxID_UNDO, wxDocManager::OnUndo)
EVT_MENU(wxID_REDO, wxDocManager::OnRedo)
EVT_UPDATE_UI(wxID_OPEN, wxDocManager::OnUpdateFileOpen)
EVT_UPDATE_UI(wxID_CLOSE, wxDocManager::OnUpdateFileClose)
EVT_UPDATE_UI(wxID_CLOSE_ALL, wxDocManager::OnUpdateFileClose)
EVT_UPDATE_UI(wxID_REVERT, wxDocManager::OnUpdateFileRevert)
EVT_UPDATE_UI(wxID_NEW, wxDocManager::OnUpdateFileNew)
EVT_UPDATE_UI(wxID_SAVE, wxDocManager::OnUpdateFileSave)
EVT_UPDATE_UI(wxID_SAVEAS, wxDocManager::OnUpdateFileSaveAs)
EVT_UPDATE_UI(wxID_UNDO, wxDocManager::OnUpdateUndo)
EVT_UPDATE_UI(wxID_REDO, wxDocManager::OnUpdateRedo)
#if wxUSE_PRINTING_ARCHITECTURE
EVT_MENU(wxID_PRINT, wxDocManager::OnPrint)
EVT_MENU(wxID_PREVIEW, wxDocManager::OnPreview)
EVT_UPDATE_UI(wxID_PRINT, wxDocManager::OnUpdatePrint)
EVT_UPDATE_UI(wxID_PREVIEW, wxDocManager::OnUpdatePreview)
#endif
END_EVENT_TABLE()
wxDocManager* wxDocManager::sm_docManager = (wxDocManager*) NULL;
wxDocManager::wxDocManager(long flags, bool initialize)
{
m_defaultDocumentNameCounter = 1;
m_flags = flags;
m_currentView = (wxView *) NULL;
m_maxDocsOpen = 10000;
m_fileHistory = (wxFileHistory *) NULL;
if (initialize)
Initialize();
sm_docManager = this;
}
wxDocManager::~wxDocManager()
{
Clear();
if (m_fileHistory)
delete m_fileHistory;
sm_docManager = (wxDocManager*) NULL;
}
// closes the specified document
bool wxDocManager::CloseDocument(wxDocument* doc, bool force)
{
if (doc->Close() || force)
{
// Implicitly deletes the document when
// the last view is deleted
doc->DeleteAllViews();
// Check we're really deleted
if (m_docs.Member(doc))
delete doc;
return true;
}
return false;
}
bool wxDocManager::CloseDocuments(bool force)
{
wxList::compatibility_iterator node = m_docs.GetFirst();
while (node)
{
wxDocument *doc = (wxDocument *)node->GetData();
wxList::compatibility_iterator next = node->GetNext();
if (!CloseDocument(doc, force))
return false;
// This assumes that documents are not connected in
// any way, i.e. deleting one document does NOT
// delete another.
node = next;
}
return true;
}
bool wxDocManager::Clear(bool force)
{
if (!CloseDocuments(force))
return false;
m_currentView = NULL;
wxList::compatibility_iterator node = m_templates.GetFirst();
while (node)
{
wxDocTemplate *templ = (wxDocTemplate*) node->GetData();
wxList::compatibility_iterator next = node->GetNext();
delete templ;
node = next;
}
return true;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?