X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e066e2566a4e5db3510fe6a204d66850eaeceade..d1a6e2b7a103d761fbc15e0e9c1c20ab53a849d9:/contrib/utils/wxrcedit/preview.cpp diff --git a/contrib/utils/wxrcedit/preview.cpp b/contrib/utils/wxrcedit/preview.cpp index 82729ec307..0d84d45db5 100644 --- a/contrib/utils/wxrcedit/preview.cpp +++ b/contrib/utils/wxrcedit/preview.cpp @@ -19,7 +19,7 @@ #include "wx/wx.h" #include "wx/xml/xml.h" -#include "wx/xml/xmlres.h" +#include "wx/xrc/xmlres.h" #include "wx/config.h" #include "wx/log.h" #include "wx/splitter.h" @@ -27,7 +27,7 @@ #include "xmlhelpr.h" #include "editor.h" -#include "wx/xml/xh_menu.h" +#include "wx/xrc/xh_menu.h" class MyMenubarHandler : public wxMenuBarXmlHandler { @@ -61,20 +61,23 @@ PreviewFrame *PreviewFrame::Get() } PreviewFrame::PreviewFrame() - : wxFrame(NULL, -1, _("Preview")) + : wxFrame(EditorFrame::Get(), -1, _("Preview"), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR +#ifdef __WXMSW__ + | wxFRAME_TOOL_WINDOW +#endif + ) { + m_Dirty = FALSE; ms_Instance = this; m_Node = NULL; SetMenuBar(new wxMenuBar()); - m_RC = new wxXmlResource; - // these handlers take precedence over std. ones: - m_RC->AddHandler(new MyMenubarHandler(GetMenuBar())); - // std handlers: - m_RC->InitAllHandlers(); + m_RC = NULL; m_TmpFile = wxGetTempFileName(_T("wxrcedit")); - m_RC->Load(m_TmpFile); + ResetResource(); wxConfigBase *cfg = wxConfigBase::Get(); SetSize(wxRect(wxPoint(cfg->Read(_T("previewframe_x"), -1), cfg->Read(_T("previewframe_y"), -1)), @@ -88,10 +91,26 @@ PreviewFrame::PreviewFrame() m_Splitter->SplitHorizontally(m_ScrollWin, m_LogCtrl, cfg->Read(_T("previewframe_sash"), 300)); CreateStatusBar(); + +#ifdef __WXMSW__ + SendSizeEvent(); // force resize for WXMSW +#endif } +void PreviewFrame::ResetResource() +{ + delete m_RC; + m_RC = new wxXmlResource; + // these handlers take precedence over std. ones: + m_RC->AddHandler(new MyMenubarHandler(GetMenuBar())); + // std handlers: + m_RC->InitAllHandlers(); + wxRemoveFile(m_TmpFile); + m_RC->Load(m_TmpFile); +} + PreviewFrame::~PreviewFrame() { wxConfigBase *cfg = wxConfigBase::Get(); @@ -109,19 +128,38 @@ PreviewFrame::~PreviewFrame() -void PreviewFrame::Preview(wxXmlNode *node) +void PreviewFrame::MakeDirty() +{ + if (m_Node == NULL) return; + if (m_Dirty) return; + m_Dirty = TRUE; + m_LogCtrl->Clear(); + m_LogCtrl->SetValue(_("Resource modified.\nMove mouse cursor over the preview window to refresh it.")); +} + + + +void PreviewFrame::Preview(wxXmlNode *node, wxXmlDocument *orig_doc) { + wxString version = orig_doc->GetRoot()->GetPropVal(wxT("version"), wxT("0.0.0.0")); + while (node->GetParent()->GetParent() != NULL) node = node->GetParent(); { wxXmlDocument doc; - doc.SetRoot(new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource"))); + wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource")); + root->AddProperty(new wxXmlProperty(wxT("version"),version,NULL)); + doc.SetRoot(root); doc.GetRoot()->AddChild(new wxXmlNode(*node)); + doc.SetFileEncoding(orig_doc->GetFileEncoding()); if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog")) XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel")); - doc.Save(m_TmpFile, wxXML_IO_BIN); + if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxFrame")) + XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel")); + + doc.Save(m_TmpFile); // wxXmlResource will detect change automatically } @@ -135,6 +173,7 @@ void PreviewFrame::Preview(wxXmlNode *node) } m_Node = node; + m_Doc = orig_doc; m_LogCtrl->Clear(); wxLogTextCtrl mylog(m_LogCtrl); @@ -149,16 +188,20 @@ void PreviewFrame::Preview(wxXmlNode *node) PreviewToolbar(); else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog")) PreviewPanel(); - + else if (XmlGetClass(node) == _T("wxFrame")) + PreviewWXFrame(); + wxSetWorkingDirectory(oldcwd); wxLog::SetActiveTarget(oldlog); + + m_Dirty = FALSE; } void PreviewFrame::PreviewMenu() { - wxMenuBar *mbar; + wxMenuBar *mbar = NULL; if (XmlGetClass(m_Node) == _T("wxMenuBar")) mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1"))); @@ -184,6 +227,37 @@ void PreviewFrame::PreviewToolbar() void PreviewFrame::PreviewPanel() { wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1"))); + + if (panel == NULL) + wxLogError(_("Cannot preview the panel -- XML resource corrupted.")); + else + { + m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y, + 0, 0, TRUE); + } +} + +void PreviewFrame::PreviewWXFrame() +{ + //for this to work the frame MUST have a child panel! + + wxXmlNode* child = m_Node; + wxString name; + + while( child != NULL) + { + name = child->GetPropVal(_T("name"), _T("-1")); + + if(name != _T("-1")) + { + wxXmlNode* parent = child->GetParent(); + if(parent->GetPropVal(_T("class"),_T("-1")) == _T("wxPanel")) + break; + } + child = child->GetNext(); + } + + wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, name); if (panel == NULL) wxLogError(_("Cannot preview the panel -- XML resource corrupted.")); @@ -192,4 +266,14 @@ void PreviewFrame::PreviewPanel() m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y, 0, 0, TRUE); } + +} + +BEGIN_EVENT_TABLE(PreviewFrame, wxFrame) + EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter) +END_EVENT_TABLE() + +void PreviewFrame::OnMouseEnter(wxMouseEvent& WXUNUSED(event)) +{ + if (m_Dirty) Preview(m_Node,m_Doc); }