1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        src/common/clrpickercmn.cpp
3 // Purpose:     wxColourPickerCtrl class implementation
4 // Author:      Francesco Montorsi (readapted code written by Vadim Zeitlin)
5 // Modified by:
6 // Created:     15/04/2006
7 // RCS-ID:      $Id: clrpickercmn.cpp 42219 2006-10-21 19:53:05Z PC $
8 // Copyright:   (c) Vadim Zeitlin, Francesco Montorsi
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 // ============================================================================
13 // declarations
14 // ============================================================================
15 
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22 
23 #ifdef __BORLANDC__
24     #pragma hdrstop
25 #endif
26 
27 #if wxUSE_COLOURPICKERCTRL
28 
29 #include "wx/clrpicker.h"
30 
31 #ifndef WX_PRECOMP
32     #include "wx/textctrl.h"
33 #endif
34 
35 const wxChar wxColourPickerCtrlNameStr[] = wxT("colourpicker");
36 const wxChar wxColourPickerWidgetNameStr[] = wxT("colourpickerwidget");
37 
38 // ============================================================================
39 // implementation
40 // ============================================================================
41 
42 DEFINE_EVENT_TYPE(wxEVT_COMMAND_COLOURPICKER_CHANGED)
IMPLEMENT_DYNAMIC_CLASS(wxColourPickerCtrl,wxPickerBase)43 IMPLEMENT_DYNAMIC_CLASS(wxColourPickerCtrl, wxPickerBase)
44 IMPLEMENT_DYNAMIC_CLASS(wxColourPickerEvent, wxEvent)
45 
46 // ----------------------------------------------------------------------------
47 // wxColourPickerCtrl
48 // ----------------------------------------------------------------------------
49 
50 #define M_PICKER     ((wxColourPickerWidget*)m_picker)
51 
52 bool wxColourPickerCtrl::Create( wxWindow *parent, wxWindowID id,
53                         const wxColour &col,
54                         const wxPoint &pos, const wxSize &size,
55                         long style, const wxValidator& validator,
56                         const wxString &name )
57 {
58     if (!wxPickerBase::CreateBase(parent, id, col.GetAsString(), pos, size,
59                                   style, validator, name))
60         return false;
61 
62     // we are not interested to the ID of our picker as we connect
63     // to its "changed" event dynamically...
64     m_picker = new wxColourPickerWidget(this, wxID_ANY, col,
65                                         wxDefaultPosition, wxDefaultSize,
66                                         GetPickerStyle(style));
67 
68     // complete sizer creation
69     wxPickerBase::PostCreation();
70 
71     m_picker->Connect(wxEVT_COMMAND_COLOURPICKER_CHANGED,
72             wxColourPickerEventHandler(wxColourPickerCtrl::OnColourChange),
73             NULL, this);
74 
75     return true;
76 }
77 
SetColour(const wxColour & col)78 void wxColourPickerCtrl::SetColour(const wxColour &col)
79 {
80     M_PICKER->SetColour(col);
81     UpdateTextCtrlFromPicker();
82 }
83 
SetColour(const wxString & text)84 bool wxColourPickerCtrl::SetColour(const wxString &text)
85 {
86     wxColour col(text);     // smart wxString->wxColour conversion
87     if ( !col.Ok() )
88         return false;
89     M_PICKER->SetColour(col);
90     UpdateTextCtrlFromPicker();
91 
92     return true;
93 }
94 
UpdatePickerFromTextCtrl()95 void wxColourPickerCtrl::UpdatePickerFromTextCtrl()
96 {
97     wxASSERT(m_text);
98 
99     if (m_bIgnoreNextTextCtrlUpdate)
100     {
101         // ignore this update
102         m_bIgnoreNextTextCtrlUpdate = false;
103         return;
104     }
105 
106     // wxString -> wxColour conversion
107     wxColour col(m_text->GetValue());
108     if ( !col.Ok() )
109         return;     // invalid user input
110 
111     if (M_PICKER->GetColour() != col)
112     {
113         M_PICKER->SetColour(col);
114 
115         // fire an event
116         wxColourPickerEvent event(this, GetId(), col);
117         GetEventHandler()->ProcessEvent(event);
118     }
119 }
120 
UpdateTextCtrlFromPicker()121 void wxColourPickerCtrl::UpdateTextCtrlFromPicker()
122 {
123     if (!m_text)
124         return;     // no textctrl to update
125 
126     // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED
127     //       which will trigger a unneeded UpdateFromTextCtrl(); thus before using
128     //       SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag...
129     m_bIgnoreNextTextCtrlUpdate = true;
130     m_text->SetValue(M_PICKER->GetColour().GetAsString());
131 }
132 
133 
134 
135 // ----------------------------------------------------------------------------
136 // wxColourPickerCtrl - event handlers
137 // ----------------------------------------------------------------------------
138 
OnColourChange(wxColourPickerEvent & ev)139 void wxColourPickerCtrl::OnColourChange(wxColourPickerEvent &ev)
140 {
141     UpdateTextCtrlFromPicker();
142 
143     // the wxColourPickerWidget sent us a colour-change notification.
144     // forward this event to our parent
145     wxColourPickerEvent event(this, GetId(), ev.GetColour());
146     GetEventHandler()->ProcessEvent(event);
147 }
148 
149 #endif  // wxUSE_COLOURPICKERCTRL
150