Renames to avoid object files with duplicate filenames. (Should we just make everything in this dir _osx for consistency?)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55455 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
515
src/osx/radiobox_osx.cpp
Normal file
515
src/osx/radiobox_osx.cpp
Normal file
@@ -0,0 +1,515 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: src/osx/radiobox.cpp
|
||||
// Purpose: wxRadioBox
|
||||
// Author: Stefan Csomor
|
||||
// Modified by: JS Lair (99/11/15) first implementation
|
||||
// Created: 1998-01-01
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Stefan Csomor
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#if wxUSE_RADIOBOX
|
||||
|
||||
#include "wx/radiobox.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/radiobut.h"
|
||||
#include "wx/arrstr.h"
|
||||
#endif
|
||||
|
||||
#include "wx/osx/private.h"
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(wxRadioBox, wxControl)
|
||||
EVT_RADIOBUTTON( wxID_ANY , wxRadioBox::OnRadioButton )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
void wxRadioBox::OnRadioButton( wxCommandEvent &outer )
|
||||
{
|
||||
if ( outer.IsChecked() )
|
||||
{
|
||||
wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId );
|
||||
int i = GetSelection() ;
|
||||
event.SetInt(i);
|
||||
event.SetString(GetString(i));
|
||||
event.SetEventObject( this );
|
||||
ProcessCommand(event);
|
||||
}
|
||||
}
|
||||
|
||||
wxRadioBox::wxRadioBox()
|
||||
{
|
||||
m_noItems = 0;
|
||||
m_noRowsOrCols = 0;
|
||||
m_radioButtonCycle = NULL;
|
||||
}
|
||||
|
||||
wxRadioBox::~wxRadioBox()
|
||||
{
|
||||
m_isBeingDeleted = true;
|
||||
|
||||
wxRadioButton *next, *current;
|
||||
|
||||
current = m_radioButtonCycle->NextInCycle();
|
||||
if (current != NULL)
|
||||
{
|
||||
while (current != m_radioButtonCycle)
|
||||
{
|
||||
next = current->NextInCycle();
|
||||
delete current;
|
||||
|
||||
current = next;
|
||||
}
|
||||
|
||||
delete current;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the radiobox for two-step construction
|
||||
|
||||
bool wxRadioBox::Create( wxWindow *parent,
|
||||
wxWindowID id, const wxString& label,
|
||||
const wxPoint& pos, const wxSize& size,
|
||||
const wxArrayString& choices,
|
||||
int majorDim, long style,
|
||||
const wxValidator& val, const wxString& name )
|
||||
{
|
||||
wxCArrayString chs(choices);
|
||||
|
||||
return Create(
|
||||
parent, id, label, pos, size, chs.GetCount(),
|
||||
chs.GetStrings(), majorDim, style, val, name);
|
||||
}
|
||||
|
||||
bool wxRadioBox::Create( wxWindow *parent,
|
||||
wxWindowID id, const wxString& label,
|
||||
const wxPoint& pos, const wxSize& size,
|
||||
int n, const wxString choices[],
|
||||
int majorDim, long style,
|
||||
const wxValidator& val, const wxString& name )
|
||||
{
|
||||
m_macIsUserPane = false ;
|
||||
|
||||
if ( !wxControl::Create( parent, id, pos, size, style, val, name ) )
|
||||
return false;
|
||||
|
||||
int i;
|
||||
|
||||
m_noItems = (unsigned int)n;
|
||||
m_noRowsOrCols = majorDim;
|
||||
m_radioButtonCycle = NULL;
|
||||
|
||||
SetMajorDim( majorDim == 0 ? n : majorDim, style );
|
||||
|
||||
m_labelOrig = m_label = label;
|
||||
|
||||
m_peer = wxWidgetImpl::CreateGroupBox( this, parent, id, label, pos, size, style, GetExtraStyle() );
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
wxRadioButton *radBtn = new wxRadioButton(
|
||||
this,
|
||||
wxID_ANY,
|
||||
GetLabelText(choices[i]),
|
||||
wxPoint( 5, 20 * i + 10 ),
|
||||
wxDefaultSize,
|
||||
i == 0 ? wxRB_GROUP : 0 );
|
||||
|
||||
if ( i == 0 )
|
||||
m_radioButtonCycle = radBtn;
|
||||
// m_radioButtonCycle = radBtn->AddInCycle( m_radioButtonCycle );
|
||||
}
|
||||
|
||||
SetSelection( 0 );
|
||||
MacPostControlCreate( pos, size );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Enables or disables the entire radiobox
|
||||
//
|
||||
bool wxRadioBox::Enable(bool enable)
|
||||
{
|
||||
wxRadioButton *current;
|
||||
|
||||
if (!wxControl::Enable( enable ))
|
||||
return false;
|
||||
|
||||
current = m_radioButtonCycle;
|
||||
for (unsigned int i = 0; i < m_noItems; i++)
|
||||
{
|
||||
current->Enable( enable );
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Enables or disables an given button
|
||||
//
|
||||
bool wxRadioBox::Enable(unsigned int item, bool enable)
|
||||
{
|
||||
if (!IsValid( item ))
|
||||
return false;
|
||||
|
||||
unsigned int i = 0;
|
||||
wxRadioButton *current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->Enable( enable );
|
||||
}
|
||||
|
||||
bool wxRadioBox::IsItemEnabled(unsigned int item) const
|
||||
{
|
||||
if (!IsValid( item ))
|
||||
return false;
|
||||
|
||||
unsigned int i = 0;
|
||||
wxRadioButton *current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->IsEnabled();
|
||||
}
|
||||
|
||||
// Returns the radiobox label
|
||||
//
|
||||
wxString wxRadioBox::GetLabel() const
|
||||
{
|
||||
return wxControl::GetLabel();
|
||||
}
|
||||
|
||||
// Returns the label for the given button
|
||||
//
|
||||
wxString wxRadioBox::GetString(unsigned int item) const
|
||||
{
|
||||
wxRadioButton *current;
|
||||
|
||||
if (!IsValid( item ))
|
||||
return wxEmptyString;
|
||||
|
||||
unsigned int i = 0;
|
||||
current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->GetLabel();
|
||||
}
|
||||
|
||||
// Returns the zero-based position of the selected button
|
||||
//
|
||||
int wxRadioBox::GetSelection() const
|
||||
{
|
||||
int i;
|
||||
wxRadioButton *current;
|
||||
|
||||
i = 0;
|
||||
current = m_radioButtonCycle;
|
||||
while (!current->GetValue())
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
// Sets the radiobox label
|
||||
//
|
||||
void wxRadioBox::SetLabel(const wxString& label)
|
||||
{
|
||||
return wxControl::SetLabel( label );
|
||||
}
|
||||
|
||||
// Sets the label of a given button
|
||||
//
|
||||
void wxRadioBox::SetString(unsigned int item,const wxString& label)
|
||||
{
|
||||
if (!IsValid( item ))
|
||||
return;
|
||||
|
||||
unsigned int i = 0;
|
||||
wxRadioButton *current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->SetLabel( label );
|
||||
}
|
||||
|
||||
// Sets a button by passing the desired position. This does not cause
|
||||
// wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted
|
||||
//
|
||||
void wxRadioBox::SetSelection(int item)
|
||||
{
|
||||
int i;
|
||||
wxRadioButton *current;
|
||||
|
||||
if (!IsValid( item ))
|
||||
return;
|
||||
|
||||
i = 0;
|
||||
current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
current->SetValue( true );
|
||||
}
|
||||
|
||||
// Shows or hides the entire radiobox
|
||||
//
|
||||
bool wxRadioBox::Show(bool show)
|
||||
{
|
||||
wxRadioButton *current;
|
||||
|
||||
current = m_radioButtonCycle;
|
||||
for (unsigned int i=0; i<m_noItems; i++)
|
||||
{
|
||||
current->Show( show );
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
wxControl::Show( show );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Shows or hides the given button
|
||||
//
|
||||
bool wxRadioBox::Show(unsigned int item, bool show)
|
||||
{
|
||||
if (!IsValid( item ))
|
||||
return false;
|
||||
|
||||
unsigned int i = 0;
|
||||
wxRadioButton *current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->Show( show );
|
||||
}
|
||||
|
||||
bool wxRadioBox::IsItemShown(unsigned int item) const
|
||||
{
|
||||
if (!IsValid( item ))
|
||||
return false;
|
||||
|
||||
unsigned int i = 0;
|
||||
wxRadioButton *current = m_radioButtonCycle;
|
||||
while (i != item)
|
||||
{
|
||||
i++;
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
return current->IsShown();
|
||||
}
|
||||
|
||||
|
||||
// Simulates the effect of the user issuing a command to the item
|
||||
//
|
||||
void wxRadioBox::Command( wxCommandEvent& event )
|
||||
{
|
||||
SetSelection( event.GetInt() );
|
||||
ProcessCommand( event );
|
||||
}
|
||||
|
||||
// Sets the selected button to receive keyboard input
|
||||
//
|
||||
void wxRadioBox::SetFocus()
|
||||
{
|
||||
wxRadioButton *current;
|
||||
|
||||
current = m_radioButtonCycle;
|
||||
while (!current->GetValue())
|
||||
{
|
||||
current = current->NextInCycle();
|
||||
}
|
||||
|
||||
current->SetFocus();
|
||||
}
|
||||
|
||||
// Simulates the effect of the user issuing a command to the item
|
||||
//
|
||||
#define RADIO_SIZE 20
|
||||
|
||||
void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
|
||||
{
|
||||
int i;
|
||||
wxRadioButton *current;
|
||||
|
||||
// define the position
|
||||
|
||||
int x_current, y_current;
|
||||
int x_offset, y_offset;
|
||||
int widthOld, heightOld;
|
||||
|
||||
GetSize( &widthOld, &heightOld );
|
||||
GetPosition( &x_current, &y_current );
|
||||
|
||||
x_offset = x;
|
||||
y_offset = y;
|
||||
if (!(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
{
|
||||
if (x == wxDefaultCoord)
|
||||
x_offset = x_current;
|
||||
if (y == wxDefaultCoord)
|
||||
y_offset = y_current;
|
||||
}
|
||||
|
||||
// define size
|
||||
int charWidth, charHeight;
|
||||
int maxWidth, maxHeight;
|
||||
int eachWidth[128], eachHeight[128];
|
||||
int totWidth, totHeight;
|
||||
|
||||
GetTextExtent(
|
||||
wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
|
||||
&charWidth, &charHeight );
|
||||
|
||||
charWidth /= 52;
|
||||
|
||||
maxWidth = -1;
|
||||
maxHeight = -1;
|
||||
for (unsigned int i = 0 ; i < m_noItems; i++)
|
||||
{
|
||||
GetTextExtent(GetString(i), &eachWidth[i], &eachHeight[i] );
|
||||
eachWidth[i] = (int)(eachWidth[i] + RADIO_SIZE);
|
||||
eachHeight[i] = (int)((3 * eachHeight[i]) / 2);
|
||||
|
||||
if (maxWidth < eachWidth[i])
|
||||
maxWidth = eachWidth[i];
|
||||
if (maxHeight < eachHeight[i])
|
||||
maxHeight = eachHeight[i];
|
||||
}
|
||||
|
||||
totHeight = GetRowCount() * maxHeight;
|
||||
totWidth = GetColumnCount() * (maxWidth + charWidth);
|
||||
|
||||
wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) ) ;
|
||||
|
||||
// change the width / height only when specified
|
||||
if ( width == wxDefaultCoord )
|
||||
{
|
||||
if ( sizeFlags & wxSIZE_AUTO_WIDTH )
|
||||
width = sz.x;
|
||||
else
|
||||
width = widthOld;
|
||||
}
|
||||
|
||||
if ( height == wxDefaultCoord )
|
||||
{
|
||||
if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
|
||||
height = sz.y;
|
||||
else
|
||||
height = heightOld;
|
||||
}
|
||||
|
||||
wxControl::DoSetSize( x_offset, y_offset, width, height, wxSIZE_AUTO );
|
||||
|
||||
// arrange radio buttons
|
||||
int x_start, y_start;
|
||||
|
||||
x_start = 0;
|
||||
y_start = 0;
|
||||
|
||||
x_offset = x_start;
|
||||
y_offset = y_start;
|
||||
|
||||
current = m_radioButtonCycle;
|
||||
for (i = 0 ; i < (int)m_noItems; i++)
|
||||
{
|
||||
// not to do for the zero button!
|
||||
if ((i > 0) && ((i % GetMajorDim()) == 0))
|
||||
{
|
||||
if (m_windowStyle & wxRA_SPECIFY_ROWS)
|
||||
{
|
||||
x_offset += maxWidth + charWidth;
|
||||
y_offset = y_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
x_offset = x_start;
|
||||
y_offset += maxHeight ; //+ charHeight / 2
|
||||
}
|
||||
}
|
||||
|
||||
current->SetSize( x_offset, y_offset, eachWidth[i], eachHeight[i]);
|
||||
current = current->NextInCycle();
|
||||
|
||||
if (m_windowStyle & wxRA_SPECIFY_ROWS)
|
||||
y_offset += maxHeight ; // + charHeight / 2
|
||||
else
|
||||
x_offset += maxWidth + charWidth;
|
||||
}
|
||||
}
|
||||
|
||||
wxSize wxRadioBox::DoGetBestSize() const
|
||||
{
|
||||
int charWidth, charHeight;
|
||||
int maxWidth, maxHeight;
|
||||
int eachWidth, eachHeight;
|
||||
int totWidth, totHeight;
|
||||
|
||||
wxFont font = GetFont(); // GetParent()->GetFont()
|
||||
GetTextExtent(
|
||||
wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
|
||||
&charWidth, &charHeight, NULL, NULL, &font );
|
||||
|
||||
charWidth /= 52;
|
||||
|
||||
maxWidth = -1;
|
||||
maxHeight = -1;
|
||||
|
||||
for (unsigned int i = 0 ; i < m_noItems; i++)
|
||||
{
|
||||
GetTextExtent(GetString(i), &eachWidth, &eachHeight, NULL, NULL, &font );
|
||||
eachWidth = (int)(eachWidth + RADIO_SIZE);
|
||||
eachHeight = (int)((3 * eachHeight) / 2);
|
||||
if (maxWidth < eachWidth)
|
||||
maxWidth = eachWidth;
|
||||
if (maxHeight < eachHeight)
|
||||
maxHeight = eachHeight;
|
||||
}
|
||||
|
||||
totHeight = GetRowCount() * maxHeight;
|
||||
totWidth = GetColumnCount() * (maxWidth + charWidth);
|
||||
|
||||
wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) );
|
||||
totWidth = sz.x;
|
||||
totHeight = sz.y;
|
||||
|
||||
// handle radio box title as well
|
||||
GetTextExtent( GetLabel(), &eachWidth, NULL );
|
||||
eachWidth = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth;
|
||||
if (totWidth < eachWidth)
|
||||
totWidth = eachWidth;
|
||||
|
||||
return wxSize( totWidth, totHeight );
|
||||
}
|
||||
|
||||
#endif // wxUSE_RADIOBOX
|
||||
Reference in New Issue
Block a user