]>
git.saurik.com Git - wxWidgets.git/blob - contrib/utils/wxrcedit/nodehnd.cpp
6dbe037caac73589a2996fa0805dd090e740189e
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
;
50 list
.Add(wxGetHomeDir() + "/.wxrcedit");
53 wxString path
= list
.FindValidPath(filename
);
54 if (path
.IsEmpty()) return;
58 if (!tf
.IsOpened()) return;
60 for (size_t i
= 0; i
< tf
.GetLineCount(); i
++)
62 if (tf
[i
].IsEmpty() || tf
[i
][0] == '#') continue;
63 wxStringTokenizer
tkn(tf
[i
], ' ');
64 wxString s
= tkn
.GetNextToken();
66 nd
= tkn
.GetNextToken();
67 else if (s
== "childtype")
68 cht
= tkn
.GetNextToken();
70 tkn
.GetNextToken().ToLong(&icn
);
71 else if (s
== "derived")
73 if (tkn
.GetNextToken() == "from")
75 s
= tkn
.GetNextToken();
80 else if (s
== "abstract")
84 s
= tkn
.GetNextToken();
85 if (s
== "sizer") tp
= HANDLER_SIZER
;
86 else if (s
== "sizeritem") tp
= HANDLER_SIZERITEM
;
87 else if (s
== "panel") tp
= HANDLER_PANEL
;
88 else if (s
== "notebook") tp
= HANDLER_NOTEBOOK
;
89 else if (s
== "notebookpage") tp
= HANDLER_NOTEBOOKPAGE
;
90 else /*if (s == "normal")*/ tp
= HANDLER_NORMAL
;
95 pi
.Name
= tkn
.GetNextToken();
97 wxString typ
= tkn
.GetNextToken();
98 if (tkn
.HasMoreTokens()) pi
.MoreInfo
= tkn
.GetNextToken();
99 if (typ
== "color") pi
.Type
= PROP_COLOR
;
100 else if (typ
== "flags") pi
.Type
= PROP_FLAGS
;
101 else if (typ
== "bool") pi
.Type
= PROP_BOOL
;
102 else if (typ
== "integer") pi
.Type
= PROP_INTEGER
;
103 else if (typ
== "coord") pi
.Type
= PROP_COORD
;
104 else if (typ
== "not_implemented") pi
.Type
= PROP_NOT_IMPLEMENTED
;
105 else /*if (typ == "text")*/ pi
.Type
= PROP_TEXT
;
108 for (size_t j
= 0; j
< Props
.GetCount(); j
++)
110 if (Props
[j
].Name
== pi
.Name
)
112 if (Props
[j
].Type
== pi
.Type
&& pi
.Type
== PROP_FLAGS
)
113 Props
[j
].MoreInfo
<< ',' << pi
.MoreInfo
;
120 if (!fnd
) Props
.Add(pi
);
124 if (!nd
.IsEmpty()) Node
= nd
;
125 if (!cht
.IsEmpty()) ChildType
= cht
;
126 if (tp
!= HANDLER_NONE
) Type
= tp
;
127 if (icn
!= -1) Icon
= icn
;
133 NodeHandler
*NodeHandler::CreateFromFile(const wxString
& filename
, EditorFrame
*frame
)
135 NodeHandler
*hnd
= NULL
;
137 if (s_AllNodes
== NULL
) s_AllNodes
= new NodeInfoArray
;
139 NodeInfo
*ni
= new NodeInfo
;
140 ni
->Type
= HANDLER_NONE
;
143 s_AllNodes
->Add(*ni
); // add a copy
145 if (ni
->Type
== HANDLER_NONE
|| ni
->Node
.IsEmpty() || ni
->Abstract
)
151 hnd
= new NodeHandlerPanel(frame
, ni
);
154 hnd
= new NodeHandlerSizer(frame
, ni
);
156 case HANDLER_SIZERITEM
:
157 hnd
= new NodeHandlerSizerItem(frame
, ni
);
159 case HANDLER_NOTEBOOK
:
160 hnd
= new NodeHandlerNotebook(frame
, ni
);
162 case HANDLER_NOTEBOOKPAGE
:
163 hnd
= new NodeHandlerNotebookPage(frame
, ni
);
166 hnd
= new NodeHandler(frame
, ni
);
178 PropertyHandler
* NodeHandler::s_PropHandlers
[PROP_TYPES_CNT
] = {NULL
};
179 int NodeHandler::s_RefCnt
= 0;
180 NodeInfoArray
* NodeHandler::s_AllNodes
= NULL
;
183 NodeHandler::NodeHandler(EditorFrame
*frame
, NodeInfo
*ni
) :
186 if (s_RefCnt
++ == 0) CreatePropHandlers();
190 void NodeHandler::CreatePropHandlers()
192 s_PropHandlers
[PROP_TEXT
] = new TextPropertyHandler
;
193 s_PropHandlers
[PROP_FLAGS
] = new FlagsPropertyHandler
;
194 s_PropHandlers
[PROP_COLOR
] = new TextPropertyHandler
;
195 s_PropHandlers
[PROP_BOOL
] = new BoolPropertyHandler
;
196 s_PropHandlers
[PROP_INTEGER
] = new TextPropertyHandler
;
197 s_PropHandlers
[PROP_COORD
] = new CoordPropertyHandler
;
198 s_PropHandlers
[PROP_NOT_IMPLEMENTED
] = new NotImplPropertyHandler
;
202 NodeHandler::~NodeHandler()
206 for (int i
= 0; i
< PROP_TYPES_CNT
; i
++)
207 delete s_PropHandlers
[i
];
208 delete s_AllNodes
; s_AllNodes
= NULL
;
215 bool NodeHandler::CanHandle(wxXmlNode
*node
)
217 return (m_NodeInfo
->Node
== node
->GetName());
222 wxTreeItemId
NodeHandler::CreateTreeNode(wxTreeCtrl
*treectrl
,
226 int icon
= GetTreeIcon(node
);
228 treectrl
->AppendItem(parent
, GetTreeString(node
),
229 icon
, icon
, new XmlTreeData(node
));
230 if (parent
== treectrl
->GetRootItem())
231 treectrl
->SetItemBold(item
);
237 wxString
NodeHandler::GetTreeString(wxXmlNode
*node
)
239 wxString xmlid
= node
->GetPropVal("name", "");
241 return node
->GetName();
243 return (node
->GetName() + " '" + xmlid
+ "'");
248 void NodeHandler::CreatePropsList(wxListCtrl
*listctrl
, wxXmlNode
*node
)
252 for (size_t i
= 0; i
< m_NodeInfo
->Props
.GetCount(); i
++)
254 PropertyInfo
*p
= &(m_NodeInfo
->Props
[i
]);
255 index
= s_PropHandlers
[p
->Type
]->CreateListItem(listctrl
, node
, p
);
256 listctrl
->SetItemData(index
, (long)new PropsListInfo(
257 index
, s_PropHandlers
[p
->Type
], node
,
264 wxPanel
*NodeHandler::CreatePropEditPanel(wxWindow
*parent
, wxListCtrl
*listctrl
, int index
)
266 PropsListInfo
*pli
= (PropsListInfo
*)listctrl
->GetItemData(index
);
268 return pli
->m_Handler
->CreateEditPanel(parent
, pli
);
273 wxArrayString
& NodeHandler::GetChildTypes()
275 if (m_ChildTypes
.IsEmpty())
277 wxString basetype
= m_NodeInfo
->ChildType
;
279 for (size_t i
= 0; i
< s_AllNodes
->GetCount(); i
++)
281 NodeInfo
&ni
= (*s_AllNodes
)[i
];
283 if (ni
.Node
== basetype
&& !ni
.Abstract
)
284 m_ChildTypes
.Add(ni
.Node
);
286 if (ni
.DerivedFrom
.Index(basetype
) != wxNOT_FOUND
&& !ni
.Abstract
)
287 m_ChildTypes
.Add(ni
.Node
);
297 void NodeHandler::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
300 wxLogError(_("Cannot insert child into this type of node!"));
310 wxTreeItemId
NodeHandlerPanel::CreateTreeNode(wxTreeCtrl
*treectrl
,
314 wxTreeItemId root
= NodeHandler::CreateTreeNode(treectrl
, parent
, node
);
316 wxXmlNode
*n
= XmlFindNode(node
, "children");
318 if (n
) n
= n
->GetChildren();
322 if (n
->GetType() == wxXML_ELEMENT_NODE
)
323 EditorFrame::Get()->CreateTreeNode(treectrl
, root
, n
);
326 treectrl
->Expand(root
);
332 void NodeHandlerPanel::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
334 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
337 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
338 parent
->AddChild(cnd
);
341 cnd
->InsertChild(node
, insert_before
);
344 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);
351 void NodeHandlerSizer::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
353 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
356 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
357 parent
->AddChild(cnd
);
360 if (node
->GetName() == "spacer")
363 cnd
->InsertChild(node
, insert_before
);
369 wxXmlNode
*itemnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "sizeritem");
370 wxXmlNode
*winnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "window");
371 itemnode
->AddChild(winnode
);
372 winnode
->AddChild(node
);
375 cnd
->InsertChild(itemnode
, insert_before
);
377 cnd
->AddChild(itemnode
);
379 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);
384 int NodeHandlerSizer::GetTreeIcon(wxXmlNode
*node
)
386 int orig
= NodeHandler::GetTreeIcon(node
);
389 if (XmlReadValue(node
, "orient") == "wxVERTICAL") return 2;
397 wxTreeItemId
NodeHandlerSizerItem::CreateTreeNode(wxTreeCtrl
*treectrl
,
403 root
= EditorFrame::Get()->CreateTreeNode(treectrl
, parent
, GetRealNode(node
));
404 ((XmlTreeData
*)treectrl
->GetItemData(root
))->Node
= node
;
406 treectrl
->Expand(root
);
412 void NodeHandlerSizerItem::CreatePropsList(wxListCtrl
*listctrl
, wxXmlNode
*node
)
414 NodeHandler::CreatePropsList(listctrl
, node
);
415 int item
= listctrl
->GetItemCount();
416 listctrl
->InsertItem(item
, "------");
417 listctrl
->SetItemImage(item
, 0, 0);
418 EditorFrame::Get()->CreatePropsList(listctrl
, GetRealNode(node
));
423 wxString
NodeHandlerSizerItem::GetTreeString(wxXmlNode
*node
)
425 wxXmlNode
*n
= GetRealNode(node
);
426 return EditorFrame::Get()->FindHandler(n
)->GetTreeString(n
);
431 int NodeHandlerSizerItem::GetTreeIcon(wxXmlNode
*node
)
433 wxXmlNode
*n
= GetRealNode(node
);
434 return EditorFrame::Get()->FindHandler(n
)->GetTreeIcon(n
);
439 wxXmlNode
*NodeHandlerSizerItem::GetRealNode(wxXmlNode
*node
)
441 wxXmlNode
*n
= XmlFindNode(node
, "window");
443 if (n
) n
= n
->GetChildren();
447 if (n
->GetType() == wxXML_ELEMENT_NODE
)
459 void NodeHandlerNotebook::InsertNode(wxXmlNode
*parent
, wxXmlNode
*node
, wxXmlNode
*insert_before
)
461 wxXmlNode
*cnd
= XmlFindNode(parent
, "children");
464 cnd
= new wxXmlNode(wxXML_ELEMENT_NODE
, "children");
465 parent
->AddChild(cnd
);
469 wxXmlNode
*itemnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "notebookpage");
470 wxXmlNode
*winnode
= new wxXmlNode(wxXML_ELEMENT_NODE
, "window");
471 itemnode
->AddChild(winnode
);
472 winnode
->AddChild(node
);
475 cnd
->InsertChild(itemnode
, insert_before
);
477 cnd
->AddChild(itemnode
);
479 EditorFrame::Get()->NotifyChanged(CHANGED_TREE
);