Fix to excule OnPaint from WXPM
[wxWidgets.git] / src / generic / colrdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: colrdlgg.cpp
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
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__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include <stdio.h>
25 #include <stdio.h>
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"
36 #endif
37
38 #if wxUSE_STATLINE
39 #include "wx/statline.h"
40 #endif
41
42 #include "wx/generic/colrdlgg.h"
43
44 IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog, wxDialog)
45
46 BEGIN_EVENT_TABLE(wxGenericColourDialog, wxDialog)
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)
54 END_EVENT_TABLE()
55
56
57 /*
58 * Generic wxColourDialog
59 */
60
61 #define NUM_COLS 48
62 static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"),
63 wxT("GOLDENROD"),
64 wxT("WHEAT"),
65 wxT("SPRING GREEN"),
66 wxT("SKY BLUE"),
67 wxT("SLATE BLUE"),
68 wxT("MEDIUM VIOLET RED"),
69 wxT("PURPLE"),
70
71 wxT("RED"),
72 wxT("YELLOW"),
73 wxT("MEDIUM SPRING GREEN"),
74 wxT("PALE GREEN"),
75 wxT("CYAN"),
76 wxT("LIGHT STEEL BLUE"),
77 wxT("ORCHID"),
78 wxT("LIGHT MAGENTA"),
79
80 wxT("BROWN"),
81 wxT("YELLOW"),
82 wxT("GREEN"),
83 wxT("CADET BLUE"),
84 wxT("MEDIUM BLUE"),
85 wxT("MAGENTA"),
86 wxT("MAROON"),
87 wxT("ORANGE RED"),
88
89 wxT("FIREBRICK"),
90 wxT("CORAL"),
91 wxT("FOREST GREEN"),
92 wxT("AQUAMARINE"),
93 wxT("BLUE"),
94 wxT("NAVY"),
95 wxT("THISTLE"),
96 wxT("MEDIUM VIOLET RED"),
97
98 wxT("INDIAN RED"),
99 wxT("GOLD"),
100 wxT("MEDIUM SEA GREEN"),
101 wxT("MEDIUM BLUE"),
102 wxT("MIDNIGHT BLUE"),
103 wxT("GREY"),
104 wxT("PURPLE"),
105 wxT("KHAKI"),
106
107 wxT("BLACK"),
108 wxT("MEDIUM FOREST GREEN"),
109 wxT("KHAKI"),
110 wxT("DARK GREY"),
111 wxT("SEA GREEN"),
112 wxT("LIGHT GREY"),
113 wxT("MEDIUM SLATE BLUE"),
114 wxT("WHITE")
115 };
116
117 wxGenericColourDialog::wxGenericColourDialog()
118 {
119 dialogParent = NULL;
120 whichKind = 1;
121 colourSelection = 0;
122 }
123
124 wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent,
125 wxColourData *data)
126 {
127 whichKind = 1;
128 colourSelection = 0;
129 Create(parent, data);
130 }
131
132 wxGenericColourDialog::~wxGenericColourDialog()
133 {
134 }
135
136 void wxGenericColourDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
137 {
138 EndModal(wxID_CANCEL);
139 }
140
141 bool wxGenericColourDialog::Create(wxWindow *parent, wxColourData *data)
142 {
143 if ( !wxDialog::Create(parent, -1, wxT("Colour"),
144 wxPoint(0, 0), wxSize(900, 900),
145 wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL) )
146 return FALSE;
147
148 dialogParent = parent;
149
150 if (data)
151 colourData = *data;
152
153 InitializeColours();
154 CalculateMeasurements();
155 CreateWidgets();
156
157 return TRUE;
158 }
159
160 int wxGenericColourDialog::ShowModal()
161 {
162 return wxDialog::ShowModal();
163 }
164
165
166 // Internal functions
167 void wxGenericColourDialog::OnMouseEvent(wxMouseEvent& event)
168 {
169 if (event.ButtonDown(1))
170 {
171 int x = (int)event.GetX();
172 int y = (int)event.GetY();
173
174 if ((x >= standardColoursRect.x && x <= (standardColoursRect.x + standardColoursRect.width)) &&
175 (y >= standardColoursRect.y && y <= (standardColoursRect.y + standardColoursRect.height)))
176 {
177 int selX = (int)(x - standardColoursRect.x)/(smallRectangleSize.x + gridSpacing);
178 int selY = (int)(y - standardColoursRect.y)/(smallRectangleSize.y + gridSpacing);
179 int ptr = (int)(selX + selY*8);
180 OnBasicColourClick(ptr);
181 }
182 else if ((x >= customColoursRect.x && x <= (customColoursRect.x + customColoursRect.width)) &&
183 (y >= customColoursRect.y && y <= (customColoursRect.y + customColoursRect.height)))
184 {
185 int selX = (int)(x - customColoursRect.x)/(smallRectangleSize.x + gridSpacing);
186 int selY = (int)(y - customColoursRect.y)/(smallRectangleSize.y + gridSpacing);
187 int ptr = (int)(selX + selY*8);
188 OnCustomColourClick(ptr);
189 }
190 }
191 }
192
193 void wxGenericColourDialog::OnPaint(wxPaintEvent& event)
194 {
195 #if !defined(__WXMOTIF__) && !defined(__WXMAC__) && !defined(__WXPM__)
196 wxDialog::OnPaint(event);
197 #endif
198
199 wxPaintDC dc(this);
200
201 PaintBasicColours(dc);
202 PaintCustomColours(dc);
203 PaintCustomColour(dc);
204 PaintHighlight(dc, TRUE);
205 }
206
207 void wxGenericColourDialog::CalculateMeasurements()
208 {
209 smallRectangleSize.x = 18;
210 smallRectangleSize.y = 14;
211 customRectangleSize.x = 40;
212 customRectangleSize.y = 40;
213
214 gridSpacing = 6;
215 sectionSpacing = 15;
216
217 standardColoursRect.x = 10;
218 standardColoursRect.y = 15;
219 standardColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing);
220 standardColoursRect.height = (6*smallRectangleSize.y) + (5*gridSpacing);
221
222 customColoursRect.x = standardColoursRect.x;
223 customColoursRect.y = standardColoursRect.y + standardColoursRect.height + 20;
224 customColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing);
225 customColoursRect.height = (2*smallRectangleSize.y) + (1*gridSpacing);
226
227 singleCustomColourRect.x = customColoursRect.width + customColoursRect.x + sectionSpacing;
228 singleCustomColourRect.y = 80;
229 singleCustomColourRect.width = customRectangleSize.x;
230 singleCustomColourRect.height = customRectangleSize.y;
231
232 okButtonX = 10;
233 customButtonX = singleCustomColourRect.x ;
234 buttonY = customColoursRect.y + customColoursRect.height + 10;
235 }
236
237 void wxGenericColourDialog::CreateWidgets()
238 {
239 wxBeginBusyCursor();
240
241 int sliderX = singleCustomColourRect.x + singleCustomColourRect.width + sectionSpacing;
242 #if defined(__WXMOTIF__)
243 int sliderSpacing = 65;
244 int sliderHeight = 160;
245 #else
246 int sliderSpacing = 45;
247 int sliderHeight = 160;
248 #endif
249
250 redSlider = new wxSlider(this, wxID_RED_SLIDER, 0, 0, 255,
251 wxPoint(sliderX, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS);
252 greenSlider = new wxSlider(this, wxID_GREEN_SLIDER, 0, 0, 255,
253 wxPoint(sliderX + sliderSpacing, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS);
254 blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, 0, 0, 255,
255 wxPoint(sliderX + 2*sliderSpacing, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS);
256
257 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
258
259 // 1) space for explicitly layouted controls
260 topsizer->Add( sliderX + 3*sliderSpacing, sliderHeight+25 );
261
262 #if wxUSE_STATLINE
263 // 2) static line
264 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
265 #endif
266
267 // 3) buttons
268 wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL );
269 buttonsizer->Add( new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours") ), 0, wxLEFT|wxRIGHT, 10 );
270 topsizer->Add( buttonsizer, 0, wxCENTRE | wxALL, 10 );
271
272 SetAutoLayout( TRUE );
273 SetSizer( topsizer );
274
275 topsizer->SetSizeHints( this );
276 topsizer->Fit( this );
277
278 Centre( wxBOTH );
279
280 wxEndBusyCursor();
281 }
282
283 void wxGenericColourDialog::InitializeColours(void)
284 {
285 int i;
286 for (i = 0; i < 48; i++)
287 {
288 wxColour *col = wxTheColourDatabase->FindColour(wxColourDialogNames[i]);
289 if (col)
290 standardColours[i].Set(col->Red(), col->Green(), col->Blue());
291 else
292 standardColours[i].Set(0, 0, 0);
293 }
294
295 for (i = 0; i < 16; i++)
296 customColours[i] =
297 colourData.GetCustomColour(i);
298
299 singleCustomColour.Set(0, 0, 0);
300 }
301
302 void wxGenericColourDialog::PaintBasicColours(wxDC& dc)
303 {
304 dc.BeginDrawing();
305
306 int i;
307 for (i = 0; i < 6; i++)
308 {
309 int j;
310 for (j = 0; j < 8; j++)
311 {
312 int ptr = i*8 + j;
313
314 int x = (j*(smallRectangleSize.x+gridSpacing) + standardColoursRect.x);
315 int y = (i*(smallRectangleSize.y+gridSpacing) + standardColoursRect.y);
316
317 dc.SetPen(*wxBLACK_PEN);
318 wxBrush brush(standardColours[ptr], wxSOLID);
319 dc.SetBrush(brush);
320
321 dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y);
322 }
323 }
324 dc.EndDrawing();
325 }
326
327 void wxGenericColourDialog::PaintCustomColours(wxDC& dc)
328 {
329 dc.BeginDrawing();
330
331 int i;
332 for (i = 0; i < 2; i++)
333 {
334 int j;
335 for (j = 0; j < 8; j++)
336 {
337 int ptr = i*8 + j;
338
339 int x = (j*(smallRectangleSize.x+gridSpacing)) + customColoursRect.x;
340 int y = (i*(smallRectangleSize.y+gridSpacing)) + customColoursRect.y;
341
342 dc.SetPen(*wxBLACK_PEN);
343
344 wxBrush brush(customColours[ptr], wxSOLID);
345 dc.SetBrush(brush);
346
347 dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y);
348 }
349 }
350 dc.EndDrawing();
351 }
352
353 void wxGenericColourDialog::PaintHighlight(wxDC& dc, bool draw)
354 {
355 dc.BeginDrawing();
356
357 // Number of pixels bigger than the standard rectangle size
358 // for drawing a highlight
359 int deltaX = 2;
360 int deltaY = 2;
361
362 if (whichKind == 1)
363 {
364 // Standard colours
365 int y = (int)(colourSelection / 8);
366 int x = (int)(colourSelection - (y*8));
367
368 x = (x*(smallRectangleSize.x + gridSpacing) + standardColoursRect.x) - deltaX;
369 y = (y*(smallRectangleSize.y + gridSpacing) + standardColoursRect.y) - deltaY;
370
371 if (draw)
372 dc.SetPen(*wxBLACK_PEN);
373 else
374 dc.SetPen(*wxLIGHT_GREY_PEN);
375
376 dc.SetBrush(*wxTRANSPARENT_BRUSH);
377 dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY)));
378 }
379 else
380 {
381 // User-defined colours
382 int y = (int)(colourSelection / 8);
383 int x = (int)(colourSelection - (y*8));
384
385 x = (x*(smallRectangleSize.x + gridSpacing) + customColoursRect.x) - deltaX;
386 y = (y*(smallRectangleSize.y + gridSpacing) + customColoursRect.y) - deltaY;
387
388 if (draw)
389 dc.SetPen(*wxBLACK_PEN);
390 else
391 dc.SetPen(*wxLIGHT_GREY_PEN);
392
393 dc.SetBrush(*wxTRANSPARENT_BRUSH);
394 dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY)));
395 }
396
397 dc.EndDrawing();
398 }
399
400 void wxGenericColourDialog::PaintCustomColour(wxDC& dc)
401 {
402 dc.BeginDrawing();
403
404 dc.SetPen(*wxBLACK_PEN);
405
406 wxBrush *brush = new wxBrush(singleCustomColour, wxSOLID);
407 dc.SetBrush(*brush);
408
409 dc.DrawRectangle( singleCustomColourRect.x, singleCustomColourRect.y,
410 customRectangleSize.x, customRectangleSize.y);
411
412 dc.SetBrush(wxNullBrush);
413 delete brush;
414
415 dc.EndDrawing();
416 }
417
418 void wxGenericColourDialog::OnBasicColourClick(int which)
419 {
420 wxClientDC dc(this);
421
422 PaintHighlight(dc, FALSE);
423 whichKind = 1;
424 colourSelection = which;
425 colourData.SetColour(standardColours[colourSelection]);
426
427 PaintHighlight(dc, TRUE);
428 }
429
430 void wxGenericColourDialog::OnCustomColourClick(int which)
431 {
432 wxClientDC dc(this);
433 PaintHighlight(dc, FALSE);
434 whichKind = 2;
435 colourSelection = which;
436 colourData.SetColour(customColours[colourSelection]);
437
438 PaintHighlight(dc, TRUE);
439 }
440
441 /*
442 void wxGenericColourDialog::OnOk(void)
443 {
444 Show(FALSE);
445 }
446
447 void wxGenericColourDialog::OnCancel(void)
448 {
449 colourDialogCancelled = TRUE;
450 Show(FALSE);
451 }
452 */
453
454 void wxGenericColourDialog::OnAddCustom(wxCommandEvent& WXUNUSED(event))
455 {
456 wxClientDC dc(this);
457 if (whichKind != 2)
458 {
459 PaintHighlight(dc, FALSE);
460 whichKind = 2;
461 colourSelection = 0;
462 PaintHighlight(dc, TRUE);
463 }
464
465 customColours[colourSelection].Set(singleCustomColour.Red(), singleCustomColour.Green(), singleCustomColour.Blue());
466 colourData.SetColour(customColours[colourSelection]);
467 colourData.SetCustomColour(colourSelection, customColours[colourSelection]);
468
469 PaintCustomColours(dc);
470 }
471
472 void wxGenericColourDialog::OnRedSlider(wxCommandEvent& WXUNUSED(event))
473 {
474 if (!redSlider)
475 return;
476
477 wxClientDC dc(this);
478 singleCustomColour.Set(redSlider->GetValue(), singleCustomColour.Green(), singleCustomColour.Blue());
479 PaintCustomColour(dc);
480 }
481
482 void wxGenericColourDialog::OnGreenSlider(wxCommandEvent& WXUNUSED(event))
483 {
484 if (!greenSlider)
485 return;
486
487 wxClientDC dc(this);
488 singleCustomColour.Set(singleCustomColour.Red(), greenSlider->GetValue(), singleCustomColour.Blue());
489 PaintCustomColour(dc);
490 }
491
492 void wxGenericColourDialog::OnBlueSlider(wxCommandEvent& WXUNUSED(event))
493 {
494 if (!blueSlider)
495 return;
496
497 wxClientDC dc(this);
498 singleCustomColour.Set(singleCustomColour.Red(), singleCustomColour.Green(), blueSlider->GetValue());
499 PaintCustomColour(dc);
500 }
501
502