]> git.saurik.com Git - wxWidgets.git/blame - src/generic/colrdlgg.cpp
Optimized sizers to not call CalcMin more often than neccessary
[wxWidgets.git] / src / generic / colrdlgg.cpp
CommitLineData
c801d85f 1/////////////////////////////////////////////////////////////////////////////
1e6feb95 2// Name: generic/colrdlgg.cpp
c801d85f
KB
3// Purpose: Choice dialogs
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
6aa89a22 8// Copyright: (c) Julian Smart
65571936 9// Licence: wxWindows licence
c801d85f
KB
10/////////////////////////////////////////////////////////////////////////////
11
14f355c2 12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
c801d85f
KB
13#pragma implementation "colrdlgg.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
1e6feb95 20 #pragma hdrstop
c801d85f
KB
21#endif
22
a2b99ff5 23#if wxUSE_COLOURDLG && !defined(__WXGTK20__)
1e6feb95 24
c801d85f 25#ifndef WX_PRECOMP
1e6feb95
VZ
26 #include "wx/utils.h"
27 #include "wx/intl.h"
28 #include "wx/dialog.h"
29 #include "wx/listbox.h"
30 #include "wx/button.h"
31 #include "wx/stattext.h"
32 #include "wx/layout.h"
33 #include "wx/dcclient.h"
34 #include "wx/slider.h"
35 #include "wx/sizer.h"
4130b487
RR
36#endif
37
38#if wxUSE_STATLINE
39 #include "wx/statline.h"
c801d85f
KB
40#endif
41
42#include "wx/generic/colrdlgg.h"
43
c801d85f
KB
44IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog, wxDialog)
45
46BEGIN_EVENT_TABLE(wxGenericColourDialog, wxDialog)
c35414db
VZ
47 EVT_BUTTON(wxID_ADD_CUSTOM, wxGenericColourDialog::OnAddCustom)
48 EVT_SLIDER(wxID_RED_SLIDER, wxGenericColourDialog::OnRedSlider)
49 EVT_SLIDER(wxID_GREEN_SLIDER, wxGenericColourDialog::OnGreenSlider)
50 EVT_SLIDER(wxID_BLUE_SLIDER, wxGenericColourDialog::OnBlueSlider)
51 EVT_PAINT(wxGenericColourDialog::OnPaint)
52 EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent)
53 EVT_CLOSE(wxGenericColourDialog::OnCloseWindow)
c801d85f
KB
54END_EVENT_TABLE()
55
c801d85f
KB
56
57/*
58 * Generic wxColourDialog
59 */
60
61138de0
VZ
61// don't change the number of elements (48) in this array, the code below is
62// hardcoded to use it
63static const wxChar *wxColourDialogNames[] =
64{
65 wxT("ORANGE"),
66 wxT("GOLDENROD"),
67 wxT("WHEAT"),
68 wxT("SPRING GREEN"),
69 wxT("SKY BLUE"),
70 wxT("SLATE BLUE"),
71 wxT("MEDIUM VIOLET RED"),
72 wxT("PURPLE"),
73
74 wxT("RED"),
75 wxT("YELLOW"),
76 wxT("MEDIUM SPRING GREEN"),
77 wxT("PALE GREEN"),
78 wxT("CYAN"),
79 wxT("LIGHT STEEL BLUE"),
80 wxT("ORCHID"),
81 wxT("LIGHT MAGENTA"),
82
83 wxT("BROWN"),
84 wxT("YELLOW"),
85 wxT("GREEN"),
86 wxT("CADET BLUE"),
87 wxT("MEDIUM BLUE"),
88 wxT("MAGENTA"),
89 wxT("MAROON"),
90 wxT("ORANGE RED"),
91
92 wxT("FIREBRICK"),
93 wxT("CORAL"),
94 wxT("FOREST GREEN"),
95 wxT("AQUAMARINE"),
96 wxT("BLUE"),
97 wxT("NAVY"),
98 wxT("THISTLE"),
99 wxT("MEDIUM VIOLET RED"),
100
101 wxT("INDIAN RED"),
102 wxT("GOLD"),
103 wxT("MEDIUM SEA GREEN"),
104 wxT("MEDIUM BLUE"),
105 wxT("MIDNIGHT BLUE"),
106 wxT("GREY"),
107 wxT("PURPLE"),
108 wxT("KHAKI"),
109
110 wxT("BLACK"),
111 wxT("MEDIUM FOREST GREEN"),
112 wxT("KHAKI"),
113 wxT("DARK GREY"),
114 wxT("SEA GREEN"),
115 wxT("LIGHT GREY"),
116 wxT("MEDIUM SLATE BLUE"),
117 wxT("WHITE")
118};
c801d85f 119
4130b487 120wxGenericColourDialog::wxGenericColourDialog()
c801d85f
KB
121{
122 dialogParent = NULL;
123 whichKind = 1;
ea8a9699 124 colourSelection = -1;
c801d85f
KB
125}
126
f6bcfd97
BP
127wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent,
128 wxColourData *data)
c801d85f
KB
129{
130 whichKind = 1;
ea8a9699 131 colourSelection = -1;
c801d85f
KB
132 Create(parent, data);
133}
134
4130b487 135wxGenericColourDialog::~wxGenericColourDialog()
c801d85f
KB
136{
137}
138
74e3313b 139void wxGenericColourDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
c801d85f 140{
e3065973 141 EndModal(wxID_CANCEL);
c801d85f
KB
142}
143
144bool wxGenericColourDialog::Create(wxWindow *parent, wxColourData *data)
145{
ca65c044 146 if ( !wxDialog::Create(parent, wxID_ANY, _("Choose colour"),
2a21ac15 147 wxPoint(0, 0), wxSize(900, 900)) )
ca65c044 148 return false;
c35414db 149
f6bcfd97 150 dialogParent = parent;
c801d85f 151
f6bcfd97
BP
152 if (data)
153 colourData = *data;
c35414db 154
f6bcfd97
BP
155 InitializeColours();
156 CalculateMeasurements();
157 CreateWidgets();
158
ca65c044 159 return true;
c801d85f
KB
160}
161
4130b487 162int wxGenericColourDialog::ShowModal()
c801d85f
KB
163{
164 return wxDialog::ShowModal();
165}
166
167
168// Internal functions
169void wxGenericColourDialog::OnMouseEvent(wxMouseEvent& event)
170{
171 if (event.ButtonDown(1))
172 {
173 int x = (int)event.GetX();
174 int y = (int)event.GetY();
175
b1f9d7bf
DW
176#ifdef __WXPM__
177 // Handle OS/2's reverse coordinate system and account for the dialog title
178 int nClientHeight;
179
180 GetClientSize(NULL, &nClientHeight);
181 y = (nClientHeight - y) + 20;
182#endif
c801d85f
KB
183 if ((x >= standardColoursRect.x && x <= (standardColoursRect.x + standardColoursRect.width)) &&
184 (y >= standardColoursRect.y && y <= (standardColoursRect.y + standardColoursRect.height)))
185 {
186 int selX = (int)(x - standardColoursRect.x)/(smallRectangleSize.x + gridSpacing);
187 int selY = (int)(y - standardColoursRect.y)/(smallRectangleSize.y + gridSpacing);
188 int ptr = (int)(selX + selY*8);
189 OnBasicColourClick(ptr);
190 }
191 else if ((x >= customColoursRect.x && x <= (customColoursRect.x + customColoursRect.width)) &&
192 (y >= customColoursRect.y && y <= (customColoursRect.y + customColoursRect.height)))
193 {
194 int selX = (int)(x - customColoursRect.x)/(smallRectangleSize.x + gridSpacing);
195 int selY = (int)(y - customColoursRect.y)/(smallRectangleSize.y + gridSpacing);
196 int ptr = (int)(selX + selY*8);
197 OnCustomColourClick(ptr);
198 }
c10920de
VS
199 else
200 event.Skip();
c801d85f 201 }
c10920de
VS
202 else
203 event.Skip();
c801d85f
KB
204}
205
206void wxGenericColourDialog::OnPaint(wxPaintEvent& event)
207{
bec1ace6 208#if !defined(__WXMOTIF__) && !defined(__WXMAC__) && !defined(__WXPM__) && !defined(__WXCOCOA__)
c801d85f 209 wxDialog::OnPaint(event);
d75638f8 210#endif
c801d85f
KB
211
212 wxPaintDC dc(this);
213
214 PaintBasicColours(dc);
215 PaintCustomColours(dc);
216 PaintCustomColour(dc);
ca65c044 217 PaintHighlight(dc, true);
c801d85f
KB
218}
219
4130b487 220void wxGenericColourDialog::CalculateMeasurements()
c801d85f
KB
221{
222 smallRectangleSize.x = 18;
223 smallRectangleSize.y = 14;
224 customRectangleSize.x = 40;
225 customRectangleSize.y = 40;
226
227 gridSpacing = 6;
228 sectionSpacing = 15;
229
230 standardColoursRect.x = 10;
b1f9d7bf
DW
231#ifdef __WXPM__
232 standardColoursRect.y = 15 + 20; /* OS/2 needs to account for dialog titlebar */
233#else
c801d85f 234 standardColoursRect.y = 15;
b1f9d7bf 235#endif
c801d85f
KB
236 standardColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing);
237 standardColoursRect.height = (6*smallRectangleSize.y) + (5*gridSpacing);
238
239 customColoursRect.x = standardColoursRect.x;
240 customColoursRect.y = standardColoursRect.y + standardColoursRect.height + 20;
241 customColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing);
242 customColoursRect.height = (2*smallRectangleSize.y) + (1*gridSpacing);
243
244 singleCustomColourRect.x = customColoursRect.width + customColoursRect.x + sectionSpacing;
245 singleCustomColourRect.y = 80;
246 singleCustomColourRect.width = customRectangleSize.x;
247 singleCustomColourRect.height = customRectangleSize.y;
248
249 okButtonX = 10;
250 customButtonX = singleCustomColourRect.x ;
251 buttonY = customColoursRect.y + customColoursRect.height + 10;
252}
253
4130b487 254void wxGenericColourDialog::CreateWidgets()
c801d85f 255{
4130b487 256 wxBeginBusyCursor();
c801d85f 257
4130b487
RR
258 int sliderX = singleCustomColourRect.x + singleCustomColourRect.width + sectionSpacing;
259#if defined(__WXMOTIF__)
260 int sliderSpacing = 65;
261 int sliderHeight = 160;
c801d85f 262#else
4130b487
RR
263 int sliderSpacing = 45;
264 int sliderHeight = 160;
265#endif
266
ea8a9699 267 redSlider = new wxSlider(this, wxID_RED_SLIDER, singleCustomColour.Red(), 0, 255,
ca65c044 268 wxPoint(sliderX, 10), wxSize(wxDefaultSize.x, sliderHeight), wxVERTICAL|wxSL_LABELS);
ea8a9699 269 greenSlider = new wxSlider(this, wxID_GREEN_SLIDER, singleCustomColour.Green(), 0, 255,
ca65c044 270 wxPoint(sliderX + sliderSpacing, 10), wxSize(wxDefaultSize.x, sliderHeight), wxVERTICAL|wxSL_LABELS);
ea8a9699 271 blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, singleCustomColour.Blue(), 0, 255,
ca65c044 272 wxPoint(sliderX + 2*sliderSpacing, 10), wxSize(wxDefaultSize.x, sliderHeight), wxVERTICAL|wxSL_LABELS);
4130b487
RR
273
274 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
275
276 // 1) space for explicitly layouted controls
277 topsizer->Add( sliderX + 3*sliderSpacing, sliderHeight+25 );
6c34d0ed 278
4130b487
RR
279#if wxUSE_STATLINE
280 // 2) static line
ca65c044 281 topsizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
c801d85f 282#endif
c35414db 283
4130b487
RR
284 // 3) buttons
285 wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL );
286 buttonsizer->Add( new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours") ), 0, wxLEFT|wxRIGHT, 10 );
287 topsizer->Add( buttonsizer, 0, wxCENTRE | wxALL, 10 );
c801d85f 288
ca65c044 289 SetAutoLayout( true );
4130b487 290 SetSizer( topsizer );
6c34d0ed 291
4130b487
RR
292 topsizer->SetSizeHints( this );
293 topsizer->Fit( this );
c801d85f 294
4130b487 295 Centre( wxBOTH );
c801d85f 296
4130b487 297 wxEndBusyCursor();
c801d85f
KB
298}
299
300void wxGenericColourDialog::InitializeColours(void)
301{
a4ba2eec 302 size_t i;
ea8a9699 303
61138de0 304 for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++)
ea8a9699 305 {
564a150b
VZ
306 wxColour col = wxTheColourDatabase->Find(wxColourDialogNames[i]);
307 if (col.Ok())
308 standardColours[i].Set(col.Red(), col.Green(), col.Blue());
ea8a9699
VZ
309 else
310 standardColours[i].Set(0, 0, 0);
311 }
c801d85f 312
564a150b 313 for (i = 0; i < WXSIZEOF(customColours); i++)
ea8a9699 314 {
a2b99ff5
VS
315 wxColour c = colourData.GetCustomColour(i);
316 if (c.Ok())
317 customColours[i] = colourData.GetCustomColour(i);
318 else
319 customColours[i] = wxColour(255, 255, 255);
ea8a9699 320 }
c801d85f 321
ea8a9699
VZ
322 wxColour curr = colourData.GetColour();
323 if ( curr.Ok() )
324 {
ca65c044 325 bool initColourFound = false;
ea8a9699 326
61138de0 327 for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++)
ea8a9699
VZ
328 {
329 if ( standardColours[i] == curr && !initColourFound )
330 {
331 whichKind = 1;
332 colourSelection = i;
ca65c044 333 initColourFound = true;
ea8a9699
VZ
334 break;
335 }
336 }
337 if ( !initColourFound )
338 {
564a150b 339 for ( i = 0; i < WXSIZEOF(customColours); i++ )
ea8a9699
VZ
340 {
341 if ( customColours[i] == curr )
342 {
343 whichKind = 2;
344 colourSelection = i;
ea8a9699
VZ
345 break;
346 }
347 }
348 }
349 singleCustomColour.Set( curr.Red(), curr.Green(), curr.Blue() );
350 }
351 else
352 {
353 whichKind = 1;
354 colourSelection = 0;
355 singleCustomColour.Set( 0, 0, 0 );
356 }
c801d85f
KB
357}
358
359void wxGenericColourDialog::PaintBasicColours(wxDC& dc)
360{
361 dc.BeginDrawing();
362
363 int i;
364 for (i = 0; i < 6; i++)
365 {
366 int j;
367 for (j = 0; j < 8; j++)
368 {
369 int ptr = i*8 + j;
c35414db 370
c801d85f
KB
371 int x = (j*(smallRectangleSize.x+gridSpacing) + standardColoursRect.x);
372 int y = (i*(smallRectangleSize.y+gridSpacing) + standardColoursRect.y);
373
374 dc.SetPen(*wxBLACK_PEN);
375 wxBrush brush(standardColours[ptr], wxSOLID);
376 dc.SetBrush(brush);
377
378 dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y);
379 }
380 }
381 dc.EndDrawing();
382}
383
384void wxGenericColourDialog::PaintCustomColours(wxDC& dc)
385{
386 dc.BeginDrawing();
387
388 int i;
389 for (i = 0; i < 2; i++)
390 {
391 int j;
392 for (j = 0; j < 8; j++)
393 {
394 int ptr = i*8 + j;
c35414db 395
c801d85f
KB
396 int x = (j*(smallRectangleSize.x+gridSpacing)) + customColoursRect.x;
397 int y = (i*(smallRectangleSize.y+gridSpacing)) + customColoursRect.y;
398
399 dc.SetPen(*wxBLACK_PEN);
400
401 wxBrush brush(customColours[ptr], wxSOLID);
402 dc.SetBrush(brush);
403
404 dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y);
405 }
406 }
407 dc.EndDrawing();
408}
409
410void wxGenericColourDialog::PaintHighlight(wxDC& dc, bool draw)
411{
ea8a9699
VZ
412 if ( colourSelection < 0 )
413 return;
414
c801d85f
KB
415 dc.BeginDrawing();
416
417 // Number of pixels bigger than the standard rectangle size
418 // for drawing a highlight
419 int deltaX = 2;
420 int deltaY = 2;
421
422 if (whichKind == 1)
423 {
424 // Standard colours
425 int y = (int)(colourSelection / 8);
426 int x = (int)(colourSelection - (y*8));
427
428 x = (x*(smallRectangleSize.x + gridSpacing) + standardColoursRect.x) - deltaX;
429 y = (y*(smallRectangleSize.y + gridSpacing) + standardColoursRect.y) - deltaY;
430
431 if (draw)
432 dc.SetPen(*wxBLACK_PEN);
433 else
434 dc.SetPen(*wxLIGHT_GREY_PEN);
435
436 dc.SetBrush(*wxTRANSPARENT_BRUSH);
437 dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY)));
438 }
439 else
440 {
441 // User-defined colours
442 int y = (int)(colourSelection / 8);
443 int x = (int)(colourSelection - (y*8));
444
445 x = (x*(smallRectangleSize.x + gridSpacing) + customColoursRect.x) - deltaX;
446 y = (y*(smallRectangleSize.y + gridSpacing) + customColoursRect.y) - deltaY;
447
448 if (draw)
449 dc.SetPen(*wxBLACK_PEN);
450 else
451 dc.SetPen(*wxLIGHT_GREY_PEN);
c35414db 452
c801d85f
KB
453 dc.SetBrush(*wxTRANSPARENT_BRUSH);
454 dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY)));
455 }
c35414db 456
c801d85f
KB
457 dc.EndDrawing();
458}
459
460void wxGenericColourDialog::PaintCustomColour(wxDC& dc)
461{
462 dc.BeginDrawing();
c35414db 463
c801d85f
KB
464 dc.SetPen(*wxBLACK_PEN);
465
466 wxBrush *brush = new wxBrush(singleCustomColour, wxSOLID);
467 dc.SetBrush(*brush);
468
469 dc.DrawRectangle( singleCustomColourRect.x, singleCustomColourRect.y,
470 customRectangleSize.x, customRectangleSize.y);
471
472 dc.SetBrush(wxNullBrush);
473 delete brush;
474
475 dc.EndDrawing();
476}
477
478void wxGenericColourDialog::OnBasicColourClick(int which)
479{
ca65c044 480 wxClientDC dc(this);
c801d85f 481
ca65c044
WS
482 PaintHighlight(dc, false);
483 whichKind = 1;
484 colourSelection = which;
485 colourData.SetColour(standardColours[colourSelection]);
486 redSlider->SetValue( standardColours[colourSelection].Red() );
ea8a9699
VZ
487 greenSlider->SetValue( standardColours[colourSelection].Green() );
488 blueSlider->SetValue( standardColours[colourSelection].Blue() );
ca65c044 489 singleCustomColour.Set(standardColours[colourSelection].Red(), standardColours[colourSelection].Green(), standardColours[colourSelection].Blue());
c801d85f 490
ca65c044
WS
491 PaintCustomColour(dc);
492 PaintHighlight(dc, true);
c801d85f
KB
493}
494
495void wxGenericColourDialog::OnCustomColourClick(int which)
496{
ca65c044
WS
497 wxClientDC dc(this);
498 PaintHighlight(dc, false);
499 whichKind = 2;
500 colourSelection = which;
501 colourData.SetColour(customColours[colourSelection]);
502 redSlider->SetValue( customColours[colourSelection].Red() );
ea8a9699
VZ
503 greenSlider->SetValue( customColours[colourSelection].Green() );
504 blueSlider->SetValue( customColours[colourSelection].Blue() );
ca65c044
WS
505 singleCustomColour.Set(customColours[colourSelection].Red(), customColours[colourSelection].Green(), customColours[colourSelection].Blue());
506 PaintCustomColour(dc);
507 PaintHighlight(dc, true);
c801d85f
KB
508}
509
510/*
511void wxGenericColourDialog::OnOk(void)
512{
ca65c044 513 Show(false);
c801d85f
KB
514}
515
516void wxGenericColourDialog::OnCancel(void)
517{
ca65c044
WS
518 colourDialogCancelled = true;
519 Show(false);
c801d85f
KB
520}
521*/
522
523void wxGenericColourDialog::OnAddCustom(wxCommandEvent& WXUNUSED(event))
524{
525 wxClientDC dc(this);
526 if (whichKind != 2)
527 {
ca65c044 528 PaintHighlight(dc, false);
c801d85f
KB
529 whichKind = 2;
530 colourSelection = 0;
ca65c044 531 PaintHighlight(dc, true);
c801d85f
KB
532 }
533
534 customColours[colourSelection].Set(singleCustomColour.Red(), singleCustomColour.Green(), singleCustomColour.Blue());
535 colourData.SetColour(customColours[colourSelection]);
536 colourData.SetCustomColour(colourSelection, customColours[colourSelection]);
c35414db 537
c801d85f
KB
538 PaintCustomColours(dc);
539}
540
541void wxGenericColourDialog::OnRedSlider(wxCommandEvent& WXUNUSED(event))
542{
543 if (!redSlider)
544 return;
c35414db 545
c801d85f
KB
546 wxClientDC dc(this);
547 singleCustomColour.Set(redSlider->GetValue(), singleCustomColour.Green(), singleCustomColour.Blue());
548 PaintCustomColour(dc);
549}
550
551void wxGenericColourDialog::OnGreenSlider(wxCommandEvent& WXUNUSED(event))
552{
553 if (!greenSlider)
554 return;
555
556 wxClientDC dc(this);
557 singleCustomColour.Set(singleCustomColour.Red(), greenSlider->GetValue(), singleCustomColour.Blue());
558 PaintCustomColour(dc);
559}
560
561void wxGenericColourDialog::OnBlueSlider(wxCommandEvent& WXUNUSED(event))
562{
563 if (!blueSlider)
564 return;
565
566 wxClientDC dc(this);
567 singleCustomColour.Set(singleCustomColour.Red(), singleCustomColour.Green(), blueSlider->GetValue());
568 PaintCustomColour(dc);
569}
570
a2b99ff5 571#endif // wxUSE_COLOURDLG && !defined(__WXGTK20__)
c801d85f 572