]> git.saurik.com Git - wxWidgets.git/blob - contrib/utils/wxrcedit/preview.cpp
wxDefaultSize.* and wxDefaultPosition.* to wxDefaultCoord.
[wxWidgets.git] / contrib / utils / wxrcedit / preview.cpp
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
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(), wxID_ANY, _("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"), wxDefaultCoord), cfg->Read(_T("previewframe_y"), wxDefaultCoord)),
84 wxSize(cfg->Read(_T("previewframe_w"), 400), cfg->Read(_T("previewframe_h"), 400))));
85
86 m_Splitter = new wxSplitterWindow(this, wxID_ANY);
87 m_LogCtrl = new wxTextCtrl(m_Splitter, wxID_ANY, wxEmptyString, wxDefaultPosition,
88 wxDefaultSize, wxTE_MULTILINE);
89 m_ScrollWin = new wxScrolledWindow(m_Splitter, wxID_ANY);
90 m_ScrollWin->SetBackgroundColour(_T("light steel blue"));
91 m_Splitter->SplitHorizontally(m_ScrollWin, m_LogCtrl, cfg->Read(_T("previewframe_sash"), 300));
92
93 #if wxUSE_STATUSBAR
94 CreateStatusBar();
95 #endif // wxUSE_STATUSBAR
96
97 #ifdef __WXMSW__
98 SendSizeEvent(); // force resize for WXMSW
99 #endif
100 }
101
102
103
104 void PreviewFrame::ResetResource()
105 {
106 delete m_RC;
107 m_RC = new wxXmlResource;
108 // these handlers take precedence over std. ones:
109 m_RC->AddHandler(new MyMenubarHandler(GetMenuBar()));
110 // std handlers:
111 m_RC->InitAllHandlers();
112 wxRemoveFile(m_TmpFile);
113 m_RC->Load(m_TmpFile);
114 }
115
116 PreviewFrame::~PreviewFrame()
117 {
118 wxConfigBase *cfg = wxConfigBase::Get();
119 cfg->Write(_T("previewframe_x"), (long)GetPosition().x);
120 cfg->Write(_T("previewframe_y"), (long)GetPosition().y);
121 cfg->Write(_T("previewframe_w"), (long)GetSize().x);
122 cfg->Write(_T("previewframe_h"), (long)GetSize().y);
123 cfg->Write(_T("previewframe_sash"), (long)m_Splitter->GetSashPosition());
124
125 ms_Instance = NULL;
126
127 delete m_RC;
128 wxRemoveFile(m_TmpFile);
129 }
130
131
132
133 void PreviewFrame::MakeDirty()
134 {
135 if (m_Node == NULL) return;
136 if (m_Dirty) return;
137 m_Dirty = true;
138 m_LogCtrl->Clear();
139 m_LogCtrl->SetValue(_("Resource modified.\nMove mouse cursor over the preview window to refresh it."));
140 }
141
142
143
144 void PreviewFrame::Preview(wxXmlNode *node, wxXmlDocument *orig_doc)
145 {
146 wxString version = orig_doc->GetRoot()->GetPropVal(wxT("version"), wxT("0.0.0.0"));
147
148 while (node->GetParent()->GetParent() != NULL) node = node->GetParent();
149
150 {
151 wxXmlDocument doc;
152 wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, _T("resource"));
153 root->AddProperty(new wxXmlProperty(wxT("version"),version,NULL));
154 doc.SetRoot(root);
155 doc.GetRoot()->AddChild(new wxXmlNode(*node));
156 doc.SetFileEncoding(orig_doc->GetFileEncoding());
157
158 if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog"))
159 XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));
160
161 if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxFrame"))
162 XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel"));
163
164 doc.Save(m_TmpFile);
165 // wxXmlResource will detect change automatically
166 }
167
168
169 //if (m_Node != node)
170 {
171 SetToolBar(NULL);
172 for (int i = (int)(GetMenuBar()->GetMenuCount())-1; i >= 0; i--)
173 delete GetMenuBar()->Remove(i);
174 m_ScrollWin->DestroyChildren();
175 }
176
177 m_Node = node;
178 m_Doc = orig_doc;
179
180 m_LogCtrl->Clear();
181 wxLogTextCtrl mylog(m_LogCtrl);
182 wxLog *oldlog = wxLog::SetActiveTarget(&mylog);
183
184 wxString oldcwd = wxGetCwd();
185 wxSetWorkingDirectory(wxPathOnly(EditorFrame::Get()->GetFileName()));
186
187 if (XmlGetClass(node) == _T("wxMenuBar") || XmlGetClass(node) == _T("wxMenu"))
188 PreviewMenu();
189 else if (XmlGetClass(node) == _T("wxToolBar"))
190 PreviewToolbar();
191 else if (XmlGetClass(node) == _T("wxPanel") || XmlGetClass(node) == _T("wxDialog"))
192 PreviewPanel();
193 else if (XmlGetClass(node) == _T("wxFrame"))
194 PreviewWXFrame();
195
196 wxSetWorkingDirectory(oldcwd);
197 wxLog::SetActiveTarget(oldlog);
198
199 m_Dirty = false;
200 }
201
202
203
204 void PreviewFrame::PreviewMenu()
205 {
206 wxMenuBar *mbar = NULL;
207
208 if (XmlGetClass(m_Node) == _T("wxMenuBar"))
209 mbar = m_RC->LoadMenuBar(m_Node->GetPropVal(_T("name"), _T("-1")));
210 else
211 {
212 wxMenu *m = m_RC->LoadMenu(m_Node->GetPropVal(_T("name"), _T("-1")));
213 if (m != NULL) GetMenuBar()->Append(m, _("(menu)"));
214 }
215
216 if (mbar == NULL)
217 wxLogError(_("Cannot preview the menu -- XML resource corrupted."));
218 }
219
220
221
222 void PreviewFrame::PreviewToolbar()
223 {
224 SetToolBar(m_RC->LoadToolBar(this, m_Node->GetPropVal(_T("name"), _T("-1"))));
225 }
226
227
228
229 void PreviewFrame::PreviewPanel()
230 {
231 wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, m_Node->GetPropVal(_T("name"), _T("-1")));
232
233 if (panel == NULL)
234 wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
235 else
236 {
237 m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
238 0, 0, true);
239 }
240 }
241
242 void PreviewFrame::PreviewWXFrame()
243 {
244 //for this to work the frame MUST have a child panel!
245
246 wxXmlNode* child = m_Node;
247 wxString name;
248
249 while( child != NULL)
250 {
251 name = child->GetPropVal(_T("name"), _T("-1"));
252
253 if(name != _T("-1"))
254 {
255 wxXmlNode* parent = child->GetParent();
256 if(parent->GetPropVal(_T("class"),_T("-1")) == _T("wxPanel"))
257 break;
258 }
259 child = child->GetNext();
260 }
261
262 wxPanel *panel = m_RC->LoadPanel(m_ScrollWin, name);
263
264 if (panel == NULL)
265 wxLogError(_("Cannot preview the panel -- XML resource corrupted."));
266 else
267 {
268 m_ScrollWin->SetScrollbars(1, 1, panel->GetSize().x, panel->GetSize().y,
269 0, 0, true);
270 }
271
272 }
273
274 BEGIN_EVENT_TABLE(PreviewFrame, wxFrame)
275 EVT_ENTER_WINDOW(PreviewFrame::OnMouseEnter)
276 END_EVENT_TABLE()
277
278 void PreviewFrame::OnMouseEnter(wxMouseEvent& WXUNUSED(event))
279 {
280 if (m_Dirty) Preview(m_Node,m_Doc);
281 }