1 /////////////////////////////////////////////////////////////////////////////
2 // Name: generic/colrdlgg.cpp
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "colrdlgg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.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"
39 #include "wx/statline.h"
42 #include "wx/generic/colrdlgg.h"
44 IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog
, wxDialog
)
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
)
58 * Generic wxColourDialog
62 static wxString wxColourDialogNames
[NUM_COLS
]={wxT("ORANGE"),
68 wxT("MEDIUM VIOLET RED"),
73 wxT("MEDIUM SPRING GREEN"),
76 wxT("LIGHT STEEL BLUE"),
96 wxT("MEDIUM VIOLET RED"),
100 wxT("MEDIUM SEA GREEN"),
102 wxT("MIDNIGHT BLUE"),
108 wxT("MEDIUM FOREST GREEN"),
113 wxT("MEDIUM SLATE BLUE"),
117 wxGenericColourDialog::wxGenericColourDialog()
124 wxGenericColourDialog::wxGenericColourDialog(wxWindow
*parent
,
129 Create(parent
, data
);
132 wxGenericColourDialog::~wxGenericColourDialog()
136 void wxGenericColourDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
138 EndModal(wxID_CANCEL
);
141 bool wxGenericColourDialog::Create(wxWindow
*parent
, wxColourData
*data
)
143 if ( !wxDialog::Create(parent
, -1, wxT("Colour"),
144 wxPoint(0, 0), wxSize(900, 900),
145 wxDEFAULT_DIALOG_STYLE
| wxDIALOG_MODAL
) )
148 dialogParent
= parent
;
154 CalculateMeasurements();
160 int wxGenericColourDialog::ShowModal()
162 return wxDialog::ShowModal();
166 // Internal functions
167 void wxGenericColourDialog::OnMouseEvent(wxMouseEvent
& event
)
169 if (event
.ButtonDown(1))
171 int x
= (int)event
.GetX();
172 int y
= (int)event
.GetY();
174 if ((x
>= standardColoursRect
.x
&& x
<= (standardColoursRect
.x
+ standardColoursRect
.width
)) &&
175 (y
>= standardColoursRect
.y
&& y
<= (standardColoursRect
.y
+ standardColoursRect
.height
)))
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
);
182 else if ((x
>= customColoursRect
.x
&& x
<= (customColoursRect
.x
+ customColoursRect
.width
)) &&
183 (y
>= customColoursRect
.y
&& y
<= (customColoursRect
.y
+ customColoursRect
.height
)))
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
);
197 void wxGenericColourDialog::OnPaint(wxPaintEvent
& event
)
199 #if !defined(__WXMOTIF__) && !defined(__WXMAC__) && !defined(__WXPM__)
200 wxDialog::OnPaint(event
);
205 PaintBasicColours(dc
);
206 PaintCustomColours(dc
);
207 PaintCustomColour(dc
);
208 PaintHighlight(dc
, TRUE
);
211 void wxGenericColourDialog::CalculateMeasurements()
213 smallRectangleSize
.x
= 18;
214 smallRectangleSize
.y
= 14;
215 customRectangleSize
.x
= 40;
216 customRectangleSize
.y
= 40;
221 standardColoursRect
.x
= 10;
222 standardColoursRect
.y
= 15;
223 standardColoursRect
.width
= (8*smallRectangleSize
.x
) + (7*gridSpacing
);
224 standardColoursRect
.height
= (6*smallRectangleSize
.y
) + (5*gridSpacing
);
226 customColoursRect
.x
= standardColoursRect
.x
;
227 customColoursRect
.y
= standardColoursRect
.y
+ standardColoursRect
.height
+ 20;
228 customColoursRect
.width
= (8*smallRectangleSize
.x
) + (7*gridSpacing
);
229 customColoursRect
.height
= (2*smallRectangleSize
.y
) + (1*gridSpacing
);
231 singleCustomColourRect
.x
= customColoursRect
.width
+ customColoursRect
.x
+ sectionSpacing
;
232 singleCustomColourRect
.y
= 80;
233 singleCustomColourRect
.width
= customRectangleSize
.x
;
234 singleCustomColourRect
.height
= customRectangleSize
.y
;
237 customButtonX
= singleCustomColourRect
.x
;
238 buttonY
= customColoursRect
.y
+ customColoursRect
.height
+ 10;
241 void wxGenericColourDialog::CreateWidgets()
245 int sliderX
= singleCustomColourRect
.x
+ singleCustomColourRect
.width
+ sectionSpacing
;
246 #if defined(__WXMOTIF__)
247 int sliderSpacing
= 65;
248 int sliderHeight
= 160;
250 int sliderSpacing
= 45;
251 int sliderHeight
= 160;
254 redSlider
= new wxSlider(this, wxID_RED_SLIDER
, 0, 0, 255,
255 wxPoint(sliderX
, 10), wxSize(-1, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
256 greenSlider
= new wxSlider(this, wxID_GREEN_SLIDER
, 0, 0, 255,
257 wxPoint(sliderX
+ sliderSpacing
, 10), wxSize(-1, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
258 blueSlider
= new wxSlider(this, wxID_BLUE_SLIDER
, 0, 0, 255,
259 wxPoint(sliderX
+ 2*sliderSpacing
, 10), wxSize(-1, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
261 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
263 // 1) space for explicitly layouted controls
264 topsizer
->Add( sliderX
+ 3*sliderSpacing
, sliderHeight
+25 );
268 topsizer
->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10 );
272 wxSizer
*buttonsizer
= CreateButtonSizer( wxOK
|wxCANCEL
);
273 buttonsizer
->Add( new wxButton(this, wxID_ADD_CUSTOM
, _("Add to custom colours") ), 0, wxLEFT
|wxRIGHT
, 10 );
274 topsizer
->Add( buttonsizer
, 0, wxCENTRE
| wxALL
, 10 );
276 SetAutoLayout( TRUE
);
277 SetSizer( topsizer
);
279 topsizer
->SetSizeHints( this );
280 topsizer
->Fit( this );
287 void wxGenericColourDialog::InitializeColours(void)
290 for (i
= 0; i
< 48; i
++)
292 wxColour
*col
= wxTheColourDatabase
->FindColour(wxColourDialogNames
[i
]);
294 standardColours
[i
].Set(col
->Red(), col
->Green(), col
->Blue());
296 standardColours
[i
].Set(0, 0, 0);
299 for (i
= 0; i
< 16; i
++)
301 colourData
.GetCustomColour(i
);
303 singleCustomColour
.Set(0, 0, 0);
306 void wxGenericColourDialog::PaintBasicColours(wxDC
& dc
)
311 for (i
= 0; i
< 6; i
++)
314 for (j
= 0; j
< 8; j
++)
318 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
) + standardColoursRect
.x
);
319 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
) + standardColoursRect
.y
);
321 dc
.SetPen(*wxBLACK_PEN
);
322 wxBrush
brush(standardColours
[ptr
], wxSOLID
);
325 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
331 void wxGenericColourDialog::PaintCustomColours(wxDC
& dc
)
336 for (i
= 0; i
< 2; i
++)
339 for (j
= 0; j
< 8; j
++)
343 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
)) + customColoursRect
.x
;
344 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
)) + customColoursRect
.y
;
346 dc
.SetPen(*wxBLACK_PEN
);
348 wxBrush
brush(customColours
[ptr
], wxSOLID
);
351 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
357 void wxGenericColourDialog::PaintHighlight(wxDC
& dc
, bool draw
)
361 // Number of pixels bigger than the standard rectangle size
362 // for drawing a highlight
369 int y
= (int)(colourSelection
/ 8);
370 int x
= (int)(colourSelection
- (y
*8));
372 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + standardColoursRect
.x
) - deltaX
;
373 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + standardColoursRect
.y
) - deltaY
;
376 dc
.SetPen(*wxBLACK_PEN
);
378 dc
.SetPen(*wxLIGHT_GREY_PEN
);
380 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
381 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
385 // User-defined colours
386 int y
= (int)(colourSelection
/ 8);
387 int x
= (int)(colourSelection
- (y
*8));
389 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + customColoursRect
.x
) - deltaX
;
390 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + customColoursRect
.y
) - deltaY
;
393 dc
.SetPen(*wxBLACK_PEN
);
395 dc
.SetPen(*wxLIGHT_GREY_PEN
);
397 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
398 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
404 void wxGenericColourDialog::PaintCustomColour(wxDC
& dc
)
408 dc
.SetPen(*wxBLACK_PEN
);
410 wxBrush
*brush
= new wxBrush(singleCustomColour
, wxSOLID
);
413 dc
.DrawRectangle( singleCustomColourRect
.x
, singleCustomColourRect
.y
,
414 customRectangleSize
.x
, customRectangleSize
.y
);
416 dc
.SetBrush(wxNullBrush
);
422 void wxGenericColourDialog::OnBasicColourClick(int which
)
426 PaintHighlight(dc
, FALSE
);
428 colourSelection
= which
;
429 colourData
.SetColour(standardColours
[colourSelection
]);
431 PaintHighlight(dc
, TRUE
);
434 void wxGenericColourDialog::OnCustomColourClick(int which
)
437 PaintHighlight(dc
, FALSE
);
439 colourSelection
= which
;
440 colourData
.SetColour(customColours
[colourSelection
]);
442 PaintHighlight(dc
, TRUE
);
446 void wxGenericColourDialog::OnOk(void)
451 void wxGenericColourDialog::OnCancel(void)
453 colourDialogCancelled = TRUE;
458 void wxGenericColourDialog::OnAddCustom(wxCommandEvent
& WXUNUSED(event
))
463 PaintHighlight(dc
, FALSE
);
466 PaintHighlight(dc
, TRUE
);
469 customColours
[colourSelection
].Set(singleCustomColour
.Red(), singleCustomColour
.Green(), singleCustomColour
.Blue());
470 colourData
.SetColour(customColours
[colourSelection
]);
471 colourData
.SetCustomColour(colourSelection
, customColours
[colourSelection
]);
473 PaintCustomColours(dc
);
476 void wxGenericColourDialog::OnRedSlider(wxCommandEvent
& WXUNUSED(event
))
482 singleCustomColour
.Set(redSlider
->GetValue(), singleCustomColour
.Green(), singleCustomColour
.Blue());
483 PaintCustomColour(dc
);
486 void wxGenericColourDialog::OnGreenSlider(wxCommandEvent
& WXUNUSED(event
))
492 singleCustomColour
.Set(singleCustomColour
.Red(), greenSlider
->GetValue(), singleCustomColour
.Blue());
493 PaintCustomColour(dc
);
496 void wxGenericColourDialog::OnBlueSlider(wxCommandEvent
& WXUNUSED(event
))
502 singleCustomColour
.Set(singleCustomColour
.Red(), singleCustomColour
.Green(), blueSlider
->GetValue());
503 PaintCustomColour(dc
);
506 #endif // wxUSE_COLOURDLG