]>
git.saurik.com Git - wxWidgets.git/blob - contrib/utils/wxrcedit/nodehnd.cpp
22e9da81c4ca9acb68d7c6648b9ff3c862863cd1
1 /////////////////////////////////////////////////////////////////////////////
2 // Author: Vaclav Slavik
5 // Copyright: (c) 2000 Vaclav Slavik
6 // Licence: wxWindows licence
7 /////////////////////////////////////////////////////////////////////////////
10 #pragma implementation "nodehnd.h"
13 // For compilers that support precompilation, includes "wx/wx.h".
14 #include "wx/wxprec.h"
21 #include "wx/xml/xml.h"
22 #include "wx/filefn.h"
24 #include "wx/arrimpl.cpp"
25 #include "wx/textfile.h"
26 #include "wx/tokenzr.h"
27 #include "wx/listctrl.h"
33 WX_DEFINE_OBJARRAY(NodeInfoArray
);
37 void NodeInfo::Read(const wxString
& filename
)
39 HandlerType tp
= HANDLER_NONE
;
47 // if modifying, don't forget to modify it in all places --
48 // search for wxINSTALL_PREFIX in editor.cpp
52 list
.Add(wxGetHomeDir() + "/.wxrcedit");
53 #ifdef wxINSTALL_PREFIX
54 list
.Add(wxINSTALL_PREFIX
"/share/wx/wxrcedit");
58 wxString path
= list
.FindValidPath(filename
);
59 if (path
.IsEmpty()) return;
64 if (!tf
.IsOpened()) return;
66 for (size_t i
= 0; i
< tf
.GetLineCount(); i
++)
68 if (tf
[i
].IsEmpty() || tf
[i
][0] == '#') continue;
69 wxStringTokenizer
tkn(tf
[i
], ' ');
70 wxString s
= tkn
.GetNextToken();
72 nd
= tkn
.GetNextToken();
73 else if (s
== "childtype")
74 cht
= tkn
.GetNextToken();
76 tkn
.GetNextToken().ToLong(&icn
);
77 else if (s
== "derived")
79 if (tkn
.GetNextToken() == "from")
81 s
= tkn
.GetNextToken();
86 else if (s
== "abstract")
90 s
= tkn
.GetNextToken();
91 if (s
== "sizer") tp
= HANDLER_SIZER
;
92 else if (s
== "sizeritem") tp
= HANDLER_SIZERITEM
;
93 else if (s
== "panel") tp
= HANDLER_PANEL
;
94 else if (s
== "notebook") tp
= HANDLER_NOTEBOOK
;
95 else if (s
== "notebookpage") tp
= HANDLER_NOTEBOOKPAGE
;
96 else /*if (s == "normal")*/ tp
= HANDLER_NORMAL
;
101 pi
.Name
= tkn
.GetNextToken();
103 wxString typ
= tkn
.GetNextToken();
104 if (tkn
.HasMoreTokens()) pi
.MoreInfo
= tkn
.GetNextToken();
105 if (typ
== "color") pi
.Type
= PROP_COLOR
;
106 else if (typ
== "flags") pi
.Type
= PROP_FLAGS
;
107 else if (typ
== "bool") pi
.Type
= PROP_BOOL
;
108 else if (typ
== "integer") pi
.Type
= PROP_INTEGER
;
109 else if (typ
== "coord") pi
.Type
= PROP_COORD
;
110 else if (typ
== "not_implemented") pi
.Type
= PROP_NOT_IMPLEMENTED
;
111 else /*if (typ == "text")*/ pi
.Type
= PROP_TEXT
;
114 for (size_t j
= 0; j
< Props
.GetCount(); j
++)
116 if (Props
[j
].Name
== pi
.Name
)
118 if (Props
[j
].Type
== pi
.Type
&& pi
.Type
== PROP_FLAGS
)
119 Props
[j
].MoreInfo
<< ',' << pi
.MoreInfo
;
126 if (!fnd
) Props
.Add(pi
);
130 if (!nd
.IsEmpty()) Node
= nd
;
131 if (!cht
.IsEmpty()) ChildType
= cht
;
132 if (tp
!= HANDLER_NONE
) Type
= tp
;
133 if (icn
!= -1) Icon
= icn
;
139 NodeHandler
*NodeHandler::CreateFromFile(const wxString
& filename
, EditorFrame
*frame
)
141 NodeHandler
*hnd
= NULL
;
143 if (s_AllNodes
== NULL
) s_AllNodes
= new NodeInfoArray
;
145 NodeInfo
*ni
= new NodeInfo
;
146 ni
->Type
= HANDLER_NONE
;
149 s_AllNodes
->Add(*ni
); // add a copy
151 if (ni
->Type
== HANDLER_NONE
|| ni
->Node
.IsEmpty() || ni
->Abstract
)
157 hnd
= new NodeHandlerPanel(frame
, ni
);
160 hnd
= new NodeHandlerSizer(frame
, ni
);
162 case HANDLER_SIZERITEM
:
163 hnd
= new NodeHandlerSizerItem(frame
, ni
);
165 case HANDLER_NOTEBOOK
:
166 hnd
= new NodeHandlerNotebook(frame
, ni
);
168 case HANDLER_NOTEBOOKPAGE
:
169 hnd
= new NodeHandlerNotebookPage(frame
, ni
);
172 hnd
= new NodeHandler(frame
, ni
);
184 PropertyHandler
* NodeHandler::s_PropHandlers
[PROP_TYPES_CNT
] = {NULL
};
185 int NodeHandler::s_RefCnt
= 0;
186 NodeInfoArray
* NodeHandler::s_AllNodes
= NULL
;
189 NodeHandler::NodeHandler(EditorFrame
*frame
, NodeInfo
*ni
) :
192 if (s_RefCnt
++ == 0) CreatePropHandlers();
196 void NodeHandler::CreatePropHandlers()
198 s_PropHandlers
[PROP_TEXT
] = new TextPropertyHandler
;
199 s_PropHandlers
[PROP_FLAGS
] = new FlagsPropertyHandler
;
200 s_PropHandlers
[PROP_COLOR
] = new TextPropertyHandler
;
201 s_PropHandlers
[PROP_BOOL
] = new BoolPropertyHandler
;
202 s_PropHandlers
[PROP_INTEGER
] = new TextPropertyHandler
;
203 s_PropHandlers
[PROP_COORD
] = new CoordPropertyHandler
;
204 s_PropHandlers
[PROP_NOT_IMPLEMENTED
] = new NotImplPropertyHandler
;
208 NodeHandler::~NodeHandler()
212 for (int i
= 0; i
< PROP_TYPES_CNT
; i
++)
213 delete s_PropHandlers
[i
];
214 delete s_AllNodes
; s_AllNodes
= NULL
;
221 bool NodeHandler::CanHandle(wxXmlNode
*node
)
223 return (m_NodeInfo
->Node
== node
->GetName());
228 wxTreeItemId
NodeHandler::CreateTreeNode(wxTreeCtrl
*treectrl
,
232 int icon
= GetTreeIcon(node
);
234 treectrl
->AppendItem(parent
, GetTreeString(node
),
235 icon
, icon
, new XmlTreeData(node
));
236 if (parent
== treectrl
->GetRootItem())
237 treectrl
->SetItemBold(item
);
243 wxString
NodeHandler::GetTreeString(wxXmlNode
*node
)
245 wxString xmlid
= node
->GetPropVal("name", "");
247 return node
->GetName();
249 return (node
->GetName() + " '" + xmlid
+ "'");
254 void NodeHandler::CreatePropsList(wxListCtrl
*listctrl
, wxXmlNode
*node
)
258 for (size_t i
= 0; i
< m_NodeInfo
->Props
.GetCount(); i
++)
260 PropertyInfo
*p
= &(m_NodeInfo
->Props
[i
]);
261 index
= s_PropHandlers
[p
->Type
]->CreateListItem(listctrl
, node
, p
);
262 listctrl
->SetItemData(index
, (long)new PropsListInfo(
263 index
, s_PropHandlers
[p
->Type
], node
,
270 wxPanel
*NodeHandler::CreatePropEditPanel(wxWindow
*parent
, wxListCtrl
*listctrl
, int index
)
272 PropsListInfo
*pli
= (PropsListInfo
*)listctrl
->GetItemData(index
);
274 return pli
->m_Handler
->CreateEditPanel(parent
, pli
);
279 wxArrayString
& NodeHandler::GetChildTypes()
281 if (m_ChildTypes
.IsEmpty())
283 wxString basetype
= m_NodeInfo
->ChildType
;
285 for (size_t i
= 0; i
< s_AllNodes
->GetCount(); i
++)
287 NodeInfo
&ni
= (*s_AllNodes
)[i
];
289 if (ni
.Node
== basetype
&& !ni
.Abstract
)
290 m_ChildTypes
.Add(ni
.Node
);
292 if (ni
.DerivedFrom
.Index(basetype
) != wxNOT_FOUND
&& !ni
.Abstract
)
293 m_ChildTypes
.Add(ni
.Node
);
303 void NodeHandler::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
306 wxLogError(_("Cannot insert child into this type of node!"));
316 wxTreeItemId
NodeHandlerPanel::CreateTreeNode(wxTreeCtrl
*treectrl
,
320 wxTreeItemId root
= NodeHandler::CreateTreeNode(treectrl
, parent
, node
);
322 wxXmlNode
*n
= XmlFindNode(node
, "children");
324 if (n
) n
= n
->GetChildren();
328 if (n
->GetType() == wxXML_ELEMENT_NODE
)
329 EditorFrame::Get()->CreateTreeNode(treectrl
, root
, n
);
332 treectrl
->Expand(root
);
338 void NodeHandlerPanel::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
340 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
343 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
344 parent
->AddChild(cnd
);
347 cnd
->InsertChild(node
, insert_before
);
350 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);
357 void NodeHandlerSizer::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
359 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
362 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
363 parent
->AddChild(cnd
);
366 if (node
->GetName() == "spacer" || node
->GetName() == "sizeritem")
369 cnd
->InsertChild(node
, insert_before
);
375 wxXmlNode
*itemnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "sizeritem");
376 wxXmlNode
*winnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "window");
377 itemnode
->AddChild(winnode
);
378 winnode
->AddChild(node
);
381 cnd
->InsertChild(itemnode
, insert_before
);
383 cnd
->AddChild(itemnode
);
385 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);
390 int NodeHandlerSizer::GetTreeIcon(wxXmlNode
*node
)
392 int orig
= NodeHandler::GetTreeIcon(node
);
395 if (XmlReadValue(node
, "orient") == "wxVERTICAL") return 2;
403 wxTreeItemId
NodeHandlerSizerItem::CreateTreeNode(wxTreeCtrl
*treectrl
,
409 root
= EditorFrame::Get()->CreateTreeNode(treectrl
, parent
, GetRealNode(node
));
410 ((XmlTreeData
*)treectrl
->GetItemData(root
))->Node
= node
;
412 treectrl
->Expand(root
);
418 void NodeHandlerSizerItem::CreatePropsList(wxListCtrl
*listctrl
, wxXmlNode
*node
)
420 NodeHandler::CreatePropsList(listctrl
, node
);
421 int item
= listctrl
->GetItemCount();
422 listctrl
->InsertItem(item
, "------");
423 listctrl
->SetItemImage(item
, 0, 0);
424 EditorFrame::Get()->CreatePropsList(listctrl
, GetRealNode(node
));
429 wxString
NodeHandlerSizerItem::GetTreeString(wxXmlNode
*node
)
431 wxXmlNode
*n
= GetRealNode(node
);
432 return EditorFrame::Get()->FindHandler(n
)->GetTreeString(n
);
437 int NodeHandlerSizerItem::GetTreeIcon(wxXmlNode
*node
)
439 wxXmlNode
*n
= GetRealNode(node
);
440 return EditorFrame::Get()->FindHandler(n
)->GetTreeIcon(n
);
445 wxXmlNode
*NodeHandlerSizerItem::GetRealNode(wxXmlNode
*node
)
447 wxXmlNode
*n
= XmlFindNode(node
, "window");
449 if (n
) n
= n
->GetChildren();
453 if (n
->GetType() == wxXML_ELEMENT_NODE
)
465 void NodeHandlerNotebook::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
467 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
470 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
471 parent
->AddChild(cnd
);
477 if (node
->GetName() == "notebookpage")
481 itemnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "notebookpage");
482 wxXmlNode
*winnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "window");
483 itemnode
->AddChild(winnode
);
484 winnode
->AddChild(node
);
488 cnd
->InsertChild(itemnode
, insert_before
);
490 cnd
->AddChild(itemnode
);
492 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);