]> git.saurik.com Git - wxWidgets.git/blame_incremental - contrib/utils/wxrcedit/preview.cpp
Changed type of bitmaps. RC of DMC reported 'is not a valid Windows 3.0 or OS/2 1...
[wxWidgets.git] / contrib / utils / wxrcedit / preview.cpp
... / ...
CommitLineData
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/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
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()
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
102void 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
114PreviewFrame::~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
131void 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.\nMove mouse cursor over the preview window to refresh it."));
138}
139
140
141
142void PreviewFrame::Preview(wxXmlNode *node, wxXmlDocument *orig_doc)
143{
144 wxString version = orig_doc->GetRoot()->GetPropVal(wxT("version"), wxT("0.0.0.0"));
145
146 while (node->GetParent()->GetParent() != NULL) node = node->GetParent();
147
148 {
149 wxXmlDocument doc;
150 wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource"));
151 root->AddProperty(new wxXmlProperty(wxT("version"),version,NULL));
152 doc.SetRoot(root);
153 doc.GetRoot()->AddChild(new wxXmlNode(*node));
154 doc.SetFileEncoding(orig_doc->GetFileEncoding());
155
156 if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog"))
157 XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));
158
159 if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxFrame"))
160 XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));
161
162 doc.Save(m_TmpFile);
163 // wxXmlResource will detect change automatically
164 }
165
166
167 //if (m_Node != node)
168 {
169 SetToolBar(NULL);
170 for (int i = (int)(GetMenuBar()->GetMenuCount())-1; i >= 0; i--)
171 delete GetMenuBar()->Remove(i);
172 m_ScrollWin->DestroyChildren();
173 }
174
175 m_Node = node;
176 m_Doc = orig_doc;
177
178 m_LogCtrl->Clear();
179 wxLogTextCtrl mylog(m_LogCtrl);
180 wxLog *oldlog = wxLog::SetActiveTarget(&mylog);
181
182 wxString oldcwd = wxGetCwd();
183 wxSetWorkingDirectory(wxPathOnly(EditorFrame::Get()->GetFileName()));
184
185 if (XmlGetClass(node) == _T("wxMenuBar") || XmlGetClass(node) == _T("wxMenu"))
186 PreviewMenu();
187 else if (XmlGetClass(node) == _T("wxToolBar"))
188 PreviewToolbar();
189 else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog"))
190 PreviewPanel();
191 else if (XmlGetClass(node) == _T("wxFrame"))
192 PreviewWXFrame();
193
194 wxSetWorkingDirectory(oldcwd);
195 wxLog::SetActiveTarget(oldlog);
196
197 m_Dirty = FALSE;
198}
199
200
201
202void PreviewFrame::PreviewMenu()
203{
204 wxMenuBar *mbar = NULL;
205
206 if (XmlGetClass(m_Node) == _T("wxMenuBar"))
207 mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1")));
208 else
209 {
210 wxMenu *m = m_RC->LoadMenu(m_Node->GetPropVal(_T("name"), _T("-1")));
211 if (m != NULL) GetMenuBar()->Append(m, _("(menu)"));
212 }
213
214 if (mbar == NULL)
215 wxLogError(_("Cannot preview the menu -- XML resource corrupted."));
216}
217
218
219
220void PreviewFrame::PreviewToolbar()
221{
222 SetToolBar(m_RC->LoadToolBar(this, m_Node->GetPropVal(_T("name"), _T("-1"))));
223}
224
225
226
227void PreviewFrame::PreviewPanel()
228{
229 wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1")));
230
231 if (panel == NULL)
232 wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
233 else
234 {
235 m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
236 0, 0, TRUE);
237 }
238}
239
240void PreviewFrame::PreviewWXFrame()
241{
242 //for this to work the frame MUST have a child panel!
243
244 wxXmlNode* child = m_Node;
245 wxString name;
246
247 while( child != NULL)
248 {
249 name = child->GetPropVal(_T("name"), _T("-1"));
250
251 if(name != _T("-1"))
252 {
253 wxXmlNode* parent = child->GetParent();
254 if(parent->GetPropVal(_T("class"),_T("-1")) == _T("wxPanel"))
255 break;
256 }
257 child = child->GetNext();
258 }
259
260 wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, name);
261
262 if (panel == NULL)
263 wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
264 else
265 {
266 m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
267 0, 0, TRUE);
268 }
269
270}
271
272BEGIN_EVENT_TABLE(PreviewFrame, wxFrame)
273 EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter)
274END_EVENT_TABLE()
275
276void PreviewFrame::OnMouseEnter(wxMouseEvent& WXUNUSED(event))
277{
278 if (m_Dirty) Preview(m_Node,m_Doc);
279}