X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/94b49b9303a9fd119e24d1b07263f5bb0643afa5..88c139da4639cd25e4ad1298062e1e8b19ee29f1:/src/generic/colrdlgg.cpp diff --git a/src/generic/colrdlgg.cpp b/src/generic/colrdlgg.cpp index daec7a16fb..a868d28d58 100644 --- a/src/generic/colrdlgg.cpp +++ b/src/generic/colrdlgg.cpp @@ -1,155 +1,166 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: colrdlgg.cpp +// Name: generic/colrdlgg.cpp // Purpose: Choice dialogs // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "colrdlgg.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_COLOURDLG && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__)) + #ifndef WX_PRECOMP -#include -#include -#include "wx/utils.h" -#include "wx/intl.h" -#include "wx/dialog.h" -#include "wx/listbox.h" -#include "wx/button.h" -#include "wx/stattext.h" -#include "wx/layout.h" -#include "wx/dcclient.h" -#include "wx/slider.h" + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/dialog.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/layout.h" + #include "wx/dcclient.h" + #include "wx/sizer.h" +#endif + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +#if wxUSE_SLIDER + #include "wx/slider.h" #endif #include "wx/generic/colrdlgg.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog, wxDialog) BEGIN_EVENT_TABLE(wxGenericColourDialog, wxDialog) - EVT_BUTTON(wxID_ADD_CUSTOM, wxGenericColourDialog::OnAddCustom) - EVT_SLIDER(wxID_RED_SLIDER, wxGenericColourDialog::OnRedSlider) - EVT_SLIDER(wxID_GREEN_SLIDER, wxGenericColourDialog::OnGreenSlider) - EVT_SLIDER(wxID_BLUE_SLIDER, wxGenericColourDialog::OnBlueSlider) - EVT_PAINT(wxGenericColourDialog::OnPaint) - EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent) + EVT_BUTTON(wxID_ADD_CUSTOM, wxGenericColourDialog::OnAddCustom) +#if wxUSE_SLIDER + EVT_SLIDER(wxID_RED_SLIDER, wxGenericColourDialog::OnRedSlider) + EVT_SLIDER(wxID_GREEN_SLIDER, wxGenericColourDialog::OnGreenSlider) + EVT_SLIDER(wxID_BLUE_SLIDER, wxGenericColourDialog::OnBlueSlider) +#endif + EVT_PAINT(wxGenericColourDialog::OnPaint) + EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent) + EVT_CLOSE(wxGenericColourDialog::OnCloseWindow) END_EVENT_TABLE() -#endif /* * Generic wxColourDialog */ -#define NUM_COLS 48 -static wxString wxColourDialogNames[NUM_COLS]={"ORANGE", - "GOLDENROD", - "WHEAT", - "SPRING GREEN", - "SKY BLUE", - "SLATE BLUE", - "MEDIUM VIOLET RED", - "PURPLE", - - "RED", - "YELLOW", - "MEDIUM SPRING GREEN", - "PALE GREEN", - "CYAN", - "LIGHT STEEL BLUE", - "ORCHID", - "LIGHT MAGENTA", - - "BROWN", - "YELLOW", - "GREEN", - "CADET BLUE", - "MEDIUM BLUE", - "MAGENTA", - "MAROON", - "ORANGE RED", - - "FIREBRICK", - "CORAL", - "FOREST GREEN", - "AQUAMARINE", - "BLUE", - "NAVY", - "THISTLE", - "MEDIUM VIOLET RED", - - "INDIAN RED", - "GOLD", - "MEDIUM SEA GREEN", - "MEDIUM BLUE", - "MIDNIGHT BLUE", - "GREY", - "PURPLE", - "KHAKI", - - "BLACK", - "MEDIUM FOREST GREEN", - "KHAKI", - "DARK GREY", - "SEA GREEN", - "LIGHT GREY", - "MEDIUM SLATE BLUE", - "WHITE" - }; - -wxGenericColourDialog::wxGenericColourDialog(void) +// don't change the number of elements (48) in this array, the code below is +// hardcoded to use it +static const wxChar *wxColourDialogNames[] = +{ + wxT("ORANGE"), + wxT("GOLDENROD"), + wxT("WHEAT"), + wxT("SPRING GREEN"), + wxT("SKY BLUE"), + wxT("SLATE BLUE"), + wxT("MEDIUM VIOLET RED"), + wxT("PURPLE"), + + wxT("RED"), + wxT("YELLOW"), + wxT("MEDIUM SPRING GREEN"), + wxT("PALE GREEN"), + wxT("CYAN"), + wxT("LIGHT STEEL BLUE"), + wxT("ORCHID"), + wxT("LIGHT MAGENTA"), + + wxT("BROWN"), + wxT("YELLOW"), + wxT("GREEN"), + wxT("CADET BLUE"), + wxT("MEDIUM BLUE"), + wxT("MAGENTA"), + wxT("MAROON"), + wxT("ORANGE RED"), + + wxT("FIREBRICK"), + wxT("CORAL"), + wxT("FOREST GREEN"), + wxT("AQUAMARINE"), + wxT("BLUE"), + wxT("NAVY"), + wxT("THISTLE"), + wxT("MEDIUM VIOLET RED"), + + wxT("INDIAN RED"), + wxT("GOLD"), + wxT("MEDIUM SEA GREEN"), + wxT("MEDIUM BLUE"), + wxT("MIDNIGHT BLUE"), + wxT("GREY"), + wxT("PURPLE"), + wxT("KHAKI"), + + wxT("BLACK"), + wxT("MEDIUM FOREST GREEN"), + wxT("KHAKI"), + wxT("DARK GREY"), + wxT("SEA GREEN"), + wxT("LIGHT GREY"), + wxT("MEDIUM SLATE BLUE"), + wxT("WHITE") +}; + +wxGenericColourDialog::wxGenericColourDialog() { dialogParent = NULL; whichKind = 1; - colourSelection = 0; + colourSelection = -1; } -wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent, wxColourData *data): - wxDialog(parent, -1, "Colour", wxPoint(0, 0), wxSize(900, 900), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL) +wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent, + wxColourData *data) { whichKind = 1; - colourSelection = 0; + colourSelection = -1; Create(parent, data); } -wxGenericColourDialog::~wxGenericColourDialog(void) +wxGenericColourDialog::~wxGenericColourDialog() { } -bool wxGenericColourDialog::OnClose(void) +void wxGenericColourDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { - Show(FALSE); - return FALSE; + EndModal(wxID_CANCEL); } bool wxGenericColourDialog::Create(wxWindow *parent, wxColourData *data) { - dialogParent = parent; - - if (data) - colourData = *data; - - InitializeColours(); - CalculateMeasurements(); - CreateWidgets(); - - return TRUE; + if ( !wxDialog::Create(parent, wxID_ANY, _("Choose colour"), + wxPoint(0,0), wxSize(900, 900)) ) + return false; + + dialogParent = parent; + + if (data) + colourData = *data; + + InitializeColours(); + CalculateMeasurements(); + CreateWidgets(); + + return true; } -int wxGenericColourDialog::ShowModal(void) +int wxGenericColourDialog::ShowModal() { return wxDialog::ShowModal(); } @@ -163,6 +174,13 @@ void wxGenericColourDialog::OnMouseEvent(wxMouseEvent& event) int x = (int)event.GetX(); int y = (int)event.GetY(); +#ifdef __WXPM__ + // Handle OS/2's reverse coordinate system and account for the dialog title + int nClientHeight; + + GetClientSize(NULL, &nClientHeight); + y = (nClientHeight - y) + 20; +#endif if ((x >= standardColoursRect.x && x <= (standardColoursRect.x + standardColoursRect.width)) && (y >= standardColoursRect.y && y <= (standardColoursRect.y + standardColoursRect.height))) { @@ -179,22 +197,30 @@ void wxGenericColourDialog::OnMouseEvent(wxMouseEvent& event) int ptr = (int)(selX + selY*8); OnCustomColourClick(ptr); } + else + event.Skip(); } + else + event.Skip(); } void wxGenericColourDialog::OnPaint(wxPaintEvent& event) { - wxDialog::OnPaint(event); +#if !defined(__WXMOTIF__) && !defined(__WXPM__) && !defined(__WXCOCOA__) + wxDialog::OnPaint(event); +#else + wxUnusedVar(event); +#endif - wxPaintDC dc(this); + wxPaintDC dc(this); - PaintBasicColours(dc); - PaintCustomColours(dc); - PaintCustomColour(dc); - PaintHighlight(dc, TRUE); + PaintBasicColours(dc); + PaintCustomColours(dc); + PaintCustomColour(dc); + PaintHighlight(dc, true); } -void wxGenericColourDialog::CalculateMeasurements(void) +void wxGenericColourDialog::CalculateMeasurements() { smallRectangleSize.x = 18; smallRectangleSize.y = 14; @@ -205,7 +231,11 @@ void wxGenericColourDialog::CalculateMeasurements(void) sectionSpacing = 15; standardColoursRect.x = 10; +#ifdef __WXPM__ + standardColoursRect.y = 15 + 20; /* OS/2 needs to account for dialog titlebar */ +#else standardColoursRect.y = 15; +#endif standardColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing); standardColoursRect.height = (6*smallRectangleSize.y) + (5*gridSpacing); @@ -224,70 +254,119 @@ void wxGenericColourDialog::CalculateMeasurements(void) buttonY = customColoursRect.y + customColoursRect.height + 10; } -void wxGenericColourDialog::CreateWidgets(void) +void wxGenericColourDialog::CreateWidgets() { - wxBeginBusyCursor(); - - wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(okButtonX, buttonY)); - int bw, bh; - okButton->GetSize(&bw, &bh); - - (void) new wxButton(this, wxID_CANCEL, _("Cancel"), wxPoint(okButtonX + bw + 20, buttonY)); - (void) new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours"), - wxPoint(customButtonX, buttonY)); - - int sliderX = singleCustomColourRect.x + singleCustomColourRect.width + sectionSpacing; -#ifdef __X__ - int sliderSpacing = 75; - int sliderHeight = 160; + wxBeginBusyCursor(); + + wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); + + const int sliderHeight = 160; + +#if wxUSE_SLIDER + const int sliderX = singleCustomColourRect.x + singleCustomColourRect.width + sectionSpacing; + + redSlider = new wxSlider(this, wxID_RED_SLIDER, colourData.m_dataColour.Red(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + greenSlider = new wxSlider(this, wxID_GREEN_SLIDER, colourData.m_dataColour.Green(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, colourData.m_dataColour.Blue(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + + wxBoxSizer *sliderSizer = new wxBoxSizer( wxHORIZONTAL ); + + // 1) space for sliders + sliderSizer->Add( sliderX, sliderHeight ); + sliderSizer->Add( redSlider, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 10 ); + sliderSizer->Add( greenSlider, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 10 ); + sliderSizer->Add( blueSlider, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 10 ); + + topSizer->Add( sliderSizer, 0, wxCENTRE | wxALL, 10 ); #else - int sliderSpacing = 45; - int sliderHeight = 160; + topSizer->Add( 1, sliderHeight, 0, wxCENTRE | wxALL, 15 ); +#endif // wxUSE_SLIDER + +#if wxUSE_STATLINE + // 2) static line + topSizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); #endif - - redSlider = new wxSlider(this, wxID_RED_SLIDER, 0, 0, 255, - wxPoint(sliderX, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS); - greenSlider = new wxSlider(this, wxID_GREEN_SLIDER, 0, 0, 255, - wxPoint(sliderX + sliderSpacing, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS); - blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, 0, 0, 255, - wxPoint(sliderX + 2*sliderSpacing, 10), wxSize(-1, sliderHeight), wxVERTICAL|wxSL_LABELS); - SetClientSize(sliderX + 3*sliderSpacing, buttonY + 40); - okButton->SetDefault(); + // 3) buttons + wxSizer *buttonsizer = CreateButtonSizer( wxOK|wxCANCEL ); + buttonsizer->Add( new wxButton(this, wxID_ADD_CUSTOM, _("Add to custom colours") ), 0, wxLEFT|wxRIGHT, 10 ); + topSizer->Add( buttonsizer, 0, wxEXPAND | wxALL, 10 ); + + SetAutoLayout( true ); + SetSizer( topSizer ); - Centre(wxBOTH); + topSizer->SetSizeHints( this ); + topSizer->Fit( this ); - wxEndBusyCursor(); + Centre( wxBOTH ); + + wxEndBusyCursor(); } void wxGenericColourDialog::InitializeColours(void) { - int i; - for (i = 0; i < 48; i++) - { - wxColour *col = wxTheColourDatabase->FindColour(wxColourDialogNames[i]); - if (col) - standardColours[i].Set(col->Red(), col->Green(), col->Blue()); - else - standardColours[i].Set(0, 0, 0); - } + size_t i; - for (i = 0; i < 16; i++) - customColours[i] = -/* -#ifndef __VMS__ - (wxColour&) -#endif -*/ - colourData.GetCustomColour(i); + for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++) + { + wxColour col = wxTheColourDatabase->Find(wxColourDialogNames[i]); + if (col.Ok()) + standardColours[i].Set(col.Red(), col.Green(), col.Blue()); + else + standardColours[i].Set(0, 0, 0); + } - singleCustomColour.Set(0, 0, 0); + for (i = 0; i < WXSIZEOF(customColours); i++) + { + wxColour c = colourData.GetCustomColour(i); + if (c.Ok()) + customColours[i] = colourData.GetCustomColour(i); + else + customColours[i] = wxColour(255, 255, 255); + } + + wxColour curr = colourData.GetColour(); + if ( curr.Ok() ) + { + bool initColourFound = false; + + for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++) + { + if ( standardColours[i] == curr && !initColourFound ) + { + whichKind = 1; + colourSelection = i; + initColourFound = true; + break; + } + } + if ( !initColourFound ) + { + for ( i = 0; i < WXSIZEOF(customColours); i++ ) + { + if ( customColours[i] == curr ) + { + whichKind = 2; + colourSelection = i; + break; + } + } + } + colourData.m_dataColour.Set( curr.Red(), curr.Green(), curr.Blue() ); + } + else + { + whichKind = 1; + colourSelection = 0; + colourData.m_dataColour.Set( 0, 0, 0 ); + } } void wxGenericColourDialog::PaintBasicColours(wxDC& dc) { - dc.BeginDrawing(); - int i; for (i = 0; i < 6; i++) { @@ -295,7 +374,7 @@ void wxGenericColourDialog::PaintBasicColours(wxDC& dc) for (j = 0; j < 8; j++) { int ptr = i*8 + j; - + int x = (j*(smallRectangleSize.x+gridSpacing) + standardColoursRect.x); int y = (i*(smallRectangleSize.y+gridSpacing) + standardColoursRect.y); @@ -306,13 +385,10 @@ void wxGenericColourDialog::PaintBasicColours(wxDC& dc) dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y); } } - dc.EndDrawing(); } void wxGenericColourDialog::PaintCustomColours(wxDC& dc) { - dc.BeginDrawing(); - int i; for (i = 0; i < 2; i++) { @@ -320,7 +396,7 @@ void wxGenericColourDialog::PaintCustomColours(wxDC& dc) for (j = 0; j < 8; j++) { int ptr = i*8 + j; - + int x = (j*(smallRectangleSize.x+gridSpacing)) + customColoursRect.x; int y = (i*(smallRectangleSize.y+gridSpacing)) + customColoursRect.y; @@ -332,12 +408,12 @@ void wxGenericColourDialog::PaintCustomColours(wxDC& dc) dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y); } } - dc.EndDrawing(); } void wxGenericColourDialog::PaintHighlight(wxDC& dc, bool draw) { - dc.BeginDrawing(); + if ( colourSelection < 0 ) + return; // Number of pixels bigger than the standard rectangle size // for drawing a highlight @@ -374,21 +450,17 @@ void wxGenericColourDialog::PaintHighlight(wxDC& dc, bool draw) dc.SetPen(*wxBLACK_PEN); else dc.SetPen(*wxLIGHT_GREY_PEN); - + dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY))); } - - dc.EndDrawing(); } void wxGenericColourDialog::PaintCustomColour(wxDC& dc) { - dc.BeginDrawing(); - dc.SetPen(*wxBLACK_PEN); - wxBrush *brush = new wxBrush(singleCustomColour, wxSOLID); + wxBrush *brush = new wxBrush(colourData.m_dataColour, wxSOLID); dc.SetBrush(*brush); dc.DrawRectangle( singleCustomColourRect.x, singleCustomColourRect.y, @@ -396,43 +468,61 @@ void wxGenericColourDialog::PaintCustomColour(wxDC& dc) dc.SetBrush(wxNullBrush); delete brush; - - dc.EndDrawing(); } void wxGenericColourDialog::OnBasicColourClick(int which) { - wxClientDC dc(this); + wxClientDC dc(this); - PaintHighlight(dc, FALSE); - whichKind = 1; - colourSelection = which; - colourData.SetColour(standardColours[colourSelection]); + PaintHighlight(dc, false); + whichKind = 1; + colourSelection = which; + +#if wxUSE_SLIDER + redSlider->SetValue( standardColours[colourSelection].Red() ); + greenSlider->SetValue( standardColours[colourSelection].Green() ); + blueSlider->SetValue( standardColours[colourSelection].Blue() ); +#endif // wxUSE_SLIDER + + colourData.m_dataColour.Set(standardColours[colourSelection].Red(), + standardColours[colourSelection].Green(), + standardColours[colourSelection].Blue()); - PaintHighlight(dc, TRUE); + PaintCustomColour(dc); + PaintHighlight(dc, true); } void wxGenericColourDialog::OnCustomColourClick(int which) { - wxClientDC dc(this); - PaintHighlight(dc, FALSE); - whichKind = 2; - colourSelection = which; - colourData.SetColour(customColours[colourSelection]); + wxClientDC dc(this); + PaintHighlight(dc, false); + whichKind = 2; + colourSelection = which; + +#if wxUSE_SLIDER + redSlider->SetValue( customColours[colourSelection].Red() ); + greenSlider->SetValue( customColours[colourSelection].Green() ); + blueSlider->SetValue( customColours[colourSelection].Blue() ); +#endif // wxUSE_SLIDER + + colourData.m_dataColour.Set(customColours[colourSelection].Red(), + customColours[colourSelection].Green(), + customColours[colourSelection].Blue()); - PaintHighlight(dc, TRUE); + PaintCustomColour(dc); + PaintHighlight(dc, true); } /* void wxGenericColourDialog::OnOk(void) { - Show(FALSE); + Show(false); } void wxGenericColourDialog::OnCancel(void) { - colourDialogCancelled = TRUE; - Show(FALSE); + colourDialogCancelled = true; + Show(false); } */ @@ -441,26 +531,30 @@ void wxGenericColourDialog::OnAddCustom(wxCommandEvent& WXUNUSED(event)) wxClientDC dc(this); if (whichKind != 2) { - PaintHighlight(dc, FALSE); + PaintHighlight(dc, false); whichKind = 2; colourSelection = 0; - PaintHighlight(dc, TRUE); + PaintHighlight(dc, true); } - customColours[colourSelection].Set(singleCustomColour.Red(), singleCustomColour.Green(), singleCustomColour.Blue()); - colourData.SetColour(customColours[colourSelection]); + customColours[colourSelection].Set(colourData.m_dataColour.Red(), + colourData.m_dataColour.Green(), + colourData.m_dataColour.Blue()); + colourData.SetCustomColour(colourSelection, customColours[colourSelection]); - + PaintCustomColours(dc); } +#if wxUSE_SLIDER + void wxGenericColourDialog::OnRedSlider(wxCommandEvent& WXUNUSED(event)) { if (!redSlider) return; - + wxClientDC dc(this); - singleCustomColour.Set(redSlider->GetValue(), singleCustomColour.Green(), singleCustomColour.Blue()); + colourData.m_dataColour.Set((unsigned char)redSlider->GetValue(), colourData.m_dataColour.Green(), colourData.m_dataColour.Blue()); PaintCustomColour(dc); } @@ -470,7 +564,7 @@ void wxGenericColourDialog::OnGreenSlider(wxCommandEvent& WXUNUSED(event)) return; wxClientDC dc(this); - singleCustomColour.Set(singleCustomColour.Red(), greenSlider->GetValue(), singleCustomColour.Blue()); + colourData.m_dataColour.Set(colourData.m_dataColour.Red(), (unsigned char)greenSlider->GetValue(), colourData.m_dataColour.Blue()); PaintCustomColour(dc); } @@ -480,8 +574,10 @@ void wxGenericColourDialog::OnBlueSlider(wxCommandEvent& WXUNUSED(event)) return; wxClientDC dc(this); - singleCustomColour.Set(singleCustomColour.Red(), singleCustomColour.Green(), blueSlider->GetValue()); + colourData.m_dataColour.Set(colourData.m_dataColour.Red(), colourData.m_dataColour.Green(), (unsigned char)blueSlider->GetValue()); PaintCustomColour(dc); } +#endif // wxUSE_SLIDER +#endif // wxUSE_COLOURDLG && !defined(__WXGTK20__)