]> git.saurik.com Git - wxWidgets.git/blame - contrib/utils/wxrcedit/preview.cpp
wxZipFSHandler does not report non-local zip archives as openable anymore
[wxWidgets.git] / contrib / utils / wxrcedit / preview.cpp
CommitLineData
e066e256
VS
1/////////////////////////////////////////////////////////////////////////////
2// Author: Vaclav Slavik
3// Created: 2000/05/05
4// RCS-ID: $Id$
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/xml/xml.h"
22#include "wx/xml/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/xml/xh_menu.h"
31
32class 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
51PreviewFrame* PreviewFrame::ms_Instance = NULL;
52
53PreviewFrame *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
63PreviewFrame::PreviewFrame()
aaa2b34e
VS
64 : wxFrame(EditorFrame::Get(), -1, _("Preview"),
65 wxDefaultPosition, wxDefaultSize,
66 wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxFRAME_TOOL_WINDOW)
e066e256 67{
26607f41 68 m_Dirty = FALSE;
e066e256
VS
69 ms_Instance = this;
70 m_Node = NULL;
71
72 SetMenuBar(new wxMenuBar());
73
74 m_RC = new wxXmlResource;
75 // these handlers take precedence over std. ones:
76 m_RC->AddHandler(new MyMenubarHandler(GetMenuBar()));
77 // std handlers:
78 m_RC->InitAllHandlers();
79 m_TmpFile = wxGetTempFileName(_T("wxrcedit"));
80 m_RC->Load(m_TmpFile);
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();
aaa2b34e
VS
94
95 SetSize(GetSize()); // refresh: MSW needs it
e066e256
VS
96}
97
98
99
100PreviewFrame::~PreviewFrame()
101{
102 wxConfigBase *cfg = wxConfigBase::Get();
103 cfg->Write(_T("previewframe_x"), (long)GetPosition().x);
104 cfg->Write(_T("previewframe_y"), (long)GetPosition().y);
105 cfg->Write(_T("previewframe_w"), (long)GetSize().x);
106 cfg->Write(_T("previewframe_h"), (long)GetSize().y);
107 cfg->Write(_T("previewframe_sash"), (long)m_Splitter->GetSashPosition());
108
109 ms_Instance = NULL;
110
111 delete m_RC;
112 wxRemoveFile(m_TmpFile);
113}
114
115
116
26607f41
VS
117void PreviewFrame::MakeDirty()
118{
119 if (m_Node == NULL) return;
120 if (m_Dirty) return;
121 m_Dirty = TRUE;
122 m_LogCtrl->Clear();
123 m_LogCtrl->SetValue(_("Resource modified.\n"
124 "Move mouse cursor over the preview window to refresh it."));
125}
126
127
128
e066e256
VS
129void PreviewFrame::Preview(wxXmlNode *node)
130{
131 while (node->GetParent()->GetParent() != NULL) node = node->GetParent();
132
133 {
134 wxXmlDocument doc;
135 doc.SetRoot(new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource")));
136 doc.GetRoot()->AddChild(new wxXmlNode(*node));
137
138 if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog"))
139 XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));
140
141 doc.Save(m_TmpFile, wxXML_IO_BIN);
142 // wxXmlResource will detect change automatically
143 }
144
145
146 //if (m_Node != node)
147 {
148 SetToolBar(NULL);
149 for (int i = (int)(GetMenuBar()->GetMenuCount())-1; i >= 0; i--)
150 delete GetMenuBar()->Remove(i);
151 m_ScrollWin->DestroyChildren();
152 }
153
154 m_Node = node;
155
156 m_LogCtrl->Clear();
157 wxLogTextCtrl mylog(m_LogCtrl);
158 wxLog *oldlog = wxLog::SetActiveTarget(&mylog);
159
160 wxString oldcwd = wxGetCwd();
161 wxSetWorkingDirectory(wxPathOnly(EditorFrame::Get()->GetFileName()));
162
163 if (XmlGetClass(node) == _T("wxMenuBar") || XmlGetClass(node) == _T("wxMenu"))
164 PreviewMenu();
165 else if (XmlGetClass(node) == _T("wxToolBar"))
166 PreviewToolbar();
167 else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog"))
168 PreviewPanel();
169
170 wxSetWorkingDirectory(oldcwd);
171 wxLog::SetActiveTarget(oldlog);
26607f41
VS
172
173 m_Dirty = FALSE;
e066e256
VS
174}
175
176
177
178void PreviewFrame::PreviewMenu()
179{
180 wxMenuBar *mbar;
181
182 if (XmlGetClass(m_Node) == _T("wxMenuBar"))
183 mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1")));
184 else
185 {
186 wxMenu *m = m_RC->LoadMenu(m_Node->GetPropVal(_T("name"), _T("-1")));
187 if (m != NULL) GetMenuBar()->Append(m, _("(menu)"));
188 }
189
190 if (mbar == NULL)
191 wxLogError(_("Cannot preview the menu -- XML resource corrupted."));
192}
193
194
195
196void PreviewFrame::PreviewToolbar()
197{
198 SetToolBar(m_RC->LoadToolBar(this, m_Node->GetPropVal(_T("name"), _T("-1"))));
199}
200
201
202
203void PreviewFrame::PreviewPanel()
204{
205 wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1")));
206
207 if (panel == NULL)
208 wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
209 else
210 {
211 m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
212 0, 0, TRUE);
213 }
214}
26607f41
VS
215
216
217
218BEGIN_EVENT_TABLE(PreviewFrame, wxFrame)
219 EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter)
220END_EVENT_TABLE()
221
222void PreviewFrame::OnMouseEnter(wxMouseEvent& event)
223{
224 if (m_Dirty) Preview(m_Node);
225}