]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/colrdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: generic/colrdlgg.cpp
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "colrdlgg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
23 #if wxUSE_COLOURDLG && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__))
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
61 // don't change the number of elements (48) in this array, the code below is
62 // hardcoded to use it
63 static const wxChar
*wxColourDialogNames
[] =
71 wxT("MEDIUM VIOLET RED"),
76 wxT("MEDIUM SPRING GREEN"),
79 wxT("LIGHT STEEL BLUE"),
99 wxT("MEDIUM VIOLET RED"),
103 wxT("MEDIUM SEA GREEN"),
105 wxT("MIDNIGHT BLUE"),
111 wxT("MEDIUM FOREST GREEN"),
116 wxT("MEDIUM SLATE BLUE"),
120 wxGenericColourDialog::wxGenericColourDialog()
124 colourSelection
= -1;
127 wxGenericColourDialog::wxGenericColourDialog(wxWindow
*parent
,
131 colourSelection
= -1;
132 Create(parent
, data
);
135 wxGenericColourDialog::~wxGenericColourDialog()
139 void wxGenericColourDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
141 EndModal(wxID_CANCEL
);
144 bool wxGenericColourDialog::Create(wxWindow
*parent
, wxColourData
*data
)
146 if ( !wxDialog::Create(parent
, wxID_ANY
, _("Choose colour"),
147 wxPoint(0, 0), wxSize(900, 900)) )
150 dialogParent
= parent
;
156 CalculateMeasurements();
162 int wxGenericColourDialog::ShowModal()
164 return wxDialog::ShowModal();
168 // Internal functions
169 void wxGenericColourDialog::OnMouseEvent(wxMouseEvent
& event
)
171 if (event
.ButtonDown(1))
173 int x
= (int)event
.GetX();
174 int y
= (int)event
.GetY();
177 // Handle OS/2's reverse coordinate system and account for the dialog title
180 GetClientSize(NULL
, &nClientHeight
);
181 y
= (nClientHeight
- y
) + 20;
183 if ((x
>= standardColoursRect
.x
&& x
<= (standardColoursRect
.x
+ standardColoursRect
.width
)) &&
184 (y
>= standardColoursRect
.y
&& y
<= (standardColoursRect
.y
+ standardColoursRect
.height
)))
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
);
191 else if ((x
>= customColoursRect
.x
&& x
<= (customColoursRect
.x
+ customColoursRect
.width
)) &&
192 (y
>= customColoursRect
.y
&& y
<= (customColoursRect
.y
+ customColoursRect
.height
)))
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
);
206 void wxGenericColourDialog::OnPaint(wxPaintEvent
& event
)
208 #if !defined(__WXMOTIF__) && !defined(__WXMAC__) && !defined(__WXPM__) && !defined(__WXCOCOA__)
209 wxDialog::OnPaint(event
);
214 PaintBasicColours(dc
);
215 PaintCustomColours(dc
);
216 PaintCustomColour(dc
);
217 PaintHighlight(dc
, true);
220 void wxGenericColourDialog::CalculateMeasurements()
222 smallRectangleSize
.x
= 18;
223 smallRectangleSize
.y
= 14;
224 customRectangleSize
.x
= 40;
225 customRectangleSize
.y
= 40;
230 standardColoursRect
.x
= 10;
232 standardColoursRect
.y
= 15 + 20; /* OS/2 needs to account for dialog titlebar */
234 standardColoursRect
.y
= 15;
236 standardColoursRect
.width
= (8*smallRectangleSize
.x
) + (7*gridSpacing
);
237 standardColoursRect
.height
= (6*smallRectangleSize
.y
) + (5*gridSpacing
);
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
);
244 singleCustomColourRect
.x
= customColoursRect
.width
+ customColoursRect
.x
+ sectionSpacing
;
245 singleCustomColourRect
.y
= 80;
246 singleCustomColourRect
.width
= customRectangleSize
.x
;
247 singleCustomColourRect
.height
= customRectangleSize
.y
;
250 customButtonX
= singleCustomColourRect
.x
;
251 buttonY
= customColoursRect
.y
+ customColoursRect
.height
+ 10;
254 void wxGenericColourDialog::CreateWidgets()
258 const int sliderX
= singleCustomColourRect
.x
+ singleCustomColourRect
.width
+ sectionSpacing
;
259 const int sliderHeight
= 160;
261 redSlider
= new wxSlider(this, wxID_RED_SLIDER
, singleCustomColour
.Red(), 0, 255,
262 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
263 greenSlider
= new wxSlider(this, wxID_GREEN_SLIDER
, singleCustomColour
.Green(), 0, 255,
264 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
265 blueSlider
= new wxSlider(this, wxID_BLUE_SLIDER
, singleCustomColour
.Blue(), 0, 255,
266 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxVERTICAL
|wxSL_LABELS
);
268 wxBoxSizer
*sliderSizer
= new wxBoxSizer( wxHORIZONTAL
);
270 // 1) space for sliders
271 sliderSizer
->Add( sliderX
, sliderHeight
);
272 sliderSizer
->Add( redSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
273 sliderSizer
->Add( greenSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
274 sliderSizer
->Add( blueSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
276 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
278 topSizer
->Add( sliderSizer
, 0, wxCENTRE
| wxALL
, 10 );
282 topSizer
->Add( new wxStaticLine( this, wxID_ANY
), 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10 );
286 wxSizer
*buttonsizer
= CreateButtonSizer( wxOK
|wxCANCEL
);
287 buttonsizer
->Add( new wxButton(this, wxID_ADD_CUSTOM
, _("Add to custom colours") ), 0, wxLEFT
|wxRIGHT
, 10 );
288 topSizer
->Add( buttonsizer
, 0, wxCENTRE
| wxALL
, 10 );
290 SetAutoLayout( true );
291 SetSizer( topSizer
);
293 topSizer
->SetSizeHints( this );
294 topSizer
->Fit( this );
301 void wxGenericColourDialog::InitializeColours(void)
305 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
307 wxColour col
= wxTheColourDatabase
->Find(wxColourDialogNames
[i
]);
309 standardColours
[i
].Set(col
.Red(), col
.Green(), col
.Blue());
311 standardColours
[i
].Set(0, 0, 0);
314 for (i
= 0; i
< WXSIZEOF(customColours
); i
++)
316 wxColour c
= colourData
.GetCustomColour(i
);
318 customColours
[i
] = colourData
.GetCustomColour(i
);
320 customColours
[i
] = wxColour(255, 255, 255);
323 wxColour curr
= colourData
.GetColour();
326 bool initColourFound
= false;
328 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
330 if ( standardColours
[i
] == curr
&& !initColourFound
)
334 initColourFound
= true;
338 if ( !initColourFound
)
340 for ( i
= 0; i
< WXSIZEOF(customColours
); i
++ )
342 if ( customColours
[i
] == curr
)
350 singleCustomColour
.Set( curr
.Red(), curr
.Green(), curr
.Blue() );
356 singleCustomColour
.Set( 0, 0, 0 );
360 void wxGenericColourDialog::PaintBasicColours(wxDC
& dc
)
365 for (i
= 0; i
< 6; i
++)
368 for (j
= 0; j
< 8; j
++)
372 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
) + standardColoursRect
.x
);
373 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
) + standardColoursRect
.y
);
375 dc
.SetPen(*wxBLACK_PEN
);
376 wxBrush
brush(standardColours
[ptr
], wxSOLID
);
379 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
385 void wxGenericColourDialog::PaintCustomColours(wxDC
& dc
)
390 for (i
= 0; i
< 2; i
++)
393 for (j
= 0; j
< 8; j
++)
397 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
)) + customColoursRect
.x
;
398 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
)) + customColoursRect
.y
;
400 dc
.SetPen(*wxBLACK_PEN
);
402 wxBrush
brush(customColours
[ptr
], wxSOLID
);
405 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
411 void wxGenericColourDialog::PaintHighlight(wxDC
& dc
, bool draw
)
413 if ( colourSelection
< 0 )
418 // Number of pixels bigger than the standard rectangle size
419 // for drawing a highlight
426 int y
= (int)(colourSelection
/ 8);
427 int x
= (int)(colourSelection
- (y
*8));
429 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + standardColoursRect
.x
) - deltaX
;
430 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + standardColoursRect
.y
) - deltaY
;
433 dc
.SetPen(*wxBLACK_PEN
);
435 dc
.SetPen(*wxLIGHT_GREY_PEN
);
437 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
438 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
442 // User-defined colours
443 int y
= (int)(colourSelection
/ 8);
444 int x
= (int)(colourSelection
- (y
*8));
446 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + customColoursRect
.x
) - deltaX
;
447 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + customColoursRect
.y
) - deltaY
;
450 dc
.SetPen(*wxBLACK_PEN
);
452 dc
.SetPen(*wxLIGHT_GREY_PEN
);
454 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
455 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
461 void wxGenericColourDialog::PaintCustomColour(wxDC
& dc
)
465 dc
.SetPen(*wxBLACK_PEN
);
467 wxBrush
*brush
= new wxBrush(singleCustomColour
, wxSOLID
);
470 dc
.DrawRectangle( singleCustomColourRect
.x
, singleCustomColourRect
.y
,
471 customRectangleSize
.x
, customRectangleSize
.y
);
473 dc
.SetBrush(wxNullBrush
);
479 void wxGenericColourDialog::OnBasicColourClick(int which
)
483 PaintHighlight(dc
, false);
485 colourSelection
= which
;
486 colourData
.SetColour(standardColours
[colourSelection
]);
487 redSlider
->SetValue( standardColours
[colourSelection
].Red() );
488 greenSlider
->SetValue( standardColours
[colourSelection
].Green() );
489 blueSlider
->SetValue( standardColours
[colourSelection
].Blue() );
490 singleCustomColour
.Set(standardColours
[colourSelection
].Red(), standardColours
[colourSelection
].Green(), standardColours
[colourSelection
].Blue());
492 PaintCustomColour(dc
);
493 PaintHighlight(dc
, true);
496 void wxGenericColourDialog::OnCustomColourClick(int which
)
499 PaintHighlight(dc
, false);
501 colourSelection
= which
;
502 colourData
.SetColour(customColours
[colourSelection
]);
503 redSlider
->SetValue( customColours
[colourSelection
].Red() );
504 greenSlider
->SetValue( customColours
[colourSelection
].Green() );
505 blueSlider
->SetValue( customColours
[colourSelection
].Blue() );
506 singleCustomColour
.Set(customColours
[colourSelection
].Red(), customColours
[colourSelection
].Green(), customColours
[colourSelection
].Blue());
507 PaintCustomColour(dc
);
508 PaintHighlight(dc
, true);
512 void wxGenericColourDialog::OnOk(void)
517 void wxGenericColourDialog::OnCancel(void)
519 colourDialogCancelled = true;
524 void wxGenericColourDialog::OnAddCustom(wxCommandEvent
& WXUNUSED(event
))
529 PaintHighlight(dc
, false);
532 PaintHighlight(dc
, true);
535 customColours
[colourSelection
].Set(singleCustomColour
.Red(), singleCustomColour
.Green(), singleCustomColour
.Blue());
536 colourData
.SetColour(customColours
[colourSelection
]);
537 colourData
.SetCustomColour(colourSelection
, customColours
[colourSelection
]);
539 PaintCustomColours(dc
);
542 void wxGenericColourDialog::OnRedSlider(wxCommandEvent
& WXUNUSED(event
))
548 singleCustomColour
.Set((unsigned char)redSlider
->GetValue(), singleCustomColour
.Green(), singleCustomColour
.Blue());
549 PaintCustomColour(dc
);
552 void wxGenericColourDialog::OnGreenSlider(wxCommandEvent
& WXUNUSED(event
))
558 singleCustomColour
.Set(singleCustomColour
.Red(), (unsigned char)greenSlider
->GetValue(), singleCustomColour
.Blue());
559 PaintCustomColour(dc
);
562 void wxGenericColourDialog::OnBlueSlider(wxCommandEvent
& WXUNUSED(event
))
568 singleCustomColour
.Set(singleCustomColour
.Red(), singleCustomColour
.Green(), (unsigned char)blueSlider
->GetValue());
569 PaintCustomColour(dc
);
572 #endif // wxUSE_COLOURDLG && !defined(__WXGTK20__)