1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/commandlinkbutton.h
3 // Purpose:     wxCommandLinkButtonBase and wxGenericCommandLinkButton classes
4 // Author:      Rickard Westerlund
5 // Created:     2010-06-11
6 // Copyright:   (c) 2010 wxWidgets team
7 // Licence:     wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_COMMANDLINKBUTTON_H_
11 #define _WX_COMMANDLINKBUTTON_H_
12 
13 #include "wx/defs.h"
14 
15 #if wxUSE_COMMANDLINKBUTTON
16 
17 #include "wx/button.h"
18 
19 // ----------------------------------------------------------------------------
20 // Command link button common base class
21 // ----------------------------------------------------------------------------
22 
23 // This class has separate "main label" (title-like string) and (possibly
24 // multiline) "note" which can be set and queried separately but can also be
25 // set both at once by joining them with a new line and setting them as a
26 // label and queried by breaking the label into the parts before the first new
27 // line and after it.
28 
29 class WXDLLIMPEXP_ADV wxCommandLinkButtonBase : public wxButton
30 {
31 public:
wxCommandLinkButtonBase()32     wxCommandLinkButtonBase() : wxButton() { }
33 
34     wxCommandLinkButtonBase(wxWindow *parent,
35                             wxWindowID id,
36                             const wxString& mainLabel = wxEmptyString,
37                             const wxString& note = wxEmptyString,
38                             const wxPoint& pos = wxDefaultPosition,
39                             const wxSize& size = wxDefaultSize,
40                             long style = 0,
41                             const wxValidator& validator =
42                                 wxDefaultValidator,
43                             const wxString& name = wxASCII_STR(wxButtonNameStr))
44         : wxButton(parent,
45                    id,
46                    mainLabel + '\n' + note,
47                    pos,
48                    size,
49                    style,
50                    validator,
51                    name)
52         { }
53 
54     virtual void SetMainLabelAndNote(const wxString& mainLabel,
55                                      const wxString& note) = 0;
56 
SetMainLabel(const wxString & mainLabel)57     virtual void SetMainLabel(const wxString& mainLabel)
58     {
59         SetMainLabelAndNote(mainLabel, GetNote());
60     }
61 
SetNote(const wxString & note)62     virtual void SetNote(const wxString& note)
63     {
64         SetMainLabelAndNote(GetMainLabel(), note);
65     }
66 
GetMainLabel()67     virtual wxString GetMainLabel() const
68     {
69         return GetLabel().BeforeFirst('\n');
70     }
71 
GetNote()72     virtual wxString GetNote() const
73     {
74         return GetLabel().AfterFirst('\n');
75     }
76 
77 protected:
HasNativeBitmap()78     virtual bool HasNativeBitmap() const { return false; }
79 
80 private:
81     wxDECLARE_NO_COPY_CLASS(wxCommandLinkButtonBase);
82 };
83 
84 // ----------------------------------------------------------------------------
85 // Generic command link button
86 // ----------------------------------------------------------------------------
87 
88 // Trivial generic implementation simply using a multiline label to show both
89 // the main label and the note.
90 
91 class WXDLLIMPEXP_ADV wxGenericCommandLinkButton
92                       : public wxCommandLinkButtonBase
93 {
94 public:
wxGenericCommandLinkButton()95     wxGenericCommandLinkButton() : wxCommandLinkButtonBase() { }
96 
97 
98     wxGenericCommandLinkButton(wxWindow *parent,
99                                wxWindowID id,
100                                const wxString& mainLabel = wxEmptyString,
101                                const wxString& note = wxEmptyString,
102                                const wxPoint& pos = wxDefaultPosition,
103                                const wxSize& size = wxDefaultSize,
104                                long style = 0,
105                                const wxValidator& validator = wxDefaultValidator,
106                                const wxString& name = wxASCII_STR(wxButtonNameStr))
wxCommandLinkButtonBase()107         : wxCommandLinkButtonBase()
108     {
109         Create(parent, id, mainLabel, note, pos, size, style, validator, name);
110     }
111 
112     bool Create(wxWindow *parent,
113                 wxWindowID id,
114                 const wxString& mainLabel = wxEmptyString,
115                 const wxString& note = wxEmptyString,
116                 const wxPoint& pos = wxDefaultPosition,
117                 const wxSize& size = wxDefaultSize,
118                 long style = 0,
119                 const wxValidator& validator = wxDefaultValidator,
120                 const wxString& name = wxASCII_STR(wxButtonNameStr));
121 
SetMainLabelAndNote(const wxString & mainLabel,const wxString & note)122     virtual void SetMainLabelAndNote(const wxString& mainLabel,
123                                      const wxString& note) wxOVERRIDE
124     {
125         wxButton::SetLabel(mainLabel + '\n' + note);
126     }
127 
128 private:
129     void SetDefaultBitmap();
130 
131     wxDECLARE_NO_COPY_CLASS(wxGenericCommandLinkButton);
132 };
133 
134 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
135     #include "wx/msw/commandlinkbutton.h"
136 #else
137     class WXDLLIMPEXP_ADV wxCommandLinkButton : public wxGenericCommandLinkButton
138     {
139     public:
wxCommandLinkButton()140         wxCommandLinkButton() : wxGenericCommandLinkButton() { }
141 
142         wxCommandLinkButton(wxWindow *parent,
143                             wxWindowID id,
144                             const wxString& mainLabel = wxEmptyString,
145                             const wxString& note = wxEmptyString,
146                             const wxPoint& pos = wxDefaultPosition,
147                             const wxSize& size = wxDefaultSize,
148                             long style = 0,
149                             const wxValidator& validator = wxDefaultValidator,
150                             const wxString& name = wxASCII_STR(wxButtonNameStr))
wxGenericCommandLinkButton(parent,id,mainLabel,note,pos,size,style,validator,name)151             : wxGenericCommandLinkButton(parent,
152                                          id,
153                                          mainLabel,
154                                          note,
155                                          pos,
156                                          size,
157                                          style,
158                                          validator,
159                                          name)
160             { }
161 
162     private:
163         wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxCommandLinkButton);
164     };
165 #endif // __WXMSW__/!__WXMSW__
166 
167 #endif // wxUSE_COMMANDLINKBUTTON
168 
169 #endif // _WX_COMMANDLINKBUTTON_H_
170