home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / contrib / utils / wxrcedit / preview.cpp < prev    next >
C/C++ Source or Header  |  2002-09-28  |  7KB  |  245 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Author:      Vaclav Slavik
  3. // Created:     2000/05/05
  4. // RCS-ID:      $Id: preview.cpp,v 1.9.2.1 2002/09/25 11:10:18 VS Exp $
  5. // Copyright:   (c) 2000 Vaclav Slavik
  6. // Licence:     wxWindows licence
  7. /////////////////////////////////////////////////////////////////////////////
  8.  
  9. #ifdef __GNUG__
  10.     #pragma implementation "preview.h"
  11. #endif
  12.  
  13. // For compilers that support precompilation, includes "wx/wx.h".
  14. #include "wx/wxprec.h"
  15.  
  16. #ifdef __BORLANDC__
  17.     #pragma hdrstop
  18. #endif
  19.  
  20. #include "wx/wx.h"
  21. #include "wx/xrc/xml.h"
  22. #include "wx/xrc/xmlres.h"
  23. #include "wx/config.h"
  24. #include "wx/log.h"
  25. #include "wx/splitter.h"
  26. #include "preview.h"
  27. #include "xmlhelpr.h"
  28. #include "editor.h"
  29.  
  30. #include "wx/xrc/xh_menu.h"
  31.  
  32. class MyMenubarHandler : public wxMenuBarXmlHandler
  33. {
  34.     public:
  35.         MyMenubarHandler(wxMenuBar *mbar) : m_MenuBar(mbar) {}
  36.  
  37.         wxObject *DoCreateResource()
  38.         {
  39.             //wxMenuBar *menubar = new wxMenuBar(GetStyle());            
  40.             CreateChildren(m_MenuBar);
  41.             return m_MenuBar;
  42.         }
  43.         
  44.     private:
  45.         wxMenuBar *m_MenuBar;
  46. };
  47.  
  48.  
  49.  
  50.  
  51. PreviewFrame* PreviewFrame::ms_Instance = NULL;
  52.  
  53. PreviewFrame *PreviewFrame::Get()
  54. {
  55.     if (ms_Instance == NULL) 
  56.     {
  57.         (void)new PreviewFrame;
  58.         ms_Instance->Show(TRUE);
  59.     }
  60.     return ms_Instance;
  61. }
  62.  
  63. PreviewFrame::PreviewFrame()
  64.     : wxFrame(EditorFrame::Get(), -1, _("Preview"),
  65.               wxDefaultPosition, wxDefaultSize, 
  66.               wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR
  67. #ifdef __WXMSW__
  68.               | wxFRAME_TOOL_WINDOW
  69. #endif
  70.               )
  71. {
  72.     m_Dirty = FALSE;
  73.     ms_Instance = this;
  74.     m_Node = NULL;
  75.     
  76.     SetMenuBar(new wxMenuBar());
  77.     
  78.     m_RC = NULL;
  79.     m_TmpFile = wxGetTempFileName(_T("wxrcedit"));
  80.     ResetResource();
  81.  
  82.     wxConfigBase *cfg = wxConfigBase::Get();
  83.     SetSize(wxRect(wxPoint(cfg->Read(_T("previewframe_x"), -1), cfg->Read(_T("previewframe_y"), -1)),
  84.             wxSize(cfg->Read(_T("previewframe_w"), 400), cfg->Read(_T("previewframe_h"), 400))));
  85.  
  86.     m_Splitter = new wxSplitterWindow(this, -1);
  87.     m_LogCtrl = new wxTextCtrl(m_Splitter, -1, wxEmptyString, wxDefaultPosition, 
  88.                                wxDefaultSize, wxTE_MULTILINE);
  89.     m_ScrollWin = new wxScrolledWindow(m_Splitter, -1);
  90.     m_ScrollWin->SetBackgroundColour(_T("light steel blue"));
  91.     m_Splitter->SplitHorizontally(m_ScrollWin, m_LogCtrl, cfg->Read(_T("previewframe_sash"), 300));
  92.  
  93.     CreateStatusBar();
  94.  
  95. #ifdef __WXMSW__
  96.     SendSizeEvent(); // force resize for WXMSW
  97. #endif
  98. }
  99.  
  100.  
  101.  
  102. void PreviewFrame::ResetResource()
  103. {
  104.     delete m_RC;
  105.     m_RC = new wxXmlResource;
  106.     // these handlers take precedence over std. ones:
  107.     m_RC->AddHandler(new MyMenubarHandler(GetMenuBar()));
  108.     // std handlers:
  109.     m_RC->InitAllHandlers();
  110.     wxRemoveFile(m_TmpFile);
  111.     m_RC->Load(m_TmpFile);
  112. }
  113.  
  114. PreviewFrame::~PreviewFrame()
  115. {
  116.     wxConfigBase *cfg = wxConfigBase::Get();  
  117.     cfg->Write(_T("previewframe_x"), (long)GetPosition().x);
  118.     cfg->Write(_T("previewframe_y"), (long)GetPosition().y);
  119.     cfg->Write(_T("previewframe_w"), (long)GetSize().x);
  120.     cfg->Write(_T("previewframe_h"), (long)GetSize().y);
  121.     cfg->Write(_T("previewframe_sash"), (long)m_Splitter->GetSashPosition());
  122.     
  123.     ms_Instance = NULL;
  124.     
  125.     delete m_RC;
  126.     wxRemoveFile(m_TmpFile);
  127. }
  128.  
  129.  
  130.         
  131. void PreviewFrame::MakeDirty()
  132. {
  133.     if (m_Node == NULL) return;
  134.     if (m_Dirty) return;
  135.     m_Dirty = TRUE;
  136.     m_LogCtrl->Clear();
  137.     m_LogCtrl->SetValue(_("Resource modified.\n"
  138.                    "Move mouse cursor over the preview window to refresh it."));
  139. }
  140.  
  141.  
  142.  
  143. void PreviewFrame::Preview(wxXmlNode *node, wxXmlDocument *orig_doc)
  144. {
  145.    wxString version = orig_doc->GetRoot()->GetPropVal(wxT("version"), wxT("0.0.0.0"));
  146.  
  147.    while (node->GetParent()->GetParent() != NULL) node = node->GetParent();
  148.  
  149.    {
  150.        wxXmlDocument doc;
  151.        wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource"));
  152.        root->AddProperty(new wxXmlProperty(wxT("version"),version,NULL));
  153.        doc.SetRoot(root);
  154.        doc.GetRoot()->AddChild(new wxXmlNode(*node));
  155.        doc.SetFileEncoding(orig_doc->GetFileEncoding());
  156.  
  157.        if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog")) 
  158.            XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));   
  159.  
  160.        doc.Save(m_TmpFile);
  161.        // wxXmlResource will detect change automatically
  162.    }
  163.  
  164.  
  165.    //if (m_Node != node)
  166.    {
  167.        SetToolBar(NULL);
  168.        for (int i = (int)(GetMenuBar()->GetMenuCount())-1; i >= 0; i--)
  169.            delete GetMenuBar()->Remove(i);
  170.        m_ScrollWin->DestroyChildren();
  171.    }
  172.  
  173.    m_Node = node;
  174.    m_Doc = orig_doc;
  175.  
  176.    m_LogCtrl->Clear();
  177.    wxLogTextCtrl mylog(m_LogCtrl);
  178.    wxLog *oldlog = wxLog::SetActiveTarget(&mylog);
  179.    
  180.    wxString oldcwd = wxGetCwd();
  181.    wxSetWorkingDirectory(wxPathOnly(EditorFrame::Get()->GetFileName()));
  182.    
  183.    if (XmlGetClass(node) == _T("wxMenuBar") || XmlGetClass(node) == _T("wxMenu"))
  184.        PreviewMenu();
  185.    else if (XmlGetClass(node) == _T("wxToolBar"))
  186.        PreviewToolbar();
  187.    else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog"))
  188.        PreviewPanel();
  189.    
  190.    wxSetWorkingDirectory(oldcwd);
  191.    wxLog::SetActiveTarget(oldlog);
  192.    
  193.    m_Dirty = FALSE;
  194. }
  195.  
  196.  
  197.  
  198. void PreviewFrame::PreviewMenu()
  199. {
  200.     wxMenuBar *mbar;
  201.  
  202.     if (XmlGetClass(m_Node) == _T("wxMenuBar"))
  203.         mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1")));
  204.     else
  205.     {
  206.         wxMenu *m = m_RC->LoadMenu(m_Node->GetPropVal(_T("name"), _T("-1")));
  207.         if (m != NULL) GetMenuBar()->Append(m, _("(menu)"));
  208.     }
  209.  
  210.     if (mbar == NULL)
  211.         wxLogError(_("Cannot preview the menu -- XML resource corrupted."));
  212. }
  213.  
  214.  
  215.  
  216. void PreviewFrame::PreviewToolbar()
  217. {
  218.     SetToolBar(m_RC->LoadToolBar(this, m_Node->GetPropVal(_T("name"), _T("-1"))));
  219. }
  220.  
  221.  
  222.  
  223. void PreviewFrame::PreviewPanel()
  224. {
  225.     wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1")));
  226.     
  227.     if (panel == NULL)
  228.         wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
  229.     else
  230.     {
  231.         m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
  232.                                    0, 0, TRUE);
  233.     }
  234. }
  235.  
  236.  
  237. BEGIN_EVENT_TABLE(PreviewFrame, wxFrame)
  238.     EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter)
  239. END_EVENT_TABLE()
  240.  
  241. void PreviewFrame::OnMouseEnter(wxMouseEvent& event)
  242. {
  243.     if (m_Dirty) Preview(m_Node,m_Doc);
  244. }
  245.