home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / contrib / utils / wxrcedit / preview.cpp < prev    next >
C/C++ Source or Header  |  2002-02-03  |  7KB  |  242 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Author:      Vaclav Slavik
  3. // Created:     2000/05/05
  4. // RCS-ID:      $Id: preview.cpp,v 1.9 2002/02/02 23:17:16 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,const wxString &version)
  144. {
  145.    while (node->GetParent()->GetParent() != NULL) node = node->GetParent();
  146.  
  147.    {
  148.        wxXmlDocument doc;
  149.        wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource"));
  150.        root->AddProperty(new wxXmlProperty(wxT("version"),version,NULL));
  151.        doc.SetRoot(root);
  152.        doc.GetRoot()->AddChild(new wxXmlNode(*node));
  153.  
  154.        if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog")) 
  155.            XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));   
  156.  
  157.        doc.Save(m_TmpFile);
  158.        // wxXmlResource will detect change automatically
  159.    }
  160.  
  161.  
  162.    //if (m_Node != node)
  163.    {
  164.        SetToolBar(NULL);
  165.        for (int i = (int)(GetMenuBar()->GetMenuCount())-1; i >= 0; i--)
  166.            delete GetMenuBar()->Remove(i);
  167.        m_ScrollWin->DestroyChildren();
  168.    }
  169.  
  170.    m_Node = node;
  171.    m_Version = version;
  172.  
  173.    m_LogCtrl->Clear();
  174.    wxLogTextCtrl mylog(m_LogCtrl);
  175.    wxLog *oldlog = wxLog::SetActiveTarget(&mylog);
  176.    
  177.    wxString oldcwd = wxGetCwd();
  178.    wxSetWorkingDirectory(wxPathOnly(EditorFrame::Get()->GetFileName()));
  179.    
  180.    if (XmlGetClass(node) == _T("wxMenuBar") || XmlGetClass(node) == _T("wxMenu"))
  181.        PreviewMenu();
  182.    else if (XmlGetClass(node) == _T("wxToolBar"))
  183.        PreviewToolbar();
  184.    else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog"))
  185.        PreviewPanel();
  186.    
  187.    wxSetWorkingDirectory(oldcwd);
  188.    wxLog::SetActiveTarget(oldlog);
  189.    
  190.    m_Dirty = FALSE;
  191. }
  192.  
  193.  
  194.  
  195. void PreviewFrame::PreviewMenu()
  196. {
  197.     wxMenuBar *mbar;
  198.  
  199.     if (XmlGetClass(m_Node) == _T("wxMenuBar"))
  200.         mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1")));
  201.     else
  202.     {
  203.         wxMenu *m = m_RC->LoadMenu(m_Node->GetPropVal(_T("name"), _T("-1")));
  204.         if (m != NULL) GetMenuBar()->Append(m, _("(menu)"));
  205.     }
  206.  
  207.     if (mbar == NULL)
  208.         wxLogError(_("Cannot preview the menu -- XML resource corrupted."));
  209. }
  210.  
  211.  
  212.  
  213. void PreviewFrame::PreviewToolbar()
  214. {
  215.     SetToolBar(m_RC->LoadToolBar(this, m_Node->GetPropVal(_T("name"), _T("-1"))));
  216. }
  217.  
  218.  
  219.  
  220. void PreviewFrame::PreviewPanel()
  221. {
  222.     wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1")));
  223.     
  224.     if (panel == NULL)
  225.         wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
  226.     else
  227.     {
  228.         m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
  229.                                    0, 0, TRUE);
  230.     }
  231. }
  232.  
  233.  
  234. BEGIN_EVENT_TABLE(PreviewFrame, wxFrame)
  235.     EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter)
  236. END_EVENT_TABLE()
  237.  
  238. void PreviewFrame::OnMouseEnter(wxMouseEvent& event)
  239. {
  240.     if (m_Dirty) Preview(m_Node,m_Version);
  241. }
  242.