]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/colrdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/colrdlgg.cpp
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
24 #include "wx/dialog.h"
25 #include "wx/listbox.h"
26 #include "wx/button.h"
27 #include "wx/stattext.h"
28 #include "wx/layout.h"
29 #include "wx/dcclient.h"
31 #include "wx/slider.h"
35 #include "wx/statline.h"
38 #include "wx/colourdata.h"
39 #include "wx/generic/colrdlgg.h"
41 IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog
, wxDialog
)
43 BEGIN_EVENT_TABLE(wxGenericColourDialog
, wxDialog
)
44 EVT_BUTTON(wxID_ADD_CUSTOM
, wxGenericColourDialog::OnAddCustom
)
46 EVT_SLIDER(wxID_RED_SLIDER
, wxGenericColourDialog::OnRedSlider
)
47 EVT_SLIDER(wxID_GREEN_SLIDER
, wxGenericColourDialog::OnGreenSlider
)
48 EVT_SLIDER(wxID_BLUE_SLIDER
, wxGenericColourDialog::OnBlueSlider
)
50 EVT_PAINT(wxGenericColourDialog::OnPaint
)
51 EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent
)
52 EVT_CLOSE(wxGenericColourDialog::OnCloseWindow
)
57 * Generic wxColourDialog
60 // don't change the number of elements (48) in this array, the code below is
61 // hardcoded to use it
62 static const wxChar
*const wxColourDialogNames
[] =
70 wxT("MEDIUM VIOLET RED"),
75 wxT("MEDIUM SPRING GREEN"),
78 wxT("LIGHT STEEL BLUE"),
98 wxT("MEDIUM VIOLET RED"),
102 wxT("MEDIUM SEA GREEN"),
104 wxT("MIDNIGHT BLUE"),
110 wxT("MEDIUM FOREST GREEN"),
115 wxT("MEDIUM SLATE BLUE"),
119 wxGenericColourDialog::wxGenericColourDialog()
122 m_colourSelection
= -1;
125 wxGenericColourDialog::wxGenericColourDialog(wxWindow
*parent
,
129 m_colourSelection
= -1;
130 Create(parent
, data
);
133 wxGenericColourDialog::~wxGenericColourDialog()
137 void wxGenericColourDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
139 EndModal(wxID_CANCEL
);
142 bool wxGenericColourDialog::Create(wxWindow
*parent
, wxColourData
*data
)
144 if ( !wxDialog::Create(GetParentForModalDialog(parent
, 0), wxID_ANY
,
146 wxPoint(0, 0), wxSize(900, 900)) )
150 m_colourData
= *data
;
153 CalculateMeasurements();
159 int wxGenericColourDialog::ShowModal()
161 return wxDialog::ShowModal();
165 // Internal functions
166 void wxGenericColourDialog::OnMouseEvent(wxMouseEvent
& event
)
168 if (event
.ButtonDown(1))
170 int x
= (int)event
.GetX();
171 int y
= (int)event
.GetY();
174 // Handle OS/2's reverse coordinate system and account for the dialog title
177 GetClientSize(NULL
, &nClientHeight
);
178 y
= (nClientHeight
- y
) + 20;
180 if ((x
>= m_standardColoursRect
.x
&& x
<= (m_standardColoursRect
.x
+ m_standardColoursRect
.width
)) &&
181 (y
>= m_standardColoursRect
.y
&& y
<= (m_standardColoursRect
.y
+ m_standardColoursRect
.height
)))
183 int selX
= (int)(x
- m_standardColoursRect
.x
)/(m_smallRectangleSize
.x
+ m_gridSpacing
);
184 int selY
= (int)(y
- m_standardColoursRect
.y
)/(m_smallRectangleSize
.y
+ m_gridSpacing
);
185 int ptr
= (int)(selX
+ selY
*8);
186 OnBasicColourClick(ptr
);
188 else if ((x
>= m_customColoursRect
.x
&& x
<= (m_customColoursRect
.x
+ m_customColoursRect
.width
)) &&
189 (y
>= m_customColoursRect
.y
&& y
<= (m_customColoursRect
.y
+ m_customColoursRect
.height
)))
191 int selX
= (int)(x
- m_customColoursRect
.x
)/(m_smallRectangleSize
.x
+ m_gridSpacing
);
192 int selY
= (int)(y
- m_customColoursRect
.y
)/(m_smallRectangleSize
.y
+ m_gridSpacing
);
193 int ptr
= (int)(selX
+ selY
*8);
194 OnCustomColourClick(ptr
);
203 void wxGenericColourDialog::OnPaint(wxPaintEvent
& WXUNUSED(event
))
207 PaintBasicColours(dc
);
208 PaintCustomColours(dc
);
209 PaintCustomColour(dc
);
210 PaintHighlight(dc
, true);
213 void wxGenericColourDialog::CalculateMeasurements()
215 m_smallRectangleSize
.x
= 18;
216 m_smallRectangleSize
.y
= 14;
217 m_customRectangleSize
.x
= 40;
218 m_customRectangleSize
.y
= 40;
221 m_sectionSpacing
= 15;
223 m_standardColoursRect
.x
= 10;
225 m_standardColoursRect
.y
= 15 + 20; /* OS/2 needs to account for dialog titlebar */
227 m_standardColoursRect
.y
= 15;
229 m_standardColoursRect
.width
= (8*m_smallRectangleSize
.x
) + (7*m_gridSpacing
);
230 m_standardColoursRect
.height
= (6*m_smallRectangleSize
.y
) + (5*m_gridSpacing
);
232 m_customColoursRect
.x
= m_standardColoursRect
.x
;
233 m_customColoursRect
.y
= m_standardColoursRect
.y
+ m_standardColoursRect
.height
+ 20;
234 m_customColoursRect
.width
= (8*m_smallRectangleSize
.x
) + (7*m_gridSpacing
);
235 m_customColoursRect
.height
= (2*m_smallRectangleSize
.y
) + (1*m_gridSpacing
);
237 m_singleCustomColourRect
.x
= m_customColoursRect
.width
+ m_customColoursRect
.x
+ m_sectionSpacing
;
238 m_singleCustomColourRect
.y
= 80;
239 m_singleCustomColourRect
.width
= m_customRectangleSize
.x
;
240 m_singleCustomColourRect
.height
= m_customRectangleSize
.y
;
243 m_customButtonX
= m_singleCustomColourRect
.x
;
244 m_buttonY
= m_customColoursRect
.y
+ m_customColoursRect
.height
+ 10;
247 void wxGenericColourDialog::CreateWidgets()
251 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
253 const int sliderHeight
= 160;
257 const int sliderX
= m_singleCustomColourRect
.x
+ m_singleCustomColourRect
.width
+ m_sectionSpacing
;
259 m_redSlider
= new wxSlider(this, wxID_RED_SLIDER
, m_colourData
.m_dataColour
.Red(), 0, 255,
260 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
261 m_greenSlider
= new wxSlider(this, wxID_GREEN_SLIDER
, m_colourData
.m_dataColour
.Green(), 0, 255,
262 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
263 m_blueSlider
= new wxSlider(this, wxID_BLUE_SLIDER
, m_colourData
.m_dataColour
.Blue(), 0, 255,
264 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
266 wxBoxSizer
*sliderSizer
= new wxBoxSizer( wxHORIZONTAL
);
268 sliderSizer
->Add(sliderX
, sliderHeight
);
270 wxSizerFlags flagsRight
;
271 flagsRight
.Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
).DoubleBorder();
273 sliderSizer
->Add(m_redSlider
, flagsRight
);
274 sliderSizer
->Add(m_greenSlider
,flagsRight
);
275 sliderSizer
->Add(m_blueSlider
,flagsRight
);
277 topSizer
->Add(sliderSizer
, wxSizerFlags().Centre().DoubleBorder());
279 topSizer
->Add(1, sliderHeight
, wxSizerFlags(1).Centre().TripleBorder());
280 #endif // wxUSE_SLIDER
282 // then the custom button
283 topSizer
->Add(new wxButton(this, wxID_ADD_CUSTOM
,
284 _("Add to custom colours") ),
285 wxSizerFlags().DoubleHorzBorder());
287 // then the standard buttons
288 wxSizer
*buttonsizer
= CreateSeparatedButtonSizer(wxOK
| wxCANCEL
);
291 topSizer
->Add(buttonsizer
, wxSizerFlags().Expand().DoubleBorder());
294 SetAutoLayout( true );
295 SetSizer( topSizer
);
297 topSizer
->SetSizeHints( this );
298 topSizer
->Fit( this );
305 void wxGenericColourDialog::InitializeColours(void)
309 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
311 wxColour col
= wxTheColourDatabase
->Find(wxColourDialogNames
[i
]);
313 m_standardColours
[i
].Set(col
.Red(), col
.Green(), col
.Blue());
315 m_standardColours
[i
].Set(0, 0, 0);
318 for (i
= 0; i
< WXSIZEOF(m_customColours
); i
++)
320 wxColour c
= m_colourData
.GetCustomColour(i
);
322 m_customColours
[i
] = m_colourData
.GetCustomColour(i
);
324 m_customColours
[i
] = wxColour(255, 255, 255);
327 wxColour curr
= m_colourData
.GetColour();
330 bool m_initColourFound
= false;
332 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
334 if ( m_standardColours
[i
] == curr
&& !m_initColourFound
)
337 m_colourSelection
= i
;
338 m_initColourFound
= true;
342 if ( !m_initColourFound
)
344 for ( i
= 0; i
< WXSIZEOF(m_customColours
); i
++ )
346 if ( m_customColours
[i
] == curr
)
349 m_colourSelection
= i
;
354 m_colourData
.m_dataColour
.Set( curr
.Red(), curr
.Green(), curr
.Blue() );
359 m_colourSelection
= 0;
360 m_colourData
.m_dataColour
.Set( 0, 0, 0 );
364 void wxGenericColourDialog::PaintBasicColours(wxDC
& dc
)
367 for (i
= 0; i
< 6; i
++)
370 for (j
= 0; j
< 8; j
++)
374 int x
= (j
*(m_smallRectangleSize
.x
+m_gridSpacing
) + m_standardColoursRect
.x
);
375 int y
= (i
*(m_smallRectangleSize
.y
+m_gridSpacing
) + m_standardColoursRect
.y
);
377 dc
.SetPen(*wxBLACK_PEN
);
378 wxBrush
brush(m_standardColours
[ptr
]);
381 dc
.DrawRectangle( x
, y
, m_smallRectangleSize
.x
, m_smallRectangleSize
.y
);
386 void wxGenericColourDialog::PaintCustomColours(wxDC
& dc
)
389 for (i
= 0; i
< 2; i
++)
392 for (j
= 0; j
< 8; j
++)
396 int x
= (j
*(m_smallRectangleSize
.x
+m_gridSpacing
)) + m_customColoursRect
.x
;
397 int y
= (i
*(m_smallRectangleSize
.y
+m_gridSpacing
)) + m_customColoursRect
.y
;
399 dc
.SetPen(*wxBLACK_PEN
);
401 wxBrush
brush(m_customColours
[ptr
]);
404 dc
.DrawRectangle( x
, y
, m_smallRectangleSize
.x
, m_smallRectangleSize
.y
);
409 void wxGenericColourDialog::PaintHighlight(wxDC
& dc
, bool draw
)
411 if ( m_colourSelection
< 0 )
414 // Number of pixels bigger than the standard rectangle size
415 // for drawing a highlight
419 if (m_whichKind
== 1)
422 int y
= (int)(m_colourSelection
/ 8);
423 int x
= (int)(m_colourSelection
- (y
*8));
425 x
= (x
*(m_smallRectangleSize
.x
+ m_gridSpacing
) + m_standardColoursRect
.x
) - deltaX
;
426 y
= (y
*(m_smallRectangleSize
.y
+ m_gridSpacing
) + m_standardColoursRect
.y
) - deltaY
;
429 dc
.SetPen(*wxBLACK_PEN
);
431 dc
.SetPen(*wxLIGHT_GREY_PEN
);
433 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
434 dc
.DrawRectangle( x
, y
, (m_smallRectangleSize
.x
+ (2*deltaX
)), (m_smallRectangleSize
.y
+ (2*deltaY
)));
438 // User-defined colours
439 int y
= (int)(m_colourSelection
/ 8);
440 int x
= (int)(m_colourSelection
- (y
*8));
442 x
= (x
*(m_smallRectangleSize
.x
+ m_gridSpacing
) + m_customColoursRect
.x
) - deltaX
;
443 y
= (y
*(m_smallRectangleSize
.y
+ m_gridSpacing
) + m_customColoursRect
.y
) - deltaY
;
446 dc
.SetPen(*wxBLACK_PEN
);
448 dc
.SetPen(*wxLIGHT_GREY_PEN
);
450 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
451 dc
.DrawRectangle( x
, y
, (m_smallRectangleSize
.x
+ (2*deltaX
)), (m_smallRectangleSize
.y
+ (2*deltaY
)));
455 void wxGenericColourDialog::PaintCustomColour(wxDC
& dc
)
457 dc
.SetPen(*wxBLACK_PEN
);
459 wxBrush
*brush
= new wxBrush(m_colourData
.m_dataColour
);
462 dc
.DrawRectangle( m_singleCustomColourRect
.x
, m_singleCustomColourRect
.y
,
463 m_customRectangleSize
.x
, m_customRectangleSize
.y
);
465 dc
.SetBrush(wxNullBrush
);
469 void wxGenericColourDialog::OnBasicColourClick(int which
)
473 PaintHighlight(dc
, false);
475 m_colourSelection
= which
;
478 m_redSlider
->SetValue( m_standardColours
[m_colourSelection
].Red() );
479 m_greenSlider
->SetValue( m_standardColours
[m_colourSelection
].Green() );
480 m_blueSlider
->SetValue( m_standardColours
[m_colourSelection
].Blue() );
481 #endif // wxUSE_SLIDER
483 m_colourData
.m_dataColour
.Set(m_standardColours
[m_colourSelection
].Red(),
484 m_standardColours
[m_colourSelection
].Green(),
485 m_standardColours
[m_colourSelection
].Blue());
487 PaintCustomColour(dc
);
488 PaintHighlight(dc
, true);
491 void wxGenericColourDialog::OnCustomColourClick(int which
)
494 PaintHighlight(dc
, false);
496 m_colourSelection
= which
;
499 m_redSlider
->SetValue( m_customColours
[m_colourSelection
].Red() );
500 m_greenSlider
->SetValue( m_customColours
[m_colourSelection
].Green() );
501 m_blueSlider
->SetValue( m_customColours
[m_colourSelection
].Blue() );
502 #endif // wxUSE_SLIDER
504 m_colourData
.m_dataColour
.Set(m_customColours
[m_colourSelection
].Red(),
505 m_customColours
[m_colourSelection
].Green(),
506 m_customColours
[m_colourSelection
].Blue());
508 PaintCustomColour(dc
);
509 PaintHighlight(dc
, true);
513 void wxGenericColourDialog::OnOk(void)
518 void wxGenericColourDialog::OnCancel(void)
520 colourDialogCancelled = true;
525 void wxGenericColourDialog::OnAddCustom(wxCommandEvent
& WXUNUSED(event
))
528 if (m_whichKind
!= 2)
530 PaintHighlight(dc
, false);
532 m_colourSelection
= 0;
533 PaintHighlight(dc
, true);
536 m_customColours
[m_colourSelection
].Set(m_colourData
.m_dataColour
.Red(),
537 m_colourData
.m_dataColour
.Green(),
538 m_colourData
.m_dataColour
.Blue());
540 m_colourData
.SetCustomColour(m_colourSelection
, m_customColours
[m_colourSelection
]);
542 PaintCustomColours(dc
);
547 void wxGenericColourDialog::OnRedSlider(wxCommandEvent
& WXUNUSED(event
))
553 m_colourData
.m_dataColour
.Set((unsigned char)m_redSlider
->GetValue(), m_colourData
.m_dataColour
.Green(), m_colourData
.m_dataColour
.Blue());
554 PaintCustomColour(dc
);
557 void wxGenericColourDialog::OnGreenSlider(wxCommandEvent
& WXUNUSED(event
))
563 m_colourData
.m_dataColour
.Set(m_colourData
.m_dataColour
.Red(), (unsigned char)m_greenSlider
->GetValue(), m_colourData
.m_dataColour
.Blue());
564 PaintCustomColour(dc
);
567 void wxGenericColourDialog::OnBlueSlider(wxCommandEvent
& WXUNUSED(event
))
573 m_colourData
.m_dataColour
.Set(m_colourData
.m_dataColour
.Red(), m_colourData
.m_dataColour
.Green(), (unsigned char)m_blueSlider
->GetValue());
574 PaintCustomColour(dc
);
577 #endif // wxUSE_SLIDER
579 #endif // wxUSE_COLOURDLG