1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/xrc/xh_statbar.cpp
3 // Purpose:     XRC resource for wxStatusBar
4 // Author:      Brian Ravnsgaard Riis
5 // Created:     2004/01/21
6 // Copyright:   (c) 2004 Brian Ravnsgaard Riis
7 // Licence:     wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
12 
13 #ifdef __BORLANDC__
14     #pragma hdrstop
15 #endif
16 
17 #if wxUSE_XRC && wxUSE_STATUSBAR
18 
19 #include "wx/xrc/xh_statbar.h"
20 
21 #ifndef WX_PRECOMP
22     #include "wx/string.h"
23     #include "wx/log.h"
24     #include "wx/frame.h"
25     #include "wx/statusbr.h"
26 #endif
27 
IMPLEMENT_DYNAMIC_CLASS(wxStatusBarXmlHandler,wxXmlResourceHandler)28 IMPLEMENT_DYNAMIC_CLASS(wxStatusBarXmlHandler, wxXmlResourceHandler)
29 
30 wxStatusBarXmlHandler::wxStatusBarXmlHandler()
31                       :wxXmlResourceHandler()
32 {
33     XRC_ADD_STYLE(wxSTB_SIZEGRIP);
34     XRC_ADD_STYLE(wxSTB_SHOW_TIPS);
35     XRC_ADD_STYLE(wxSTB_ELLIPSIZE_START);
36     XRC_ADD_STYLE(wxSTB_ELLIPSIZE_MIDDLE);
37     XRC_ADD_STYLE(wxSTB_ELLIPSIZE_END);
38     XRC_ADD_STYLE(wxSTB_DEFAULT_STYLE);
39 
40     // compat style name:
41     XRC_ADD_STYLE(wxST_SIZEGRIP);
42 
43     AddWindowStyles();
44 }
45 
DoCreateResource()46 wxObject *wxStatusBarXmlHandler::DoCreateResource()
47 {
48     XRC_MAKE_INSTANCE(statbar, wxStatusBar)
49 
50     statbar->Create(m_parentAsWindow,
51                     GetID(),
52                     GetStyle(),
53                     GetName());
54 
55     int fields = GetLong(wxT("fields"), 1);
56     wxString widths = GetParamValue(wxT("widths"));
57     wxString styles = GetParamValue(wxT("styles"));
58 
59     if (fields > 1 && !widths.IsEmpty())
60     {
61         int *width = new int[fields];
62 
63         for (int i = 0; i < fields; ++i)
64         {
65             width[i] = wxAtoi(widths.BeforeFirst(wxT(',')));
66             if(widths.Find(wxT(',')))
67                 widths.Remove(0, widths.Find(wxT(',')) + 1);
68         }
69         statbar->SetFieldsCount(fields, width);
70         delete[] width;
71     }
72     else
73         statbar->SetFieldsCount(fields);
74 
75     if (!styles.empty())
76     {
77         int *style = new int[fields];
78         for (int i = 0; i < fields; ++i)
79         {
80             style[i] = wxSB_NORMAL;
81 
82             wxString first = styles.BeforeFirst(wxT(','));
83             if (first == wxT("wxSB_NORMAL"))
84                 style[i] = wxSB_NORMAL;
85             else if (first == wxT("wxSB_FLAT"))
86                 style[i] = wxSB_FLAT;
87             else if (first == wxT("wxSB_RAISED"))
88                 style[i] = wxSB_RAISED;
89             else if (first == wxT("wxSB_SUNKEN"))
90                 style[i] = wxSB_SUNKEN;
91             else if (!first.empty())
92             {
93                 ReportParamError
94                 (
95                     "styles",
96                     wxString::Format
97                     (
98                         "unknown status bar field style \"%s\"",
99                         first
100                     )
101                 );
102             }
103 
104             if(styles.Find(wxT(',')))
105                 styles.Remove(0, styles.Find(wxT(',')) + 1);
106         }
107         statbar->SetStatusStyles(fields, style);
108         delete [] style;
109     }
110 
111     CreateChildren(statbar);
112 
113     if (m_parentAsWindow)
114     {
115         wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);
116         if (parentFrame)
117             parentFrame->SetStatusBar(statbar);
118     }
119 
120     return statbar;
121 }
122 
CanHandle(wxXmlNode * node)123 bool wxStatusBarXmlHandler::CanHandle(wxXmlNode *node)
124 {
125     return IsOfClass(node, wxT("wxStatusBar"));
126 }
127 
128 #endif // wxUSE_XRC && wxUSE_STATUSBAR
129