]>
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"
38 #include "wx/statline.h"
42 #include "wx/slider.h"
45 #include "wx/generic/colrdlgg.h"
47 IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog
, wxDialog
)
49 BEGIN_EVENT_TABLE(wxGenericColourDialog
, wxDialog
)
50 EVT_BUTTON(wxID_ADD_CUSTOM
, wxGenericColourDialog::OnAddCustom
)
52 EVT_SLIDER(wxID_RED_SLIDER
, wxGenericColourDialog::OnRedSlider
)
53 EVT_SLIDER(wxID_GREEN_SLIDER
, wxGenericColourDialog::OnGreenSlider
)
54 EVT_SLIDER(wxID_BLUE_SLIDER
, wxGenericColourDialog::OnBlueSlider
)
56 EVT_PAINT(wxGenericColourDialog::OnPaint
)
57 EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent
)
58 EVT_CLOSE(wxGenericColourDialog::OnCloseWindow
)
63 * Generic wxColourDialog
66 // don't change the number of elements (48) in this array, the code below is
67 // hardcoded to use it
68 static const wxChar
*wxColourDialogNames
[] =
76 wxT("MEDIUM VIOLET RED"),
81 wxT("MEDIUM SPRING GREEN"),
84 wxT("LIGHT STEEL BLUE"),
104 wxT("MEDIUM VIOLET RED"),
108 wxT("MEDIUM SEA GREEN"),
110 wxT("MIDNIGHT BLUE"),
116 wxT("MEDIUM FOREST GREEN"),
121 wxT("MEDIUM SLATE BLUE"),
125 wxGenericColourDialog::wxGenericColourDialog()
129 colourSelection
= -1;
132 wxGenericColourDialog::wxGenericColourDialog(wxWindow
*parent
,
136 colourSelection
= -1;
137 Create(parent
, data
);
140 wxGenericColourDialog::~wxGenericColourDialog()
144 void wxGenericColourDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
146 EndModal(wxID_CANCEL
);
149 bool wxGenericColourDialog::Create(wxWindow
*parent
, wxColourData
*data
)
151 if ( !wxDialog::Create(parent
, wxID_ANY
, _("Choose colour"),
152 wxPoint(0,0), wxSize(900, 900)) )
155 dialogParent
= parent
;
161 CalculateMeasurements();
167 int wxGenericColourDialog::ShowModal()
169 return wxDialog::ShowModal();
173 // Internal functions
174 void wxGenericColourDialog::OnMouseEvent(wxMouseEvent
& event
)
176 if (event
.ButtonDown(1))
178 int x
= (int)event
.GetX();
179 int y
= (int)event
.GetY();
182 // Handle OS/2's reverse coordinate system and account for the dialog title
185 GetClientSize(NULL
, &nClientHeight
);
186 y
= (nClientHeight
- y
) + 20;
188 if ((x
>= standardColoursRect
.x
&& x
<= (standardColoursRect
.x
+ standardColoursRect
.width
)) &&
189 (y
>= standardColoursRect
.y
&& y
<= (standardColoursRect
.y
+ standardColoursRect
.height
)))
191 int selX
= (int)(x
- standardColoursRect
.x
)/(smallRectangleSize
.x
+ gridSpacing
);
192 int selY
= (int)(y
- standardColoursRect
.y
)/(smallRectangleSize
.y
+ gridSpacing
);
193 int ptr
= (int)(selX
+ selY
*8);
194 OnBasicColourClick(ptr
);
196 else if ((x
>= customColoursRect
.x
&& x
<= (customColoursRect
.x
+ customColoursRect
.width
)) &&
197 (y
>= customColoursRect
.y
&& y
<= (customColoursRect
.y
+ customColoursRect
.height
)))
199 int selX
= (int)(x
- customColoursRect
.x
)/(smallRectangleSize
.x
+ gridSpacing
);
200 int selY
= (int)(y
- customColoursRect
.y
)/(smallRectangleSize
.y
+ gridSpacing
);
201 int ptr
= (int)(selX
+ selY
*8);
202 OnCustomColourClick(ptr
);
211 void wxGenericColourDialog::OnPaint(wxPaintEvent
& event
)
213 #if !defined(__WXMOTIF__) && !defined(__WXPM__) && !defined(__WXCOCOA__)
214 wxDialog::OnPaint(event
);
219 PaintBasicColours(dc
);
220 PaintCustomColours(dc
);
221 PaintCustomColour(dc
);
222 PaintHighlight(dc
, true);
225 void wxGenericColourDialog::CalculateMeasurements()
227 smallRectangleSize
.x
= 18;
228 smallRectangleSize
.y
= 14;
229 customRectangleSize
.x
= 40;
230 customRectangleSize
.y
= 40;
235 standardColoursRect
.x
= 10;
237 standardColoursRect
.y
= 15 + 20; /* OS/2 needs to account for dialog titlebar */
239 standardColoursRect
.y
= 15;
241 standardColoursRect
.width
= (8*smallRectangleSize
.x
) + (7*gridSpacing
);
242 standardColoursRect
.height
= (6*smallRectangleSize
.y
) + (5*gridSpacing
);
244 customColoursRect
.x
= standardColoursRect
.x
;
245 customColoursRect
.y
= standardColoursRect
.y
+ standardColoursRect
.height
+ 20;
246 customColoursRect
.width
= (8*smallRectangleSize
.x
) + (7*gridSpacing
);
247 customColoursRect
.height
= (2*smallRectangleSize
.y
) + (1*gridSpacing
);
249 singleCustomColourRect
.x
= customColoursRect
.width
+ customColoursRect
.x
+ sectionSpacing
;
250 singleCustomColourRect
.y
= 80;
251 singleCustomColourRect
.width
= customRectangleSize
.x
;
252 singleCustomColourRect
.height
= customRectangleSize
.y
;
255 customButtonX
= singleCustomColourRect
.x
;
256 buttonY
= customColoursRect
.y
+ customColoursRect
.height
+ 10;
259 void wxGenericColourDialog::CreateWidgets()
263 wxBoxSizer
*topSizer
= new wxBoxSizer( wxVERTICAL
);
265 const int sliderHeight
= 160;
268 const int sliderX
= singleCustomColourRect
.x
+ singleCustomColourRect
.width
+ sectionSpacing
;
270 redSlider
= new wxSlider(this, wxID_RED_SLIDER
, colourData
.m_dataColour
.Red(), 0, 255,
271 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
272 greenSlider
= new wxSlider(this, wxID_GREEN_SLIDER
, colourData
.m_dataColour
.Green(), 0, 255,
273 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
274 blueSlider
= new wxSlider(this, wxID_BLUE_SLIDER
, colourData
.m_dataColour
.Blue(), 0, 255,
275 wxDefaultPosition
, wxSize(wxDefaultCoord
, sliderHeight
), wxSL_VERTICAL
|wxSL_LABELS
|wxSL_INVERSE
);
277 wxBoxSizer
*sliderSizer
= new wxBoxSizer( wxHORIZONTAL
);
279 // 1) space for sliders
280 sliderSizer
->Add( sliderX
, sliderHeight
);
281 sliderSizer
->Add( redSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
282 sliderSizer
->Add( greenSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
283 sliderSizer
->Add( blueSlider
, 0, wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL
| wxALL
, 10 );
285 topSizer
->Add( sliderSizer
, 0, wxCENTRE
| wxALL
, 10 );
287 topSizer
->Add( 1, sliderHeight
, 0, wxCENTRE
| wxALL
, 15 );
288 #endif // wxUSE_SLIDER
292 topSizer
->Add( new wxStaticLine( this, wxID_ANY
), 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10 );
296 wxSizer
*buttonsizer
= CreateButtonSizer( wxOK
|wxCANCEL
);
297 buttonsizer
->Add( new wxButton(this, wxID_ADD_CUSTOM
, _("Add to custom colours") ), 0, wxLEFT
|wxRIGHT
, 10 );
298 topSizer
->Add( buttonsizer
, 0, wxEXPAND
| wxALL
, 10 );
300 SetAutoLayout( true );
301 SetSizer( topSizer
);
303 topSizer
->SetSizeHints( this );
304 topSizer
->Fit( this );
311 void wxGenericColourDialog::InitializeColours(void)
315 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
317 wxColour col
= wxTheColourDatabase
->Find(wxColourDialogNames
[i
]);
319 standardColours
[i
].Set(col
.Red(), col
.Green(), col
.Blue());
321 standardColours
[i
].Set(0, 0, 0);
324 for (i
= 0; i
< WXSIZEOF(customColours
); i
++)
326 wxColour c
= colourData
.GetCustomColour(i
);
328 customColours
[i
] = colourData
.GetCustomColour(i
);
330 customColours
[i
] = wxColour(255, 255, 255);
333 wxColour curr
= colourData
.GetColour();
336 bool initColourFound
= false;
338 for (i
= 0; i
< WXSIZEOF(wxColourDialogNames
); i
++)
340 if ( standardColours
[i
] == curr
&& !initColourFound
)
344 initColourFound
= true;
348 if ( !initColourFound
)
350 for ( i
= 0; i
< WXSIZEOF(customColours
); i
++ )
352 if ( customColours
[i
] == curr
)
360 colourData
.m_dataColour
.Set( curr
.Red(), curr
.Green(), curr
.Blue() );
366 colourData
.m_dataColour
.Set( 0, 0, 0 );
370 void wxGenericColourDialog::PaintBasicColours(wxDC
& dc
)
375 for (i
= 0; i
< 6; i
++)
378 for (j
= 0; j
< 8; j
++)
382 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
) + standardColoursRect
.x
);
383 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
) + standardColoursRect
.y
);
385 dc
.SetPen(*wxBLACK_PEN
);
386 wxBrush
brush(standardColours
[ptr
], wxSOLID
);
389 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
395 void wxGenericColourDialog::PaintCustomColours(wxDC
& dc
)
400 for (i
= 0; i
< 2; i
++)
403 for (j
= 0; j
< 8; j
++)
407 int x
= (j
*(smallRectangleSize
.x
+gridSpacing
)) + customColoursRect
.x
;
408 int y
= (i
*(smallRectangleSize
.y
+gridSpacing
)) + customColoursRect
.y
;
410 dc
.SetPen(*wxBLACK_PEN
);
412 wxBrush
brush(customColours
[ptr
], wxSOLID
);
415 dc
.DrawRectangle( x
, y
, smallRectangleSize
.x
, smallRectangleSize
.y
);
421 void wxGenericColourDialog::PaintHighlight(wxDC
& dc
, bool draw
)
423 if ( colourSelection
< 0 )
428 // Number of pixels bigger than the standard rectangle size
429 // for drawing a highlight
436 int y
= (int)(colourSelection
/ 8);
437 int x
= (int)(colourSelection
- (y
*8));
439 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + standardColoursRect
.x
) - deltaX
;
440 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + standardColoursRect
.y
) - deltaY
;
443 dc
.SetPen(*wxBLACK_PEN
);
445 dc
.SetPen(*wxLIGHT_GREY_PEN
);
447 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
448 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
452 // User-defined colours
453 int y
= (int)(colourSelection
/ 8);
454 int x
= (int)(colourSelection
- (y
*8));
456 x
= (x
*(smallRectangleSize
.x
+ gridSpacing
) + customColoursRect
.x
) - deltaX
;
457 y
= (y
*(smallRectangleSize
.y
+ gridSpacing
) + customColoursRect
.y
) - deltaY
;
460 dc
.SetPen(*wxBLACK_PEN
);
462 dc
.SetPen(*wxLIGHT_GREY_PEN
);
464 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
465 dc
.DrawRectangle( x
, y
, (smallRectangleSize
.x
+ (2*deltaX
)), (smallRectangleSize
.y
+ (2*deltaY
)));
471 void wxGenericColourDialog::PaintCustomColour(wxDC
& dc
)
475 dc
.SetPen(*wxBLACK_PEN
);
477 wxBrush
*brush
= new wxBrush(colourData
.m_dataColour
, wxSOLID
);
480 dc
.DrawRectangle( singleCustomColourRect
.x
, singleCustomColourRect
.y
,
481 customRectangleSize
.x
, customRectangleSize
.y
);
483 dc
.SetBrush(wxNullBrush
);
489 void wxGenericColourDialog::OnBasicColourClick(int which
)
493 PaintHighlight(dc
, false);
495 colourSelection
= which
;
498 redSlider
->SetValue( standardColours
[colourSelection
].Red() );
499 greenSlider
->SetValue( standardColours
[colourSelection
].Green() );
500 blueSlider
->SetValue( standardColours
[colourSelection
].Blue() );
501 #endif // wxUSE_SLIDER
503 colourData
.m_dataColour
.Set(standardColours
[colourSelection
].Red(),
504 standardColours
[colourSelection
].Green(),
505 standardColours
[colourSelection
].Blue());
507 PaintCustomColour(dc
);
508 PaintHighlight(dc
, true);
511 void wxGenericColourDialog::OnCustomColourClick(int which
)
514 PaintHighlight(dc
, false);
516 colourSelection
= which
;
519 redSlider
->SetValue( customColours
[colourSelection
].Red() );
520 greenSlider
->SetValue( customColours
[colourSelection
].Green() );
521 blueSlider
->SetValue( customColours
[colourSelection
].Blue() );
522 #endif // wxUSE_SLIDER
524 colourData
.m_dataColour
.Set(customColours
[colourSelection
].Red(),
525 customColours
[colourSelection
].Green(),
526 customColours
[colourSelection
].Blue());
528 PaintCustomColour(dc
);
529 PaintHighlight(dc
, true);
533 void wxGenericColourDialog::OnOk(void)
538 void wxGenericColourDialog::OnCancel(void)
540 colourDialogCancelled = true;
545 void wxGenericColourDialog::OnAddCustom(wxCommandEvent
& WXUNUSED(event
))
550 PaintHighlight(dc
, false);
553 PaintHighlight(dc
, true);
556 customColours
[colourSelection
].Set(colourData
.m_dataColour
.Red(),
557 colourData
.m_dataColour
.Green(),
558 colourData
.m_dataColour
.Blue());
560 colourData
.SetCustomColour(colourSelection
, customColours
[colourSelection
]);
562 PaintCustomColours(dc
);
567 void wxGenericColourDialog::OnRedSlider(wxCommandEvent
& WXUNUSED(event
))
573 colourData
.m_dataColour
.Set((unsigned char)redSlider
->GetValue(), colourData
.m_dataColour
.Green(), colourData
.m_dataColour
.Blue());
574 PaintCustomColour(dc
);
577 void wxGenericColourDialog::OnGreenSlider(wxCommandEvent
& WXUNUSED(event
))
583 colourData
.m_dataColour
.Set(colourData
.m_dataColour
.Red(), (unsigned char)greenSlider
->GetValue(), colourData
.m_dataColour
.Blue());
584 PaintCustomColour(dc
);
587 void wxGenericColourDialog::OnBlueSlider(wxCommandEvent
& WXUNUSED(event
))
593 colourData
.m_dataColour
.Set(colourData
.m_dataColour
.Red(), colourData
.m_dataColour
.Green(), (unsigned char)blueSlider
->GetValue());
594 PaintCustomColour(dc
);
597 #endif // wxUSE_SLIDER
599 #endif // wxUSE_COLOURDLG && !defined(__WXGTK20__)