split classic and carbon
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26277 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
36
src/mac/classic/Info.plist.in
Normal file
36
src/mac/classic/Info.plist.in
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||||
|
<plist version="0.9">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>org.wxwindows.IDENTIFIER</string>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>EXECUTABLE</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>wxmac.icns</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>EXECUTABLE</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>VERSION</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>VERSION</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>EXECUTABLE version VERSION, (c) 2002 wxWindows</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string>VERSION, (c) 2002 wxWindows</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>Copyright 2002 wxWindows</string>
|
||||||
|
<key>LSRequiresCarbon</key>
|
||||||
|
<true/>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
108
src/mac/classic/accel.cpp
Normal file
108
src/mac/classic/accel.cpp
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: accel.cpp
|
||||||
|
// Purpose: wxAcceleratorTable
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "accel.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
#include "wx/accel.h"
|
||||||
|
#include "wx/string.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxAccelList: a list of wxAcceleratorEntries
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList);
|
||||||
|
#include "wx/listimpl.cpp"
|
||||||
|
WX_DEFINE_LIST(wxAccelList);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxAccelRefData: the data used by wxAcceleratorTable
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
|
||||||
|
{
|
||||||
|
friend class WXDLLEXPORT wxAcceleratorTable;
|
||||||
|
public:
|
||||||
|
wxAcceleratorRefData();
|
||||||
|
~wxAcceleratorRefData();
|
||||||
|
|
||||||
|
wxAccelList m_accels;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
|
||||||
|
|
||||||
|
wxAcceleratorRefData::wxAcceleratorRefData()
|
||||||
|
: m_accels()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxAcceleratorRefData::~wxAcceleratorRefData()
|
||||||
|
{
|
||||||
|
m_accels.DeleteContents( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxAcceleratorTable::wxAcceleratorTable()
|
||||||
|
{
|
||||||
|
m_refData = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxAcceleratorTable::~wxAcceleratorTable()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create from an array
|
||||||
|
wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
|
||||||
|
{
|
||||||
|
m_refData = new wxAcceleratorRefData;
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
int flag = entries[i].GetFlags();
|
||||||
|
int keycode = entries[i].GetKeyCode();
|
||||||
|
int command = entries[i].GetCommand();
|
||||||
|
if ((keycode >= (int)'a') && (keycode <= (int)'z')) keycode = (int)toupper( (char)keycode );
|
||||||
|
M_ACCELDATA->m_accels.Append( new wxAcceleratorEntry( flag, keycode, command ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxAcceleratorTable::Ok() const
|
||||||
|
{
|
||||||
|
return (m_refData != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxAcceleratorTable::GetCommand( wxKeyEvent &event )
|
||||||
|
{
|
||||||
|
if (!Ok()) return -1;
|
||||||
|
|
||||||
|
wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxAcceleratorEntry *entry = (wxAcceleratorEntry*)node->GetData();
|
||||||
|
if ((event.m_keyCode == entry->GetKeyCode()) &&
|
||||||
|
(((entry->GetFlags() & wxACCEL_CTRL) == 0) || event.ControlDown()) &&
|
||||||
|
(((entry->GetFlags() & wxACCEL_SHIFT) == 0) || event.ShiftDown()) &&
|
||||||
|
(((entry->GetFlags() & wxACCEL_ALT) == 0) || event.AltDown() || event.MetaDown()))
|
||||||
|
{
|
||||||
|
return entry->GetCommand();
|
||||||
|
}
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
2
src/mac/classic/aga.cpp
Normal file
2
src/mac/classic/aga.cpp
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// NOT NEEDED ANYMORE
|
||||||
|
|
||||||
2439
src/mac/classic/app.cpp
Normal file
2439
src/mac/classic/app.cpp
Normal file
File diff suppressed because it is too large
Load Diff
6
src/mac/classic/apprsrc.h
Normal file
6
src/mac/classic/apprsrc.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#define kMacSTRWrongMachine 1
|
||||||
|
#define kMacSTRSmallSize 2
|
||||||
|
#define kMacSTRNoMemory 3
|
||||||
|
#define kMacSTROldSystem 4
|
||||||
|
#define kMacSTRGenericAbout 5
|
||||||
|
#define kMacSTRNoPre8Yet 6
|
||||||
32
src/mac/classic/apprsrc.r
Normal file
32
src/mac/classic/apprsrc.r
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#ifdef __UNIX__
|
||||||
|
# include <Carbon.r>
|
||||||
|
#else
|
||||||
|
# include <Types.r>
|
||||||
|
#endif
|
||||||
|
#include "apprsrc.h"
|
||||||
|
|
||||||
|
resource 'STR#' ( 128 , "Simple Alert Messages" )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"This application needs at least a MacPlus" ,
|
||||||
|
"This application needs more memory" ,
|
||||||
|
"This application is out of memory" ,
|
||||||
|
"This application needs at least System 8.6" ,
|
||||||
|
"About this wxWindows Application" ,
|
||||||
|
"This application needs Appearance extension (built in with System 8) - this restriction will be relieved in the final release"
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
resource 'MENU' (1, preload)
|
||||||
|
{
|
||||||
|
1, textMenuProc, 0b11111111111111111111111111111110 , enabled, apple ,
|
||||||
|
{
|
||||||
|
"About<EFBFBD>" , noicon, nokey,nomark,plain ,
|
||||||
|
"-" , noicon, nokey,nomark,plain
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
resource 'MBAR' (1,preload)
|
||||||
|
{
|
||||||
|
{ 1 } ;
|
||||||
|
} ;
|
||||||
1436
src/mac/classic/bitmap.cpp
Normal file
1436
src/mac/classic/bitmap.cpp
Normal file
File diff suppressed because it is too large
Load Diff
113
src/mac/classic/bmpbuttn.cpp
Normal file
113
src/mac/classic/bmpbuttn.cpp
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: bmpbuttn.cpp
|
||||||
|
// Purpose: wxBitmapButton
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "bmpbuttn.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/bmpbuttn.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
|
||||||
|
bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
// since bitmapbuttonbase is subclass of button calling wxBitmapButtonBase::Create
|
||||||
|
// essentially creates an additional button
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size,
|
||||||
|
style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_bmpNormal = bitmap;
|
||||||
|
|
||||||
|
if (style & wxBU_AUTODRAW)
|
||||||
|
{
|
||||||
|
m_marginX = wxDEFAULT_BUTTON_MARGIN;
|
||||||
|
m_marginY = wxDEFAULT_BUTTON_MARGIN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_marginX = 0;
|
||||||
|
m_marginY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int width = size.x;
|
||||||
|
int height = size.y;
|
||||||
|
|
||||||
|
if ( bitmap.Ok() )
|
||||||
|
{
|
||||||
|
wxSize newSize = DoGetBestSize();
|
||||||
|
if ( width == -1 )
|
||||||
|
width = newSize.x;
|
||||||
|
if ( height == -1 )
|
||||||
|
height = newSize.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
m_bmpNormal = bitmap;
|
||||||
|
wxBitmapRefData * bmap = NULL ;
|
||||||
|
|
||||||
|
if ( m_bmpNormal.Ok() )
|
||||||
|
bmap = (wxBitmapRefData*) ( m_bmpNormal.GetRefData()) ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , wxSize( width , height ) ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 ,
|
||||||
|
kControlBehaviorOffsetContents +
|
||||||
|
( bmap && bmap->m_bitmapType == kMacBitmapTypeIcon ?
|
||||||
|
kControlContentCIconHandle : kControlContentPictHandle ) , 0,
|
||||||
|
(( style & wxBU_AUTODRAW ) ? kControlBevelButtonSmallBevelProc : kControlBevelButtonNormalBevelProc ), (long) this ) ;
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
ControlButtonContentInfo info ;
|
||||||
|
wxMacCreateBitmapButton( &info , m_bmpNormal ) ;
|
||||||
|
if ( info.contentType != kControlNoContent )
|
||||||
|
{
|
||||||
|
::SetControlData( (ControlHandle) m_macControl , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
|
||||||
|
}
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap)
|
||||||
|
{
|
||||||
|
m_bmpNormal = bitmap;
|
||||||
|
|
||||||
|
ControlButtonContentInfo info ;
|
||||||
|
wxMacCreateBitmapButton( &info , m_bmpNormal ) ;
|
||||||
|
if ( info.contentType != kControlNoContent )
|
||||||
|
{
|
||||||
|
::SetControlData( (ControlHandle) m_macControl , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxSize wxBitmapButton::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize best;
|
||||||
|
if (m_bmpNormal.Ok())
|
||||||
|
{
|
||||||
|
best.x = m_bmpNormal.GetWidth() + 2*m_marginX;
|
||||||
|
best.y = m_bmpNormal.GetHeight() + 2*m_marginY;
|
||||||
|
}
|
||||||
|
return best;
|
||||||
|
}
|
||||||
229
src/mac/classic/brush.cpp
Normal file
229
src/mac/classic/brush.cpp
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: brush.cpp
|
||||||
|
// Purpose: wxBrush
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "brush.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/brush.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxBrushRefData: public wxGDIRefData
|
||||||
|
{
|
||||||
|
friend class WXDLLEXPORT wxBrush;
|
||||||
|
public:
|
||||||
|
wxBrushRefData();
|
||||||
|
wxBrushRefData(const wxBrushRefData& data);
|
||||||
|
~wxBrushRefData();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
wxMacBrushKind m_macBrushKind ;
|
||||||
|
int m_style;
|
||||||
|
wxBitmap m_stipple ;
|
||||||
|
wxColour m_colour;
|
||||||
|
|
||||||
|
ThemeBrush m_macThemeBrush ;
|
||||||
|
|
||||||
|
ThemeBackgroundKind m_macThemeBackground ;
|
||||||
|
Rect m_macThemeBackgroundExtent ;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define M_BRUSHDATA ((wxBrushRefData *)m_refData)
|
||||||
|
|
||||||
|
wxBrushRefData::wxBrushRefData()
|
||||||
|
: m_style(wxSOLID)
|
||||||
|
{
|
||||||
|
m_macBrushKind = kwxMacBrushColour ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
|
||||||
|
: wxGDIRefData()
|
||||||
|
, m_style(data.m_style)
|
||||||
|
{
|
||||||
|
m_stipple = data.m_stipple;
|
||||||
|
m_colour = data.m_colour;
|
||||||
|
m_macBrushKind = data.m_macBrushKind ;
|
||||||
|
m_macThemeBrush = data.m_macThemeBrush ;
|
||||||
|
m_macThemeBackground = data.m_macThemeBackground ;
|
||||||
|
m_macThemeBackgroundExtent = data.m_macThemeBackgroundExtent ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrushRefData::~wxBrushRefData()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brushes
|
||||||
|
wxBrush::wxBrush()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrush::~wxBrush()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrush::wxBrush(const wxColour& col, int Style)
|
||||||
|
{
|
||||||
|
m_refData = new wxBrushRefData;
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_colour = col;
|
||||||
|
M_BRUSHDATA->m_style = Style;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrush::wxBrush(const wxBitmap& stipple)
|
||||||
|
{
|
||||||
|
m_refData = new wxBrushRefData;
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_colour = *wxBLACK;
|
||||||
|
M_BRUSHDATA->m_stipple = stipple;
|
||||||
|
|
||||||
|
if (M_BRUSHDATA->m_stipple.GetMask())
|
||||||
|
M_BRUSHDATA->m_style = wxSTIPPLE_MASK_OPAQUE;
|
||||||
|
else
|
||||||
|
M_BRUSHDATA->m_style = wxSTIPPLE;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBrush::wxBrush(ThemeBrush macThemeBrush )
|
||||||
|
{
|
||||||
|
m_refData = new wxBrushRefData;
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushTheme;
|
||||||
|
M_BRUSHDATA->m_macThemeBrush = macThemeBrush;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
void wxBrush::Unshare()
|
||||||
|
{
|
||||||
|
// Don't change shared data
|
||||||
|
if (!m_refData)
|
||||||
|
{
|
||||||
|
m_refData = new wxBrushRefData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxBrushRefData* ref = new wxBrushRefData(*(wxBrushRefData*)m_refData);
|
||||||
|
UnRef();
|
||||||
|
m_refData = ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetColour(const wxColour& col)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushColour;
|
||||||
|
M_BRUSHDATA->m_colour = col;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetColour(unsigned char r, unsigned char g, unsigned char b)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushColour;
|
||||||
|
M_BRUSHDATA->m_colour.Set(r, g, b);
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetStyle(int Style)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushColour;
|
||||||
|
M_BRUSHDATA->m_style = Style;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetStipple(const wxBitmap& Stipple)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushColour;
|
||||||
|
M_BRUSHDATA->m_stipple = Stipple;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetMacTheme(ThemeBrush macThemeBrush)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushTheme;
|
||||||
|
M_BRUSHDATA->m_macThemeBrush = macThemeBrush;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBrush::SetMacThemeBackground(unsigned long macThemeBackground, const WXRECTPTR extent)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_BRUSHDATA->m_macBrushKind = kwxMacBrushThemeBackground;
|
||||||
|
M_BRUSHDATA->m_macThemeBackground = macThemeBackground;
|
||||||
|
M_BRUSHDATA->m_macThemeBackgroundExtent = *(Rect*)extent ;
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxBrush::RealizeResource()
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long wxBrush::GetMacThemeBackground( WXRECTPTR extent) const
|
||||||
|
{
|
||||||
|
if ( M_BRUSHDATA && M_BRUSHDATA->m_macBrushKind == kwxMacBrushThemeBackground )
|
||||||
|
{
|
||||||
|
if ( extent )
|
||||||
|
*(Rect*)extent = M_BRUSHDATA->m_macThemeBackgroundExtent ;
|
||||||
|
return M_BRUSHDATA->m_macThemeBackground ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
short wxBrush::GetMacTheme() const
|
||||||
|
{
|
||||||
|
return (M_BRUSHDATA ? ( M_BRUSHDATA->m_macBrushKind == kwxMacBrushTheme ? M_BRUSHDATA->m_macThemeBrush : kThemeBrushBlack) : kThemeBrushBlack);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColour& wxBrush::GetColour() const
|
||||||
|
{
|
||||||
|
return (M_BRUSHDATA ? M_BRUSHDATA->m_colour : wxNullColour);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxBrush::GetStyle() const
|
||||||
|
{
|
||||||
|
return (M_BRUSHDATA ? M_BRUSHDATA->m_style : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBitmap *wxBrush::GetStipple() const
|
||||||
|
{
|
||||||
|
return (M_BRUSHDATA ? & M_BRUSHDATA->m_stipple : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacBrushKind wxBrush::MacGetBrushKind() const
|
||||||
|
{
|
||||||
|
return (M_BRUSHDATA ? M_BRUSHDATA->m_macBrushKind : kwxMacBrushColour);
|
||||||
|
}
|
||||||
132
src/mac/classic/button.cpp
Normal file
132
src/mac/classic/button.cpp
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: button.cpp
|
||||||
|
// Purpose: wxButton
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "button.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/button.h"
|
||||||
|
#include "wx/panel.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
// Button
|
||||||
|
|
||||||
|
static const int kMacOSXHorizontalBorder = 2 ;
|
||||||
|
static const int kMacOSXVerticalBorder = 4 ;
|
||||||
|
|
||||||
|
bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
m_macHorizontalBorder = kMacOSXHorizontalBorder;
|
||||||
|
m_macVerticalBorder = kMacOSXVerticalBorder;
|
||||||
|
}
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , label , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlPushButtonProc , (long) this ) ;
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxButton::SetDefault()
|
||||||
|
{
|
||||||
|
wxWindow *parent = GetParent();
|
||||||
|
wxButton *btnOldDefault = NULL;
|
||||||
|
if ( parent )
|
||||||
|
{
|
||||||
|
btnOldDefault = wxDynamicCast(parent->GetDefaultItem(),
|
||||||
|
wxButton);
|
||||||
|
parent->SetDefaultItem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Boolean inData;
|
||||||
|
if ( btnOldDefault && btnOldDefault->m_macControl )
|
||||||
|
{
|
||||||
|
inData = 0;
|
||||||
|
::SetControlData( (ControlHandle) btnOldDefault->m_macControl , kControlButtonPart ,
|
||||||
|
kControlPushButtonDefaultTag , sizeof( Boolean ) , (char*)(&inData) ) ;
|
||||||
|
}
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
inData = 1;
|
||||||
|
::SetControlData( (ControlHandle) m_macControl , kControlButtonPart ,
|
||||||
|
kControlPushButtonDefaultTag , sizeof( Boolean ) , (char*)(&inData) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxButton::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize sz = GetDefaultSize() ;
|
||||||
|
|
||||||
|
int wBtn = m_label.Length() * 8 + 12 + 2 * kMacOSXHorizontalBorder ;
|
||||||
|
|
||||||
|
if (wBtn > sz.x) sz.x = wBtn;
|
||||||
|
|
||||||
|
return sz ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxButton::GetDefaultSize()
|
||||||
|
{
|
||||||
|
int wBtn = 70 ;
|
||||||
|
int hBtn = 20 ;
|
||||||
|
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
wBtn += 2 * kMacOSXHorizontalBorder ;
|
||||||
|
hBtn += 2 * kMacOSXVerticalBorder ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxSize(wBtn, hBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxButton::Command (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
HiliteControl( (ControlHandle) m_macControl , kControlButtonPart ) ;
|
||||||
|
unsigned long finalTicks ;
|
||||||
|
Delay( 8 , &finalTicks ) ;
|
||||||
|
HiliteControl( (ControlHandle) m_macControl , 0 ) ;
|
||||||
|
}
|
||||||
|
ProcessCommand (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxButton::MacHandleControlClick( WXWidget WXUNUSED(control) , wxInt16 controlpart , bool WXUNUSED(mouseStillDown) )
|
||||||
|
{
|
||||||
|
if ( controlpart != kControlNoPart )
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId );
|
||||||
|
event.SetEventObject(this);
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
7
src/mac/classic/carbrsrc.r
Normal file
7
src/mac/classic/carbrsrc.r
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// carbon for 9
|
||||||
|
data 'carb' (0) {
|
||||||
|
$"0000" /* .. */
|
||||||
|
};
|
||||||
|
|
||||||
|
// the plist resource should only be included in the application
|
||||||
|
// since it contains the bundle information and should not be duplicated
|
||||||
179
src/mac/classic/checkbox.cpp
Normal file
179
src/mac/classic/checkbox.cpp
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: checkbox.cpp
|
||||||
|
// Purpose: wxCheckBox
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "checkbox.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/checkbox.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// Single check box item
|
||||||
|
bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxCheckBoxBase::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , label , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
SInt16 maxValue = 1 /* kControlCheckboxCheckedValue */;
|
||||||
|
if (style & wxCHK_3STATE)
|
||||||
|
{
|
||||||
|
maxValue = 2 /* kControlCheckboxMixedValue */;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , maxValue,
|
||||||
|
kControlCheckBoxProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckBox::SetValue(bool val)
|
||||||
|
{
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
Set3StateValue(wxCHK_CHECKED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Set3StateValue(wxCHK_UNCHECKED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCheckBox::GetValue() const
|
||||||
|
{
|
||||||
|
return (DoGet3StateValue() != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckBox::Command (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
int state = event.GetInt();
|
||||||
|
|
||||||
|
wxCHECK_RET( (state == wxCHK_UNCHECKED) || (state == wxCHK_CHECKED)
|
||||||
|
|| (state == wxCHK_UNDETERMINED),
|
||||||
|
wxT("event.GetInt() returned an invalid checkbox state") );
|
||||||
|
|
||||||
|
Set3StateValue((wxCheckBoxState) state);
|
||||||
|
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCheckBoxState wxCheckBox::DoGet3StateValue() const
|
||||||
|
{
|
||||||
|
return (wxCheckBoxState) ::GetControl32BitValue( (ControlHandle) m_macControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckBox::DoSet3StateValue(wxCheckBoxState val)
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( (ControlHandle) m_macControl , (int) val) ;
|
||||||
|
MacRedrawControl() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckBox::MacHandleControlClick( WXWidget WXUNUSED(control), wxInt16 WXUNUSED(controlpart) , bool WXUNUSED(mouseStillDown) )
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId );
|
||||||
|
wxCheckBoxState state = Get3StateValue();
|
||||||
|
|
||||||
|
if (state == wxCHK_UNCHECKED)
|
||||||
|
{
|
||||||
|
state = wxCHK_CHECKED;
|
||||||
|
}
|
||||||
|
else if (state == wxCHK_CHECKED)
|
||||||
|
{
|
||||||
|
// If the style flag to allow the user setting the undetermined state
|
||||||
|
// is set, then set the state to undetermined. Otherwise set state to
|
||||||
|
// unchecked.
|
||||||
|
if ( Is3rdStateAllowedForUser() )
|
||||||
|
{
|
||||||
|
state = wxCHK_UNDETERMINED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
state = wxCHK_UNCHECKED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (state == wxCHK_UNDETERMINED)
|
||||||
|
{
|
||||||
|
state = wxCHK_UNCHECKED;
|
||||||
|
}
|
||||||
|
Set3StateValue(state);
|
||||||
|
|
||||||
|
event.SetInt(state);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bitmap checkbox
|
||||||
|
bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxBitmap *label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
SetName(name);
|
||||||
|
SetValidator(validator);
|
||||||
|
m_windowStyle = style;
|
||||||
|
|
||||||
|
if (parent) parent->AddChild(this);
|
||||||
|
|
||||||
|
if ( id == -1 )
|
||||||
|
m_windowId = NewControlId();
|
||||||
|
else
|
||||||
|
m_windowId = id;
|
||||||
|
|
||||||
|
// TODO: Create the bitmap checkbox
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapCheckBox::SetLabel(const wxBitmap *bitmap)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
wxFAIL_MSG(wxT("wxBitmapCheckBox::SetLabel() not yet implemented"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapCheckBox::SetSize(int x, int y, int width, int height, int sizeFlags)
|
||||||
|
{
|
||||||
|
wxControl::SetSize( x , y , width , height , sizeFlags ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapCheckBox::SetValue(bool val)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
wxFAIL_MSG(wxT("wxBitmapCheckBox::SetValue() not yet implemented"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxBitmapCheckBox::GetValue() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
wxFAIL_MSG(wxT("wxBitmapCheckBox::GetValue() not yet implemented"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
453
src/mac/classic/checklst.cpp
Normal file
453
src/mac/classic/checklst.cpp
Normal file
@@ -0,0 +1,453 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: checklst.cpp
|
||||||
|
// Purpose: implementation of wxCheckListBox class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// headers & declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "checklst.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#if wxUSE_CHECKLISTBOX
|
||||||
|
|
||||||
|
#include "wx/checklst.h"
|
||||||
|
#include "wx/arrstr.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include <Appearance.h>
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation of wxCheckListBox
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
|
||||||
|
|
||||||
|
const short kwxMacListWithVerticalScrollbar = 128 ;
|
||||||
|
const short kwxMacListItemHeight = 14 ;
|
||||||
|
const short kwxMacListCheckboxWidth = 14 ;
|
||||||
|
|
||||||
|
#if PRAGMA_STRUCT_ALIGN
|
||||||
|
#pragma options align=mac68k
|
||||||
|
#elif PRAGMA_STRUCT_PACKPUSH
|
||||||
|
#pragma pack(push, 2)
|
||||||
|
#elif PRAGMA_STRUCT_PACK
|
||||||
|
#pragma pack(2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned short instruction;
|
||||||
|
void (*function)();
|
||||||
|
} ldefRec, *ldefPtr, **ldefHandle;
|
||||||
|
|
||||||
|
#if PRAGMA_STRUCT_ALIGN
|
||||||
|
#pragma options align=reset
|
||||||
|
#elif PRAGMA_STRUCT_PACKPUSH
|
||||||
|
#pragma pack(pop)
|
||||||
|
#elif PRAGMA_STRUCT_PACK
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Rect *drawRect,
|
||||||
|
Cell cell, short dataOffset, short dataLength,
|
||||||
|
ListHandle listHandle ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Rect *drawRect,
|
||||||
|
Cell cell, short dataOffset, short dataLength,
|
||||||
|
ListHandle listHandle )
|
||||||
|
{
|
||||||
|
wxCheckListBox* list;
|
||||||
|
list = (wxCheckListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) );
|
||||||
|
if ( list == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
GrafPtr savePort;
|
||||||
|
GrafPtr grafPtr;
|
||||||
|
RgnHandle savedClipRegion;
|
||||||
|
SInt32 savedPenMode;
|
||||||
|
GetPort(&savePort);
|
||||||
|
SetPort((**listHandle).port);
|
||||||
|
grafPtr = (**listHandle).port ;
|
||||||
|
// typecast our refCon
|
||||||
|
|
||||||
|
// Calculate the cell rect.
|
||||||
|
|
||||||
|
switch( message ) {
|
||||||
|
case lInitMsg:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case lCloseMsg:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case lDrawMsg:
|
||||||
|
{
|
||||||
|
const wxString text = list->m_stringArray[cell.v] ;
|
||||||
|
int checked = list->m_checks[cell.v] ;
|
||||||
|
|
||||||
|
// Save the current clip region, and set the clip region to the area we are about
|
||||||
|
// to draw.
|
||||||
|
|
||||||
|
savedClipRegion = NewRgn();
|
||||||
|
GetClip( savedClipRegion );
|
||||||
|
|
||||||
|
ClipRect( drawRect );
|
||||||
|
EraseRect( drawRect );
|
||||||
|
|
||||||
|
const wxFont& font = list->GetFont();
|
||||||
|
if ( font.Ok() )
|
||||||
|
{
|
||||||
|
::TextFont( font.GetMacFontNum() ) ;
|
||||||
|
::TextSize( font.GetMacFontSize()) ;
|
||||||
|
::TextFace( font.GetMacFontStyle() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeButtonDrawInfo info ;
|
||||||
|
info.state = kThemeStateActive ;
|
||||||
|
info.value = checked ? kThemeButtonOn : kThemeButtonOff ;
|
||||||
|
info.adornment = kThemeAdornmentNone ;
|
||||||
|
Rect checkRect = *drawRect ;
|
||||||
|
|
||||||
|
|
||||||
|
checkRect.left +=0 ;
|
||||||
|
checkRect.top +=0 ;
|
||||||
|
checkRect.right = checkRect.left + list->m_checkBoxWidth ;
|
||||||
|
checkRect.bottom = checkRect.top + list->m_checkBoxHeight ;
|
||||||
|
DrawThemeButton(&checkRect,kThemeCheckBox,
|
||||||
|
&info,NULL,NULL, NULL,0);
|
||||||
|
|
||||||
|
MoveTo(drawRect->left + 2 + list->m_checkBoxWidth+2, drawRect->top + list->m_TextBaseLineOffset );
|
||||||
|
|
||||||
|
DrawText(text, 0 , text.Length());
|
||||||
|
// If the cell is hilited, do the hilite now. Paint the cell contents with the
|
||||||
|
// appropriate QuickDraw transform mode.
|
||||||
|
|
||||||
|
if( isSelected ) {
|
||||||
|
savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
|
||||||
|
SetPortPenMode( (CGrafPtr) grafPtr, hilitetransfermode );
|
||||||
|
PaintRect( drawRect );
|
||||||
|
SetPortPenMode( (CGrafPtr) grafPtr, savedPenMode );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore the saved clip region.
|
||||||
|
|
||||||
|
SetClip( savedClipRegion );
|
||||||
|
DisposeRgn( savedClipRegion );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case lHiliteMsg:
|
||||||
|
|
||||||
|
// Hilite or unhilite the cell. Paint the cell contents with the
|
||||||
|
// appropriate QuickDraw transform mode.
|
||||||
|
|
||||||
|
GetPort( &grafPtr );
|
||||||
|
savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
|
||||||
|
SetPortPenMode( (CGrafPtr) grafPtr, hilitetransfermode );
|
||||||
|
PaintRect( drawRect );
|
||||||
|
SetPortPenMode( (CGrafPtr) grafPtr, savedPenMode );
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
SetPort(savePort);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
|
||||||
|
|
||||||
|
static ListDefUPP macCheckListDefUPP = NULL ;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// creation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxCheckListBox::Init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCheckListBox::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint &pos,
|
||||||
|
const wxSize &size,
|
||||||
|
const wxArrayString& choices,
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString &name)
|
||||||
|
{
|
||||||
|
wxCArrayString chs(choices);
|
||||||
|
|
||||||
|
return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(),
|
||||||
|
style, validator, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCheckListBox::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint &pos,
|
||||||
|
const wxSize &size,
|
||||||
|
int n,
|
||||||
|
const wxString choices[],
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString &name)
|
||||||
|
{
|
||||||
|
if ( !wxCheckListBoxBase::Create(parent, id, pos, size,
|
||||||
|
n, choices, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_noItems = 0 ; // this will be increased by our append command
|
||||||
|
m_selected = 0;
|
||||||
|
|
||||||
|
m_checkBoxWidth = 12;
|
||||||
|
m_checkBoxHeight= 10;
|
||||||
|
|
||||||
|
long h = m_checkBoxHeight ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
GetThemeMetric(kThemeMetricCheckBoxWidth,(long *)&m_checkBoxWidth);
|
||||||
|
GetThemeMetric(kThemeMetricCheckBoxHeight,&h);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const wxFont& font = GetFont();
|
||||||
|
|
||||||
|
FontInfo finfo;
|
||||||
|
FetchFontInfo(font.GetMacFontNum(),font.GetMacFontSize(),font.GetMacFontStyle(),&finfo);
|
||||||
|
|
||||||
|
m_TextBaseLineOffset= finfo.leading+finfo.ascent;
|
||||||
|
m_checkBoxHeight= finfo.leading+finfo.ascent+finfo.descent;
|
||||||
|
|
||||||
|
if (m_checkBoxHeight<h)
|
||||||
|
{
|
||||||
|
m_TextBaseLineOffset+= (h-m_checkBoxHeight)/2;
|
||||||
|
m_checkBoxHeight= h;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
ListDefSpec listDef;
|
||||||
|
listDef.defType = kListDefUserProcType;
|
||||||
|
if ( macCheckListDefUPP == NULL )
|
||||||
|
{
|
||||||
|
macCheckListDefUPP = NewListDefUPP( wxMacCheckListDefinition );
|
||||||
|
}
|
||||||
|
listDef.u.userProc = macCheckListDefUPP ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
Size asize;
|
||||||
|
|
||||||
|
|
||||||
|
CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true,
|
||||||
|
m_checkBoxHeight+2, 14, false, &listDef, (ControlRef *)&m_macControl );
|
||||||
|
|
||||||
|
GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag,
|
||||||
|
sizeof(ListHandle), (Ptr) &m_macList, &asize);
|
||||||
|
|
||||||
|
SetControlReference( (ControlHandle) m_macControl, (long) this);
|
||||||
|
SetControlVisibility( (ControlHandle) m_macControl, false, false);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
long result ;
|
||||||
|
|
||||||
|
wxStAppResource resload ;
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false ,
|
||||||
|
kwxMacListWithVerticalScrollbar , 0 , 0,
|
||||||
|
kControlListBoxProc , (long) this ) ;
|
||||||
|
::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxListHandleTag ,
|
||||||
|
sizeof( ListHandle ) , (char*) &m_macList , &result ) ;
|
||||||
|
|
||||||
|
HLock( (Handle) m_macList ) ;
|
||||||
|
ldefHandle ldef ;
|
||||||
|
ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ;
|
||||||
|
if ( (**(ListHandle)m_macList).listDefProc != NULL )
|
||||||
|
{
|
||||||
|
(**ldef).instruction = 0x4EF9; /* JMP instruction */
|
||||||
|
(**ldef).function = (void(*)()) listDef.u.userProc;
|
||||||
|
(**(ListHandle)m_macList).listDefProc = (Handle) ldef ;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point pt = (**(ListHandle)m_macList).cellSize ;
|
||||||
|
pt.v = 14 ;
|
||||||
|
LCellSize( pt , (ListHandle)m_macList ) ;
|
||||||
|
LAddColumn( 1 , 0 , (ListHandle)m_macList ) ;
|
||||||
|
#endif
|
||||||
|
OptionBits options = 0;
|
||||||
|
if ( style & wxLB_MULTIPLE )
|
||||||
|
{
|
||||||
|
options += lNoExtend ;
|
||||||
|
}
|
||||||
|
else if ( style & wxLB_EXTENDED )
|
||||||
|
{
|
||||||
|
options += lExtendDrag ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
options = (OptionBits) lOnlyOne ;
|
||||||
|
}
|
||||||
|
SetListSelectionFlags((ListHandle)m_macList, options);
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i++ )
|
||||||
|
{
|
||||||
|
Append( choices[i] ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
LSetDrawingMode( true , (ListHandle) m_macList ) ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxCheckListBox functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxCheckListBox::IsChecked(size_t item) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( item < m_checks.GetCount(), FALSE,
|
||||||
|
_T("invalid index in wxCheckListBox::IsChecked") );
|
||||||
|
|
||||||
|
return m_checks[item] != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckListBox::Check(size_t item, bool check)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( item < m_checks.GetCount(),
|
||||||
|
_T("invalid index in wxCheckListBox::Check") );
|
||||||
|
|
||||||
|
// intermediate var is needed to avoid compiler warning with VC++
|
||||||
|
bool isChecked = m_checks[item] != 0;
|
||||||
|
if ( check != isChecked )
|
||||||
|
{
|
||||||
|
m_checks[item] = check;
|
||||||
|
|
||||||
|
MacRedrawControl() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// methods forwarded to wxListBox
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxCheckListBox::Delete(int n)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( n < GetCount(), _T("invalid index in wxListBox::Delete") );
|
||||||
|
|
||||||
|
wxListBox::Delete(n);
|
||||||
|
|
||||||
|
m_checks.RemoveAt(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxCheckListBox::DoAppend(const wxString& item)
|
||||||
|
{
|
||||||
|
LSetDrawingMode( false , (ListHandle) m_macList ) ;
|
||||||
|
int pos = wxListBox::DoAppend(item);
|
||||||
|
|
||||||
|
// the item is initially unchecked
|
||||||
|
m_checks.Insert(FALSE, pos);
|
||||||
|
LSetDrawingMode( true , (ListHandle) m_macList ) ;
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckListBox::DoInsertItems(const wxArrayString& items, int pos)
|
||||||
|
{
|
||||||
|
wxListBox::DoInsertItems(items, pos);
|
||||||
|
|
||||||
|
size_t count = items.GetCount();
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
m_checks.Insert(FALSE, pos + n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData)
|
||||||
|
{
|
||||||
|
// call it first as it does DoClear()
|
||||||
|
wxListBox::DoSetItems(items, clientData);
|
||||||
|
|
||||||
|
size_t count = items.GetCount();
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
m_checks.Add(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckListBox::DoClear()
|
||||||
|
{
|
||||||
|
m_checks.Empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
|
||||||
|
EVT_CHAR(wxCheckListBox::OnChar)
|
||||||
|
EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
// this will only work as soon as
|
||||||
|
|
||||||
|
void wxCheckListBox::OnChar(wxKeyEvent& event)
|
||||||
|
{
|
||||||
|
if ( event.GetKeyCode() == WXK_SPACE )
|
||||||
|
{
|
||||||
|
int index = GetSelection() ;
|
||||||
|
if ( index >= 0 )
|
||||||
|
{
|
||||||
|
Check(index, !IsChecked(index) ) ;
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId());
|
||||||
|
event.SetInt(index);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCheckListBox::OnLeftClick(wxMouseEvent& event)
|
||||||
|
{
|
||||||
|
// clicking on the item selects it, clicking on the checkmark toggles
|
||||||
|
if ( event.GetX() <= 20 /*check width*/ ) {
|
||||||
|
int lineheight ;
|
||||||
|
int topcell ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
Point pt ;
|
||||||
|
GetListCellSize( (ListHandle)m_macList , &pt ) ;
|
||||||
|
lineheight = pt.v ;
|
||||||
|
ListBounds visible ;
|
||||||
|
GetListVisibleCells( (ListHandle)m_macList , &visible ) ;
|
||||||
|
topcell = visible.top ;
|
||||||
|
#else
|
||||||
|
lineheight = (**(ListHandle)m_macList).cellSize.v ;
|
||||||
|
topcell = (**(ListHandle)m_macList).visible.top ;
|
||||||
|
#endif
|
||||||
|
size_t nItem = ((size_t)event.GetY()) / lineheight + topcell ;
|
||||||
|
|
||||||
|
if ( nItem < (size_t)m_noItems )
|
||||||
|
{
|
||||||
|
Check(nItem, !IsChecked(nItem) ) ;
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId());
|
||||||
|
event.SetInt(nItem);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
//else: it's not an error, just click outside of client zone
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// implement default behaviour: clicking on the item selects it
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_CHECKLISTBOX
|
||||||
300
src/mac/classic/choice.cpp
Normal file
300
src/mac/classic/choice.cpp
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: choice.cpp
|
||||||
|
// Purpose: wxChoice
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "choice.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/choice.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern MenuHandle NewUniqueMenu() ;
|
||||||
|
|
||||||
|
wxChoice::~wxChoice()
|
||||||
|
{
|
||||||
|
if ( HasClientObjectData() )
|
||||||
|
{
|
||||||
|
size_t i, max = GetCount();
|
||||||
|
|
||||||
|
for ( i = 0; i < max; ++i )
|
||||||
|
delete GetClientObject(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteMenu( m_macPopUpMenuId ) ;
|
||||||
|
// DisposeMenu( m_macPopUpMenuHandle ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxChoice::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
const wxArrayString& choices,
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
wxCArrayString chs(choices);
|
||||||
|
|
||||||
|
return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(),
|
||||||
|
style, validator, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxChoice::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
int n, const wxString choices[],
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxChoiceBase::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , -12345 , 0 ,
|
||||||
|
kControlPopupButtonProc + kControlPopupFixedWidthVariant , (long) this ) ;
|
||||||
|
|
||||||
|
m_macPopUpMenuHandle = NewUniqueMenu() ;
|
||||||
|
SetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlPopupButtonMenuHandleTag , sizeof( MenuHandle ) , (char*) &m_macPopUpMenuHandle) ;
|
||||||
|
SetControl32BitMinimum( (ControlHandle) m_macControl , 0 ) ;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , 0) ;
|
||||||
|
if ( n > 0 )
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , 1 ) ;
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
// TODO wxCB_SORT
|
||||||
|
for ( int i = 0; i < n; i++ )
|
||||||
|
{
|
||||||
|
Append(choices[i]);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// adding/deleting items to/from the list
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
int wxChoice::DoAppend(const wxString& item)
|
||||||
|
{
|
||||||
|
UMAAppendMenuItem(MAC_WXHMENU( m_macPopUpMenuHandle ) , item, m_font.GetEncoding() );
|
||||||
|
m_strings.Add( item ) ;
|
||||||
|
m_datas.Add( NULL ) ;
|
||||||
|
int index = m_strings.GetCount() - 1 ;
|
||||||
|
DoSetItemClientData( index , NULL ) ;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , GetCount()) ;
|
||||||
|
return index ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxChoice::DoInsert(const wxString& item, int pos)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
|
||||||
|
wxCHECK_MSG((pos>=0) && (pos<=GetCount()), -1, wxT("invalid index"));
|
||||||
|
|
||||||
|
if (pos == GetCount())
|
||||||
|
return DoAppend(item);
|
||||||
|
|
||||||
|
UMAAppendMenuItem(MAC_WXHMENU( m_macPopUpMenuHandle ) , item, m_font.GetEncoding() );
|
||||||
|
m_strings.Insert( item, pos ) ;
|
||||||
|
m_datas.Insert( NULL, pos ) ;
|
||||||
|
DoSetItemClientData( pos , NULL ) ;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , pos) ;
|
||||||
|
return pos ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::Delete(int n)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( n < GetCount(), wxT("invalid item index in wxChoice::Delete") );
|
||||||
|
if ( HasClientObjectData() )
|
||||||
|
{
|
||||||
|
delete GetClientObject(n);
|
||||||
|
}
|
||||||
|
::DeleteMenuItem( MAC_WXHMENU(m_macPopUpMenuHandle) , n + 1) ;
|
||||||
|
m_strings.RemoveAt( n ) ;
|
||||||
|
m_datas.RemoveAt( n ) ;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , GetCount()) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::Clear()
|
||||||
|
{
|
||||||
|
FreeData();
|
||||||
|
for ( int i = 0 ; i < GetCount() ; i++ )
|
||||||
|
{
|
||||||
|
::DeleteMenuItem( MAC_WXHMENU(m_macPopUpMenuHandle) , 1 ) ;
|
||||||
|
}
|
||||||
|
m_strings.Empty() ;
|
||||||
|
m_datas.Empty() ;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , 0 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::FreeData()
|
||||||
|
{
|
||||||
|
if ( HasClientObjectData() )
|
||||||
|
{
|
||||||
|
size_t count = GetCount();
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
delete GetClientObject(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// selection
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
int wxChoice::GetSelection() const
|
||||||
|
{
|
||||||
|
return GetControl32BitValue( (ControlHandle) m_macControl ) -1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::SetSelection(int n)
|
||||||
|
{
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , n + 1 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// string list functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
int wxChoice::GetCount() const
|
||||||
|
{
|
||||||
|
return m_strings.GetCount() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxChoice::FindString(const wxString& s) const
|
||||||
|
{
|
||||||
|
for( int i = 0 ; i < GetCount() ; i++ )
|
||||||
|
{
|
||||||
|
if ( GetString( i ).IsSameAs(s, FALSE) )
|
||||||
|
return i ;
|
||||||
|
}
|
||||||
|
return wxNOT_FOUND ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::SetString(int n, const wxString& s)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("wxChoice::SetString() not yet implemented"));
|
||||||
|
#if 0 // should do this, but no Insert() so far
|
||||||
|
Delete(n);
|
||||||
|
Insert(n + 1, s);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxChoice::GetString(int n) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( n >= 0 && (size_t)n < m_strings.GetCount(), _T(""),
|
||||||
|
_T("wxChoice::GetString(): invalid index") );
|
||||||
|
|
||||||
|
return m_strings[n] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// client data
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void wxChoice::DoSetItemClientData( int n, void* clientData )
|
||||||
|
{
|
||||||
|
wxCHECK_RET( n >= 0 && (size_t)n < m_datas.GetCount(),
|
||||||
|
wxT("invalid index in wxChoice::SetClientData") );
|
||||||
|
|
||||||
|
m_datas[n] = (char*) clientData ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *wxChoice::DoGetItemClientData(int n) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( n >= 0 && (size_t)n < m_datas.GetCount(), NULL,
|
||||||
|
wxT("invalid index in wxChoice::GetClientData") );
|
||||||
|
return (void *)m_datas[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::DoSetItemClientObject( int n, wxClientData* clientData )
|
||||||
|
{
|
||||||
|
DoSetItemClientData(n, clientData);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxClientData* wxChoice::DoGetItemClientObject( int n ) const
|
||||||
|
{
|
||||||
|
return (wxClientData *)DoGetItemClientData(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxChoice::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED(mouseStillDown))
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId );
|
||||||
|
int n = GetSelection();
|
||||||
|
// actually n should be made sure by the os to be a valid selection, but ...
|
||||||
|
if ( n > -1 )
|
||||||
|
{
|
||||||
|
event.SetInt( n );
|
||||||
|
event.SetString(GetStringSelection());
|
||||||
|
event.SetEventObject(this);
|
||||||
|
if ( HasClientObjectData() )
|
||||||
|
event.SetClientObject( GetClientObject(n) );
|
||||||
|
else if ( HasClientUntypedData() )
|
||||||
|
event.SetClientData( GetClientData(n) );
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxChoice::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
int lbWidth = GetCount() > 0 ? 20 : 100; // some defaults
|
||||||
|
int lbHeight = 20;
|
||||||
|
int wLine;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
long metric ;
|
||||||
|
GetThemeMetric(kThemeMetricPopupButtonHeight , &metric );
|
||||||
|
lbHeight = metric ;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ;
|
||||||
|
if ( m_font.Ok() )
|
||||||
|
{
|
||||||
|
::TextFont( m_font.GetMacFontNum() ) ;
|
||||||
|
::TextSize( m_font.GetMacFontSize() ) ;
|
||||||
|
::TextFace( m_font.GetMacFontStyle() ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::TextFont( kFontIDMonaco ) ;
|
||||||
|
::TextSize( 9 );
|
||||||
|
::TextFace( 0 ) ;
|
||||||
|
}
|
||||||
|
// Find the widest line
|
||||||
|
for(int i = 0; i < GetCount(); i++) {
|
||||||
|
wxString str(GetString(i));
|
||||||
|
#if wxUSE_UNICODE
|
||||||
|
Point bounds={0,0} ;
|
||||||
|
SInt16 baseline ;
|
||||||
|
::GetThemeTextDimensions( wxMacCFStringHolder( str , m_font.GetEncoding() ) ,
|
||||||
|
kThemeCurrentPortFont,
|
||||||
|
kThemeStateActive,
|
||||||
|
false,
|
||||||
|
&bounds,
|
||||||
|
&baseline );
|
||||||
|
wLine = bounds.h ;
|
||||||
|
#else
|
||||||
|
wLine = ::TextWidth( str.c_str() , 0 , str.Length() ) ;
|
||||||
|
#endif
|
||||||
|
lbWidth = wxMax(lbWidth, wLine);
|
||||||
|
}
|
||||||
|
// Add room for the popup arrow
|
||||||
|
lbWidth += 2 * lbHeight ;
|
||||||
|
// And just a bit more
|
||||||
|
int cx = ::TextWidth( "X" , 0 , 1 ) ;
|
||||||
|
lbWidth += cx ;
|
||||||
|
|
||||||
|
}
|
||||||
|
return wxSize(lbWidth, lbHeight);
|
||||||
|
}
|
||||||
406
src/mac/classic/clipbrd.cpp
Normal file
406
src/mac/classic/clipbrd.cpp
Normal file
@@ -0,0 +1,406 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: clipbrd.cpp
|
||||||
|
// Purpose: Clipboard functionality
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "clipbrd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/metafile.h"
|
||||||
|
#include "wx/clipbrd.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <Scrap.h>
|
||||||
|
#endif
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#define wxUSE_DATAOBJ 1
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// the trace mask we use with wxLogTrace() - call
|
||||||
|
// wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here
|
||||||
|
// (there will be a *lot* of them!)
|
||||||
|
static const wxChar *TRACE_CLIPBOARD = _T("clipboard");
|
||||||
|
|
||||||
|
void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
|
||||||
|
{
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
OSErr err = noErr ;
|
||||||
|
#else
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
#endif
|
||||||
|
void * data = NULL ;
|
||||||
|
Size byteCount;
|
||||||
|
|
||||||
|
switch (dataFormat.GetType())
|
||||||
|
{
|
||||||
|
case wxDF_OEMTEXT:
|
||||||
|
dataFormat = wxDF_TEXT;
|
||||||
|
// fall through
|
||||||
|
|
||||||
|
case wxDF_TEXT:
|
||||||
|
break;
|
||||||
|
case wxDF_UNICODETEXT:
|
||||||
|
break;
|
||||||
|
case wxDF_BITMAP :
|
||||||
|
case wxDF_METAFILE :
|
||||||
|
break ;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
wxLogError(_("Unsupported clipboard format."));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
ScrapRef scrapRef;
|
||||||
|
|
||||||
|
err = GetCurrentScrap( &scrapRef );
|
||||||
|
if ( err != noTypeErr && err != memFullErr )
|
||||||
|
{
|
||||||
|
ScrapFlavorFlags flavorFlags;
|
||||||
|
|
||||||
|
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
|
||||||
|
{
|
||||||
|
if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr)
|
||||||
|
{
|
||||||
|
Size allocSize = byteCount ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_TEXT )
|
||||||
|
allocSize += 1 ;
|
||||||
|
else if ( dataFormat.GetType() == wxDF_UNICODETEXT )
|
||||||
|
allocSize += 2 ;
|
||||||
|
|
||||||
|
data = new char[ allocSize ] ;
|
||||||
|
|
||||||
|
if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr )
|
||||||
|
{
|
||||||
|
*len = allocSize ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_TEXT )
|
||||||
|
((char*)data)[byteCount] = 0 ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_UNICODETEXT )
|
||||||
|
((wxChar*)data)[byteCount/2] = 0 ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete[] ((char *)data) ;
|
||||||
|
data = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
long offset ;
|
||||||
|
Handle datahandle = NewHandle(0) ;
|
||||||
|
HLock( datahandle ) ;
|
||||||
|
GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ;
|
||||||
|
HUnlock( datahandle ) ;
|
||||||
|
if ( GetHandleSize( datahandle ) > 0 )
|
||||||
|
{
|
||||||
|
byteCount = GetHandleSize( datahandle ) ;
|
||||||
|
Size allocSize = byteCount ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_TEXT )
|
||||||
|
allocSize += 1 ;
|
||||||
|
else if ( dataFormat.GetType() == wxDF_UNICODETEXT )
|
||||||
|
allocSize += 2 ;
|
||||||
|
|
||||||
|
data = new char[ allocSize ] ;
|
||||||
|
|
||||||
|
memcpy( (char*) data , (char*) *datahandle , byteCount ) ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_TEXT )
|
||||||
|
((char*)data)[byteCount] = 0 ;
|
||||||
|
if ( dataFormat.GetType() == wxDF_UNICODETEXT )
|
||||||
|
((wxChar*)data)[byteCount/2] = 0 ;
|
||||||
|
*len = byteCount ;
|
||||||
|
}
|
||||||
|
DisposeHandle( datahandle ) ;
|
||||||
|
#endif
|
||||||
|
if ( err )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Failed to get clipboard data."));
|
||||||
|
|
||||||
|
return NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( dataFormat.GetType() == wxDF_TEXT )
|
||||||
|
{
|
||||||
|
wxMacConvertNewlines10To13( (char*) data ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generalized clipboard implementation by Matthew Flatt
|
||||||
|
*/
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject)
|
||||||
|
|
||||||
|
wxClipboard::wxClipboard()
|
||||||
|
{
|
||||||
|
m_open = false ;
|
||||||
|
m_data = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxClipboard::~wxClipboard()
|
||||||
|
{
|
||||||
|
if (m_data)
|
||||||
|
{
|
||||||
|
delete m_data;
|
||||||
|
m_data = (wxDataObject*) NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxClipboard::Clear()
|
||||||
|
{
|
||||||
|
if (m_data)
|
||||||
|
{
|
||||||
|
delete m_data;
|
||||||
|
m_data = (wxDataObject*) NULL;
|
||||||
|
}
|
||||||
|
#if TARGET_CARBON
|
||||||
|
OSStatus err ;
|
||||||
|
err = ClearCurrentScrap( );
|
||||||
|
#else
|
||||||
|
OSErr err ;
|
||||||
|
err = ZeroScrap( );
|
||||||
|
#endif
|
||||||
|
if ( err )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Failed to empty the clipboard."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::Flush()
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::Open()
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( !m_open, FALSE, wxT("clipboard already open") );
|
||||||
|
m_open = true ;
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::IsOpened() const
|
||||||
|
{
|
||||||
|
return m_open;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::SetData( wxDataObject *data )
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
|
||||||
|
|
||||||
|
wxCHECK_MSG( data, FALSE, wxT("data is invalid") );
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
// as we can only store one wxDataObject, this is the same in this
|
||||||
|
// implementation
|
||||||
|
return AddData( data );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::AddData( wxDataObject *data )
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
|
||||||
|
|
||||||
|
wxCHECK_MSG( data, FALSE, wxT("data is invalid") );
|
||||||
|
|
||||||
|
/* we can only store one wxDataObject */
|
||||||
|
Clear();
|
||||||
|
|
||||||
|
m_data = data;
|
||||||
|
|
||||||
|
/* get formats from wxDataObjects */
|
||||||
|
wxDataFormat *array = new wxDataFormat[ m_data->GetFormatCount() ];
|
||||||
|
m_data->GetAllFormats( array );
|
||||||
|
|
||||||
|
for (size_t i = 0; i < m_data->GetFormatCount(); i++)
|
||||||
|
{
|
||||||
|
wxLogTrace( TRACE_CLIPBOARD,
|
||||||
|
wxT("wxClipboard now supports atom %s"),
|
||||||
|
array[i].GetId().c_str() );
|
||||||
|
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
OSErr err = noErr ;
|
||||||
|
#else
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
#endif
|
||||||
|
size_t sz = data->GetDataSize( array[i] ) ;
|
||||||
|
void* buf = malloc( sz + 1 ) ;
|
||||||
|
if ( buf )
|
||||||
|
{
|
||||||
|
data->GetDataHere( array[i] , buf ) ;
|
||||||
|
OSType mactype = 0 ;
|
||||||
|
switch ( array[i].GetType() )
|
||||||
|
{
|
||||||
|
case wxDF_TEXT:
|
||||||
|
case wxDF_OEMTEXT:
|
||||||
|
mactype = kScrapFlavorTypeText ;
|
||||||
|
break ;
|
||||||
|
#if wxUSE_UNICODE
|
||||||
|
case wxDF_UNICODETEXT :
|
||||||
|
mactype = kScrapFlavorTypeUnicode ;
|
||||||
|
break ;
|
||||||
|
#endif
|
||||||
|
#if wxUSE_DRAG_AND_DROP
|
||||||
|
case wxDF_METAFILE:
|
||||||
|
mactype = kScrapFlavorTypePicture ;
|
||||||
|
break ;
|
||||||
|
#endif
|
||||||
|
case wxDF_BITMAP:
|
||||||
|
case wxDF_DIB:
|
||||||
|
mactype = kScrapFlavorTypePicture ;
|
||||||
|
break ;
|
||||||
|
default:
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
UMAPutScrap( sz , mactype , buf ) ;
|
||||||
|
free( buf ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] array;
|
||||||
|
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxClipboard::Close()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_open, wxT("clipboard not open") );
|
||||||
|
|
||||||
|
m_open = false ;
|
||||||
|
|
||||||
|
// Get rid of cached object. If this is not done copying from another application will
|
||||||
|
// only work once
|
||||||
|
if (m_data)
|
||||||
|
{
|
||||||
|
delete m_data;
|
||||||
|
m_data = (wxDataObject*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::IsSupported( const wxDataFormat &dataFormat )
|
||||||
|
{
|
||||||
|
if ( m_data )
|
||||||
|
{
|
||||||
|
return m_data->IsSupported( dataFormat ) ;
|
||||||
|
}
|
||||||
|
#if TARGET_CARBON
|
||||||
|
OSStatus err = noErr;
|
||||||
|
ScrapRef scrapRef;
|
||||||
|
|
||||||
|
err = GetCurrentScrap( &scrapRef );
|
||||||
|
if ( err != noTypeErr && err != memFullErr )
|
||||||
|
{
|
||||||
|
ScrapFlavorFlags flavorFlags;
|
||||||
|
Size byteCount;
|
||||||
|
|
||||||
|
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
|
||||||
|
{
|
||||||
|
if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr)
|
||||||
|
{
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
#else
|
||||||
|
long offset ;
|
||||||
|
Handle datahandle = NewHandle(0) ;
|
||||||
|
HLock( datahandle ) ;
|
||||||
|
GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ;
|
||||||
|
HUnlock( datahandle ) ;
|
||||||
|
bool hasData = GetHandleSize( datahandle ) > 0 ;
|
||||||
|
DisposeHandle( datahandle ) ;
|
||||||
|
return hasData ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxClipboard::GetData( wxDataObject& data )
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
|
||||||
|
|
||||||
|
size_t formatcount = data.GetFormatCount() + 1 ;
|
||||||
|
wxDataFormat *array = new wxDataFormat[ formatcount ];
|
||||||
|
array[0] = data.GetPreferredFormat();
|
||||||
|
data.GetAllFormats( &array[1] );
|
||||||
|
|
||||||
|
bool transferred = false ;
|
||||||
|
|
||||||
|
if ( m_data )
|
||||||
|
{
|
||||||
|
for (size_t i = 0; !transferred && i < formatcount ; i++)
|
||||||
|
{
|
||||||
|
wxDataFormat format = array[i] ;
|
||||||
|
if ( m_data->IsSupported( format ) )
|
||||||
|
{
|
||||||
|
int size = m_data->GetDataSize( format );
|
||||||
|
transferred = true ;
|
||||||
|
|
||||||
|
if (size == 0)
|
||||||
|
{
|
||||||
|
data.SetData(format , 0 , 0 ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *d = new char[size];
|
||||||
|
m_data->GetDataHere( format , (void*) d );
|
||||||
|
data.SetData( format , size , d ) ;
|
||||||
|
delete[] d ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* get formats from wxDataObjects */
|
||||||
|
if ( !transferred )
|
||||||
|
{
|
||||||
|
for (size_t i = 0; !transferred && i < formatcount ; i++)
|
||||||
|
{
|
||||||
|
wxDataFormat format = array[i] ;
|
||||||
|
|
||||||
|
switch ( format.GetType() )
|
||||||
|
{
|
||||||
|
case wxDF_TEXT :
|
||||||
|
case wxDF_OEMTEXT :
|
||||||
|
case wxDF_BITMAP :
|
||||||
|
case wxDF_METAFILE :
|
||||||
|
{
|
||||||
|
long len ;
|
||||||
|
char* s = (char*)wxGetClipboardData(format, &len );
|
||||||
|
if ( s )
|
||||||
|
{
|
||||||
|
data.SetData( format , len , s ) ;
|
||||||
|
delete [] s;
|
||||||
|
|
||||||
|
transferred = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] array ;
|
||||||
|
return transferred ;
|
||||||
|
}
|
||||||
70
src/mac/classic/colordlg.cpp
Normal file
70
src/mac/classic/colordlg.cpp
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: colordlg.cpp
|
||||||
|
// Purpose: wxColourDialog class. NOTE: you can use the generic class
|
||||||
|
// if you wish, instead of implementing this.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "colordlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/colordlg.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxColourDialog, wxDialog)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <ColorPicker.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxColourDialog
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxColourDialog::wxColourDialog()
|
||||||
|
{
|
||||||
|
m_dialogParent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColourDialog::wxColourDialog(wxWindow *parent, wxColourData *data)
|
||||||
|
{
|
||||||
|
Create(parent, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxColourDialog::Create(wxWindow *parent, wxColourData *data)
|
||||||
|
{
|
||||||
|
m_dialogParent = parent;
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
m_colourData = *data;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxColourDialog::ShowModal()
|
||||||
|
{
|
||||||
|
Point where ;
|
||||||
|
RGBColor currentColor = *((RGBColor*)m_colourData.m_dataColour.GetPixel()) , newColor ;
|
||||||
|
|
||||||
|
where.h = where.v = -1;
|
||||||
|
|
||||||
|
if (GetColor( where, "\pSelect a new palette color.", ¤tColor, &newColor ))
|
||||||
|
{
|
||||||
|
m_colourData.m_dataColour.Set( (WXCOLORREF*) &newColor ) ;
|
||||||
|
return wxID_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return wxID_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxID_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
116
src/mac/classic/colour.cpp
Normal file
116
src/mac/classic/colour.cpp
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: colour.cpp
|
||||||
|
// Purpose: wxColour class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "colour.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/colour.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxColour, wxObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Colour
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
static void wxComposeRGBColor( WXCOLORREF* color , int red, int blue, int green ) ;
|
||||||
|
static void wxComposeRGBColor( WXCOLORREF* color , int red, int blue, int green )
|
||||||
|
{
|
||||||
|
RGBColor* col = (RGBColor*) color ;
|
||||||
|
col->red = (red << 8) + red;
|
||||||
|
col->blue = (blue << 8) + blue;
|
||||||
|
col->green = (green << 8) + green;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxColour::Init()
|
||||||
|
{
|
||||||
|
m_isInit = false;
|
||||||
|
m_red =
|
||||||
|
m_blue =
|
||||||
|
m_green = 0;
|
||||||
|
|
||||||
|
wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColour::wxColour (const wxColour& col)
|
||||||
|
: wxObject()
|
||||||
|
{
|
||||||
|
m_red = col.m_red;
|
||||||
|
m_green = col.m_green;
|
||||||
|
m_blue = col.m_blue;
|
||||||
|
m_isInit = col.m_isInit;
|
||||||
|
|
||||||
|
memcpy( &m_pixel , &col.m_pixel , 6 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColour::wxColour (const wxColour* col)
|
||||||
|
{
|
||||||
|
m_red = col->m_red;
|
||||||
|
m_green = col->m_green;
|
||||||
|
m_blue = col->m_blue;
|
||||||
|
m_isInit = col->m_isInit;
|
||||||
|
|
||||||
|
memcpy( &m_pixel , &col->m_pixel , 6 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColour& wxColour::operator =(const wxColour& col)
|
||||||
|
{
|
||||||
|
m_red = col.m_red;
|
||||||
|
m_green = col.m_green;
|
||||||
|
m_blue = col.m_blue;
|
||||||
|
m_isInit = col.m_isInit;
|
||||||
|
|
||||||
|
memcpy( &m_pixel , &col.m_pixel , 6 ) ;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxColour::InitFromName(const wxString& name)
|
||||||
|
{
|
||||||
|
if ( wxTheColourDatabase )
|
||||||
|
{
|
||||||
|
wxColour col = wxTheColourDatabase->Find(name);
|
||||||
|
if ( col.Ok() )
|
||||||
|
{
|
||||||
|
*this = col;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// leave invalid
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxColour::~wxColour ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxColour::Set (unsigned char r, unsigned char g, unsigned char b)
|
||||||
|
{
|
||||||
|
m_red = r;
|
||||||
|
m_green = g;
|
||||||
|
m_blue = b;
|
||||||
|
m_isInit = true;
|
||||||
|
|
||||||
|
wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxColour::Set( const WXCOLORREF* color )
|
||||||
|
{
|
||||||
|
RGBColor* col = (RGBColor*) color ;
|
||||||
|
memcpy( &m_pixel , color , 6 ) ;
|
||||||
|
m_red = col->red>>8 ;
|
||||||
|
m_blue = col->blue>>8 ;
|
||||||
|
m_green = col->green>>8 ;
|
||||||
|
}
|
||||||
540
src/mac/classic/combobox.cpp
Normal file
540
src/mac/classic/combobox.cpp
Normal file
@@ -0,0 +1,540 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: combobox.cpp
|
||||||
|
// Purpose: wxComboBox class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "combobox.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/combobox.h"
|
||||||
|
#include "wx/button.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// composite combobox implementation by Dan "Bud" Keith bud@otsys.com
|
||||||
|
|
||||||
|
|
||||||
|
static int nextPopUpMenuId = 1000 ;
|
||||||
|
MenuHandle NewUniqueMenu()
|
||||||
|
{
|
||||||
|
MenuHandle handle = NewMenu( nextPopUpMenuId , "\pMenu" ) ;
|
||||||
|
nextPopUpMenuId++ ;
|
||||||
|
return handle ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// the margin between the text control and the choice
|
||||||
|
static const wxCoord MARGIN = 2;
|
||||||
|
static const int POPUPWIDTH = 18;
|
||||||
|
static const int POPUPHEIGHT = 23;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxComboBoxText: text control forwards events to combobox
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxComboBoxText : public wxTextCtrl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxComboBoxText( wxComboBox * cb )
|
||||||
|
: wxTextCtrl( cb , 1 )
|
||||||
|
{
|
||||||
|
m_cb = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnChar( wxKeyEvent& event )
|
||||||
|
{
|
||||||
|
if ( event.GetKeyCode() == WXK_RETURN )
|
||||||
|
{
|
||||||
|
wxString value = GetValue();
|
||||||
|
|
||||||
|
if ( m_cb->GetCount() == 0 )
|
||||||
|
{
|
||||||
|
// make Enter generate "selected" event if there is only one item
|
||||||
|
// in the combobox - without it, it's impossible to select it at
|
||||||
|
// all!
|
||||||
|
wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() );
|
||||||
|
event.SetInt( 0 );
|
||||||
|
event.SetString( value );
|
||||||
|
event.SetEventObject( m_cb );
|
||||||
|
m_cb->GetEventHandler()->ProcessEvent( event );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// add the item to the list if it's not there yet
|
||||||
|
if ( m_cb->FindString(value) == wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
m_cb->Append(value);
|
||||||
|
m_cb->SetStringSelection(value);
|
||||||
|
|
||||||
|
// and generate the selected event for it
|
||||||
|
wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() );
|
||||||
|
event.SetInt( m_cb->GetCount() - 1 );
|
||||||
|
event.SetString( value );
|
||||||
|
event.SetEventObject( m_cb );
|
||||||
|
m_cb->GetEventHandler()->ProcessEvent( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will invoke the dialog default action, such
|
||||||
|
// as the clicking the default button.
|
||||||
|
|
||||||
|
wxWindow *parent = GetParent();
|
||||||
|
while( parent && !parent->IsTopLevel() && parent->GetDefaultItem() == NULL ) {
|
||||||
|
parent = parent->GetParent() ;
|
||||||
|
}
|
||||||
|
if ( parent && parent->GetDefaultItem() )
|
||||||
|
{
|
||||||
|
wxButton *def = wxDynamicCast(parent->GetDefaultItem(),
|
||||||
|
wxButton);
|
||||||
|
if ( def && def->IsEnabled() )
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() );
|
||||||
|
event.SetEventObject(def);
|
||||||
|
def->Command(event);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxComboBox *m_cb;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxComboBoxText, wxTextCtrl)
|
||||||
|
EVT_CHAR( wxComboBoxText::OnChar)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
class wxComboBoxChoice : public wxChoice
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxComboBoxChoice(wxComboBox *cb, int style)
|
||||||
|
: wxChoice( cb , 1 )
|
||||||
|
{
|
||||||
|
m_cb = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnChoice( wxCommandEvent& e )
|
||||||
|
{
|
||||||
|
wxString s = e.GetString();
|
||||||
|
|
||||||
|
m_cb->DelegateChoice( s );
|
||||||
|
wxCommandEvent event2(wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() );
|
||||||
|
event2.SetInt(m_cb->GetSelection());
|
||||||
|
event2.SetEventObject(m_cb);
|
||||||
|
event2.SetString(m_cb->GetStringSelection());
|
||||||
|
m_cb->ProcessCommand(event2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxComboBox *m_cb;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxComboBoxChoice, wxChoice)
|
||||||
|
EVT_CHOICE(-1, wxComboBoxChoice::OnChoice)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
wxComboBox::~wxComboBox()
|
||||||
|
{
|
||||||
|
// delete client objects
|
||||||
|
FreeData();
|
||||||
|
|
||||||
|
// delete the controls now, don't leave them alive even though they would
|
||||||
|
// still be eventually deleted by our parent - but it will be too late, the
|
||||||
|
// user code expects them to be gone now
|
||||||
|
if (m_text != NULL) {
|
||||||
|
delete m_text;
|
||||||
|
m_text = NULL;
|
||||||
|
}
|
||||||
|
if (m_choice != NULL) {
|
||||||
|
delete m_choice;
|
||||||
|
m_choice = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// geometry
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxSize wxComboBox::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize size = m_choice->GetBestSize();
|
||||||
|
|
||||||
|
if ( m_text != NULL )
|
||||||
|
{
|
||||||
|
wxSize sizeText = m_text->GetBestSize();
|
||||||
|
|
||||||
|
size.x = POPUPWIDTH + sizeText.x + MARGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::DoMoveWindow(int x, int y, int width, int height) {
|
||||||
|
height = POPUPHEIGHT;
|
||||||
|
|
||||||
|
wxControl::DoMoveWindow(x, y, width, height);
|
||||||
|
|
||||||
|
if ( m_text == NULL )
|
||||||
|
{
|
||||||
|
m_choice->SetSize(0, 0 , width, -1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxCoord wText = width - POPUPWIDTH - MARGIN;
|
||||||
|
m_text->SetSize(0, 0, wText, height);
|
||||||
|
m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// operations forwarded to the subcontrols
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxComboBox::Enable(bool enable)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Enable(enable) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxComboBox::Show(bool show)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Show(show) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetFocus()
|
||||||
|
{
|
||||||
|
if ( m_text != NULL) {
|
||||||
|
m_text->SetFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxComboBox::DelegateTextChanged( const wxString& value )
|
||||||
|
{
|
||||||
|
SetStringSelection( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxComboBox::DelegateChoice( const wxString& value )
|
||||||
|
{
|
||||||
|
SetStringSelection( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& value,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
const wxArrayString& choices,
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
wxCArrayString chs( choices );
|
||||||
|
|
||||||
|
return Create( parent, id, value, pos, size, chs.GetCount(),
|
||||||
|
chs.GetStrings(), style, validator, name );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& value,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
int n, const wxString choices[],
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style ,
|
||||||
|
wxDefaultValidator, name) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_choice = new wxComboBoxChoice(this, style );
|
||||||
|
|
||||||
|
wxSize csize = size;
|
||||||
|
if ( style & wxCB_READONLY )
|
||||||
|
{
|
||||||
|
m_text = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_text = new wxComboBoxText(this);
|
||||||
|
if ( size.y == -1 ) {
|
||||||
|
csize.y = m_text->GetSize().y ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DoSetSize(pos.x, pos.y, csize.x, csize.y);
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; i++ )
|
||||||
|
{
|
||||||
|
m_choice->DoAppend( choices[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxComboBox::GetValue() const
|
||||||
|
{
|
||||||
|
wxString result;
|
||||||
|
|
||||||
|
if ( m_text == NULL )
|
||||||
|
{
|
||||||
|
result = m_choice->GetString( m_choice->GetSelection() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = m_text->GetValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetValue(const wxString& value)
|
||||||
|
{
|
||||||
|
int s = FindString (value);
|
||||||
|
if (s == wxNOT_FOUND && !HasFlag(wxCB_READONLY) )
|
||||||
|
{
|
||||||
|
m_choice->Append(value) ;
|
||||||
|
}
|
||||||
|
SetStringSelection( value ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clipboard operations
|
||||||
|
void wxComboBox::Copy()
|
||||||
|
{
|
||||||
|
if ( m_text != NULL )
|
||||||
|
{
|
||||||
|
m_text->Copy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Cut()
|
||||||
|
{
|
||||||
|
if ( m_text != NULL )
|
||||||
|
{
|
||||||
|
m_text->Cut();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Paste()
|
||||||
|
{
|
||||||
|
if ( m_text != NULL )
|
||||||
|
{
|
||||||
|
m_text->Paste();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetEditable(bool editable)
|
||||||
|
{
|
||||||
|
if ( ( m_text == NULL ) && editable )
|
||||||
|
{
|
||||||
|
m_text = new wxComboBoxText( this );
|
||||||
|
}
|
||||||
|
else if ( ( m_text != NULL ) && !editable )
|
||||||
|
{
|
||||||
|
delete m_text;
|
||||||
|
m_text = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentX, currentY;
|
||||||
|
GetPosition( ¤tX, ¤tY );
|
||||||
|
|
||||||
|
int currentW, currentH;
|
||||||
|
GetSize( ¤tW, ¤tH );
|
||||||
|
|
||||||
|
DoMoveWindow( currentX, currentY, currentW, currentH );
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetInsertionPoint(long pos)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetInsertionPointEnd()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxComboBox::GetInsertionPoint() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxComboBox::GetLastPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Replace(long from, long to, const wxString& value)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Remove(long from, long to)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetSelection(long from, long to)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxComboBox::DoAppend(const wxString& item)
|
||||||
|
{
|
||||||
|
return m_choice->DoAppend( item ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxComboBox::DoInsert(const wxString& item, int pos)
|
||||||
|
{
|
||||||
|
return m_choice->DoInsert( item , pos ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::DoSetItemClientData(int n, void* clientData)
|
||||||
|
{
|
||||||
|
return m_choice->DoSetItemClientData( n , clientData ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* wxComboBox::DoGetItemClientData(int n) const
|
||||||
|
{
|
||||||
|
return m_choice->DoGetItemClientData( n ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
|
||||||
|
{
|
||||||
|
return m_choice->DoSetItemClientObject( n , clientData ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxClientData* wxComboBox::DoGetItemClientObject(int n) const
|
||||||
|
{
|
||||||
|
return m_choice->DoGetItemClientObject( n ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::FreeData()
|
||||||
|
{
|
||||||
|
if ( HasClientObjectData() )
|
||||||
|
{
|
||||||
|
size_t count = GetCount();
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
SetClientObject( n, NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Delete(int n)
|
||||||
|
{
|
||||||
|
// force client object deletion
|
||||||
|
if( HasClientObjectData() )
|
||||||
|
SetClientObject( n, NULL );
|
||||||
|
m_choice->Delete( n );
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::Clear()
|
||||||
|
{
|
||||||
|
FreeData();
|
||||||
|
m_choice->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxComboBox::GetSelection() const
|
||||||
|
{
|
||||||
|
return m_choice->GetSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetSelection(int n)
|
||||||
|
{
|
||||||
|
m_choice->SetSelection( n );
|
||||||
|
|
||||||
|
if ( m_text != NULL )
|
||||||
|
{
|
||||||
|
m_text->SetValue( GetString( n ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxComboBox::FindString(const wxString& s) const
|
||||||
|
{
|
||||||
|
return m_choice->FindString( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxComboBox::GetString(int n) const
|
||||||
|
{
|
||||||
|
return m_choice->GetString( n );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxComboBox::GetStringSelection() const
|
||||||
|
{
|
||||||
|
int sel = GetSelection ();
|
||||||
|
if (sel > -1)
|
||||||
|
return wxString(this->GetString (sel));
|
||||||
|
else
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxComboBox::SetStringSelection(const wxString& sel)
|
||||||
|
{
|
||||||
|
int s = FindString (sel);
|
||||||
|
if (s > -1)
|
||||||
|
{
|
||||||
|
SetSelection (s);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxComboBox::SetString(int n, const wxString& s)
|
||||||
|
{
|
||||||
|
m_choice->SetString( n , s ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxComboBox::MacHandleControlClick( WXWidget WXUNUSED(control) , wxInt16 WXUNUSED(controlpart) , bool WXUNUSED(mouseStillDown))
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId );
|
||||||
|
event.SetInt(GetSelection());
|
||||||
|
event.SetEventObject(this);
|
||||||
|
event.SetString(GetStringSelection());
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
814
src/mac/classic/control.cpp
Normal file
814
src/mac/classic/control.cpp
Normal file
@@ -0,0 +1,814 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: control.cpp
|
||||||
|
// Purpose: wxControl class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "control.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/control.h"
|
||||||
|
#include "wx/panel.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
#include "wx/notebook.h"
|
||||||
|
#include "wx/tabctrl.h"
|
||||||
|
#include "wx/radiobox.h"
|
||||||
|
#include "wx/spinbutt.h"
|
||||||
|
#include "wx/scrolbar.h"
|
||||||
|
#include "wx/button.h"
|
||||||
|
#include "wx/dialog.h"
|
||||||
|
#include "wx/statbox.h"
|
||||||
|
#include "wx/sizer.h"
|
||||||
|
#include "wx/stattext.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxControl, wxWindow)
|
||||||
|
EVT_MOUSE_EVENTS( wxControl::OnMouseEvent )
|
||||||
|
EVT_PAINT( wxControl::OnPaint )
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
// Item members
|
||||||
|
|
||||||
|
|
||||||
|
#if PRAGMA_STRUCT_ALIGN
|
||||||
|
#pragma options align=mac68k
|
||||||
|
#elif PRAGMA_STRUCT_PACKPUSH
|
||||||
|
#pragma pack(push, 2)
|
||||||
|
#elif PRAGMA_STRUCT_PACK
|
||||||
|
#pragma pack(2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned short instruction;
|
||||||
|
void (*function)();
|
||||||
|
} cdefRec, *cdefPtr, **cdefHandle;
|
||||||
|
|
||||||
|
#if PRAGMA_STRUCT_ALIGN
|
||||||
|
#pragma options align=reset
|
||||||
|
#elif PRAGMA_STRUCT_PACKPUSH
|
||||||
|
#pragma pack(pop)
|
||||||
|
#elif PRAGMA_STRUCT_PACK
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ;
|
||||||
|
wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
|
||||||
|
|
||||||
|
pascal void wxMacLiveScrollbarActionProc( ControlHandle control , ControlPartCode partCode ) ;
|
||||||
|
pascal void wxMacLiveScrollbarActionProc( ControlHandle control , ControlPartCode partCode )
|
||||||
|
{
|
||||||
|
if ( partCode != 0)
|
||||||
|
{
|
||||||
|
wxControl* wx = (wxControl*) GetControlReference( control ) ;
|
||||||
|
if ( wx )
|
||||||
|
{
|
||||||
|
wx->MacHandleControlClick( control , partCode , true /* stillDown */ ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ControlColorUPP wxMacSetupControlBackgroundUPP = NULL ;
|
||||||
|
ControlDefUPP wxMacControlActionUPP = NULL ;
|
||||||
|
|
||||||
|
pascal SInt32 wxMacControlDefinition(SInt16 varCode, ControlRef theControl, ControlDefProcMessage message, SInt32 param)
|
||||||
|
{
|
||||||
|
|
||||||
|
wxControl* wx = (wxControl*) wxFindControlFromMacControl( theControl ) ;
|
||||||
|
if ( wx != NULL && wx->IsKindOf( CLASSINFO( wxControl ) ) )
|
||||||
|
{
|
||||||
|
if( message == drawCntl )
|
||||||
|
{
|
||||||
|
wxMacWindowClipper clip( wx ) ;
|
||||||
|
return InvokeControlDefUPP( varCode , theControl , message , param , (ControlDefUPP) wx->MacGetControlAction() ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return InvokeControlDefUPP( varCode , theControl , message , param , (ControlDefUPP) wx->MacGetControlAction() ) ;
|
||||||
|
}
|
||||||
|
return NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessage , SInt16 iDepth , Boolean iIsColor )
|
||||||
|
{
|
||||||
|
OSStatus status = noErr ;
|
||||||
|
switch( iMessage )
|
||||||
|
{
|
||||||
|
case kControlMsgSetUpBackground :
|
||||||
|
{
|
||||||
|
wxControl* wx = (wxControl*) GetControlReference( iControl ) ;
|
||||||
|
if ( wx != NULL && wx->IsKindOf( CLASSINFO( wxControl ) ) )
|
||||||
|
{
|
||||||
|
wxDC::MacSetupBackgroundForCurrentPort( wx->MacGetBackgroundBrush() ) ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
// under classic this would lead to partial redraws
|
||||||
|
RgnHandle clip = NewRgn() ;
|
||||||
|
int x = 0 , y = 0;
|
||||||
|
|
||||||
|
wx->MacWindowToRootWindow( &x,&y ) ;
|
||||||
|
CopyRgn( (RgnHandle) wx->MacGetVisibleRegion(false).GetWXHRGN() , clip ) ;
|
||||||
|
OffsetRgn( clip , x , y ) ;
|
||||||
|
SetClip( clip ) ;
|
||||||
|
DisposeRgn( clip ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = paramErr ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
default :
|
||||||
|
status = paramErr ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
return status ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxControl::wxControl()
|
||||||
|
{
|
||||||
|
m_macControl = NULL ;
|
||||||
|
m_macControlAction = NULL ;
|
||||||
|
m_macHorizontalBorder = 0 ; // additional pixels around the real control
|
||||||
|
m_macVerticalBorder = 0 ;
|
||||||
|
m_backgroundColour = *wxWHITE;
|
||||||
|
m_foregroundColour = *wxBLACK;
|
||||||
|
|
||||||
|
if ( wxMacLiveScrollbarActionUPP == NULL )
|
||||||
|
{
|
||||||
|
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
||||||
|
wxMacLiveScrollbarActionUPP = NewControlActionUPP( wxMacLiveScrollbarActionProc );
|
||||||
|
#else
|
||||||
|
wxMacLiveScrollbarActionUPP = NewControlActionProc( wxMacLiveScrollbarActionProc ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControl::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
m_macControl = NULL ;
|
||||||
|
m_macHorizontalBorder = 0 ; // additional pixels around the real control
|
||||||
|
m_macVerticalBorder = 0 ;
|
||||||
|
|
||||||
|
bool rval = wxWindow::Create(parent, id, pos, size, style, name);
|
||||||
|
if ( parent )
|
||||||
|
{
|
||||||
|
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||||
|
m_foregroundColour = parent->GetForegroundColour() ;
|
||||||
|
}
|
||||||
|
if (rval) {
|
||||||
|
#if wxUSE_VALIDATORS
|
||||||
|
SetValidator(validator);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxControl::~wxControl()
|
||||||
|
{
|
||||||
|
m_isBeingDeleted = TRUE;
|
||||||
|
wxRemoveMacControlAssociation( this ) ;
|
||||||
|
// If we delete an item, we should initialize the parent panel,
|
||||||
|
// because it could now be invalid.
|
||||||
|
wxWindow *parent = GetParent() ;
|
||||||
|
if ( parent )
|
||||||
|
{
|
||||||
|
if (parent->GetDefaultItem() == (wxButton*) this)
|
||||||
|
parent->SetDefaultItem(NULL);
|
||||||
|
}
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
// in case the callback might be called during destruction
|
||||||
|
::SetControlColorProc( (ControlHandle) m_macControl , NULL ) ;
|
||||||
|
::DisposeControl( (ControlHandle) m_macControl ) ;
|
||||||
|
m_macControl = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::SetLabel(const wxString& title)
|
||||||
|
{
|
||||||
|
m_label = wxStripMenuCodes(title) ;
|
||||||
|
|
||||||
|
if ( m_macControl )
|
||||||
|
{
|
||||||
|
UMASetControlTitle( (ControlHandle) m_macControl , m_label , m_font.GetEncoding() ) ;
|
||||||
|
}
|
||||||
|
Refresh() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxControl::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return wxWindow::DoGetBestSize() ;
|
||||||
|
|
||||||
|
Rect bestsize = { 0 , 0 , 0 , 0 } ;
|
||||||
|
short baselineoffset ;
|
||||||
|
int bestWidth, bestHeight ;
|
||||||
|
::GetBestControlRect( (ControlHandle) m_macControl , &bestsize , &baselineoffset ) ;
|
||||||
|
|
||||||
|
if ( EmptyRect( &bestsize ) )
|
||||||
|
{
|
||||||
|
baselineoffset = 0;
|
||||||
|
bestsize.left = bestsize.top = 0 ;
|
||||||
|
bestsize.right = 16 ;
|
||||||
|
bestsize.bottom = 16 ;
|
||||||
|
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
|
||||||
|
{
|
||||||
|
bestsize.bottom = 16 ;
|
||||||
|
}
|
||||||
|
else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
|
||||||
|
{
|
||||||
|
bestsize.bottom = 24 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bestWidth = bestsize.right - bestsize.left ;
|
||||||
|
|
||||||
|
bestWidth += 2 * m_macHorizontalBorder ;
|
||||||
|
|
||||||
|
bestHeight = bestsize.bottom - bestsize.top ;
|
||||||
|
if ( bestHeight < 10 )
|
||||||
|
bestHeight = 13 ;
|
||||||
|
|
||||||
|
bestHeight += 2 * m_macVerticalBorder;
|
||||||
|
|
||||||
|
|
||||||
|
return wxSize(bestWidth, bestHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControl::ProcessCommand (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
// Tries:
|
||||||
|
// 1) OnCommand, starting at this window and working up parent hierarchy
|
||||||
|
// 2) OnCommand then calls ProcessEvent to search the event tables.
|
||||||
|
return GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
wxList *wxWinMacControlList = NULL;
|
||||||
|
wxControl *wxFindControlFromMacControl(ControlHandle inControl )
|
||||||
|
{
|
||||||
|
wxNode *node = wxWinMacControlList->Find((long)inControl);
|
||||||
|
if (!node)
|
||||||
|
return NULL;
|
||||||
|
return (wxControl *)node->GetData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxAssociateControlWithMacControl(ControlHandle inControl, wxControl *control)
|
||||||
|
{
|
||||||
|
// adding NULL WindowRef is (first) surely a result of an error and
|
||||||
|
// (secondly) breaks menu command processing
|
||||||
|
wxCHECK_RET( inControl != (ControlHandle) NULL, wxT("attempt to add a NULL WindowRef to window list") );
|
||||||
|
|
||||||
|
if ( !wxWinMacControlList->Find((long)inControl) )
|
||||||
|
wxWinMacControlList->Append((long)inControl, control);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxRemoveMacControlAssociation(wxControl *control)
|
||||||
|
{
|
||||||
|
if ( wxWinMacControlList )
|
||||||
|
wxWinMacControlList->DeleteObject(control);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString label ,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name , WXRECTPTR outBounds , unsigned char* maclabel )
|
||||||
|
{
|
||||||
|
m_label = label ;
|
||||||
|
|
||||||
|
// These sizes will be adjusted in MacPostControlCreate
|
||||||
|
m_width = size.x ;
|
||||||
|
m_height = size.y ;
|
||||||
|
m_x = pos.x ;
|
||||||
|
m_y = pos.y ;
|
||||||
|
|
||||||
|
((Rect*)outBounds)->top = -10;
|
||||||
|
((Rect*)outBounds)->left = -10;
|
||||||
|
((Rect*)outBounds)->bottom = 0;
|
||||||
|
((Rect*)outBounds)->right = 0;
|
||||||
|
|
||||||
|
wxMacStringToPascal( wxStripMenuCodes(label) , maclabel ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacPostControlCreate()
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
DoSetWindowVariant( m_windowVariant ) ;
|
||||||
|
/*
|
||||||
|
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
|
||||||
|
{
|
||||||
|
// no font
|
||||||
|
}
|
||||||
|
else if ( !UMAHasAquaLayout() && (IsKindOf( CLASSINFO( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxRadioBox ) ) || IsKindOf( CLASSINFO( wxButton ) ) ) )
|
||||||
|
{
|
||||||
|
ControlFontStyleRec controlstyle ;
|
||||||
|
controlstyle.flags = kControlUseFontMask ;
|
||||||
|
controlstyle.font = kControlFontSmallBoldSystemFont ;
|
||||||
|
|
||||||
|
::SetControlFontStyle( (ControlHandle) m_macControl , &controlstyle ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ControlFontStyleRec controlstyle ;
|
||||||
|
controlstyle.flags = kControlUseFontMask ;
|
||||||
|
|
||||||
|
if (IsKindOf( CLASSINFO( wxButton ) ) )
|
||||||
|
controlstyle.font = kControlFontBigSystemFont ; // eventually kControlFontBigSystemFont ;
|
||||||
|
else
|
||||||
|
controlstyle.font = kControlFontSmallSystemFont ;
|
||||||
|
|
||||||
|
::SetControlFontStyle( (ControlHandle) m_macControl , &controlstyle ) ;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
ControlHandle container = (ControlHandle) GetParent()->MacGetContainerForEmbedding() ;
|
||||||
|
wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
|
||||||
|
::EmbedControl( (ControlHandle) m_macControl , container ) ;
|
||||||
|
m_macControlIsShown = MacIsReallyShown() ;
|
||||||
|
|
||||||
|
wxAssociateControlWithMacControl( (ControlHandle) m_macControl , this ) ;
|
||||||
|
if ( wxMacSetupControlBackgroundUPP == NULL )
|
||||||
|
{
|
||||||
|
wxMacSetupControlBackgroundUPP = NewControlColorUPP( wxMacSetupControlBackground ) ;
|
||||||
|
}
|
||||||
|
if ( wxMacControlActionUPP == NULL )
|
||||||
|
{
|
||||||
|
wxMacControlActionUPP = NewControlDefUPP( wxMacControlDefinition ) ;
|
||||||
|
}
|
||||||
|
// The following block of code is responsible for crashes when switching
|
||||||
|
// back to windows, which can be seen in the dialogs sample.
|
||||||
|
// It is disabled until a proper solution can be found.
|
||||||
|
#if 0
|
||||||
|
#if TARGET_CARBON
|
||||||
|
/*
|
||||||
|
only working under classic carbon
|
||||||
|
m_macControlAction = *(**(ControlHandle)m_macControl).contrlDefProc ;
|
||||||
|
(**(ControlHandle)m_macControl).contrlDefProc = (Handle) &wxMacControlActionUPP ;
|
||||||
|
*/
|
||||||
|
#else
|
||||||
|
m_macControlAction = *(**(ControlHandle)m_macControl).contrlDefProc ;
|
||||||
|
|
||||||
|
cdefHandle cdef ;
|
||||||
|
cdef = (cdefHandle) NewHandle( sizeof(cdefRec) ) ;
|
||||||
|
if ( (**(ControlHandle)m_macControl).contrlDefProc != NULL )
|
||||||
|
{
|
||||||
|
(**cdef).instruction = 0x4EF9; /* JMP instruction */
|
||||||
|
(**cdef).function = (void(*)()) wxMacControlActionUPP;
|
||||||
|
(**(ControlHandle)m_macControl).contrlDefProc = (Handle) cdef ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
SetControlColorProc( (ControlHandle) m_macControl , wxMacSetupControlBackgroundUPP ) ;
|
||||||
|
|
||||||
|
// Adjust the controls size and position
|
||||||
|
wxPoint pos(m_x, m_y);
|
||||||
|
wxSize best_size( DoGetBestSize() );
|
||||||
|
wxSize new_size( m_width, m_height );
|
||||||
|
|
||||||
|
m_x = m_y = m_width = m_height = -1; // Forces SetSize to move/size the control
|
||||||
|
|
||||||
|
if (new_size.x == -1) {
|
||||||
|
new_size.x = best_size.x;
|
||||||
|
}
|
||||||
|
if (new_size.y == -1) {
|
||||||
|
new_size.y = best_size.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSize(pos.x, pos.y, new_size.x, new_size.y);
|
||||||
|
|
||||||
|
#if wxUSE_UNICODE
|
||||||
|
UMASetControlTitle( (ControlHandle) m_macControl , wxStripMenuCodes(m_label) , m_font.GetEncoding() ) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( m_macControlIsShown )
|
||||||
|
UMAShowControl( (ControlHandle) m_macControl ) ;
|
||||||
|
|
||||||
|
SetCursor( *wxSTANDARD_CURSOR ) ;
|
||||||
|
|
||||||
|
Refresh() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacAdjustControlRect()
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
if ( m_width == -1 || m_height == -1 )
|
||||||
|
{
|
||||||
|
Rect bestsize = { 0 , 0 , 0 , 0 } ;
|
||||||
|
short baselineoffset ;
|
||||||
|
|
||||||
|
::GetBestControlRect( (ControlHandle) m_macControl , &bestsize , &baselineoffset ) ;
|
||||||
|
|
||||||
|
if ( EmptyRect( &bestsize ) )
|
||||||
|
{
|
||||||
|
baselineoffset = 0;
|
||||||
|
bestsize.left = bestsize.top = 0 ;
|
||||||
|
bestsize.right = 16 ;
|
||||||
|
bestsize.bottom = 16 ;
|
||||||
|
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
|
||||||
|
{
|
||||||
|
bestsize.bottom = 16 ;
|
||||||
|
}
|
||||||
|
else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
|
||||||
|
{
|
||||||
|
bestsize.bottom = 24 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_width == -1 )
|
||||||
|
{
|
||||||
|
if ( IsKindOf( CLASSINFO( wxButton ) ) )
|
||||||
|
{
|
||||||
|
m_width = m_label.Length() * 8 + 12 ;
|
||||||
|
if ( m_width < 70 )
|
||||||
|
m_width = 70 ;
|
||||||
|
}
|
||||||
|
else if ( IsKindOf( CLASSINFO( wxStaticText ) ) )
|
||||||
|
{
|
||||||
|
m_width = m_label.Length() * 8 ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_width = bestsize.right - bestsize.left ;
|
||||||
|
|
||||||
|
m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ;
|
||||||
|
}
|
||||||
|
if ( m_height == -1 )
|
||||||
|
{
|
||||||
|
m_height = bestsize.bottom - bestsize.top ;
|
||||||
|
if ( m_height < 10 )
|
||||||
|
m_height = 13 ;
|
||||||
|
|
||||||
|
m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ;
|
||||||
|
}
|
||||||
|
MacUpdateDimensions() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WXWidget wxControl::MacGetContainerForEmbedding()
|
||||||
|
{
|
||||||
|
if ( m_macControl )
|
||||||
|
return m_macControl ;
|
||||||
|
|
||||||
|
return wxWindow::MacGetContainerForEmbedding() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacUpdateDimensions()
|
||||||
|
{
|
||||||
|
// actually in the current systems this should never be possible, but later reparenting
|
||||||
|
// may become a reality
|
||||||
|
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
if ( GetParent() == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
|
||||||
|
if ( rootwindow == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
Rect oldBounds ;
|
||||||
|
GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ;
|
||||||
|
|
||||||
|
int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
|
||||||
|
int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
|
||||||
|
int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ;
|
||||||
|
int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ;
|
||||||
|
|
||||||
|
GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
|
||||||
|
bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
|
||||||
|
bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
|
||||||
|
if ( doMove || doResize )
|
||||||
|
{
|
||||||
|
InvalWindowRect( rootwindow, &oldBounds ) ;
|
||||||
|
if ( doMove )
|
||||||
|
{
|
||||||
|
UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
|
||||||
|
}
|
||||||
|
if ( doResize )
|
||||||
|
{
|
||||||
|
UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacSuperChangedPosition()
|
||||||
|
{
|
||||||
|
MacUpdateDimensions() ;
|
||||||
|
wxWindow::MacSuperChangedPosition() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacSuperEnabled( bool enabled )
|
||||||
|
{
|
||||||
|
Refresh(FALSE) ;
|
||||||
|
wxWindow::MacSuperEnabled( enabled ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacSuperShown( bool show )
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
if ( !show )
|
||||||
|
{
|
||||||
|
if ( m_macControlIsShown )
|
||||||
|
{
|
||||||
|
::UMAHideControl( (ControlHandle) m_macControl ) ;
|
||||||
|
m_macControlIsShown = false ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( MacIsReallyShown() && !m_macControlIsShown )
|
||||||
|
{
|
||||||
|
::UMAShowControl( (ControlHandle) m_macControl ) ;
|
||||||
|
m_macControlIsShown = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWindow::MacSuperShown( show ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::DoSetSize(int x, int y,
|
||||||
|
int width, int height,
|
||||||
|
int sizeFlags )
|
||||||
|
{
|
||||||
|
wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
Rect meta , control ;
|
||||||
|
GetControlBounds( (ControlHandle) m_macControl , &control ) ;
|
||||||
|
RgnHandle rgn = NewRgn() ;
|
||||||
|
GetControlRegion( (ControlHandle) m_macControl , kControlStructureMetaPart , rgn ) ;
|
||||||
|
GetRegionBounds( rgn , &meta ) ;
|
||||||
|
if ( !EmptyRect( &meta ) )
|
||||||
|
{
|
||||||
|
wxASSERT( meta.left >= control.left - m_macHorizontalBorder ) ;
|
||||||
|
wxASSERT( meta.right <= control.right + m_macHorizontalBorder ) ;
|
||||||
|
wxASSERT( meta.top >= control.top - m_macVerticalBorder ) ;
|
||||||
|
wxASSERT( meta.bottom <= control.bottom + m_macVerticalBorder ) ;
|
||||||
|
}
|
||||||
|
DisposeRgn( rgn ) ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControl::Show(bool show)
|
||||||
|
{
|
||||||
|
if ( !wxWindow::Show( show ) )
|
||||||
|
return FALSE ;
|
||||||
|
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
if ( !show )
|
||||||
|
{
|
||||||
|
if ( m_macControlIsShown )
|
||||||
|
{
|
||||||
|
::UMAHideControl( (ControlHandle) m_macControl ) ;
|
||||||
|
m_macControlIsShown = false ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( MacIsReallyShown() && !m_macControlIsShown )
|
||||||
|
{
|
||||||
|
::UMAShowControl( (ControlHandle) m_macControl ) ;
|
||||||
|
m_macControlIsShown = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControl::Enable(bool enable)
|
||||||
|
{
|
||||||
|
if ( !wxWindow::Enable(enable) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
if ( enable )
|
||||||
|
UMAActivateControl( (ControlHandle) m_macControl ) ;
|
||||||
|
else
|
||||||
|
UMADeactivateControl( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::Refresh(bool eraseBack, const wxRect *rect)
|
||||||
|
{
|
||||||
|
wxWindow::Refresh( eraseBack , rect ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacRedrawControl()
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl && MacGetRootWindow() && m_macControlIsShown )
|
||||||
|
{
|
||||||
|
wxClientDC dc(this) ;
|
||||||
|
wxMacPortSetter helper(&dc) ;
|
||||||
|
wxMacWindowClipper clipper(this) ;
|
||||||
|
wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
|
||||||
|
UMADrawControl( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::OnPaint(wxPaintEvent& event)
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl )
|
||||||
|
{
|
||||||
|
wxPaintDC dc(this) ;
|
||||||
|
wxMacPortSetter helper(&dc) ;
|
||||||
|
wxMacWindowClipper clipper(this) ;
|
||||||
|
wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
|
||||||
|
UMADrawControl( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.Skip() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void wxControl::OnEraseBackground(wxEraseEvent& event)
|
||||||
|
{
|
||||||
|
wxWindow::OnEraseBackground( event ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::OnKeyDown( wxKeyEvent &event )
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
|
||||||
|
char charCode ;
|
||||||
|
UInt32 keyCode ;
|
||||||
|
UInt32 modifiers ;
|
||||||
|
|
||||||
|
GetEventParameter( (EventRef) wxTheApp->MacGetCurrentEvent(), kEventParamKeyMacCharCodes, typeChar, NULL,sizeof(char), NULL,&charCode );
|
||||||
|
GetEventParameter( (EventRef) wxTheApp->MacGetCurrentEvent(), kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
|
||||||
|
GetEventParameter((EventRef) wxTheApp->MacGetCurrentEvent(), kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
|
||||||
|
|
||||||
|
::HandleControlKey( (ControlHandle) m_macControl , keyCode , charCode , modifiers ) ;
|
||||||
|
|
||||||
|
#else
|
||||||
|
EventRecord *ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ;
|
||||||
|
short keycode ;
|
||||||
|
short keychar ;
|
||||||
|
keychar = short(ev->message & charCodeMask);
|
||||||
|
keycode = short(ev->message & keyCodeMask) >> 8 ;
|
||||||
|
|
||||||
|
::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::OnMouseEvent( wxMouseEvent &event )
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
{
|
||||||
|
event.Skip() ;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK )
|
||||||
|
{
|
||||||
|
|
||||||
|
int x = event.m_x ;
|
||||||
|
int y = event.m_y ;
|
||||||
|
|
||||||
|
MacClientToRootWindow( &x , &y ) ;
|
||||||
|
|
||||||
|
ControlHandle control ;
|
||||||
|
Point localwhere ;
|
||||||
|
SInt16 controlpart ;
|
||||||
|
|
||||||
|
localwhere.h = x ;
|
||||||
|
localwhere.v = y ;
|
||||||
|
|
||||||
|
short modifiers = 0;
|
||||||
|
|
||||||
|
if ( !event.m_leftDown && !event.m_rightDown )
|
||||||
|
modifiers |= btnState ;
|
||||||
|
|
||||||
|
if ( event.m_shiftDown )
|
||||||
|
modifiers |= shiftKey ;
|
||||||
|
|
||||||
|
if ( event.m_controlDown )
|
||||||
|
modifiers |= controlKey ;
|
||||||
|
|
||||||
|
if ( event.m_altDown )
|
||||||
|
modifiers |= optionKey ;
|
||||||
|
|
||||||
|
if ( event.m_metaDown )
|
||||||
|
modifiers |= cmdKey ;
|
||||||
|
{
|
||||||
|
control = (ControlHandle) m_macControl ;
|
||||||
|
if ( control && ::IsControlActive( control ) )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
controlpart = ::HandleControlClick( control , localwhere , modifiers , (ControlActionUPP) -1 ) ;
|
||||||
|
wxTheApp->s_lastMouseDown = 0 ;
|
||||||
|
if ( control && controlpart != kControlNoPart )
|
||||||
|
{
|
||||||
|
MacHandleControlClick( control , controlpart , false /* mouse not down anymore */ ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.Skip() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControl::MacCanFocus() const
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return true ;
|
||||||
|
else
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControl::DoSetWindowVariant( wxWindowVariant variant )
|
||||||
|
{
|
||||||
|
if ( m_macControl == NULL )
|
||||||
|
{
|
||||||
|
wxWindow::SetWindowVariant( variant ) ;
|
||||||
|
return ;
|
||||||
|
|
||||||
|
}
|
||||||
|
m_windowVariant = variant ;
|
||||||
|
|
||||||
|
ControlSize size ;
|
||||||
|
ControlFontStyleRec fontStyle;
|
||||||
|
fontStyle.flags = kControlUseFontMask ;
|
||||||
|
|
||||||
|
// we will get that from the settings later
|
||||||
|
// and make this NORMAL later, but first
|
||||||
|
// we have a few calculations that we must fix
|
||||||
|
|
||||||
|
if ( variant == wxWINDOW_VARIANT_DEFAULT )
|
||||||
|
{
|
||||||
|
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
|
||||||
|
variant = wxWINDOW_VARIANT_NORMAL ;
|
||||||
|
else
|
||||||
|
variant = wxWINDOW_VARIANT_SMALL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( variant )
|
||||||
|
{
|
||||||
|
case wxWINDOW_VARIANT_NORMAL :
|
||||||
|
size = kControlSizeNormal;
|
||||||
|
fontStyle.font = kControlFontBigSystemFont;
|
||||||
|
break ;
|
||||||
|
case wxWINDOW_VARIANT_SMALL :
|
||||||
|
size = kControlSizeSmall;
|
||||||
|
fontStyle.font = kControlFontSmallSystemFont;
|
||||||
|
break ;
|
||||||
|
case wxWINDOW_VARIANT_MINI :
|
||||||
|
if (UMAGetSystemVersion() >= 0x1030 )
|
||||||
|
{
|
||||||
|
size = 3 ; // not always defined in the header
|
||||||
|
fontStyle.font = -5 ; // not always defined in the header
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size = kControlSizeSmall;
|
||||||
|
fontStyle.font = kControlFontSmallSystemFont;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
break ;
|
||||||
|
case wxWINDOW_VARIANT_LARGE :
|
||||||
|
size = kControlSizeLarge;
|
||||||
|
fontStyle.font = kControlFontBigSystemFont;
|
||||||
|
break ;
|
||||||
|
default:
|
||||||
|
wxFAIL_MSG(_T("unexpected window variant"));
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
::SetControlData( (ControlHandle) m_macControl , kControlEntireControl, kControlSizeTag, sizeof( ControlSize ), &size );
|
||||||
|
::SetControlFontStyle( (ControlHandle) m_macControl , &fontStyle );
|
||||||
|
}
|
||||||
159
src/mac/classic/corersrc.r
Normal file
159
src/mac/classic/corersrc.r
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
#ifdef __UNIX__
|
||||||
|
#include <Carbon.r>
|
||||||
|
#else
|
||||||
|
#include <Types.r>
|
||||||
|
#if UNIVERSAL_INTERFACES_VERSION > 0x320
|
||||||
|
#include <ControlDefinitions.r>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
resource 'ldes' ( 128 )
|
||||||
|
{
|
||||||
|
versionZero
|
||||||
|
{
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
hasVertScroll ,
|
||||||
|
noHorizScroll ,
|
||||||
|
0 ,
|
||||||
|
noGrowSpace ,
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
resource 'ldes' ( 129 )
|
||||||
|
{
|
||||||
|
versionZero
|
||||||
|
{
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
0 ,
|
||||||
|
hasVertScroll ,
|
||||||
|
hasHorizScroll ,
|
||||||
|
0 ,
|
||||||
|
noGrowSpace ,
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
data 'CURS' (10) {
|
||||||
|
$"0000 03E0 0630 0808 1004 31C6 2362 2222"
|
||||||
|
$"2362 31C6 1004 0808 0630 03E0 0000 0000"
|
||||||
|
$"0000 03E0 07F0 0FF8 1FFC 3FFE 3FFE 3FFE"
|
||||||
|
$"3FFE 3FFE 1FFC 0FF8 07F0 03E0 0000 0000"
|
||||||
|
$"0007 0008"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (11) {
|
||||||
|
$"0000 0000 0000 0000 0000 0000 0000 0000"
|
||||||
|
$"0000 0000 0000 0000 0000 0000 0000 0000"
|
||||||
|
$"0000 0000 0000 0000 0000 0000 0000 0000"
|
||||||
|
$"0000 0000 0000 0000 0000 0000 0000 0000"
|
||||||
|
$"0000 0000"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (12) {
|
||||||
|
$"00F0 0088 0108 0190 0270 0220 0440 0440"
|
||||||
|
$"0880 0880 1100 1E00 1C00 1800 1000 0000"
|
||||||
|
$"00F0 00F8 01F8 01F0 03F0 03E0 07C0 07C0"
|
||||||
|
$"0F80 0F80 1F00 1E00 1C00 1800 1000 0000"
|
||||||
|
$"000E 0003"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (13) {
|
||||||
|
$"0000 1E00 2100 4080 4080 4080 4080 2180"
|
||||||
|
$"1FC0 00E0 0070 0038 001C 000E 0006 0000"
|
||||||
|
$"3F00 7F80 FFC0 FFC0 FFC0 FFC0 FFC0 7FC0"
|
||||||
|
$"3FE0 1FF0 00F8 007C 003E 001F 000F 0007"
|
||||||
|
$"0004 0004"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (14) {
|
||||||
|
$"0000 07E0 1FF0 3838 3C0C 6E0E 6706 6386"
|
||||||
|
$"61C6 60E6 7076 303C 1C1C 0FF8 07E0 0000"
|
||||||
|
$"0540 0FF0 3FF8 3C3C 7E0E FF0F 6F86 E7C7"
|
||||||
|
$"63E6 E1F7 70FE 707E 3C3C 1FFC 0FF0 0540"
|
||||||
|
$"0007 0007"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (15) {
|
||||||
|
$"0000 0380 0380 0380 0380 0380 0380 0FE0"
|
||||||
|
$"1FF0 1FF0 0000 1FF0 1FF0 1550 1550 1550"
|
||||||
|
$"07C0 07C0 07C0 07C0 07C0 07C0 0FE0 1FF0"
|
||||||
|
$"3FF8 3FF8 3FF8 3FF8 3FF8 3FF8 3FF8 3FF8"
|
||||||
|
$"000B 0007"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (16) {
|
||||||
|
$"00C0 0140 0640 08C0 3180 47FE 8001 8001"
|
||||||
|
$"81FE 8040 01C0 0040 03C0 C080 3F80 0000"
|
||||||
|
$"00C0 01C0 07C0 0FC0 3F80 7FFE FFFF FFFF"
|
||||||
|
$"FFFE FFC0 FFC0 FFC0 FFC0 FF80 3F80 0000"
|
||||||
|
$"0006 000F"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (17) {
|
||||||
|
$"0100 0280 0260 0310 018C 7FE3 8000 8000"
|
||||||
|
$"7F80 0200 0380 0200 03C0 0107 01F8 0000"
|
||||||
|
$"0100 0380 03E0 03F0 01FC 7FFF FFFF FFFF"
|
||||||
|
$"FFFF 03FF 03FF 03FF 03FF 01FF 01F8 0000"
|
||||||
|
$"0006 0000"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (18) {
|
||||||
|
$"0000 4078 60FC 71CE 7986 7C06 7E0E 7F1C"
|
||||||
|
$"7FB8 7C30 6C30 4600 0630 0330 0300 0000"
|
||||||
|
$"C078 E0FC F1FE FBFF FFCF FF8F FF1F FFBE"
|
||||||
|
$"FFFC FE78 FF78 EFF8 CFF8 87F8 07F8 0300"
|
||||||
|
$"0001 0001"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (19) {
|
||||||
|
$"0000 0002 0006 000E 001E 003E 007E 00FE"
|
||||||
|
$"01FE 003E 0036 0062 0060 00C0 00C0 0000"
|
||||||
|
$"0003 0007 000F 001F 003F 007F 00FF 01FF"
|
||||||
|
$"03FF 07FF 007F 00F7 00F3 01E1 01E0 01C0"
|
||||||
|
$"0001 000E"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (20) {
|
||||||
|
$"0000 0080 01C0 03E0 0080 0080 0080 1FFC"
|
||||||
|
$"1FFC 0080 0080 0080 03E0 01C0 0080 0000"
|
||||||
|
$"0080 01C0 03E0 07F0 0FF8 01C0 3FFE 3FFE"
|
||||||
|
$"3FFE 3FFE 01C0 0FF8 07F0 03E0 01C0 0080"
|
||||||
|
$"0007 0008"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (21) {
|
||||||
|
$"0000 0080 01C0 03E0 0080 0888 188C 3FFE"
|
||||||
|
$"188C 0888 0080 03E0 01C0 0080 0000 0000"
|
||||||
|
$"0080 01C0 03E0 07F0 0BE8 1DDC 3FFE 7FFF"
|
||||||
|
$"3FFE 1DDC 0BE8 07F0 03E0 01C0 0080 0000"
|
||||||
|
$"0007 0008"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (22) {
|
||||||
|
$"0000 001E 000E 060E 0712 03A0 01C0 00E0"
|
||||||
|
$"0170 1238 1C18 1C00 1E00 0000 0000 0000"
|
||||||
|
$"007F 003F 0E1F 0F0F 0F97 07E3 03E1 21F0"
|
||||||
|
$"31F8 3A7C 3C3C 3E1C 3F00 3F80 0000 0000"
|
||||||
|
$"0006 0009"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (23) {
|
||||||
|
$"0000 7800 7000 7060 48E0 05C0 0380 0700"
|
||||||
|
$"0E80 1C48 1838 0038 0078 0000 0000 0000"
|
||||||
|
$"FE00 FC00 F870 F0F0 E9F0 C7E0 87C0 0F84"
|
||||||
|
$"1F8C 3E5C 3C3C 387C 00FC 01FC 0000 0000"
|
||||||
|
$"0006 0006"
|
||||||
|
};
|
||||||
|
|
||||||
|
data 'CURS' (24) {
|
||||||
|
$"0006 000E 001C 0018 0020 0040 00F8 0004"
|
||||||
|
$"1FF4 200C 2AA8 1FF0 1F80 3800 6000 8000"
|
||||||
|
$"000F 001F 003E 007C 0070 00E0 01FC 3FF6"
|
||||||
|
$"7FF6 7FFE 7FFC 7FF8 3FF0 7FC0 F800 E000"
|
||||||
|
$"000A 0006"
|
||||||
|
};
|
||||||
|
|
||||||
505
src/mac/classic/cursor.cpp
Normal file
505
src/mac/classic/cursor.cpp
Normal file
@@ -0,0 +1,505 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: cursor.cpp
|
||||||
|
// Purpose: wxCursor class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "cursor.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/cursor.h"
|
||||||
|
#include "wx/icon.h"
|
||||||
|
#include "wx/image.h"
|
||||||
|
#include "wx/xpmdecod.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const short kwxCursorBullseye = 10 ;
|
||||||
|
const short kwxCursorBlank = 11 ;
|
||||||
|
const short kwxCursorPencil = 12 ;
|
||||||
|
const short kwxCursorMagnifier = 13 ;
|
||||||
|
const short kwxCursorNoEntry = 14 ;
|
||||||
|
const short kwxCursorPaintBrush = 15 ;
|
||||||
|
const short kwxCursorPointRight = 16 ;
|
||||||
|
const short kwxCursorPointLeft = 17 ;
|
||||||
|
const short kwxCursorQuestionArrow = 18 ;
|
||||||
|
const short kwxCursorRightArrow = 19 ;
|
||||||
|
const short kwxCursorSizeNS = 20 ;
|
||||||
|
const short kwxCursorSize = 21 ;
|
||||||
|
const short kwxCursorSizeNESW = 22 ;
|
||||||
|
const short kwxCursorSizeNWSE = 23 ;
|
||||||
|
const short kwxCursorRoller = 24 ;
|
||||||
|
|
||||||
|
wxCursor gMacCurrentCursor ;
|
||||||
|
|
||||||
|
wxCursorRefData::wxCursorRefData()
|
||||||
|
{
|
||||||
|
m_width = 16;
|
||||||
|
m_height = 16;
|
||||||
|
m_hCursor = NULL ;
|
||||||
|
m_disposeHandle = false ;
|
||||||
|
m_releaseHandle = false ;
|
||||||
|
m_isColorCursor = false ;
|
||||||
|
m_themeCursor = -1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursorRefData::~wxCursorRefData()
|
||||||
|
{
|
||||||
|
if ( m_isColorCursor )
|
||||||
|
{
|
||||||
|
::DisposeCCursor( (CCrsrHandle) m_hCursor ) ;
|
||||||
|
}
|
||||||
|
else if ( m_disposeHandle )
|
||||||
|
{
|
||||||
|
::DisposeHandle( (Handle ) m_hCursor ) ;
|
||||||
|
}
|
||||||
|
else if ( m_releaseHandle )
|
||||||
|
{
|
||||||
|
// we don't release the resource since it may already
|
||||||
|
// be in use again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cursors
|
||||||
|
wxCursor::wxCursor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height),
|
||||||
|
int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY), const char WXUNUSED(maskBits)[])
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::wxCursor( const wxImage &image )
|
||||||
|
{
|
||||||
|
CreateFromImage( image ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::wxCursor(const char **bits)
|
||||||
|
{
|
||||||
|
(void) CreateFromXpm(bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::wxCursor(char **bits)
|
||||||
|
{
|
||||||
|
(void) CreateFromXpm((const char **)bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxCursor::CreateFromXpm(const char **bits)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid cursor data") )
|
||||||
|
wxXPMDecoder decoder;
|
||||||
|
wxImage img = decoder.ReadData(bits);
|
||||||
|
wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid cursor data") )
|
||||||
|
CreateFromImage( img ) ;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
short GetCTabIndex( CTabHandle colors , RGBColor *col )
|
||||||
|
{
|
||||||
|
short retval = 0 ;
|
||||||
|
unsigned long bestdiff = 0xFFFF ;
|
||||||
|
for ( int i = 0 ; i < (**colors).ctSize ; ++i )
|
||||||
|
{
|
||||||
|
unsigned long diff = abs(col->red - (**colors).ctTable[i].rgb.red ) +
|
||||||
|
abs(col->green - (**colors).ctTable[i].rgb.green ) +
|
||||||
|
abs(col->blue - (**colors).ctTable[i].rgb.blue ) ;
|
||||||
|
if ( diff < bestdiff )
|
||||||
|
{
|
||||||
|
bestdiff = diff ;
|
||||||
|
retval = (**colors).ctTable[i].value ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCursor::CreateFromImage(const wxImage & image)
|
||||||
|
{
|
||||||
|
m_refData = new wxCursorRefData;
|
||||||
|
|
||||||
|
wxImage image16 = image.Scale(16,16) ;
|
||||||
|
unsigned char * rgbBits = image16.GetData();
|
||||||
|
|
||||||
|
|
||||||
|
int w = image16.GetWidth() ;
|
||||||
|
int h = image16.GetHeight() ;
|
||||||
|
bool bHasMask = image16.HasMask() ;
|
||||||
|
|
||||||
|
int hotSpotX = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
|
||||||
|
int hotSpotY = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
|
||||||
|
if (hotSpotX < 0 || hotSpotX >= w)
|
||||||
|
hotSpotX = 0;
|
||||||
|
if (hotSpotY < 0 || hotSpotY >= h)
|
||||||
|
hotSpotY = 0;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// monochrome implementation
|
||||||
|
M_CURSORDATA->m_hCursor = NewHandle( sizeof( Cursor ) ) ;
|
||||||
|
M_CURSORDATA->m_disposeHandle = true ;
|
||||||
|
HLock( (Handle) M_CURSORDATA->m_hCursor ) ;
|
||||||
|
CursPtr cp = *(CursHandle)M_CURSORDATA->m_hCursor ;
|
||||||
|
memset( cp->data , 0 , sizeof( Bits16 ) ) ;
|
||||||
|
memset( cp->mask , 0 , sizeof( Bits16 ) ) ;
|
||||||
|
|
||||||
|
unsigned char mr = image16.GetMaskRed() ;
|
||||||
|
unsigned char mg = image16.GetMaskGreen() ;
|
||||||
|
unsigned char mb = image16.GetMaskBlue() ;
|
||||||
|
for ( int y = 0 ; y < h ; ++y )
|
||||||
|
{
|
||||||
|
short rowbits = 0 ;
|
||||||
|
short maskbits = 0 ;
|
||||||
|
|
||||||
|
for ( int x = 0 ; x < w ; ++x )
|
||||||
|
{
|
||||||
|
long pos = (y * w + x) * 3;
|
||||||
|
|
||||||
|
unsigned char r = rgbBits[pos] ;
|
||||||
|
unsigned char g = rgbBits[pos+1] ;
|
||||||
|
unsigned char b = rgbBits[pos+2] ;
|
||||||
|
if ( bHasMask && r==mr && g==mg && b==mb )
|
||||||
|
{
|
||||||
|
// masked area, does not appear anywhere
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (int)r + (int)g + (int)b < 0x0200 )
|
||||||
|
{
|
||||||
|
rowbits |= ( 1 << (15-x) ) ;
|
||||||
|
}
|
||||||
|
maskbits |= ( 1 << (15-x) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cp->data[y] = rowbits ;
|
||||||
|
cp->mask[y] = maskbits ;
|
||||||
|
}
|
||||||
|
if ( !bHasMask )
|
||||||
|
{
|
||||||
|
memcpy( cp->mask , cp->data , sizeof( Bits16) ) ;
|
||||||
|
}
|
||||||
|
cp->hotSpot.h = hotSpotX ;
|
||||||
|
cp->hotSpot.v = hotSpotY ;
|
||||||
|
HUnlock( (Handle) M_CURSORDATA->m_hCursor ) ;
|
||||||
|
#else
|
||||||
|
PixMapHandle pm = (PixMapHandle) NewHandleClear( sizeof (PixMap)) ;
|
||||||
|
short extent = 16 ;
|
||||||
|
short bytesPerPixel = 1 ;
|
||||||
|
short depth = 8 ;
|
||||||
|
Rect bounds = { 0 , 0 , extent , extent } ;
|
||||||
|
CCrsrHandle ch = (CCrsrHandle) NewHandleClear ( sizeof( CCrsr ) ) ;
|
||||||
|
CTabHandle newColors = GetCTable( 8 ) ;
|
||||||
|
HandToHand((Handle *) &newColors);
|
||||||
|
// set the values to the indices
|
||||||
|
for ( int i = 0 ; i < (**newColors).ctSize ; ++i )
|
||||||
|
{
|
||||||
|
(**newColors).ctTable[i].value = i ;
|
||||||
|
}
|
||||||
|
HLock( (Handle) ch) ;
|
||||||
|
(**ch).crsrType = 0x8001 ; // color cursors
|
||||||
|
(**ch).crsrMap = pm ;
|
||||||
|
short bytesPerRow = bytesPerPixel * extent ;
|
||||||
|
|
||||||
|
(**pm).baseAddr = 0;
|
||||||
|
(**pm).rowBytes = bytesPerRow | 0x8000;
|
||||||
|
(**pm).bounds = bounds;
|
||||||
|
(**pm).pmVersion = 0;
|
||||||
|
(**pm).packType = 0;
|
||||||
|
(**pm).packSize = 0;
|
||||||
|
(**pm).hRes = 0x00480000; /* 72 DPI default res */
|
||||||
|
(**pm).vRes = 0x00480000; /* 72 DPI default res */
|
||||||
|
(**pm).pixelSize = depth;
|
||||||
|
(**pm).pixelType = 0;
|
||||||
|
(**pm).cmpCount = 1;
|
||||||
|
(**pm).cmpSize = depth;
|
||||||
|
(**pm).pmTable = newColors;
|
||||||
|
|
||||||
|
(**ch).crsrData = NewHandleClear( extent * bytesPerRow ) ;
|
||||||
|
(**ch).crsrXData = NULL ;
|
||||||
|
(**ch).crsrXValid = 0;
|
||||||
|
(**ch).crsrXHandle = NULL;
|
||||||
|
|
||||||
|
(**ch).crsrHotSpot.h = hotSpotX ;
|
||||||
|
(**ch).crsrHotSpot.v = hotSpotY ;
|
||||||
|
(**ch).crsrXTable = NULL ;
|
||||||
|
(**ch).crsrID = GetCTSeed() ;
|
||||||
|
|
||||||
|
memset( (**ch).crsr1Data , 0 , sizeof( Bits16 ) ) ;
|
||||||
|
memset( (**ch).crsrMask , 0 , sizeof( Bits16 ) ) ;
|
||||||
|
|
||||||
|
unsigned char mr = image16.GetMaskRed() ;
|
||||||
|
unsigned char mg = image16.GetMaskGreen() ;
|
||||||
|
unsigned char mb = image16.GetMaskBlue() ;
|
||||||
|
for ( int y = 0 ; y < h ; ++y )
|
||||||
|
{
|
||||||
|
short rowbits = 0 ;
|
||||||
|
short maskbits = 0 ;
|
||||||
|
|
||||||
|
for ( int x = 0 ; x < w ; ++x )
|
||||||
|
{
|
||||||
|
long pos = (y * w + x) * 3;
|
||||||
|
|
||||||
|
unsigned char r = rgbBits[pos] ;
|
||||||
|
unsigned char g = rgbBits[pos+1] ;
|
||||||
|
unsigned char b = rgbBits[pos+2] ;
|
||||||
|
RGBColor col = { 0xFFFF ,0xFFFF, 0xFFFF } ;
|
||||||
|
|
||||||
|
if ( bHasMask && r==mr && g==mg && b==mb )
|
||||||
|
{
|
||||||
|
// masked area, does not appear anywhere
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (int)r + (int)g + (int)b < 0x0200 )
|
||||||
|
{
|
||||||
|
rowbits |= ( 1 << (15-x) ) ;
|
||||||
|
}
|
||||||
|
maskbits |= ( 1 << (15-x) ) ;
|
||||||
|
|
||||||
|
col = *((RGBColor*) wxColor( r , g , b ).GetPixel()) ;
|
||||||
|
}
|
||||||
|
*((*(**ch).crsrData) + y * bytesPerRow + x) =
|
||||||
|
GetCTabIndex( newColors , &col) ;
|
||||||
|
}
|
||||||
|
(**ch).crsr1Data[y] = rowbits ;
|
||||||
|
(**ch).crsrMask[y] = maskbits ;
|
||||||
|
}
|
||||||
|
if ( !bHasMask )
|
||||||
|
{
|
||||||
|
memcpy( (**ch).crsrMask , (**ch).crsr1Data , sizeof( Bits16) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
HUnlock((Handle) ch) ;
|
||||||
|
M_CURSORDATA->m_hCursor = ch ;
|
||||||
|
M_CURSORDATA->m_isColorCursor = true ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY)
|
||||||
|
{
|
||||||
|
m_refData = new wxCursorRefData;
|
||||||
|
if ( flags == wxBITMAP_TYPE_MACCURSOR_RESOURCE )
|
||||||
|
{
|
||||||
|
Str255 theName ;
|
||||||
|
wxMacStringToPascal( cursor_file , theName ) ;
|
||||||
|
|
||||||
|
wxStAppResource resload ;
|
||||||
|
Handle resHandle = ::GetNamedResource( 'crsr' , theName ) ;
|
||||||
|
if ( resHandle )
|
||||||
|
{
|
||||||
|
short theId = -1 ;
|
||||||
|
OSType theType ;
|
||||||
|
GetResInfo( resHandle , &theId , &theType , theName ) ;
|
||||||
|
ReleaseResource( resHandle ) ;
|
||||||
|
M_CURSORDATA->m_hCursor = GetCCursor( theId ) ;
|
||||||
|
if ( M_CURSORDATA->m_hCursor )
|
||||||
|
M_CURSORDATA->m_isColorCursor = true ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Handle resHandle = ::GetNamedResource( 'CURS' , theName ) ;
|
||||||
|
if ( resHandle )
|
||||||
|
{
|
||||||
|
short theId = -1 ;
|
||||||
|
OSType theType ;
|
||||||
|
GetResInfo( resHandle , &theId , &theType , theName ) ;
|
||||||
|
ReleaseResource( resHandle ) ;
|
||||||
|
M_CURSORDATA->m_hCursor = GetCursor( theId ) ;
|
||||||
|
if ( M_CURSORDATA->m_hCursor )
|
||||||
|
M_CURSORDATA->m_releaseHandle = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxImage image ;
|
||||||
|
image.LoadFile( cursor_file , flags ) ;
|
||||||
|
if( image.Ok() )
|
||||||
|
{
|
||||||
|
image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X,hotSpotX ) ;
|
||||||
|
image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y,hotSpotY ) ;
|
||||||
|
delete m_refData ;
|
||||||
|
CreateFromImage(image) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cursors by stock number
|
||||||
|
wxCursor::wxCursor(int cursor_type)
|
||||||
|
{
|
||||||
|
m_refData = new wxCursorRefData;
|
||||||
|
|
||||||
|
switch (cursor_type)
|
||||||
|
{
|
||||||
|
case wxCURSOR_COPY_ARROW:
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeCopyArrowCursor ;
|
||||||
|
break;
|
||||||
|
case wxCURSOR_WAIT:
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeWatchCursor ;
|
||||||
|
break;
|
||||||
|
case wxCURSOR_IBEAM:
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeIBeamCursor ;
|
||||||
|
break;
|
||||||
|
case wxCURSOR_CROSS:
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeCrossCursor;
|
||||||
|
break;
|
||||||
|
case wxCURSOR_SIZENWSE:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeNWSE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_SIZENESW:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeNESW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_SIZEWE:
|
||||||
|
{
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeResizeLeftRightCursor;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_SIZENS:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeNS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_SIZING:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSize);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_HAND:
|
||||||
|
{
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemePointingHandCursor;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_BULLSEYE:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorBullseye);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_PENCIL:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorPencil);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_MAGNIFIER:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorMagnifier);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_NO_ENTRY:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorNoEntry);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case wxCURSOR_WATCH:
|
||||||
|
{
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeWatchCursor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_PAINT_BRUSH:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorPaintBrush);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_POINT_LEFT:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorPointLeft);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_POINT_RIGHT:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorPointRight);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_QUESTION_ARROW:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorQuestionArrow);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_BLANK:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorBlank);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_RIGHT_ARROW:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorRightArrow);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_SPRAYCAN:
|
||||||
|
{
|
||||||
|
wxStAppResource resload ;
|
||||||
|
M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorRoller);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case wxCURSOR_CHAR:
|
||||||
|
case wxCURSOR_ARROW:
|
||||||
|
case wxCURSOR_LEFT_BUTTON:
|
||||||
|
case wxCURSOR_RIGHT_BUTTON:
|
||||||
|
case wxCURSOR_MIDDLE_BUTTON:
|
||||||
|
default:
|
||||||
|
M_CURSORDATA->m_themeCursor = kThemeArrowCursor ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( M_CURSORDATA->m_themeCursor == -1 )
|
||||||
|
M_CURSORDATA->m_releaseHandle = true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxCursor::MacInstall() const
|
||||||
|
{
|
||||||
|
gMacCurrentCursor = *this ;
|
||||||
|
if ( m_refData && M_CURSORDATA->m_themeCursor != -1 )
|
||||||
|
{
|
||||||
|
SetThemeCursor( M_CURSORDATA->m_themeCursor ) ;
|
||||||
|
}
|
||||||
|
else if ( m_refData && M_CURSORDATA->m_hCursor )
|
||||||
|
{
|
||||||
|
if ( M_CURSORDATA->m_isColorCursor )
|
||||||
|
::SetCCursor( (CCrsrHandle) M_CURSORDATA->m_hCursor ) ;
|
||||||
|
else
|
||||||
|
::SetCursor( * (CursHandle) M_CURSORDATA->m_hCursor ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetThemeCursor( kThemeArrowCursor ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCursor::~wxCursor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Global cursor setting
|
||||||
|
void wxSetCursor(const wxCursor& cursor)
|
||||||
|
{
|
||||||
|
cursor.MacInstall() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
25
src/mac/classic/data.cpp
Normal file
25
src/mac/classic/data.cpp
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mac/data.cpp
|
||||||
|
// Purpose: Various global Mac-specific data
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "wx/event.h"
|
||||||
|
|
||||||
|
#if wxUSE_SHARED_LIBRARY
|
||||||
|
///// Event tables (also must be in one, statically-linked file for shared libraries)
|
||||||
|
|
||||||
|
// This is the base, wxEvtHandler 'bootstrap' code which is expanded manually here
|
||||||
|
const wxEventTable *wxEvtHandler::GetEventTable() const { return &wxEvtHandler::sm_eventTable; }
|
||||||
|
|
||||||
|
const wxEventTable wxEvtHandler::sm_eventTable =
|
||||||
|
{ NULL, &wxEvtHandler::sm_eventTableEntries[0] };
|
||||||
|
|
||||||
|
const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = { { 0, 0, 0, NULL } };
|
||||||
|
#endif
|
||||||
|
|
||||||
308
src/mac/classic/dataobj.cpp
Normal file
308
src/mac/classic/dataobj.cpp
Normal file
@@ -0,0 +1,308 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mac/dataobj.cpp
|
||||||
|
// Purpose: implementation of wxDataObject class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 10/21/99
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1999 Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dataobj.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#endif
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/dataobj.h"
|
||||||
|
#include "wx/mstream.h"
|
||||||
|
#include "wx/image.h"
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#include <Scrap.h>
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDataFormat
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDataFormat::wxDataFormat()
|
||||||
|
{
|
||||||
|
m_type = wxDF_INVALID;
|
||||||
|
m_format = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataFormat::wxDataFormat( wxDataFormatId vType )
|
||||||
|
{
|
||||||
|
SetType(vType);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataFormat::wxDataFormat( const wxChar* zId)
|
||||||
|
{
|
||||||
|
SetId(zId);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataFormat::wxDataFormat( const wxString& rId)
|
||||||
|
{
|
||||||
|
SetId(rId);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDataFormat::wxDataFormat( NativeFormat vFormat)
|
||||||
|
{
|
||||||
|
SetId(vFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDataFormat::SetType( wxDataFormatId Type )
|
||||||
|
{
|
||||||
|
m_type = Type;
|
||||||
|
|
||||||
|
if (m_type == wxDF_TEXT )
|
||||||
|
m_format = kScrapFlavorTypeText;
|
||||||
|
else if (m_type == wxDF_UNICODETEXT )
|
||||||
|
m_format = kScrapFlavorTypeUnicode ;
|
||||||
|
else if (m_type == wxDF_BITMAP || m_type == wxDF_METAFILE )
|
||||||
|
m_format = kScrapFlavorTypePicture;
|
||||||
|
else if (m_type == wxDF_FILENAME)
|
||||||
|
m_format = kDragFlavorTypeHFS ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( wxT("invalid dataformat") );
|
||||||
|
|
||||||
|
// this is '????' but it can't be used in the code because ??' is
|
||||||
|
// parsed as a trigraph!
|
||||||
|
m_format = 0x3f3f3f3f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxDataFormat::GetId() const
|
||||||
|
{
|
||||||
|
// note that m_format is not a pointer to string, it *is* itself a 4
|
||||||
|
// character string
|
||||||
|
char text[5] ;
|
||||||
|
strncpy( text , (char*) &m_format , 4 ) ;
|
||||||
|
text[4] = 0 ;
|
||||||
|
|
||||||
|
return wxString::FromAscii( text ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDataFormat::SetId( NativeFormat format )
|
||||||
|
{
|
||||||
|
m_format = format;
|
||||||
|
|
||||||
|
if (m_format == kScrapFlavorTypeText)
|
||||||
|
m_type = wxDF_TEXT;
|
||||||
|
else if (m_format == kScrapFlavorTypeUnicode )
|
||||||
|
m_type = wxDF_UNICODETEXT;
|
||||||
|
else if (m_format == kScrapFlavorTypePicture)
|
||||||
|
m_type = wxDF_BITMAP;
|
||||||
|
else if (m_format == kDragFlavorTypeHFS )
|
||||||
|
m_type = wxDF_FILENAME;
|
||||||
|
else
|
||||||
|
m_type = wxDF_PRIVATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDataFormat::SetId( const wxChar* zId )
|
||||||
|
{
|
||||||
|
m_type = wxDF_PRIVATE;
|
||||||
|
m_format = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// wxDataObject
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDataObject::wxDataObject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDataObject::IsSupportedFormat(
|
||||||
|
const wxDataFormat& rFormat
|
||||||
|
, Direction vDir
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
size_t nFormatCount = GetFormatCount(vDir);
|
||||||
|
|
||||||
|
if (nFormatCount == 1)
|
||||||
|
{
|
||||||
|
return rFormat == GetPreferredFormat();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxDataFormat* pFormats = new wxDataFormat[nFormatCount];
|
||||||
|
GetAllFormats( pFormats
|
||||||
|
,vDir
|
||||||
|
);
|
||||||
|
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
for (n = 0; n < nFormatCount; n++)
|
||||||
|
{
|
||||||
|
if (pFormats[n] == rFormat)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] pFormats;
|
||||||
|
|
||||||
|
// found?
|
||||||
|
return n < nFormatCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFileDataObject
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxFileDataObject::GetDataHere(
|
||||||
|
void* pBuf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
wxString sFilenames;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < m_filenames.GetCount(); i++)
|
||||||
|
{
|
||||||
|
sFilenames += m_filenames[i];
|
||||||
|
sFilenames += (wxChar)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wxFileDataObject::GetDataSize() const
|
||||||
|
{
|
||||||
|
size_t nRes = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < m_filenames.GetCount(); i++)
|
||||||
|
{
|
||||||
|
nRes += m_filenames[i].Len();
|
||||||
|
nRes += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nRes + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileDataObject::SetData(
|
||||||
|
size_t WXUNUSED(nSize)
|
||||||
|
, const void* pBuf
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_filenames.Empty();
|
||||||
|
|
||||||
|
AddFile(wxString::FromAscii((char*)pBuf));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFileDataObject::AddFile(
|
||||||
|
const wxString& rFilename
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_filenames.Add(rFilename);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxBitmapDataObject
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxBitmapDataObject::wxBitmapDataObject()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBitmapDataObject::wxBitmapDataObject(
|
||||||
|
const wxBitmap& rBitmap
|
||||||
|
)
|
||||||
|
: wxBitmapDataObjectBase(rBitmap)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
if ( m_bitmap.Ok() )
|
||||||
|
{
|
||||||
|
m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBitmapDataObject::~wxBitmapDataObject()
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapDataObject::SetBitmap(
|
||||||
|
const wxBitmap& rBitmap
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
wxBitmapDataObjectBase::SetBitmap(rBitmap);
|
||||||
|
if ( m_bitmap.Ok() )
|
||||||
|
{
|
||||||
|
m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapDataObject::Init()
|
||||||
|
{
|
||||||
|
m_pictHandle = NULL ;
|
||||||
|
m_pictCreated = false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxBitmapDataObject::Clear()
|
||||||
|
{
|
||||||
|
if ( m_pictCreated && m_pictHandle )
|
||||||
|
{
|
||||||
|
KillPicture( (PicHandle) m_pictHandle ) ;
|
||||||
|
}
|
||||||
|
m_pictHandle = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxBitmapDataObject::GetDataHere(
|
||||||
|
void* pBuf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (!m_pictHandle)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
memcpy(pBuf, *(Handle)m_pictHandle, GetHandleSize((Handle)m_pictHandle));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wxBitmapDataObject::GetDataSize() const
|
||||||
|
{
|
||||||
|
return GetHandleSize((Handle)m_pictHandle) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxBitmapDataObject::SetData(
|
||||||
|
size_t nSize
|
||||||
|
, const void* pBuf
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
|
||||||
|
memcpy( *picHandle , pBuf , nSize ) ;
|
||||||
|
m_pictHandle = picHandle ;
|
||||||
|
m_pictCreated = false ;
|
||||||
|
Rect frame = (**picHandle).picFrame ;
|
||||||
|
|
||||||
|
m_bitmap.SetPict( picHandle ) ;
|
||||||
|
m_bitmap.SetWidth( frame.right - frame.left ) ;
|
||||||
|
m_bitmap.SetHeight( frame.bottom - frame.top ) ;
|
||||||
|
return m_bitmap.Ok();
|
||||||
|
}
|
||||||
2297
src/mac/classic/dc.cpp
Normal file
2297
src/mac/classic/dc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
175
src/mac/classic/dcclient.cpp
Normal file
175
src/mac/classic/dcclient.cpp
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dcclient.cpp
|
||||||
|
// Purpose: wxClientDC class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 01/02/97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dcclient.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
#include "wx/dcmemory.h"
|
||||||
|
#include "wx/region.h"
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/toplevel.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define RAD2DEG 57.2957795131
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPaintDC
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxWindowDC
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
wxWindowDC::wxWindowDC()
|
||||||
|
{
|
||||||
|
m_window = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWindowDC::wxWindowDC(wxWindow *window)
|
||||||
|
{
|
||||||
|
m_window = window ;
|
||||||
|
wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ;
|
||||||
|
WindowRef windowref = (WindowRef) rootwindow->MacGetWindowRef() ;
|
||||||
|
|
||||||
|
int x , y ;
|
||||||
|
x = y = 0 ;
|
||||||
|
window->MacWindowToRootWindow( &x , &y ) ;
|
||||||
|
m_macLocalOrigin.x = x ;
|
||||||
|
m_macLocalOrigin.y = y ;
|
||||||
|
CopyRgn( (RgnHandle) window->MacGetVisibleRegion().GetWXHRGN() , (RgnHandle) m_macBoundaryClipRgn ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , m_macLocalOrigin.x , m_macLocalOrigin.y ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
m_macPort = UMAGetWindowPort( windowref ) ;
|
||||||
|
m_ok = TRUE ;
|
||||||
|
SetBackground(window->MacGetBackgroundBrush());
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWindowDC::~wxWindowDC()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowDC::DoGetSize( int* width, int* height ) const
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_window, _T("GetSize() doesn't work without window") );
|
||||||
|
|
||||||
|
m_window->GetSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxClientDC
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxClientDC::wxClientDC()
|
||||||
|
{
|
||||||
|
m_window = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxClientDC::wxClientDC(wxWindow *window)
|
||||||
|
{
|
||||||
|
m_window = window ;
|
||||||
|
wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ;
|
||||||
|
if (!rootwindow)
|
||||||
|
return;
|
||||||
|
WindowRef windowref = (WindowRef) rootwindow->MacGetWindowRef() ;
|
||||||
|
wxPoint origin = window->GetClientAreaOrigin() ;
|
||||||
|
wxSize size = window->GetClientSize() ;
|
||||||
|
int x , y ;
|
||||||
|
x = origin.x ;
|
||||||
|
y = origin.y ;
|
||||||
|
window->MacWindowToRootWindow( &x , &y ) ;
|
||||||
|
m_macLocalOrigin.x = x ;
|
||||||
|
m_macLocalOrigin.y = y ;
|
||||||
|
SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , origin.x , origin.y , origin.x + size.x , origin.y + size.y ) ;
|
||||||
|
SectRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) window->MacGetVisibleRegion().GetWXHRGN() , (RgnHandle) m_macBoundaryClipRgn ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , -origin.x , -origin.y ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , m_macLocalOrigin.x , m_macLocalOrigin.y ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn ,(RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
m_macPort = UMAGetWindowPort( windowref ) ;
|
||||||
|
|
||||||
|
m_ok = TRUE ;
|
||||||
|
SetBackground(window->MacGetBackgroundBrush());
|
||||||
|
SetFont( window->GetFont() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxClientDC::~wxClientDC()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxClientDC::DoGetSize(int *width, int *height) const
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_window, _T("GetSize() doesn't work without window") );
|
||||||
|
|
||||||
|
m_window->GetClientSize( width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxPaintDC
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxPaintDC::wxPaintDC()
|
||||||
|
{
|
||||||
|
m_window = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPaintDC::wxPaintDC(wxWindow *window)
|
||||||
|
{
|
||||||
|
m_window = window ;
|
||||||
|
wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ;
|
||||||
|
WindowRef windowref = (WindowRef) rootwindow->MacGetWindowRef() ;
|
||||||
|
wxPoint origin = window->GetClientAreaOrigin() ;
|
||||||
|
wxSize size = window->GetClientSize() ;
|
||||||
|
int x , y ;
|
||||||
|
x = origin.x ;
|
||||||
|
y = origin.y ;
|
||||||
|
window->MacWindowToRootWindow( &x , &y ) ;
|
||||||
|
m_macLocalOrigin.x = x ;
|
||||||
|
m_macLocalOrigin.y = y ;
|
||||||
|
SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , origin.x , origin.y , origin.x + size.x , origin.y + size.y ) ;
|
||||||
|
SectRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) window->MacGetVisibleRegion().GetWXHRGN() , (RgnHandle) m_macBoundaryClipRgn ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , -origin.x , -origin.y ) ;
|
||||||
|
SectRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) window->GetUpdateRegion().GetWXHRGN() , (RgnHandle) m_macBoundaryClipRgn ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , m_macLocalOrigin.x , m_macLocalOrigin.y ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
m_macPort = UMAGetWindowPort( windowref ) ;
|
||||||
|
|
||||||
|
m_ok = TRUE ;
|
||||||
|
SetBackground(window->MacGetBackgroundBrush());
|
||||||
|
SetFont( window->GetFont() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPaintDC::~wxPaintDC()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPaintDC::DoGetSize(int *width, int *height) const
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_window, _T("GetSize() doesn't work without window") );
|
||||||
|
|
||||||
|
m_window->GetClientSize( width, height );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
100
src/mac/classic/dcmemory.cpp
Normal file
100
src/mac/classic/dcmemory.cpp
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dcmemory.cpp
|
||||||
|
// Purpose: wxMemoryDC class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 01/02/97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dcmemory.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dcmemory.h"
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxMemoryDC
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC)
|
||||||
|
|
||||||
|
wxMemoryDC::wxMemoryDC(void)
|
||||||
|
: m_selected()
|
||||||
|
{
|
||||||
|
m_ok = TRUE;
|
||||||
|
SetBackground(*wxWHITE_BRUSH);
|
||||||
|
SetBrush(*wxWHITE_BRUSH);
|
||||||
|
SetPen(*wxBLACK_PEN);
|
||||||
|
m_ok = FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
|
||||||
|
: m_selected()
|
||||||
|
{
|
||||||
|
m_ok = TRUE;
|
||||||
|
SetBackground(*wxWHITE_BRUSH);
|
||||||
|
SetBrush(*wxWHITE_BRUSH);
|
||||||
|
SetPen(*wxBLACK_PEN);
|
||||||
|
m_ok = FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
wxMemoryDC::~wxMemoryDC()
|
||||||
|
{
|
||||||
|
if ( m_selected.Ok() )
|
||||||
|
{
|
||||||
|
UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
|
||||||
|
{
|
||||||
|
if ( m_selected.Ok() )
|
||||||
|
{
|
||||||
|
UnlockPixels( GetGWorldPixMap(MAC_WXHBITMAP(m_selected.GetHBITMAP())) );
|
||||||
|
}
|
||||||
|
m_selected = bitmap;
|
||||||
|
if (m_selected.Ok())
|
||||||
|
{
|
||||||
|
if ( m_selected.GetHBITMAP() )
|
||||||
|
{
|
||||||
|
m_macPort = (GrafPtr) m_selected.GetHBITMAP() ;
|
||||||
|
LockPixels( GetGWorldPixMap( (CGrafPtr) m_macPort ) ) ;
|
||||||
|
wxMask * mask = bitmap.GetMask() ;
|
||||||
|
if ( mask )
|
||||||
|
{
|
||||||
|
m_macMask = mask->GetMaskBitmap() ;
|
||||||
|
}
|
||||||
|
SetRectRgn( (RgnHandle) m_macBoundaryClipRgn , 0 , 0 , m_selected.GetWidth() , m_selected.GetHeight() ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn ,(RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
m_ok = TRUE ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ok = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ok = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMemoryDC::DoGetSize( int *width, int *height ) const
|
||||||
|
{
|
||||||
|
if (m_selected.Ok())
|
||||||
|
{
|
||||||
|
if (width) (*width) = m_selected.GetWidth();
|
||||||
|
if (height) (*height) = m_selected.GetHeight();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (width) (*width) = 0;
|
||||||
|
if (height) (*height) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
416
src/mac/classic/dcprint.cpp
Normal file
416
src/mac/classic/dcprint.cpp
Normal file
@@ -0,0 +1,416 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dcprint.cpp
|
||||||
|
// Purpose: wxPrinterDC class
|
||||||
|
// Author: Julian Smart
|
||||||
|
// Modified by:
|
||||||
|
// Created: 01/02/97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dcprint.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dcprint.h"
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include "wx/mac/private/print.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_CLASS(wxPrinterDC, wxDC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class wxNativePrinterDC
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
wxNativePrinterDC() {}
|
||||||
|
virtual ~wxNativePrinterDC() {}
|
||||||
|
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) = 0;
|
||||||
|
virtual void EndDoc( wxPrinterDC* dc ) = 0;
|
||||||
|
virtual void StartPage( wxPrinterDC* dc ) = 0;
|
||||||
|
virtual void EndPage( wxPrinterDC* dc ) = 0;
|
||||||
|
virtual wxCoord GetMaxX() const = 0 ;
|
||||||
|
virtual wxCoord GetMaxY() const = 0 ;
|
||||||
|
// returns 0 in case of no Error, otherwise platform specific error codes
|
||||||
|
virtual wxUint32 GetStatus() const = 0 ;
|
||||||
|
bool Ok() { return GetStatus() == 0 ; }
|
||||||
|
|
||||||
|
static wxNativePrinterDC* Create(wxPrintData* data) ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
|
||||||
|
class wxMacCarbonPrinterDC : public wxNativePrinterDC
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
wxMacCarbonPrinterDC( wxPrintData* data ) ;
|
||||||
|
~wxMacCarbonPrinterDC() ;
|
||||||
|
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) ;
|
||||||
|
virtual void EndDoc( wxPrinterDC* dc ) ;
|
||||||
|
virtual void StartPage( wxPrinterDC* dc ) ;
|
||||||
|
virtual void EndPage( wxPrinterDC* dc ) ;
|
||||||
|
virtual wxCoord GetMaxX() const { return m_maxX ; }
|
||||||
|
virtual wxCoord GetMaxY() const { return m_maxY ; }
|
||||||
|
virtual wxUint32 GetStatus() const { return m_err ; }
|
||||||
|
private :
|
||||||
|
GrafPtr m_macPrintFormerPort ;
|
||||||
|
wxCoord m_maxX ;
|
||||||
|
wxCoord m_maxY ;
|
||||||
|
OSStatus m_err ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data )
|
||||||
|
{
|
||||||
|
::GetPort( & m_macPrintFormerPort ) ;
|
||||||
|
|
||||||
|
m_err = noErr ;
|
||||||
|
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) data->m_nativePrintData ;
|
||||||
|
|
||||||
|
PMRect rPage;
|
||||||
|
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
|
||||||
|
if ( m_err != noErr )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_maxX = wxCoord(rPage.right - rPage.left) ;
|
||||||
|
m_maxY = wxCoord(rPage.bottom - rPage.top);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacCarbonPrinterDC::~wxMacCarbonPrinterDC()
|
||||||
|
{
|
||||||
|
// nothing to release from print data, as wxPrinterDC has all data in its wxPrintData member
|
||||||
|
::SetPort( m_macPrintFormerPort ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxNativePrinterDC* wxNativePrinterDC::Create(wxPrintData* data)
|
||||||
|
{
|
||||||
|
return new wxMacCarbonPrinterDC(data) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMacCarbonPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return false ;
|
||||||
|
|
||||||
|
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
|
||||||
|
m_err = PMSessionBeginDocument(native->m_macPrintSession,
|
||||||
|
native->m_macPrintSettings,
|
||||||
|
native->m_macPageFormat);
|
||||||
|
if ( m_err != noErr )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
PMRect rPage;
|
||||||
|
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
|
||||||
|
if ( m_err != noErr )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_maxX = (wxCoord)(rPage.right - rPage.left);
|
||||||
|
m_maxY = (wxCoord)(rPage.bottom - rPage.top);
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrinterDC::EndDoc( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
|
||||||
|
m_err = PMSessionEndDocument(native->m_macPrintSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
|
||||||
|
m_err = PMSessionBeginPage(native->m_macPrintSession,
|
||||||
|
native->m_macPageFormat,
|
||||||
|
nil);
|
||||||
|
|
||||||
|
if ( m_err == noErr )
|
||||||
|
{
|
||||||
|
m_err = PMSessionGetGraphicsContext(native->m_macPrintSession,
|
||||||
|
nil,
|
||||||
|
(void**) &dc->m_macPort );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_err != noErr )
|
||||||
|
{
|
||||||
|
PMSessionEndPage(native->m_macPrintSession);
|
||||||
|
PMSessionEndDocument(native->m_macPrintSession);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PMRect rPage;
|
||||||
|
|
||||||
|
m_err = PMGetAdjustedPageRect(native->m_macPageFormat, &rPage);
|
||||||
|
if ( !m_err )
|
||||||
|
{
|
||||||
|
dc->m_macLocalOrigin.x = (int) rPage.left;
|
||||||
|
dc->m_macLocalOrigin.y = (int) rPage.top;
|
||||||
|
}
|
||||||
|
// since this is a non-critical error, we set the flag back
|
||||||
|
m_err = noErr ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxMacCarbonPrintData *native = (wxMacCarbonPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
|
||||||
|
m_err = PMSessionEndPage(native->m_macPrintSession);
|
||||||
|
if ( m_err != noErr )
|
||||||
|
{
|
||||||
|
PMSessionEndDocument(native->m_macPrintSession);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
class wxMacClassicPrinterDC : public wxNativePrinterDC
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
wxMacClassicPrinterDC( wxPrintData* data ) ;
|
||||||
|
~wxMacClassicPrinterDC() ;
|
||||||
|
virtual bool StartDoc( wxPrinterDC* dc , const wxString& message ) ;
|
||||||
|
virtual void EndDoc( wxPrinterDC* dc ) ;
|
||||||
|
virtual void StartPage( wxPrinterDC* dc ) ;
|
||||||
|
virtual void EndPage( wxPrinterDC* dc ) ;
|
||||||
|
virtual wxCoord GetMaxX() const { return m_maxX ; }
|
||||||
|
virtual wxCoord GetMaxY() const { return m_maxY ; }
|
||||||
|
virtual wxUint32 GetStatus() const { return m_err ; }
|
||||||
|
private :
|
||||||
|
GrafPtr m_macPrintFormerPort ;
|
||||||
|
TPPrPort m_macPrintingPort ;
|
||||||
|
OSErr m_err ;
|
||||||
|
long m_maxX ;
|
||||||
|
long m_maxY ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
wxNativePrinterDC* wxNativePrinterDC::Create(wxPrintData* data)
|
||||||
|
{
|
||||||
|
return new wxMacClassicPrinterDC(data) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacClassicPrinterDC::wxMacClassicPrinterDC(wxPrintData* data)
|
||||||
|
{
|
||||||
|
::GetPort( &m_macPrintFormerPort ) ;
|
||||||
|
m_err = noErr ;
|
||||||
|
::UMAPrOpen() ;
|
||||||
|
m_err = PrError() ;
|
||||||
|
if ( m_err != noErr )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxMacClassicPrintData *native = (wxMacClassicPrintData*) data->m_nativePrintData ;
|
||||||
|
|
||||||
|
if ( ::PrValidate( native->m_macPrintSettings ) )
|
||||||
|
{
|
||||||
|
// the driver has changed in the mean time, should we pop up a page setup dialog ?
|
||||||
|
if ( !::PrStlDialog( native->m_macPrintSettings ) )
|
||||||
|
{
|
||||||
|
m_err = -1 ;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_err = PrError() ;
|
||||||
|
|
||||||
|
if ( m_err == noErr )
|
||||||
|
{
|
||||||
|
m_maxX = (**native->m_macPrintSettings).prInfo.rPage.right - (**native->m_macPrintSettings).prInfo.rPage.left ;
|
||||||
|
m_maxY = (**native->m_macPrintSettings).prInfo.rPage.bottom - (**native->m_macPrintSettings).prInfo.rPage.top ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacClassicPrinterDC::~wxMacClassicPrinterDC()
|
||||||
|
{
|
||||||
|
::UMAPrClose() ;
|
||||||
|
::SetPort( LMGetWMgrPort() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMacClassicPrinterDC::StartDoc( wxPrinterDC* dc , const wxString& WXUNUSED(message) )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return false ;
|
||||||
|
|
||||||
|
wxMacClassicPrintData *native = (wxMacClassicPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
m_macPrintingPort = ::PrOpenDoc( native->m_macPrintSettings , NULL , NULL ) ;
|
||||||
|
m_err = PrError() ;
|
||||||
|
if ( m_err )
|
||||||
|
return false ;
|
||||||
|
|
||||||
|
// sets current port
|
||||||
|
dc->m_macPort = (GrafPtr ) m_macPrintingPort ;
|
||||||
|
m_maxX = (**native->m_macPrintSettings).prInfo.rPage.right - (**native->m_macPrintSettings).prInfo.rPage.left ;
|
||||||
|
m_maxY = (**native->m_macPrintSettings).prInfo.rPage.bottom - (**native->m_macPrintSettings).prInfo.rPage.top ;
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrinterDC::EndDoc( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
PrCloseDoc( m_macPrintingPort ) ;
|
||||||
|
m_err = PrError() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrinterDC::StartPage( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxMacClassicPrintData *native = (wxMacClassicPrintData*) dc->GetPrintData().m_nativePrintData ;
|
||||||
|
|
||||||
|
PrOpenPage( m_macPrintingPort , NULL ) ;
|
||||||
|
dc->m_macLocalOrigin.x = (**native->m_macPrintSettings).rPaper.left ;
|
||||||
|
dc->m_macLocalOrigin.y = (**native->m_macPrintSettings).rPaper.top ;
|
||||||
|
// m_macPrintingPort is now the current port
|
||||||
|
Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
|
||||||
|
::ClipRect( &clip ) ;
|
||||||
|
m_err = PrError() ;
|
||||||
|
if ( m_err != noErr )
|
||||||
|
::PrCloseDoc( m_macPrintingPort ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrinterDC::EndPage( wxPrinterDC* dc )
|
||||||
|
{
|
||||||
|
if ( m_err )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
PrClosePage( m_macPrintingPort ) ;
|
||||||
|
m_err = PrError() ;
|
||||||
|
if ( m_err != noErr )
|
||||||
|
::PrCloseDoc( m_macPrintingPort ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxPrinterDC::wxPrinterDC(const wxPrintData& printdata)
|
||||||
|
{
|
||||||
|
m_ok = FALSE ;
|
||||||
|
m_printData = printdata ;
|
||||||
|
m_printData.ConvertToNative() ;
|
||||||
|
m_nativePrinterDC = wxNativePrinterDC::Create( &m_printData ) ;
|
||||||
|
if ( m_nativePrinterDC )
|
||||||
|
{
|
||||||
|
m_ok = m_nativePrinterDC->Ok() ;
|
||||||
|
|
||||||
|
if ( !m_ok )
|
||||||
|
{
|
||||||
|
wxString message ;
|
||||||
|
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPrinterDC::~wxPrinterDC(void)
|
||||||
|
{
|
||||||
|
delete m_nativePrinterDC ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPrinterDC::StartDoc( const wxString& message )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( Ok() , wxT("Called wxPrinterDC::StartDoc from an invalid object") ) ;
|
||||||
|
|
||||||
|
if ( !m_ok )
|
||||||
|
return false ;
|
||||||
|
|
||||||
|
if ( m_nativePrinterDC->StartDoc(this, message ) )
|
||||||
|
{
|
||||||
|
// in case we have to do additional things when successful
|
||||||
|
}
|
||||||
|
m_ok = m_nativePrinterDC->Ok() ;
|
||||||
|
if ( !m_ok )
|
||||||
|
{
|
||||||
|
wxString message ;
|
||||||
|
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_ok ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPrinterDC::EndDoc(void)
|
||||||
|
{
|
||||||
|
if ( !m_ok )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
m_nativePrinterDC->EndDoc( this ) ;
|
||||||
|
m_ok = m_nativePrinterDC->Ok() ;
|
||||||
|
|
||||||
|
if ( !m_ok )
|
||||||
|
{
|
||||||
|
wxString message ;
|
||||||
|
message.Printf( wxT("Print Error %u"), m_nativePrinterDC->GetStatus() ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPrinterDC::StartPage(void)
|
||||||
|
{
|
||||||
|
if ( !m_ok )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
m_logicalFunction = wxCOPY;
|
||||||
|
// m_textAlignment = wxALIGN_TOP_LEFT;
|
||||||
|
m_backgroundMode = wxTRANSPARENT;
|
||||||
|
|
||||||
|
m_textForegroundColour = *wxBLACK;
|
||||||
|
m_textBackgroundColour = *wxWHITE;
|
||||||
|
m_pen = *wxBLACK_PEN;
|
||||||
|
m_font = *wxNORMAL_FONT;
|
||||||
|
m_brush = *wxTRANSPARENT_BRUSH;
|
||||||
|
m_backgroundBrush = *wxWHITE_BRUSH;
|
||||||
|
|
||||||
|
m_macFontInstalled = false ;
|
||||||
|
m_macBrushInstalled = false ;
|
||||||
|
m_macPenInstalled = false ;
|
||||||
|
|
||||||
|
m_nativePrinterDC->StartPage(this) ;
|
||||||
|
m_ok = m_nativePrinterDC->Ok() ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPrinterDC::EndPage(void)
|
||||||
|
{
|
||||||
|
if ( !m_ok )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
m_nativePrinterDC->EndPage(this) ;
|
||||||
|
m_ok = m_nativePrinterDC->Ok() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPrinterDC::DoGetSize(int *width, int *height) const
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_ok , _T("GetSize() doesn't work without a valid wxPrinterDC") );
|
||||||
|
|
||||||
|
if ( width )
|
||||||
|
* width = m_nativePrinterDC->GetMaxX() ;
|
||||||
|
if ( height )
|
||||||
|
* height = m_nativePrinterDC->GetMaxY() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
63
src/mac/classic/dcscreen.cpp
Normal file
63
src/mac/classic/dcscreen.cpp
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dcscreen.cpp
|
||||||
|
// Purpose: wxScreenDC class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dcscreen.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dcscreen.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxWindowDC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Create a DC representing the whole screen
|
||||||
|
wxScreenDC::wxScreenDC()
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
m_macPort = GetQDGlobalsThePort() ;
|
||||||
|
GrafPtr port ;
|
||||||
|
GetPort( &port ) ;
|
||||||
|
SetPort( (GrafPtr) m_macPort ) ;
|
||||||
|
Point pt = { 0,0 } ;
|
||||||
|
LocalToGlobal( &pt ) ;
|
||||||
|
SetPort( port ) ;
|
||||||
|
m_macLocalOrigin.x = -pt.h ;
|
||||||
|
m_macLocalOrigin.y = -pt.v ;
|
||||||
|
#else
|
||||||
|
m_macPort = LMGetWMgrPort() ;
|
||||||
|
m_macLocalOrigin.x = 0 ;
|
||||||
|
m_macLocalOrigin.y = 0 ;
|
||||||
|
#endif
|
||||||
|
m_ok = TRUE ;
|
||||||
|
BitMap screenBits;
|
||||||
|
GetQDGlobalsScreenBits( &screenBits );
|
||||||
|
m_minX = screenBits.bounds.left ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SInt16 height ;
|
||||||
|
GetThemeMenuBarHeight( &height ) ;
|
||||||
|
m_minY = screenBits.bounds.top + height ;
|
||||||
|
#else
|
||||||
|
m_minY = screenBits.bounds.top + LMGetMBarHeight() ;
|
||||||
|
#endif
|
||||||
|
m_maxX = screenBits.bounds.right ;
|
||||||
|
m_maxY = screenBits.bounds.bottom ;
|
||||||
|
MacSetRectRgn( (RgnHandle) m_macBoundaryClipRgn , m_minX , m_minY , m_maxX , m_maxY ) ;
|
||||||
|
OffsetRgn( (RgnHandle) m_macBoundaryClipRgn , m_macLocalOrigin.x , m_macLocalOrigin.y ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxScreenDC::~wxScreenDC()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
268
src/mac/classic/dialog.cpp
Normal file
268
src/mac/classic/dialog.cpp
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dialog.cpp
|
||||||
|
// Purpose: wxDialog class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dialog.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dialog.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// Lists to keep track of windows, so we can disable/enable them
|
||||||
|
// for modal dialogs
|
||||||
|
wxList wxModalDialogs;
|
||||||
|
//wxList wxModelessWindows; // Frames and modeless dialogs
|
||||||
|
extern wxList wxPendingDelete;
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxDialog, wxDialogBase)
|
||||||
|
EVT_BUTTON(wxID_OK, wxDialog::OnOK)
|
||||||
|
EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
|
||||||
|
EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
|
||||||
|
|
||||||
|
EVT_CHAR_HOOK(wxDialog::OnCharHook)
|
||||||
|
|
||||||
|
EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
|
||||||
|
|
||||||
|
EVT_CLOSE(wxDialog::OnCloseWindow)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxDialog::wxDialog()
|
||||||
|
{
|
||||||
|
m_isShown = FALSE;
|
||||||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDialog::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& title,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
|
||||||
|
|
||||||
|
|
||||||
|
if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
MacCreateRealWindow( title , pos , size , MacRemoveBordersFromStyle(style) & ~(wxYES|wxOK|wxNO|wxCANCEL) , name ) ;
|
||||||
|
|
||||||
|
m_macWindowBackgroundTheme = kThemeBrushDialogBackgroundActive ;
|
||||||
|
SetThemeWindowBackground( (WindowRef) m_macWindow , m_macWindowBackgroundTheme , false ) ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDialog::SetModal(bool flag)
|
||||||
|
{
|
||||||
|
if ( flag )
|
||||||
|
{
|
||||||
|
m_windowStyle |= wxDIALOG_MODAL;
|
||||||
|
|
||||||
|
wxModelessWindows.DeleteObject(this);
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SetWindowModality( (WindowRef) MacGetWindowRef() , kWindowModalityAppModal , NULL ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_windowStyle &= ~wxDIALOG_MODAL;
|
||||||
|
|
||||||
|
wxModelessWindows.Append(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDialog::~wxDialog()
|
||||||
|
{
|
||||||
|
m_isBeingDeleted = TRUE;
|
||||||
|
Show(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// By default, pressing escape cancels the dialog , on mac command-stop does the same thing
|
||||||
|
void wxDialog::OnCharHook(wxKeyEvent& event)
|
||||||
|
{
|
||||||
|
if (( event.m_keyCode == WXK_ESCAPE ||
|
||||||
|
( event.m_keyCode == '.' && event.MetaDown() ) )
|
||||||
|
&& FindWindow(wxID_CANCEL) )
|
||||||
|
{
|
||||||
|
// Behaviour changed in 2.0: we'll send a Cancel message
|
||||||
|
// to the dialog instead of Close.
|
||||||
|
wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
|
||||||
|
cancelEvent.SetEventObject( this );
|
||||||
|
GetEventHandler()->ProcessEvent(cancelEvent);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// We didn't process this event.
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDialog::IsModal() const
|
||||||
|
{
|
||||||
|
return (GetWindowStyleFlag() & wxDIALOG_MODAL) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxDialog::IsModalShowing() const
|
||||||
|
{
|
||||||
|
return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDialog::Show(bool show)
|
||||||
|
{
|
||||||
|
if ( !wxDialogBase::Show(show) )
|
||||||
|
{
|
||||||
|
// nothing to do
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( show )
|
||||||
|
{
|
||||||
|
// usually will result in TransferDataToWindow() being called
|
||||||
|
InitDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( IsModal() )
|
||||||
|
{
|
||||||
|
if ( show )
|
||||||
|
{
|
||||||
|
DoShowModal();
|
||||||
|
}
|
||||||
|
else // end of modal dialog
|
||||||
|
{
|
||||||
|
// this will cause IsModalShowing() return FALSE and our local
|
||||||
|
// message loop will terminate
|
||||||
|
wxModalDialogs.DeleteObject(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
extern bool s_macIsInModalLoop ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void wxDialog::DoShowModal()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( !IsModalShowing(), _T("DoShowModal() called twice") );
|
||||||
|
|
||||||
|
wxModalDialogs.Append(this);
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
BeginAppModalStateForWindow( (WindowRef) MacGetWindowRef()) ;
|
||||||
|
#else
|
||||||
|
// TODO : test whether parent gets disabled
|
||||||
|
bool formerModal = s_macIsInModalLoop ;
|
||||||
|
s_macIsInModalLoop = true ;
|
||||||
|
#endif
|
||||||
|
while ( IsModalShowing() )
|
||||||
|
{
|
||||||
|
wxTheApp->MacDoOneEvent() ;
|
||||||
|
// calls process idle itself
|
||||||
|
}
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
EndAppModalStateForWindow( (WindowRef) MacGetWindowRef() ) ;
|
||||||
|
#else
|
||||||
|
// TODO probably reenable the parent window if any
|
||||||
|
s_macIsInModalLoop = formerModal ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Replacement for Show(TRUE) for modal dialogs - returns return code
|
||||||
|
int wxDialog::ShowModal()
|
||||||
|
{
|
||||||
|
if ( !IsModal() )
|
||||||
|
{
|
||||||
|
SetModal(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Show(TRUE);
|
||||||
|
return GetReturnCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
// NB: this function (surprizingly) may be called for both modal and modeless
|
||||||
|
// dialogs and should work for both of them
|
||||||
|
void wxDialog::EndModal(int retCode)
|
||||||
|
{
|
||||||
|
SetReturnCode(retCode);
|
||||||
|
Show(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standard buttons
|
||||||
|
void wxDialog::OnOK(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
if ( Validate() && TransferDataFromWindow() )
|
||||||
|
{
|
||||||
|
EndModal(wxID_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
if (Validate())
|
||||||
|
TransferDataFromWindow();
|
||||||
|
// TODO probably need to disable the Apply button until things change again
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
EndModal(wxID_CANCEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
// We'll send a Cancel message by default,
|
||||||
|
// which may close the dialog.
|
||||||
|
// Check for looping if the Cancel event handler calls Close().
|
||||||
|
|
||||||
|
// Note that if a cancel button and handler aren't present in the dialog,
|
||||||
|
// nothing will happen when you close the dialog via the window manager, or
|
||||||
|
// via Close().
|
||||||
|
// We wouldn't want to destroy the dialog by default, since the dialog may have been
|
||||||
|
// created on the stack.
|
||||||
|
// However, this does mean that calling dialog->Close() won't delete the dialog
|
||||||
|
// unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
|
||||||
|
// sure to destroy the dialog.
|
||||||
|
// The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
|
||||||
|
|
||||||
|
static wxList closing;
|
||||||
|
|
||||||
|
if ( closing.Member(this) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
closing.Append(this);
|
||||||
|
|
||||||
|
wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
|
||||||
|
cancelEvent.SetEventObject( this );
|
||||||
|
GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
|
||||||
|
|
||||||
|
closing.DeleteObject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
146
src/mac/classic/dirdlg.cpp
Normal file
146
src/mac/classic/dirdlg.cpp
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dirdlg.cpp
|
||||||
|
// Purpose: wxDirDialog
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dirdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/dialog.h"
|
||||||
|
#include "wx/dirdlg.h"
|
||||||
|
|
||||||
|
#include "wx/cmndata.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#else
|
||||||
|
#include <Navigation.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_CLASS(wxDirDialog, wxDialog)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxDirDialog::wxDirDialog(wxWindow *parent,
|
||||||
|
const wxString& message,
|
||||||
|
const wxString& defaultPath,
|
||||||
|
long style,
|
||||||
|
const wxPoint& WXUNUSED(pos),
|
||||||
|
const wxSize& WXUNUSED(size),
|
||||||
|
const wxString& WXUNUSED(name))
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
|
||||||
|
m_message = message;
|
||||||
|
m_dialogStyle = style;
|
||||||
|
m_parent = parent;
|
||||||
|
m_path = defaultPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxDirDialog::ShowModal()
|
||||||
|
{
|
||||||
|
NavDialogOptions mNavOptions;
|
||||||
|
NavObjectFilterUPP mNavFilterUPP = NULL;
|
||||||
|
NavPreviewUPP mNavPreviewUPP = NULL ;
|
||||||
|
NavReplyRecord mNavReply;
|
||||||
|
AEDesc* mDefaultLocation = NULL ;
|
||||||
|
bool mSelectDefault = false ;
|
||||||
|
|
||||||
|
::NavGetDefaultDialogOptions(&mNavOptions);
|
||||||
|
|
||||||
|
mNavFilterUPP = nil;
|
||||||
|
mNavPreviewUPP = nil;
|
||||||
|
mSelectDefault = false;
|
||||||
|
mNavReply.validRecord = false;
|
||||||
|
mNavReply.replacing = false;
|
||||||
|
mNavReply.isStationery = false;
|
||||||
|
mNavReply.translationNeeded = false;
|
||||||
|
mNavReply.selection.descriptorType = typeNull;
|
||||||
|
mNavReply.selection.dataHandle = nil;
|
||||||
|
mNavReply.keyScript = smSystemScript;
|
||||||
|
mNavReply.fileTranslation = nil;
|
||||||
|
|
||||||
|
// Set default location, the location
|
||||||
|
// that's displayed when the dialog
|
||||||
|
// first appears
|
||||||
|
|
||||||
|
if ( mDefaultLocation ) {
|
||||||
|
|
||||||
|
if (mSelectDefault) {
|
||||||
|
mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation;
|
||||||
|
} else {
|
||||||
|
mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OSErr err = ::NavChooseFolder(
|
||||||
|
mDefaultLocation,
|
||||||
|
&mNavReply,
|
||||||
|
&mNavOptions,
|
||||||
|
NULL,
|
||||||
|
mNavFilterUPP,
|
||||||
|
0L); // User Data
|
||||||
|
|
||||||
|
if ( (err != noErr) && (err != userCanceledErr) ) {
|
||||||
|
m_path = wxT("") ;
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mNavReply.validRecord) { // User chose a folder
|
||||||
|
|
||||||
|
FSSpec folderInfo;
|
||||||
|
FSSpec outFileSpec ;
|
||||||
|
AEDesc specDesc ;
|
||||||
|
|
||||||
|
OSErr err = ::AECoerceDesc( &mNavReply.selection , typeFSS, &specDesc);
|
||||||
|
if ( err != noErr ) {
|
||||||
|
m_path = wxT("") ;
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
folderInfo = **(FSSpec**) specDesc.dataHandle;
|
||||||
|
if (specDesc.dataHandle != nil) {
|
||||||
|
::AEDisposeDesc(&specDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mNavReply.GetFileSpec(folderInfo);
|
||||||
|
|
||||||
|
// The FSSpec from NavChooseFolder is NOT the file spec
|
||||||
|
// for the folder. The parID field is actually the DirID
|
||||||
|
// of the folder itself, not the folder's parent, and
|
||||||
|
// the name field is empty. We must call PBGetCatInfo
|
||||||
|
// to get the parent DirID and folder name
|
||||||
|
|
||||||
|
Str255 name;
|
||||||
|
CInfoPBRec thePB; // Directory Info Parameter Block
|
||||||
|
thePB.dirInfo.ioCompletion = nil;
|
||||||
|
thePB.dirInfo.ioVRefNum = folderInfo.vRefNum; // Volume is right
|
||||||
|
thePB.dirInfo.ioDrDirID = folderInfo.parID; // Folder's DirID
|
||||||
|
thePB.dirInfo.ioNamePtr = name;
|
||||||
|
thePB.dirInfo.ioFDirIndex = -1; // Lookup using Volume and DirID
|
||||||
|
|
||||||
|
err = ::PBGetCatInfoSync(&thePB);
|
||||||
|
if ( err != noErr ) {
|
||||||
|
m_path = wxT("") ;
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
// Create cannonical FSSpec
|
||||||
|
::FSMakeFSSpec(thePB.dirInfo.ioVRefNum, thePB.dirInfo.ioDrParID,
|
||||||
|
name, &outFileSpec);
|
||||||
|
|
||||||
|
// outFolderDirID = thePB.dirInfo.ioDrDirID;
|
||||||
|
m_path = wxMacFSSpec2MacFilename( &outFileSpec ) ;
|
||||||
|
return wxID_OK ;
|
||||||
|
}
|
||||||
|
return wxID_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
322
src/mac/classic/dirmac.cpp
Normal file
322
src/mac/classic/dirmac.cpp
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: msw/dir.cpp
|
||||||
|
// Purpose: wxDir implementation for Mac
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 08.12.99
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1999 Stefan Csomor <csomor@advanced.ch>
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dir.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#endif // PCH
|
||||||
|
|
||||||
|
#include "wx/dir.h"
|
||||||
|
#include "wx/filefn.h" // for wxPathExists()
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
# include "MoreFilesX.h"
|
||||||
|
#else
|
||||||
|
# include "MoreFiles.h"
|
||||||
|
# include "MoreFilesExtras.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef MAX_PATH
|
||||||
|
#define MAX_PATH 260 // from VC++ headers
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// macros
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define M_DIR ((wxDirData *)m_data)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// this class stores everything we need to enumerate the files
|
||||||
|
class wxDirData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxDirData(const wxString& dirname);
|
||||||
|
~wxDirData();
|
||||||
|
|
||||||
|
void SetFileSpec(const wxString& filespec) { m_filespec = filespec; }
|
||||||
|
void SetFlags(int flags) { m_flags = flags; }
|
||||||
|
|
||||||
|
bool Read(wxString *filename); // reads the next
|
||||||
|
void Rewind() ;
|
||||||
|
|
||||||
|
const wxString& GetName() const { return m_dirname; }
|
||||||
|
bool Ok() const { return m_ok; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CInfoPBRec m_CPB ;
|
||||||
|
wxInt16 m_index ;
|
||||||
|
long m_dirId ;
|
||||||
|
Str255 m_name ;
|
||||||
|
Boolean m_isDir ;
|
||||||
|
|
||||||
|
wxString m_dirname;
|
||||||
|
wxString m_filespec;
|
||||||
|
|
||||||
|
int m_flags;
|
||||||
|
bool m_ok;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDirData
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDirData::wxDirData(const wxString& dirname)
|
||||||
|
: m_dirname(dirname)
|
||||||
|
{
|
||||||
|
m_ok = false;
|
||||||
|
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
// throw away the trailing slashes
|
||||||
|
size_t n = m_dirname.length();
|
||||||
|
wxCHECK_RET( n, _T("empty dir name in wxDir") );
|
||||||
|
|
||||||
|
while ( n > 0 && wxIsPathSeparator(m_dirname[--n]) )
|
||||||
|
;
|
||||||
|
|
||||||
|
m_dirname.Truncate(n + 1);
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
FSRef theRef;
|
||||||
|
|
||||||
|
// get the FSRef associated with the POSIX path
|
||||||
|
err = FSPathMakeRef((const UInt8 *) m_dirname.c_str(), &theRef, NULL);
|
||||||
|
FSGetVRefNum(&theRef, &(m_CPB.hFileInfo.ioVRefNum));
|
||||||
|
|
||||||
|
err = FSGetNodeID( &theRef , &m_dirId , &m_isDir ) ;
|
||||||
|
#else
|
||||||
|
FSSpec fsspec ;
|
||||||
|
|
||||||
|
wxMacFilename2FSSpec( m_dirname , &fsspec ) ;
|
||||||
|
m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
|
||||||
|
|
||||||
|
err = FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ;
|
||||||
|
#endif
|
||||||
|
//wxASSERT_MSG( (err == noErr) || (err == nsvErr) , wxT("Error accessing directory " + m_dirname)) ;
|
||||||
|
if ( (err == noErr) || (err == nsvErr))
|
||||||
|
m_ok = true;
|
||||||
|
else
|
||||||
|
wxLogError(wxString(wxT("Error accessing directory ")) + m_dirname);
|
||||||
|
|
||||||
|
m_CPB.hFileInfo.ioNamePtr = m_name ;
|
||||||
|
m_index = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDirData::~wxDirData()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDirData::Rewind()
|
||||||
|
{
|
||||||
|
m_index = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDirData::Read(wxString *filename)
|
||||||
|
{
|
||||||
|
if ( !m_isDir )
|
||||||
|
return FALSE ;
|
||||||
|
|
||||||
|
wxString result;
|
||||||
|
|
||||||
|
short err = noErr ;
|
||||||
|
|
||||||
|
while ( err == noErr )
|
||||||
|
{
|
||||||
|
m_index++ ;
|
||||||
|
m_CPB.dirInfo.ioFDirIndex = m_index;
|
||||||
|
m_CPB.dirInfo.ioDrDirID = m_dirId; /* we need to do this every time */
|
||||||
|
err = PBGetCatInfoSync((CInfoPBPtr)&m_CPB);
|
||||||
|
if ( err != noErr )
|
||||||
|
break ;
|
||||||
|
|
||||||
|
// its hidden but we don't want it
|
||||||
|
if ( ( m_CPB.hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) && !(m_flags & wxDIR_HIDDEN) )
|
||||||
|
continue ;
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
// under X, names that start with '.' are hidden
|
||||||
|
if ( ( m_name[1] == '.' ) && !(m_flags & wxDIR_HIDDEN) )
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
#if TARGET_CARBON
|
||||||
|
// under X thats the way the mounting points look like
|
||||||
|
if ( ( m_CPB.dirInfo.ioDrDirID == 0 ) && ( m_flags & wxDIR_DIRS) )
|
||||||
|
break ;
|
||||||
|
#endif
|
||||||
|
// we have a directory
|
||||||
|
if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (m_flags & wxDIR_DIRS) )
|
||||||
|
break ;
|
||||||
|
|
||||||
|
// its a file but we don't want it
|
||||||
|
if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(m_flags & wxDIR_FILES ) )
|
||||||
|
continue ;
|
||||||
|
|
||||||
|
wxString file = wxMacMakeStringFromPascal( m_name ) ;
|
||||||
|
if ( m_filespec.IsEmpty() || m_filespec == wxT("*.*") || m_filespec == wxT("*") )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if ( m_filespec.Length() > 1 && m_filespec.Left(1) == wxT("*") )
|
||||||
|
{
|
||||||
|
if ( file.Right( m_filespec.Length() - 1 ).Upper() != m_filespec.Mid(1).Upper() )
|
||||||
|
{
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( m_filespec.Length() > 1 && m_filespec.Right(1) == wxT("*") )
|
||||||
|
{
|
||||||
|
if ( file.Left( m_filespec.Length() - 1 ).Upper() != m_filespec.Left( m_filespec.Length() - 1 ).Upper() )
|
||||||
|
{
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( file.Upper() != m_filespec.Upper() )
|
||||||
|
{
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
if ( err != noErr )
|
||||||
|
{
|
||||||
|
return FALSE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
*filename = wxMacMakeStringFromPascal( m_name ) ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDir helpers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
bool wxDir::Exists(const wxString& dir)
|
||||||
|
{
|
||||||
|
return wxPathExists(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDir construction/destruction
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDir::wxDir(const wxString& dirname)
|
||||||
|
{
|
||||||
|
m_data = NULL;
|
||||||
|
|
||||||
|
(void)Open(dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDir::Open(const wxString& dirname)
|
||||||
|
{
|
||||||
|
delete M_DIR;
|
||||||
|
m_data = new wxDirData(dirname);
|
||||||
|
if (m_data->Ok())
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete m_data;
|
||||||
|
m_data = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDir::IsOpened() const
|
||||||
|
{
|
||||||
|
return m_data != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxDir::GetName() const
|
||||||
|
{
|
||||||
|
wxString name;
|
||||||
|
if ( m_data )
|
||||||
|
{
|
||||||
|
name = M_DIR->GetName();
|
||||||
|
if ( !name.empty() && (name.Last() == _T('/')) )
|
||||||
|
{
|
||||||
|
// chop off the last (back)slash
|
||||||
|
name.Truncate(name.length() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDir::~wxDir()
|
||||||
|
{
|
||||||
|
if (M_DIR != NULL) {
|
||||||
|
delete M_DIR;
|
||||||
|
m_data = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDir enumerating
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxDir::GetFirst(wxString *filename,
|
||||||
|
const wxString& filespec,
|
||||||
|
int flags) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
|
||||||
|
|
||||||
|
M_DIR->Rewind();
|
||||||
|
|
||||||
|
M_DIR->SetFileSpec(filespec);
|
||||||
|
M_DIR->SetFlags(flags);
|
||||||
|
|
||||||
|
return GetNext(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDir::GetNext(wxString *filename) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
|
||||||
|
|
||||||
|
wxCHECK_MSG( filename, FALSE, _T("bad pointer in wxDir::GetNext()") );
|
||||||
|
|
||||||
|
return M_DIR->Read(filename);
|
||||||
|
}
|
||||||
446
src/mac/classic/display.cpp
Normal file
446
src/mac/classic/display.cpp
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: display.cpp
|
||||||
|
// Purpose: Mac implementation of wxDisplay class
|
||||||
|
// Author: Brian Victor
|
||||||
|
// Modified by: Royce Mitchell III & Ryan Norton
|
||||||
|
// Created: 06/21/02
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) wxWindows team
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "display.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_DISPLAY
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#else
|
||||||
|
#include <Gestalt.h>
|
||||||
|
#include <Displays.h>
|
||||||
|
#include <Quickdraw.h>
|
||||||
|
#include <Video.h> //for VDSwitchInfoRec
|
||||||
|
#include <FixMath.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/display.h"
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/string.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxDisplayMacPriv
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GDHandle m_hndl;
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t wxDisplayBase::GetCount()
|
||||||
|
{
|
||||||
|
GDHandle hndl;
|
||||||
|
size_t num = 0;
|
||||||
|
hndl = DMGetFirstScreenDevice(true);
|
||||||
|
while(hndl)
|
||||||
|
{
|
||||||
|
num++;
|
||||||
|
hndl = DMGetNextScreenDevice(hndl, true);
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxDisplayBase::GetFromPoint(const wxPoint &p)
|
||||||
|
{
|
||||||
|
GDHandle hndl;
|
||||||
|
size_t num = 0;
|
||||||
|
hndl = DMGetFirstScreenDevice(true);
|
||||||
|
while(hndl)
|
||||||
|
{
|
||||||
|
Rect screenrect = (*hndl)->gdRect;
|
||||||
|
if (p.x >= screenrect.left &&
|
||||||
|
p.x <= screenrect.right &&
|
||||||
|
p.y >= screenrect.top &&
|
||||||
|
p.y <= screenrect.bottom)
|
||||||
|
{
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
num++;
|
||||||
|
hndl = DMGetNextScreenDevice(hndl, true);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index ),
|
||||||
|
m_priv ( new wxDisplayMacPriv() )
|
||||||
|
{
|
||||||
|
GDHandle hndl;
|
||||||
|
hndl = DMGetFirstScreenDevice(true);
|
||||||
|
m_priv->m_hndl = NULL;
|
||||||
|
while(hndl)
|
||||||
|
{
|
||||||
|
if (index == 0)
|
||||||
|
{
|
||||||
|
m_priv->m_hndl = hndl;
|
||||||
|
}
|
||||||
|
index--;
|
||||||
|
hndl = DMGetNextScreenDevice(hndl, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxDisplay::GetGeometry() const
|
||||||
|
{
|
||||||
|
if (!(m_priv)) return wxRect(0, 0, 0, 0);
|
||||||
|
if (!(m_priv->m_hndl)) return wxRect(0, 0, 0, 0);
|
||||||
|
Rect screenrect = (*(m_priv->m_hndl))->gdRect;
|
||||||
|
return wxRect( screenrect.left, screenrect.top,
|
||||||
|
screenrect.right - screenrect.left, screenrect.bottom - screenrect.top);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxDisplay::GetDepth() const
|
||||||
|
{
|
||||||
|
if (!(m_priv)) return 0;
|
||||||
|
if (!(m_priv->m_hndl)) return 0;
|
||||||
|
|
||||||
|
// This cryptic looking code is based on Apple's sample code:
|
||||||
|
// http://developer.apple.com/samplecode/Sample_Code/Graphics_2D/GDevVideo/Gen.cp.htm
|
||||||
|
|
||||||
|
//RN - according to the docs
|
||||||
|
//gdPMap is a bitmap-type representation of the GDevice, and all
|
||||||
|
//0x0000FFFF does is get the lower 16 bits of pixelSize. However,
|
||||||
|
//since pixelSize is only 16 bits (a short)...
|
||||||
|
return ((*(*(m_priv->m_hndl))->gdPMap)->pixelSize) & 0x0000FFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxDisplay::GetName() const
|
||||||
|
{
|
||||||
|
// Macs don't name their displays...
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DMModeIteratorRec
|
||||||
|
{
|
||||||
|
wxArrayVideoModes* pModes;
|
||||||
|
const wxVideoMode* pMatchMode;
|
||||||
|
};
|
||||||
|
|
||||||
|
pascal void DMModeListIteratorProc ( void* pData,
|
||||||
|
DMListIndexType nIndex,
|
||||||
|
DMDisplayModeListEntryPtr pInfo)
|
||||||
|
{
|
||||||
|
DMModeIteratorRec* pInfoData = (DMModeIteratorRec*) pData;
|
||||||
|
|
||||||
|
//Note that in testing the refresh rate is always 0 on my ibook - RN
|
||||||
|
int refresh = (int) Fix2Long(pInfo->displayModeResolutionInfo->csRefreshRate);
|
||||||
|
|
||||||
|
for(unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i)
|
||||||
|
{
|
||||||
|
#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock
|
||||||
|
|
||||||
|
if (wxVideoMode((int) pInfo->displayModeResolutionInfo->csHorizontalPixels,
|
||||||
|
(int) pInfo->displayModeResolutionInfo->csVerticalLines,
|
||||||
|
(int) pDBI->vpPixelSize,
|
||||||
|
refresh).Matches(*pInfoData->pMatchMode) )
|
||||||
|
{
|
||||||
|
pInfoData->pModes->Add(wxVideoMode((int) pInfo->displayModeResolutionInfo->csHorizontalPixels,
|
||||||
|
(int) pInfo->displayModeResolutionInfo->csVerticalLines,
|
||||||
|
(int) pDBI->vpPixelSize,
|
||||||
|
refresh));
|
||||||
|
}
|
||||||
|
#undef pDBI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DMModeInfoRec
|
||||||
|
{
|
||||||
|
const wxVideoMode* pMode;
|
||||||
|
VDSwitchInfoRec sMode;
|
||||||
|
bool bMatched;
|
||||||
|
};
|
||||||
|
|
||||||
|
pascal void DMModeInfoProc ( void* pData,
|
||||||
|
DMListIndexType nIndex,
|
||||||
|
DMDisplayModeListEntryPtr pInfo)
|
||||||
|
{
|
||||||
|
DMModeInfoRec* pInfoData = (DMModeInfoRec*) pData;
|
||||||
|
Fixed refresh = Long2Fix(pInfoData->pMode->refresh);
|
||||||
|
|
||||||
|
for(unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i)
|
||||||
|
{
|
||||||
|
#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock
|
||||||
|
if (pInfoData->pMode->w == (int&) pInfo->displayModeResolutionInfo->csHorizontalPixels &&
|
||||||
|
pInfoData->pMode->h == (int&) pInfo->displayModeResolutionInfo->csVerticalLines &&
|
||||||
|
pInfoData->pMode->bpp == (int) pDBI->vpPixelSize &&
|
||||||
|
refresh == pInfo->displayModeResolutionInfo->csRefreshRate)
|
||||||
|
{
|
||||||
|
memcpy(&pInfoData->sMode, pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthSwitchInfo,
|
||||||
|
sizeof(VDSwitchInfoRec));
|
||||||
|
pInfoData->sMode.csMode = pDBI->vpPixelSize;
|
||||||
|
pInfoData->bMatched = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#undef pDBI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DMModeTransRec
|
||||||
|
{
|
||||||
|
wxVideoMode Mode;
|
||||||
|
const VDSwitchInfoRec* psMode;
|
||||||
|
bool bMatched;
|
||||||
|
};
|
||||||
|
|
||||||
|
pascal void DMModeTransProc ( void* pData,
|
||||||
|
DMListIndexType nIndex,
|
||||||
|
DMDisplayModeListEntryPtr pInfo)
|
||||||
|
{
|
||||||
|
DMModeTransRec* pInfoData = (DMModeTransRec*) pData;
|
||||||
|
|
||||||
|
for(unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i)
|
||||||
|
{
|
||||||
|
#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock
|
||||||
|
if (pInfoData->psMode->csData == pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthSwitchInfo->csData)
|
||||||
|
{
|
||||||
|
pInfoData->Mode = wxVideoMode((int) pInfo->displayModeResolutionInfo->csHorizontalPixels,
|
||||||
|
(int) pInfo->displayModeResolutionInfo->csVerticalLines,
|
||||||
|
(int) pDBI->vpPixelSize,
|
||||||
|
(int) Fix2Long(pInfo->displayModeResolutionInfo->csRefreshRate) );
|
||||||
|
pInfoData->bMatched = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#undef pDBI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxArrayVideoModes
|
||||||
|
wxDisplay::GetModes(const wxVideoMode& mode) const
|
||||||
|
{
|
||||||
|
|
||||||
|
wxArrayVideoModes Modes;
|
||||||
|
|
||||||
|
unsigned long dwDMVer;
|
||||||
|
Gestalt(gestaltDisplayMgrVers, (long*) &dwDMVer);
|
||||||
|
|
||||||
|
//Check DM version (for backward compatibility only - 7.5.3+ use 2.0)
|
||||||
|
if (dwDMVer >= 0x020000) //version 2?
|
||||||
|
{
|
||||||
|
|
||||||
|
DMListIndexType nNumModes;
|
||||||
|
DMListType pModes;
|
||||||
|
DMDisplayModeListIteratorUPP uppMLI;
|
||||||
|
DisplayIDType nDisplayID;
|
||||||
|
|
||||||
|
wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr);
|
||||||
|
//Create a new list...
|
||||||
|
wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr, wxT("Could not create a new display mode list") );
|
||||||
|
|
||||||
|
uppMLI = NewDMDisplayModeListIteratorUPP(DMModeListIteratorProc);
|
||||||
|
wxASSERT(uppMLI);
|
||||||
|
|
||||||
|
DMModeIteratorRec sModeInfo;
|
||||||
|
sModeInfo.pModes = &Modes;
|
||||||
|
sModeInfo.pMatchMode = &mode;
|
||||||
|
for (DMListIndexType i = 0; i < nNumModes; ++i)
|
||||||
|
{
|
||||||
|
wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL,
|
||||||
|
uppMLI, &sModeInfo) == noErr);
|
||||||
|
}
|
||||||
|
DisposeDMDisplayModeListIteratorUPP(uppMLI);
|
||||||
|
wxASSERT(DMDisposeList(pModes) == noErr);
|
||||||
|
}
|
||||||
|
else //DM 1.0, 1.2, 1.x
|
||||||
|
{
|
||||||
|
wxLogSysError(wxString::Format(wxT("Display Manager Version %u Not Supported! Present? %s"),
|
||||||
|
(unsigned int) dwDMVer / 0x10000,
|
||||||
|
(dwDMVer & (1 << gestaltDisplayMgrPresent) ? wxT("Yes") : wxT("No")) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Modes;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxVideoMode wxDisplay::GetCurrentMode() const
|
||||||
|
{
|
||||||
|
unsigned long dwDMVer;
|
||||||
|
wxVideoMode RetMode;
|
||||||
|
|
||||||
|
Gestalt(gestaltDisplayMgrVers, (long*) &dwDMVer);
|
||||||
|
//Check DM version (for backward compatibility only - 7.5.3+ use 2.0)
|
||||||
|
if (dwDMVer >= 0x020000) //version 2?
|
||||||
|
{
|
||||||
|
VDSwitchInfoRec sMode; //Note - csMode member also contains the bit depth
|
||||||
|
if (DMGetDisplayMode(m_priv->m_hndl, &sMode) == noErr)
|
||||||
|
{
|
||||||
|
DMListIndexType nNumModes;
|
||||||
|
DMListType pModes;
|
||||||
|
DMDisplayModeListIteratorUPP uppMLI;
|
||||||
|
DisplayIDType nDisplayID;
|
||||||
|
|
||||||
|
wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr);
|
||||||
|
//Create a new list...
|
||||||
|
wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr,
|
||||||
|
wxT("Could not create a new display mode list") );
|
||||||
|
|
||||||
|
uppMLI = NewDMDisplayModeListIteratorUPP(DMModeTransProc);
|
||||||
|
wxASSERT(uppMLI);
|
||||||
|
|
||||||
|
DMModeTransRec sModeInfo;
|
||||||
|
sModeInfo.bMatched = false;
|
||||||
|
sModeInfo.psMode = &sMode;
|
||||||
|
for (DMListIndexType i = 0; i < nNumModes; ++i)
|
||||||
|
{
|
||||||
|
wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL,
|
||||||
|
uppMLI, &sModeInfo) == noErr);
|
||||||
|
|
||||||
|
if ( sModeInfo.bMatched == true )
|
||||||
|
{
|
||||||
|
RetMode = sModeInfo.Mode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposeDMDisplayModeListIteratorUPP(uppMLI);
|
||||||
|
wxASSERT(DMDisposeList(pModes) == noErr);
|
||||||
|
}
|
||||||
|
else //Can't get current mode?
|
||||||
|
{
|
||||||
|
wxLogSysError(wxString::Format(wxT("Couldn't obtain current display mode!!!\ndwDMVer:%u"),
|
||||||
|
(unsigned int) dwDMVer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //DM ver 1
|
||||||
|
{
|
||||||
|
wxLogSysError(wxString::Format(wxT("Display Manager Version %u Not Supported! Present? %s"),
|
||||||
|
(unsigned int) dwDMVer / 0x10000,
|
||||||
|
(dwDMVer & (1 << gestaltDisplayMgrPresent) ? wxT("Yes") : wxT("No")) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RetMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDisplay::ChangeMode(const wxVideoMode& mode)
|
||||||
|
{
|
||||||
|
unsigned long dwDMVer;
|
||||||
|
Gestalt(gestaltDisplayMgrVers, (long*)&dwDMVer);
|
||||||
|
if (GetCount() == 1 || dwDMVer >= 0x020000)
|
||||||
|
{
|
||||||
|
if (mode == wxDefaultVideoMode)
|
||||||
|
{
|
||||||
|
//#ifndef __DARWIN__
|
||||||
|
// Handle hDisplayState;
|
||||||
|
// if (DMBeginConfigureDisplays(&hDisplayState) != noErr)
|
||||||
|
// {
|
||||||
|
// wxLogSysError(wxT("Could not lock display for display mode changing!"));
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// wxASSERT( DMUseScreenPrefs(true, hDisplayState) == noErr);
|
||||||
|
// DMEndConfigureDisplays(hDisplayState);
|
||||||
|
// return true;
|
||||||
|
//#else
|
||||||
|
//hmmmmm....
|
||||||
|
return true;
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//0 & NULL for params 2 & 3 of DMSetVideoMode signal it to use defaults (current mode)
|
||||||
|
//DM 2.0+ doesn't use params 2 & 3 of DMSetDisplayMode
|
||||||
|
//so we have to use this icky structure
|
||||||
|
VDSwitchInfoRec sMode;
|
||||||
|
memset(&sMode, 0, sizeof(VDSwitchInfoRec) );
|
||||||
|
|
||||||
|
DMListIndexType nNumModes;
|
||||||
|
DMListType pModes;
|
||||||
|
DMDisplayModeListIteratorUPP uppMLI;
|
||||||
|
DisplayIDType nDisplayID;
|
||||||
|
|
||||||
|
wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr);
|
||||||
|
//Create a new list...
|
||||||
|
wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr,
|
||||||
|
wxT("Could not create a new display mode list") );
|
||||||
|
|
||||||
|
uppMLI = NewDMDisplayModeListIteratorUPP(DMModeInfoProc);
|
||||||
|
wxASSERT(uppMLI);
|
||||||
|
|
||||||
|
DMModeInfoRec sModeInfo;
|
||||||
|
sModeInfo.bMatched = false;
|
||||||
|
sModeInfo.pMode = &mode;
|
||||||
|
unsigned int i;
|
||||||
|
for(i = 0; i < nNumModes; ++i)
|
||||||
|
{
|
||||||
|
wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL,
|
||||||
|
uppMLI, &sModeInfo) == noErr);
|
||||||
|
if (sModeInfo.bMatched == true)
|
||||||
|
{
|
||||||
|
sMode = sModeInfo.sMode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i == nNumModes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
DisposeDMDisplayModeListIteratorUPP(uppMLI);
|
||||||
|
wxASSERT(DMDisposeList(pModes) == noErr);
|
||||||
|
|
||||||
|
// For the really paranoid -
|
||||||
|
// unsigned long flags;
|
||||||
|
// Boolean bok;
|
||||||
|
// wxASSERT(noErr == DMCheckDisplayMode(m_priv->m_hndl, sMode.csData,
|
||||||
|
// sMode.csMode, &flags, NULL, &bok));
|
||||||
|
// wxASSERT(bok);
|
||||||
|
|
||||||
|
Handle hDisplayState;
|
||||||
|
if (DMBeginConfigureDisplays(&hDisplayState) != noErr)
|
||||||
|
{
|
||||||
|
wxLogSysError(wxT("Could not lock display for display mode changing!"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long dwBPP = (unsigned long) mode.bpp;
|
||||||
|
if (DMSetDisplayMode(m_priv->m_hndl, sMode.csData,
|
||||||
|
(unsigned long*) &(dwBPP), NULL
|
||||||
|
//(unsigned long) &sMode
|
||||||
|
, hDisplayState
|
||||||
|
) != noErr)
|
||||||
|
{
|
||||||
|
DMEndConfigureDisplays(hDisplayState);
|
||||||
|
wxMessageBox(wxString::Format(wxT("Could not set the display mode")));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DMEndConfigureDisplays(hDisplayState);
|
||||||
|
}
|
||||||
|
else //DM 1.0, 1.2, 1.x
|
||||||
|
{
|
||||||
|
wxLogSysError(wxString::Format(wxT("Monitor gravitation not supported yet. dwDMVer:%u"),
|
||||||
|
(unsigned int) dwDMVer));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDisplay::~wxDisplay()
|
||||||
|
{
|
||||||
|
if ( m_priv )
|
||||||
|
{
|
||||||
|
delete m_priv;
|
||||||
|
m_priv = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_DISPLAY
|
||||||
607
src/mac/classic/dnd.cpp
Normal file
607
src/mac/classic/dnd.cpp
Normal file
@@ -0,0 +1,607 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dnd.cpp
|
||||||
|
// Purpose: wxDropTarget, wxDropSource, wxDataObject implementation
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1998 Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "dnd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#if wxUSE_DRAG_AND_DROP
|
||||||
|
|
||||||
|
#include "wx/dnd.h"
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/toplevel.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// global
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxMacEnsureTrackingHandlersInstalled() ;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
wxWindow* m_currentTargetWindow ;
|
||||||
|
wxDropTarget* m_currentTarget ;
|
||||||
|
wxDropSource* m_currentSource ;
|
||||||
|
} MacTrackingGlobals ;
|
||||||
|
|
||||||
|
MacTrackingGlobals gTrackingGlobals ;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
// wxDropTarget
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxDropTarget::wxDropTarget( wxDataObject *data )
|
||||||
|
: wxDropTargetBase( data )
|
||||||
|
{
|
||||||
|
wxMacEnsureTrackingHandlersInstalled() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDragResult wxDropTarget::OnDragOver( wxCoord WXUNUSED(x),
|
||||||
|
wxCoord WXUNUSED(y),
|
||||||
|
wxDragResult def )
|
||||||
|
{
|
||||||
|
|
||||||
|
return CurrentDragHasSupportedFormat() ? def : wxDragNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDropTarget::OnDrop( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y) )
|
||||||
|
{
|
||||||
|
if (!m_dataObject)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return CurrentDragHasSupportedFormat() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDragResult wxDropTarget::OnData( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y),
|
||||||
|
wxDragResult def )
|
||||||
|
{
|
||||||
|
if (!m_dataObject)
|
||||||
|
return wxDragNone;
|
||||||
|
|
||||||
|
if (!CurrentDragHasSupportedFormat())
|
||||||
|
return wxDragNone;
|
||||||
|
|
||||||
|
return GetData() ? def : wxDragNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDropTarget::CurrentDragHasSupportedFormat()
|
||||||
|
{
|
||||||
|
bool supported = false ;
|
||||||
|
if ( gTrackingGlobals.m_currentSource != NULL )
|
||||||
|
{
|
||||||
|
wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject() ;
|
||||||
|
|
||||||
|
if ( data )
|
||||||
|
{
|
||||||
|
size_t formatcount = data->GetFormatCount() ;
|
||||||
|
wxDataFormat *array = new wxDataFormat[ formatcount ];
|
||||||
|
data->GetAllFormats( array );
|
||||||
|
for (size_t i = 0; !supported && i < formatcount ; i++)
|
||||||
|
{
|
||||||
|
wxDataFormat format = array[i] ;
|
||||||
|
if ( m_dataObject->IsSupported( format ) )
|
||||||
|
{
|
||||||
|
supported = true ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete[] array ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !supported )
|
||||||
|
{
|
||||||
|
UInt16 items ;
|
||||||
|
OSErr result;
|
||||||
|
CountDragItems((DragReference)m_currentDrag, &items);
|
||||||
|
for (UInt16 index = 1; index <= items && supported == false ; ++index)
|
||||||
|
{
|
||||||
|
ItemReference theItem;
|
||||||
|
FlavorType theType ;
|
||||||
|
UInt16 flavors = 0 ;
|
||||||
|
GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);
|
||||||
|
CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;
|
||||||
|
for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
|
||||||
|
{
|
||||||
|
result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
|
||||||
|
if ( m_dataObject->IsSupportedFormat( wxDataFormat( theType ) ) )
|
||||||
|
{
|
||||||
|
supported = true ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return supported ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDropTarget::GetData()
|
||||||
|
{
|
||||||
|
if (!m_dataObject)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ( !CurrentDragHasSupportedFormat() )
|
||||||
|
return FALSE ;
|
||||||
|
|
||||||
|
bool transferred = false ;
|
||||||
|
if ( gTrackingGlobals.m_currentSource != NULL )
|
||||||
|
{
|
||||||
|
wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject() ;
|
||||||
|
|
||||||
|
if ( data )
|
||||||
|
{
|
||||||
|
size_t formatcount = data->GetFormatCount() ;
|
||||||
|
wxDataFormat *array = new wxDataFormat[ formatcount ];
|
||||||
|
data->GetAllFormats( array );
|
||||||
|
for (size_t i = 0; !transferred && i < formatcount ; i++)
|
||||||
|
{
|
||||||
|
wxDataFormat format = array[i] ;
|
||||||
|
if ( m_dataObject->IsSupported( format ) )
|
||||||
|
{
|
||||||
|
int size = data->GetDataSize( format );
|
||||||
|
transferred = true ;
|
||||||
|
|
||||||
|
if (size == 0)
|
||||||
|
{
|
||||||
|
m_dataObject->SetData(format , 0 , 0 ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *d = new char[size];
|
||||||
|
data->GetDataHere( format , (void*) d );
|
||||||
|
m_dataObject->SetData( format , size , d ) ;
|
||||||
|
delete[] d ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete[] array ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !transferred )
|
||||||
|
{
|
||||||
|
UInt16 items ;
|
||||||
|
OSErr result;
|
||||||
|
bool firstFileAdded = false ;
|
||||||
|
CountDragItems((DragReference)m_currentDrag, &items);
|
||||||
|
for (UInt16 index = 1; index <= items; ++index)
|
||||||
|
{
|
||||||
|
ItemReference theItem;
|
||||||
|
FlavorType theType ;
|
||||||
|
UInt16 flavors = 0 ;
|
||||||
|
GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);
|
||||||
|
CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;
|
||||||
|
for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )
|
||||||
|
{
|
||||||
|
result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);
|
||||||
|
wxDataFormat format(theType) ;
|
||||||
|
if ( m_dataObject->IsSupportedFormat( format ) )
|
||||||
|
{
|
||||||
|
FlavorFlags theFlags;
|
||||||
|
result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags);
|
||||||
|
if (result == noErr)
|
||||||
|
{
|
||||||
|
Size dataSize ;
|
||||||
|
Ptr theData ;
|
||||||
|
GetFlavorDataSize((DragReference)m_currentDrag, theItem, theType, &dataSize);
|
||||||
|
if ( theType == 'TEXT' )
|
||||||
|
{
|
||||||
|
// this increment is only valid for allocating, on the next GetFlavorData
|
||||||
|
// call it is reset again to the original value
|
||||||
|
dataSize++ ;
|
||||||
|
}
|
||||||
|
theData = new char[dataSize];
|
||||||
|
GetFlavorData((DragReference)m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L);
|
||||||
|
if( theType == 'TEXT' )
|
||||||
|
{
|
||||||
|
theData[dataSize]=0 ;
|
||||||
|
wxString convert( theData , wxConvLocal ) ;
|
||||||
|
m_dataObject->SetData( format, convert.Length() * sizeof(wxChar), (const wxChar*) convert );
|
||||||
|
}
|
||||||
|
else if ( theType == kDragFlavorTypeHFS )
|
||||||
|
{
|
||||||
|
HFSFlavor* theFile = (HFSFlavor*) theData ;
|
||||||
|
wxString name = wxMacFSSpec2MacFilename( &theFile->fileSpec ) ;
|
||||||
|
if ( firstFileAdded )
|
||||||
|
((wxFileDataObject*)m_dataObject)->AddFile( name ) ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
((wxFileDataObject*)m_dataObject)->SetData( 0 , name.c_str() ) ;
|
||||||
|
firstFileAdded = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dataObject->SetData( format, dataSize, theData );
|
||||||
|
}
|
||||||
|
delete[] theData;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// wxDropSource
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// drag request
|
||||||
|
|
||||||
|
wxDropSource::wxDropSource(wxWindow *win,
|
||||||
|
const wxCursor &cursorCopy,
|
||||||
|
const wxCursor &cursorMove,
|
||||||
|
const wxCursor &cursorStop)
|
||||||
|
: wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
|
||||||
|
{
|
||||||
|
wxMacEnsureTrackingHandlersInstalled() ;
|
||||||
|
m_window = win;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDropSource::wxDropSource(wxDataObject& data,
|
||||||
|
wxWindow *win,
|
||||||
|
const wxCursor &cursorCopy,
|
||||||
|
const wxCursor &cursorMove,
|
||||||
|
const wxCursor &cursorStop)
|
||||||
|
: wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
|
||||||
|
{
|
||||||
|
wxMacEnsureTrackingHandlersInstalled() ;
|
||||||
|
SetData( data );
|
||||||
|
m_window = win;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDropSource::~wxDropSource()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags))
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( m_data, wxT("Drop source: no data") );
|
||||||
|
|
||||||
|
if (!m_data)
|
||||||
|
return (wxDragResult) wxDragNone;
|
||||||
|
|
||||||
|
if (m_data->GetFormatCount() == 0)
|
||||||
|
return (wxDragResult) wxDragNone;
|
||||||
|
|
||||||
|
OSErr result;
|
||||||
|
DragReference theDrag;
|
||||||
|
RgnHandle dragRegion;
|
||||||
|
if ((result = NewDrag(&theDrag)))
|
||||||
|
{
|
||||||
|
return wxDragNone ;
|
||||||
|
}
|
||||||
|
// add data to drag
|
||||||
|
size_t formatCount = m_data->GetFormatCount() ;
|
||||||
|
wxDataFormat *formats = new wxDataFormat[formatCount] ;
|
||||||
|
m_data->GetAllFormats( formats ) ;
|
||||||
|
ItemReference theItem = 1 ;
|
||||||
|
for ( size_t i = 0 ; i < formatCount ; ++i )
|
||||||
|
{
|
||||||
|
size_t dataSize = m_data->GetDataSize( formats[i] ) ;
|
||||||
|
Ptr dataPtr = new char[dataSize] ;
|
||||||
|
m_data->GetDataHere( formats[i] , dataPtr ) ;
|
||||||
|
OSType type = formats[i].GetFormatId() ;
|
||||||
|
if ( type == 'TEXT' )
|
||||||
|
{
|
||||||
|
dataSize-- ;
|
||||||
|
dataPtr[ dataSize ] = 0 ;
|
||||||
|
wxString st( (wxChar*) dataPtr ) ;
|
||||||
|
wxCharBuffer buf = st.mb_str( wxConvLocal) ;
|
||||||
|
AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0);
|
||||||
|
}
|
||||||
|
else if (type == kDragFlavorTypeHFS )
|
||||||
|
{
|
||||||
|
HFSFlavor theFlavor ;
|
||||||
|
OSErr err = noErr;
|
||||||
|
CInfoPBRec cat;
|
||||||
|
|
||||||
|
wxMacFilename2FSSpec( dataPtr , &theFlavor.fileSpec ) ;
|
||||||
|
|
||||||
|
cat.hFileInfo.ioNamePtr = theFlavor.fileSpec.name;
|
||||||
|
cat.hFileInfo.ioVRefNum = theFlavor.fileSpec.vRefNum;
|
||||||
|
cat.hFileInfo.ioDirID = theFlavor.fileSpec.parID;
|
||||||
|
cat.hFileInfo.ioFDirIndex = 0;
|
||||||
|
err = PBGetCatInfoSync(&cat);
|
||||||
|
if (err == noErr )
|
||||||
|
{
|
||||||
|
theFlavor.fdFlags = cat.hFileInfo.ioFlFndrInfo.fdFlags;
|
||||||
|
if (theFlavor.fileSpec.parID == fsRtParID) {
|
||||||
|
theFlavor.fileCreator = 'MACS';
|
||||||
|
theFlavor.fileType = 'disk';
|
||||||
|
} else if ((cat.hFileInfo.ioFlAttrib & ioDirMask) != 0) {
|
||||||
|
theFlavor.fileCreator = 'MACS';
|
||||||
|
theFlavor.fileType = 'fold';
|
||||||
|
} else {
|
||||||
|
theFlavor.fileCreator = cat.hFileInfo.ioFlFndrInfo.fdCreator;
|
||||||
|
theFlavor.fileType = cat.hFileInfo.ioFlFndrInfo.fdType;
|
||||||
|
}
|
||||||
|
AddDragItemFlavor(theDrag, theItem, type , &theFlavor, sizeof(theFlavor), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);
|
||||||
|
}
|
||||||
|
delete[] dataPtr ;
|
||||||
|
}
|
||||||
|
delete[] formats ;
|
||||||
|
|
||||||
|
dragRegion = NewRgn();
|
||||||
|
RgnHandle tempRgn = NewRgn() ;
|
||||||
|
|
||||||
|
EventRecord* ev = NULL ;
|
||||||
|
#if !TARGET_CARBON // TODO
|
||||||
|
ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ;
|
||||||
|
#else
|
||||||
|
EventRecord rec ;
|
||||||
|
ev = &rec ;
|
||||||
|
wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
|
||||||
|
#endif
|
||||||
|
const short dragRegionOuterBoundary = 10 ;
|
||||||
|
const short dragRegionInnerBoundary = 9 ;
|
||||||
|
|
||||||
|
SetRectRgn( dragRegion , ev->where.h - dragRegionOuterBoundary ,
|
||||||
|
ev->where.v - dragRegionOuterBoundary ,
|
||||||
|
ev->where.h + dragRegionOuterBoundary ,
|
||||||
|
ev->where.v + dragRegionOuterBoundary ) ;
|
||||||
|
|
||||||
|
SetRectRgn( tempRgn , ev->where.h - dragRegionInnerBoundary ,
|
||||||
|
ev->where.v - dragRegionInnerBoundary ,
|
||||||
|
ev->where.h + dragRegionInnerBoundary ,
|
||||||
|
ev->where.v + dragRegionInnerBoundary ) ;
|
||||||
|
|
||||||
|
DiffRgn( dragRegion , tempRgn , dragRegion ) ;
|
||||||
|
DisposeRgn( tempRgn ) ;
|
||||||
|
|
||||||
|
// TODO:work with promises in order to return data only when drag
|
||||||
|
// was successfully completed
|
||||||
|
|
||||||
|
gTrackingGlobals.m_currentSource = this ;
|
||||||
|
result = TrackDrag(theDrag, ev , dragRegion);
|
||||||
|
DisposeRgn(dragRegion);
|
||||||
|
DisposeDrag(theDrag);
|
||||||
|
gTrackingGlobals.m_currentSource = NULL ;
|
||||||
|
|
||||||
|
KeyMap keymap;
|
||||||
|
GetKeys(keymap);
|
||||||
|
bool optionDown = keymap[1] & 4;
|
||||||
|
wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;
|
||||||
|
return dndresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect)
|
||||||
|
{
|
||||||
|
const wxCursor& cursor = GetCursor(effect);
|
||||||
|
if ( cursor.Ok() )
|
||||||
|
{
|
||||||
|
cursor.MacInstall() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gTrackingGlobalsInstalled = false ;
|
||||||
|
|
||||||
|
// passing the globals via refcon is not needed by the CFM and later architectures anymore
|
||||||
|
// but I'll leave it in there, just in case...
|
||||||
|
|
||||||
|
pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,
|
||||||
|
void *handlerRefCon, DragReference theDrag) ;
|
||||||
|
pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, void *handlerRefCon,
|
||||||
|
DragReference theDrag) ;
|
||||||
|
|
||||||
|
void wxMacEnsureTrackingHandlersInstalled()
|
||||||
|
{
|
||||||
|
if( !gTrackingGlobalsInstalled )
|
||||||
|
{
|
||||||
|
OSErr result;
|
||||||
|
|
||||||
|
result = InstallTrackingHandler(NewDragTrackingHandlerUPP(wxMacWindowDragTrackingHandler), 0L,&gTrackingGlobals);
|
||||||
|
wxASSERT( result == noErr ) ;
|
||||||
|
result = InstallReceiveHandler(NewDragReceiveHandlerUPP(wxMacWindowDragReceiveHandler), 0L, &gTrackingGlobals);
|
||||||
|
wxASSERT( result == noErr ) ;
|
||||||
|
|
||||||
|
gTrackingGlobalsInstalled = true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,
|
||||||
|
void *handlerRefCon, DragReference theDrag)
|
||||||
|
{
|
||||||
|
MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;
|
||||||
|
Point mouse, localMouse;
|
||||||
|
DragAttributes attributes;
|
||||||
|
GetDragAttributes(theDrag, &attributes);
|
||||||
|
wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( theWindow ) ;
|
||||||
|
|
||||||
|
KeyMap keymap;
|
||||||
|
GetKeys(keymap);
|
||||||
|
bool optionDown = keymap[1] & 4;
|
||||||
|
wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
|
||||||
|
|
||||||
|
switch(theMessage)
|
||||||
|
{
|
||||||
|
case kDragTrackingEnterHandler:
|
||||||
|
break;
|
||||||
|
case kDragTrackingLeaveHandler:
|
||||||
|
break;
|
||||||
|
case kDragTrackingEnterWindow:
|
||||||
|
trackingGlobals->m_currentTargetWindow = NULL ;
|
||||||
|
trackingGlobals->m_currentTarget = NULL ;
|
||||||
|
break;
|
||||||
|
case kDragTrackingInWindow:
|
||||||
|
if (toplevel == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
GetDragMouse(theDrag, &mouse, 0L);
|
||||||
|
localMouse = mouse;
|
||||||
|
GlobalToLocal(&localMouse);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// if (attributes & kDragHasLeftSenderWindow)
|
||||||
|
{
|
||||||
|
wxPoint point(localMouse.h , localMouse.v) ;
|
||||||
|
wxWindow *win = NULL ;
|
||||||
|
toplevel->MacGetWindowFromPointSub( point , &win ) ;
|
||||||
|
int localx , localy ;
|
||||||
|
localx = localMouse.h ;
|
||||||
|
localy = localMouse.v ;
|
||||||
|
//TODO : should we use client coordinates
|
||||||
|
if ( win )
|
||||||
|
win->MacRootWindowToWindow( &localx , &localy ) ;
|
||||||
|
if ( win != trackingGlobals->m_currentTargetWindow )
|
||||||
|
{
|
||||||
|
if ( trackingGlobals->m_currentTargetWindow )
|
||||||
|
{
|
||||||
|
// this window is left
|
||||||
|
if ( trackingGlobals->m_currentTarget )
|
||||||
|
{
|
||||||
|
HideDragHilite(theDrag);
|
||||||
|
trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
|
||||||
|
trackingGlobals->m_currentTarget->OnLeave() ;
|
||||||
|
trackingGlobals->m_currentTarget = NULL;
|
||||||
|
trackingGlobals->m_currentTargetWindow = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( win )
|
||||||
|
{
|
||||||
|
// this window is entered
|
||||||
|
trackingGlobals->m_currentTargetWindow = win ;
|
||||||
|
trackingGlobals->m_currentTarget = win->GetDropTarget() ;
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( trackingGlobals->m_currentTarget )
|
||||||
|
{
|
||||||
|
trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
|
||||||
|
result = trackingGlobals->m_currentTarget->OnEnter(
|
||||||
|
localx , localy , result ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( result != wxDragNone )
|
||||||
|
{
|
||||||
|
int x , y ;
|
||||||
|
x = y = 0 ;
|
||||||
|
win->MacWindowToRootWindow( &x , &y ) ;
|
||||||
|
RgnHandle hiliteRgn = NewRgn() ;
|
||||||
|
SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ;
|
||||||
|
ShowDragHilite(theDrag, hiliteRgn, true);
|
||||||
|
DisposeRgn( hiliteRgn ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( trackingGlobals->m_currentTarget )
|
||||||
|
{
|
||||||
|
trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
|
||||||
|
trackingGlobals->m_currentTarget->OnDragOver(
|
||||||
|
localx , localy , result ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set cursor for OnEnter and OnDragOver
|
||||||
|
if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE )
|
||||||
|
{
|
||||||
|
if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE )
|
||||||
|
{
|
||||||
|
switch( result )
|
||||||
|
{
|
||||||
|
case wxDragCopy :
|
||||||
|
{
|
||||||
|
wxCursor cursor(wxCURSOR_COPY_ARROW) ;
|
||||||
|
cursor.MacInstall() ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case wxDragMove :
|
||||||
|
{
|
||||||
|
wxCursor cursor(wxCURSOR_ARROW) ;
|
||||||
|
cursor.MacInstall() ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case wxDragNone :
|
||||||
|
{
|
||||||
|
wxCursor cursor(wxCURSOR_NO_ENTRY) ;
|
||||||
|
cursor.MacInstall() ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxDragError:
|
||||||
|
case wxDragLink:
|
||||||
|
case wxDragCancel:
|
||||||
|
// put these here to make gcc happy
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// MyTrackItemUnderMouse(localMouse, theWindow);
|
||||||
|
break;
|
||||||
|
case kDragTrackingLeaveWindow:
|
||||||
|
if (trackingGlobals->m_currentTarget)
|
||||||
|
{
|
||||||
|
trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
|
||||||
|
trackingGlobals->m_currentTarget->OnLeave() ;
|
||||||
|
HideDragHilite(theDrag);
|
||||||
|
trackingGlobals->m_currentTarget = NULL ;
|
||||||
|
}
|
||||||
|
trackingGlobals->m_currentTargetWindow = NULL ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(noErr);
|
||||||
|
}
|
||||||
|
|
||||||
|
pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,
|
||||||
|
void *handlerRefCon,
|
||||||
|
DragReference theDrag)
|
||||||
|
{
|
||||||
|
MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;
|
||||||
|
if ( trackingGlobals->m_currentTarget )
|
||||||
|
{
|
||||||
|
Point mouse,localMouse ;
|
||||||
|
int localx,localy ;
|
||||||
|
|
||||||
|
trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;
|
||||||
|
GetDragMouse(theDrag, &mouse, 0L);
|
||||||
|
localMouse = mouse;
|
||||||
|
GlobalToLocal(&localMouse);
|
||||||
|
localx = localMouse.h ;
|
||||||
|
localy = localMouse.v ;
|
||||||
|
//TODO : should we use client coordinates
|
||||||
|
if ( trackingGlobals->m_currentTargetWindow )
|
||||||
|
trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ;
|
||||||
|
if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )
|
||||||
|
{
|
||||||
|
KeyMap keymap;
|
||||||
|
GetKeys(keymap);
|
||||||
|
bool optionDown = keymap[1] & 4;
|
||||||
|
wxDragResult result = optionDown ? wxDragCopy : wxDragMove;
|
||||||
|
trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(noErr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
647
src/mac/classic/filedlg.cpp
Normal file
647
src/mac/classic/filedlg.cpp
Normal file
@@ -0,0 +1,647 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: filedlg.cpp
|
||||||
|
// Purpose: wxFileDialog
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "filedlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/dialog.h"
|
||||||
|
#include "wx/filedlg.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/tokenzr.h"
|
||||||
|
#include "wx/filename.h"
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include "PLStringFuncs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// begin wxmac
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#include <Navigation.h>
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
# include "MoreFilesX.h"
|
||||||
|
#else
|
||||||
|
# include "MoreFiles.h"
|
||||||
|
# include "MoreFilesExtras.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern bool gUseNavServices ;
|
||||||
|
|
||||||
|
// the data we need to pass to our standard file hook routine
|
||||||
|
// includes a pointer to the dialog, a pointer to the standard
|
||||||
|
// file reply record (so we can inspect the current selection)
|
||||||
|
// and a copy of the "previous" file spec of the reply record
|
||||||
|
// so we can see if the selection has changed
|
||||||
|
|
||||||
|
struct OpenUserDataRec {
|
||||||
|
int currentfilter ;
|
||||||
|
bool saveMode ;
|
||||||
|
wxArrayString name ;
|
||||||
|
wxArrayString extensions ;
|
||||||
|
wxArrayLong filtermactypes ;
|
||||||
|
wxString defaultLocation;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
CFArrayRef menuitems ;
|
||||||
|
#else
|
||||||
|
NavMenuItemSpecArrayHandle menuitems ;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct OpenUserDataRec
|
||||||
|
OpenUserDataRec, *OpenUserDataRecPtr;
|
||||||
|
|
||||||
|
static pascal void NavEventProc(
|
||||||
|
NavEventCallbackMessage inSelector,
|
||||||
|
NavCBRecPtr ioParams,
|
||||||
|
NavCallBackUserData ioUserData);
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
static NavEventUPP sStandardNavEventFilter = NewNavEventUPP(NavEventProc);
|
||||||
|
#else
|
||||||
|
static NavEventUPP sStandardNavEventFilter = NewNavEventProc(NavEventProc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static pascal void
|
||||||
|
NavEventProc(
|
||||||
|
NavEventCallbackMessage inSelector,
|
||||||
|
NavCBRecPtr ioParams,
|
||||||
|
NavCallBackUserData ioUserData )
|
||||||
|
{
|
||||||
|
OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;
|
||||||
|
if (inSelector == kNavCBEvent) {
|
||||||
|
#if TARGET_CARBON
|
||||||
|
#else
|
||||||
|
wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if ( inSelector == kNavCBStart )
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if (data && !(data->defaultLocation).IsEmpty())
|
||||||
|
{
|
||||||
|
// Set default location for the modern Navigation APIs
|
||||||
|
// Apple Technical Q&A 1151
|
||||||
|
FSSpec theFSSpec;
|
||||||
|
wxMacFilename2FSSpec(data->defaultLocation, &theFSSpec);
|
||||||
|
AEDesc theLocation = {typeNull, NULL};
|
||||||
|
if (noErr == ::AECreateDesc(typeFSS, &theFSSpec, sizeof(FSSpec), &theLocation))
|
||||||
|
::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if ( data->menuitems )
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if ( inSelector == kNavCBPopupMenuSelect )
|
||||||
|
{
|
||||||
|
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
#else
|
||||||
|
if ( menu->menuCreator == 'WXNG' )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
data->currentfilter = menu->menuType ;
|
||||||
|
if ( data->saveMode )
|
||||||
|
{
|
||||||
|
int i = menu->menuType ;
|
||||||
|
wxString extension = data->extensions[i].AfterLast('.') ;
|
||||||
|
extension.MakeLower() ;
|
||||||
|
wxString sfilename ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
wxMacCFStringHolder cfString( NavDialogGetSaveFileName( ioParams->context ) , false );
|
||||||
|
sfilename = cfString.AsString() ;
|
||||||
|
#else
|
||||||
|
Str255 filename ;
|
||||||
|
// get the current filename
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlGetEditFileName, &filename);
|
||||||
|
sfilename = wxMacMakeStringFromPascal( filename ) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int pos = sfilename.Find('.', true) ;
|
||||||
|
if ( pos != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
sfilename = sfilename.Left(pos+1)+extension ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
cfString.Assign( sfilename , wxFONTENCODING_DEFAULT ) ;
|
||||||
|
NavDialogSetSaveFileName( ioParams->context , cfString ) ;
|
||||||
|
#else
|
||||||
|
wxMacStringToPascal( sfilename , filename ) ;
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
|
||||||
|
{
|
||||||
|
myData->menuitems = NULL ;
|
||||||
|
myData->currentfilter = 0 ;
|
||||||
|
myData->saveMode = false ;
|
||||||
|
|
||||||
|
if ( filter && filter[0] )
|
||||||
|
{
|
||||||
|
wxString filter2(filter) ;
|
||||||
|
int filterIndex = 0;
|
||||||
|
bool isName = true ;
|
||||||
|
wxString current ;
|
||||||
|
for( unsigned int i = 0; i < filter2.Len() ; i++ )
|
||||||
|
{
|
||||||
|
if( filter2.GetChar(i) == wxT('|') )
|
||||||
|
{
|
||||||
|
if( isName ) {
|
||||||
|
myData->name.Add( current ) ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myData->extensions.Add( current.MakeUpper() ) ;
|
||||||
|
++filterIndex ;
|
||||||
|
}
|
||||||
|
isName = !isName ;
|
||||||
|
current = wxEmptyString ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current += filter2.GetChar(i) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// we allow for compatibility reason to have a single filter expression (like *.*) without
|
||||||
|
// an explanatory text, in that case the first part is name and extension at the same time
|
||||||
|
|
||||||
|
wxASSERT_MSG( filterIndex == 0 || !isName , wxT("incorrect format of format string") ) ;
|
||||||
|
if ( current.IsEmpty() )
|
||||||
|
myData->extensions.Add( myData->name[filterIndex] ) ;
|
||||||
|
else
|
||||||
|
myData->extensions.Add( current.MakeUpper() ) ;
|
||||||
|
if ( filterIndex == 0 || isName )
|
||||||
|
myData->name.Add( current.MakeUpper() ) ;
|
||||||
|
|
||||||
|
++filterIndex ;
|
||||||
|
|
||||||
|
const size_t extCount = myData->extensions.GetCount();
|
||||||
|
for ( size_t i = 0 ; i < extCount; i++ )
|
||||||
|
{
|
||||||
|
wxUint32 fileType;
|
||||||
|
wxUint32 creator;
|
||||||
|
wxString extension = myData->extensions[i];
|
||||||
|
|
||||||
|
if (extension.GetChar(0) == '*')
|
||||||
|
extension = extension.Mid(1); // Remove leading *
|
||||||
|
|
||||||
|
if (extension.GetChar(0) == '.')
|
||||||
|
{
|
||||||
|
extension = extension.Mid(1); // Remove leading .
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator ))
|
||||||
|
{
|
||||||
|
myData->filtermactypes.Add( (OSType)fileType );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myData->filtermactypes.Add( '****' ) ; // We'll fail safe if it's not recognized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Boolean CheckFile( const wxString &filename , OSType type , OpenUserDataRecPtr data)
|
||||||
|
{
|
||||||
|
wxString file(filename) ;
|
||||||
|
file.MakeUpper() ;
|
||||||
|
|
||||||
|
if ( data->extensions.GetCount() > 0 )
|
||||||
|
{
|
||||||
|
//for ( int i = 0 ; i < data->numfilters ; ++i )
|
||||||
|
int i = data->currentfilter ;
|
||||||
|
if ( data->extensions[i].Right(2) == wxT(".*") )
|
||||||
|
return true ;
|
||||||
|
|
||||||
|
{
|
||||||
|
if ( type == (OSType)data->filtermactypes[i] )
|
||||||
|
return true ;
|
||||||
|
|
||||||
|
wxStringTokenizer tokenizer( data->extensions[i] , wxT(";") ) ;
|
||||||
|
while( tokenizer.HasMoreTokens() )
|
||||||
|
{
|
||||||
|
wxString extension = tokenizer.GetNextToken() ;
|
||||||
|
if ( extension.GetChar(0) == '*' )
|
||||||
|
extension = extension.Mid(1) ;
|
||||||
|
|
||||||
|
if ( file.Len() >= extension.Len() && extension == file.Right(extension.Len() ) )
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, void *dataPtr)
|
||||||
|
{
|
||||||
|
OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
|
||||||
|
// return true if this item is invisible or a file
|
||||||
|
|
||||||
|
Boolean visibleFlag;
|
||||||
|
Boolean folderFlag;
|
||||||
|
|
||||||
|
visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);
|
||||||
|
folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);
|
||||||
|
|
||||||
|
// because the semantics of the filter proc are "true means don't show
|
||||||
|
// it" we need to invert the result that we return
|
||||||
|
|
||||||
|
if ( !visibleFlag )
|
||||||
|
return true ;
|
||||||
|
|
||||||
|
if ( !folderFlag )
|
||||||
|
{
|
||||||
|
wxString file = wxMacMakeStringFromPascal( myCInfoPBPtr->hFileInfo.ioNamePtr ) ;
|
||||||
|
return !CheckFile( file , myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType , data ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// end wxmac
|
||||||
|
|
||||||
|
wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
||||||
|
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
|
||||||
|
long style, const wxPoint& pos)
|
||||||
|
:wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
pascal Boolean CrossPlatformFilterCallback (
|
||||||
|
AEDesc *theItem,
|
||||||
|
void *info,
|
||||||
|
void *callBackUD,
|
||||||
|
NavFilterModes filterMode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
bool display = true;
|
||||||
|
OpenUserDataRecPtr data = (OpenUserDataRecPtr) callBackUD ;
|
||||||
|
|
||||||
|
if (filterMode == kNavFilteringBrowserList)
|
||||||
|
{
|
||||||
|
NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ;
|
||||||
|
if ( !theInfo->isFolder )
|
||||||
|
{
|
||||||
|
if (theItem->descriptorType == typeFSS )
|
||||||
|
{
|
||||||
|
FSSpec spec;
|
||||||
|
memcpy( &spec , *theItem->dataHandle , sizeof(FSSpec) ) ;
|
||||||
|
wxString file = wxMacMakeStringFromPascal( spec.name ) ;
|
||||||
|
display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;
|
||||||
|
}
|
||||||
|
#if TARGET_CARBON
|
||||||
|
else if ( theItem->descriptorType == typeFSRef )
|
||||||
|
{
|
||||||
|
FSRef fsref ;
|
||||||
|
memcpy( &fsref , *theItem->dataHandle , sizeof(FSRef) ) ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CFURLRef fullURLRef;
|
||||||
|
fullURLRef = ::CFURLCreateFromFSRef(NULL, &fsref);
|
||||||
|
#ifdef __UNIX__
|
||||||
|
CFURLPathStyle pathstyle = kCFURLPOSIXPathStyle;
|
||||||
|
#else
|
||||||
|
CFURLPathStyle pathstyle = kCFURLHFSPathStyle;
|
||||||
|
#endif
|
||||||
|
CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle);
|
||||||
|
::CFRelease( fullURLRef ) ;
|
||||||
|
wxString file = wxMacCFStringHolder(cfString).AsString(wxFont::GetDefaultEncoding());
|
||||||
|
|
||||||
|
display = CheckFile( file , theInfo->fileAndFolder.fileInfo.finderInfo.fdType , data ) ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxFileDialog::ShowModal()
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
OSErr err;
|
||||||
|
NavDialogCreationOptions dialogCreateOptions;
|
||||||
|
// set default options
|
||||||
|
::NavGetDefaultDialogCreationOptions(&dialogCreateOptions);
|
||||||
|
|
||||||
|
// this was always unset in the old code
|
||||||
|
dialogCreateOptions.optionFlags &= ~kNavSelectDefaultLocation;
|
||||||
|
|
||||||
|
wxMacCFStringHolder message(m_message, m_font.GetEncoding());
|
||||||
|
dialogCreateOptions.windowTitle = message;
|
||||||
|
|
||||||
|
wxMacCFStringHolder defaultFileName(m_fileName, m_font.GetEncoding());
|
||||||
|
dialogCreateOptions.saveFileName = defaultFileName;
|
||||||
|
|
||||||
|
|
||||||
|
NavDialogRef dialog;
|
||||||
|
NavObjectFilterUPP navFilterUPP = NULL;
|
||||||
|
CFArrayRef cfArray = NULL; // for popupExtension
|
||||||
|
OpenUserDataRec myData;
|
||||||
|
myData.defaultLocation = m_dir;
|
||||||
|
|
||||||
|
if (m_dialogStyle & wxSAVE)
|
||||||
|
{
|
||||||
|
dialogCreateOptions.optionFlags |= kNavNoTypePopup;
|
||||||
|
dialogCreateOptions.optionFlags |= kNavDontAutoTranslate;
|
||||||
|
dialogCreateOptions.optionFlags |= kNavDontAddTranslateItems;
|
||||||
|
|
||||||
|
// The extension is important
|
||||||
|
dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension;
|
||||||
|
|
||||||
|
err = ::NavCreatePutFileDialog(&dialogCreateOptions,
|
||||||
|
'TEXT',
|
||||||
|
'TEXT',
|
||||||
|
sStandardNavEventFilter,
|
||||||
|
&myData, // for defaultLocation
|
||||||
|
&dialog);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MakeUserDataRec(&myData , m_wildCard);
|
||||||
|
size_t numfilters = myData.extensions.GetCount();
|
||||||
|
if (numfilters > 0)
|
||||||
|
{
|
||||||
|
CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault ,
|
||||||
|
numfilters , &kCFTypeArrayCallBacks ) ;
|
||||||
|
dialogCreateOptions.popupExtension = popup ;
|
||||||
|
myData.menuitems = dialogCreateOptions.popupExtension ;
|
||||||
|
for ( size_t i = 0 ; i < numfilters ; ++i )
|
||||||
|
{
|
||||||
|
CFArrayAppendValue( popup , (CFStringRef) wxMacCFStringHolder( myData.name[i] , m_font.GetEncoding() ) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
navFilterUPP = NewNavObjectFilterUPP(CrossPlatformFilterCallback);
|
||||||
|
err = ::NavCreateGetFileDialog(&dialogCreateOptions,
|
||||||
|
NULL, // NavTypeListHandle
|
||||||
|
sStandardNavEventFilter,
|
||||||
|
NULL, // NavPreviewUPP
|
||||||
|
navFilterUPP,
|
||||||
|
(void *) &myData, // inClientData
|
||||||
|
&dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == noErr)
|
||||||
|
err = ::NavDialogRun(dialog);
|
||||||
|
|
||||||
|
// clean up filter related data, etc.
|
||||||
|
if (navFilterUPP)
|
||||||
|
::DisposeNavObjectFilterUPP(navFilterUPP);
|
||||||
|
if (cfArray)
|
||||||
|
::CFRelease(cfArray);
|
||||||
|
|
||||||
|
if (err != noErr)
|
||||||
|
return wxID_CANCEL;
|
||||||
|
|
||||||
|
NavReplyRecord navReply;
|
||||||
|
err = ::NavDialogGetReply(dialog, &navReply);
|
||||||
|
if (err == noErr && navReply.validRecord)
|
||||||
|
{
|
||||||
|
AEKeyword theKeyword;
|
||||||
|
DescType actualType;
|
||||||
|
Size actualSize;
|
||||||
|
FSRef theFSRef;
|
||||||
|
wxString thePath ;
|
||||||
|
long count;
|
||||||
|
::AECountItems(&navReply.selection , &count);
|
||||||
|
for (long i = 1; i <= count; ++i)
|
||||||
|
{
|
||||||
|
err = ::AEGetNthPtr(&(navReply.selection), i, typeFSRef, &theKeyword, &actualType,
|
||||||
|
&theFSRef, sizeof(theFSRef), &actualSize);
|
||||||
|
if (err != noErr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
CFURLRef fullURLRef;
|
||||||
|
if (m_dialogStyle & wxSAVE)
|
||||||
|
{
|
||||||
|
CFURLRef parentURLRef = ::CFURLCreateFromFSRef(NULL, &theFSRef);
|
||||||
|
|
||||||
|
if (parentURLRef)
|
||||||
|
{
|
||||||
|
fullURLRef =
|
||||||
|
::CFURLCreateCopyAppendingPathComponent(NULL,
|
||||||
|
parentURLRef,
|
||||||
|
navReply.saveFileName,
|
||||||
|
false);
|
||||||
|
::CFRelease(parentURLRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fullURLRef = ::CFURLCreateFromFSRef(NULL, &theFSRef);
|
||||||
|
}
|
||||||
|
#ifdef __UNIX__
|
||||||
|
CFURLPathStyle pathstyle = kCFURLPOSIXPathStyle;
|
||||||
|
#else
|
||||||
|
CFURLPathStyle pathstyle = kCFURLHFSPathStyle;
|
||||||
|
#endif
|
||||||
|
CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, pathstyle);
|
||||||
|
thePath = wxMacCFStringHolder(cfString).AsString(m_font.GetEncoding());
|
||||||
|
if (!thePath)
|
||||||
|
{
|
||||||
|
::NavDisposeReply(&navReply);
|
||||||
|
return wxID_CANCEL;
|
||||||
|
}
|
||||||
|
m_path = thePath;
|
||||||
|
m_paths.Add(m_path);
|
||||||
|
m_fileName = wxFileNameFromPath(m_path);
|
||||||
|
m_fileNames.Add(m_fileName);
|
||||||
|
}
|
||||||
|
// set these to the first hit
|
||||||
|
m_path = m_paths[0];
|
||||||
|
m_fileName = wxFileNameFromPath(m_path);
|
||||||
|
m_dir = wxPathOnly(m_path);
|
||||||
|
}
|
||||||
|
::NavDisposeReply(&navReply);
|
||||||
|
|
||||||
|
return (err == noErr) ? wxID_OK : wxID_CANCEL;
|
||||||
|
#else // TARGET_CARBON
|
||||||
|
|
||||||
|
NavDialogOptions mNavOptions;
|
||||||
|
NavObjectFilterUPP mNavFilterUPP = NULL;
|
||||||
|
NavPreviewUPP mNavPreviewUPP = NULL ;
|
||||||
|
NavReplyRecord mNavReply;
|
||||||
|
AEDesc mDefaultLocation ;
|
||||||
|
bool mSelectDefault = false ;
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
// setup dialog
|
||||||
|
|
||||||
|
mNavFilterUPP = nil;
|
||||||
|
mNavPreviewUPP = nil;
|
||||||
|
mSelectDefault = false;
|
||||||
|
mDefaultLocation.descriptorType = typeNull;
|
||||||
|
mDefaultLocation.dataHandle = nil;
|
||||||
|
|
||||||
|
NavGetDefaultDialogOptions(&mNavOptions);
|
||||||
|
wxMacStringToPascal( m_message , (StringPtr)mNavOptions.message ) ;
|
||||||
|
wxMacStringToPascal( m_fileName , (StringPtr)mNavOptions.savedFileName ) ;
|
||||||
|
|
||||||
|
// Set default location, the location
|
||||||
|
// that's displayed when the dialog
|
||||||
|
// first appears
|
||||||
|
|
||||||
|
FSSpec location ;
|
||||||
|
wxMacFilename2FSSpec( m_dir , &location ) ;
|
||||||
|
|
||||||
|
err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation );
|
||||||
|
|
||||||
|
if ( mDefaultLocation.dataHandle )
|
||||||
|
{
|
||||||
|
if (mSelectDefault)
|
||||||
|
{
|
||||||
|
mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation;
|
||||||
|
} else {
|
||||||
|
mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memset( &mNavReply , 0 , sizeof( mNavReply ) ) ;
|
||||||
|
mNavReply.validRecord = false;
|
||||||
|
mNavReply.replacing = false;
|
||||||
|
mNavReply.isStationery = false;
|
||||||
|
mNavReply.translationNeeded = false;
|
||||||
|
mNavReply.selection.descriptorType = typeNull;
|
||||||
|
mNavReply.selection.dataHandle = nil;
|
||||||
|
mNavReply.keyScript = smSystemScript;
|
||||||
|
mNavReply.fileTranslation = nil;
|
||||||
|
mNavReply.version = kNavReplyRecordVersion ;
|
||||||
|
|
||||||
|
// zero all data
|
||||||
|
|
||||||
|
m_path = wxEmptyString ;
|
||||||
|
m_fileName = wxEmptyString ;
|
||||||
|
m_paths.Empty();
|
||||||
|
m_fileNames.Empty();
|
||||||
|
|
||||||
|
OpenUserDataRec myData;
|
||||||
|
MakeUserDataRec( &myData , m_wildCard ) ;
|
||||||
|
myData.currentfilter = m_filterIndex ;
|
||||||
|
if ( myData.extensions.GetCount() > 0 )
|
||||||
|
{
|
||||||
|
mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ;
|
||||||
|
myData.menuitems = mNavOptions.popupExtension ;
|
||||||
|
for ( size_t i = 0 ; i < myData.extensions.GetCount() ; ++i )
|
||||||
|
{
|
||||||
|
(*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ;
|
||||||
|
(*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ;
|
||||||
|
// TODO : according to the new docs -1 to 10 are reserved for the OS
|
||||||
|
(*mNavOptions.popupExtension)[i].menuType = i ;
|
||||||
|
wxMacStringToPascal( myData.name[i] , (StringPtr)(*mNavOptions.popupExtension)[i].menuItemName ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( m_dialogStyle & wxSAVE )
|
||||||
|
{
|
||||||
|
myData.saveMode = true ;
|
||||||
|
|
||||||
|
mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
|
||||||
|
mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
|
||||||
|
|
||||||
|
err = ::NavPutFile(
|
||||||
|
&mDefaultLocation,
|
||||||
|
&mNavReply,
|
||||||
|
&mNavOptions,
|
||||||
|
sStandardNavEventFilter ,
|
||||||
|
NULL,
|
||||||
|
kNavGenericSignature,
|
||||||
|
&myData); // User Data
|
||||||
|
m_filterIndex = myData.currentfilter ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myData.saveMode = false ;
|
||||||
|
|
||||||
|
mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
|
||||||
|
if ( m_dialogStyle & wxMULTIPLE )
|
||||||
|
mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
|
||||||
|
else
|
||||||
|
mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ;
|
||||||
|
|
||||||
|
err = ::NavGetFile(
|
||||||
|
&mDefaultLocation,
|
||||||
|
&mNavReply,
|
||||||
|
&mNavOptions,
|
||||||
|
sStandardNavEventFilter ,
|
||||||
|
mNavPreviewUPP,
|
||||||
|
mNavFilterUPP,
|
||||||
|
NULL ,
|
||||||
|
&myData);
|
||||||
|
m_filterIndex = myData.currentfilter ;
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposeNavObjectFilterUPP(mNavFilterUPP);
|
||||||
|
if ( mDefaultLocation.dataHandle != nil )
|
||||||
|
{
|
||||||
|
::AEDisposeDesc(&mDefaultLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (err != noErr) && (err != userCanceledErr) ) {
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mNavReply.validRecord)
|
||||||
|
{
|
||||||
|
FSSpec outFileSpec ;
|
||||||
|
AEDesc specDesc ;
|
||||||
|
AEKeyword keyWord ;
|
||||||
|
|
||||||
|
long count ;
|
||||||
|
::AECountItems( &mNavReply.selection , &count ) ;
|
||||||
|
for ( long i = 1 ; i <= count ; ++i )
|
||||||
|
{
|
||||||
|
OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, &keyWord , &specDesc);
|
||||||
|
if ( err != noErr )
|
||||||
|
{
|
||||||
|
m_path = wxT("") ;
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
outFileSpec = **(FSSpec**) specDesc.dataHandle;
|
||||||
|
if (specDesc.dataHandle != nil) {
|
||||||
|
::AEDisposeDesc(&specDesc);
|
||||||
|
}
|
||||||
|
m_path = wxMacFSSpec2MacFilename( &outFileSpec ) ;
|
||||||
|
|
||||||
|
m_paths.Add( m_path ) ;
|
||||||
|
m_fileName = wxFileNameFromPath(m_path);
|
||||||
|
m_fileNames.Add(m_fileName);
|
||||||
|
}
|
||||||
|
// set these to the first hit
|
||||||
|
m_path = m_paths[ 0 ] ;
|
||||||
|
m_fileName = wxFileNameFromPath(m_path);
|
||||||
|
m_dir = wxPathOnly(m_path);
|
||||||
|
NavDisposeReply( &mNavReply ) ;
|
||||||
|
return wxID_OK ;
|
||||||
|
}
|
||||||
|
return wxID_CANCEL;
|
||||||
|
#endif // TARGET_CARBON
|
||||||
|
}
|
||||||
|
|
||||||
446
src/mac/classic/font.cpp
Normal file
446
src/mac/classic/font.cpp
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: font.cpp
|
||||||
|
// Purpose: wxFont class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "font.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/string.h"
|
||||||
|
#include "wx/font.h"
|
||||||
|
#include "wx/fontutil.h"
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
|
||||||
|
#include "wx/fontutil.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#include <ATSUnicode.h>
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxFontRefData: public wxGDIRefData
|
||||||
|
{
|
||||||
|
friend class WXDLLEXPORT wxFont;
|
||||||
|
public:
|
||||||
|
wxFontRefData()
|
||||||
|
: m_fontId(0)
|
||||||
|
, m_pointSize(10)
|
||||||
|
, m_family(wxDEFAULT)
|
||||||
|
, m_style(wxNORMAL)
|
||||||
|
, m_weight(wxNORMAL)
|
||||||
|
, m_underlined(FALSE)
|
||||||
|
, m_faceName(wxT("Geneva"))
|
||||||
|
, m_encoding(wxFONTENCODING_DEFAULT)
|
||||||
|
, m_macFontNum(0)
|
||||||
|
, m_macFontSize(0)
|
||||||
|
, m_macFontStyle(0)
|
||||||
|
, m_macATSUFontID()
|
||||||
|
{
|
||||||
|
Init(10, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE,
|
||||||
|
wxT("Geneva"), wxFONTENCODING_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFontRefData(const wxFontRefData& data)
|
||||||
|
: wxGDIRefData()
|
||||||
|
, m_fontId(data.m_fontId)
|
||||||
|
, m_pointSize(data.m_pointSize)
|
||||||
|
, m_family(data.m_family)
|
||||||
|
, m_style(data.m_style)
|
||||||
|
, m_weight(data.m_weight)
|
||||||
|
, m_underlined(data.m_underlined)
|
||||||
|
, m_faceName(data.m_faceName)
|
||||||
|
, m_encoding(data.m_encoding)
|
||||||
|
, m_macFontNum(data.m_macFontNum)
|
||||||
|
, m_macFontSize(data.m_macFontSize)
|
||||||
|
, m_macFontStyle(data.m_macFontStyle)
|
||||||
|
, m_macATSUFontID(data.m_macATSUFontID)
|
||||||
|
{
|
||||||
|
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
||||||
|
data.m_underlined, data.m_faceName, data.m_encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFontRefData(int size,
|
||||||
|
int family,
|
||||||
|
int style,
|
||||||
|
int weight,
|
||||||
|
bool underlined,
|
||||||
|
const wxString& faceName,
|
||||||
|
wxFontEncoding encoding)
|
||||||
|
: m_fontId(0)
|
||||||
|
, m_pointSize(size)
|
||||||
|
, m_family(family)
|
||||||
|
, m_style(style)
|
||||||
|
, m_weight(weight)
|
||||||
|
, m_underlined(underlined)
|
||||||
|
, m_faceName(faceName)
|
||||||
|
, m_encoding(encoding)
|
||||||
|
, m_macFontNum(0)
|
||||||
|
, m_macFontSize(0)
|
||||||
|
, m_macFontStyle(0)
|
||||||
|
, m_macATSUFontID(0)
|
||||||
|
{
|
||||||
|
Init(size, family, style, weight, underlined, faceName, encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~wxFontRefData();
|
||||||
|
void SetNoAntiAliasing( bool no = TRUE ) { m_noAA = no; }
|
||||||
|
bool GetNoAntiAliasing() { return m_noAA; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// common part of all ctors
|
||||||
|
void Init(int size,
|
||||||
|
int family,
|
||||||
|
int style,
|
||||||
|
int weight,
|
||||||
|
bool underlined,
|
||||||
|
const wxString& faceName,
|
||||||
|
wxFontEncoding encoding);
|
||||||
|
|
||||||
|
// font characterstics
|
||||||
|
int m_fontId;
|
||||||
|
int m_pointSize;
|
||||||
|
int m_family;
|
||||||
|
int m_style;
|
||||||
|
int m_weight;
|
||||||
|
bool m_underlined;
|
||||||
|
wxString m_faceName;
|
||||||
|
wxFontEncoding m_encoding;
|
||||||
|
bool m_noAA; // No anti-aliasing
|
||||||
|
|
||||||
|
public:
|
||||||
|
short m_macFontNum;
|
||||||
|
short m_macFontSize;
|
||||||
|
unsigned char m_macFontStyle;
|
||||||
|
wxUint32 m_macATSUFontID;
|
||||||
|
|
||||||
|
wxNativeFontInfo m_info;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void MacFindFont() ;
|
||||||
|
};
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFontRefData
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxFontRefData::Init(int pointSize,
|
||||||
|
int family,
|
||||||
|
int style,
|
||||||
|
int weight,
|
||||||
|
bool underlined,
|
||||||
|
const wxString& faceName,
|
||||||
|
wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
m_style = style;
|
||||||
|
m_pointSize = pointSize;
|
||||||
|
m_family = family;
|
||||||
|
m_style = style;
|
||||||
|
m_weight = weight;
|
||||||
|
m_underlined = underlined;
|
||||||
|
m_faceName = faceName;
|
||||||
|
m_encoding = encoding;
|
||||||
|
|
||||||
|
m_macFontNum = 0 ;
|
||||||
|
m_macFontSize = 0;
|
||||||
|
m_macFontStyle = 0;
|
||||||
|
m_fontId = 0;
|
||||||
|
m_noAA = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFontRefData::~wxFontRefData()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFontRefData::MacFindFont()
|
||||||
|
{
|
||||||
|
if( m_faceName.Length() == 0 )
|
||||||
|
{
|
||||||
|
switch( m_family )
|
||||||
|
{
|
||||||
|
case wxDEFAULT :
|
||||||
|
m_macFontNum = ::GetAppFont() ;
|
||||||
|
break ;
|
||||||
|
case wxDECORATIVE :
|
||||||
|
::GetFNum( "\pTimes" , &m_macFontNum) ;
|
||||||
|
break ;
|
||||||
|
case wxROMAN :
|
||||||
|
::GetFNum( "\pTimes" , &m_macFontNum) ;
|
||||||
|
break ;
|
||||||
|
case wxSCRIPT :
|
||||||
|
::GetFNum( "\pTimes" , &m_macFontNum) ;
|
||||||
|
break ;
|
||||||
|
case wxSWISS :
|
||||||
|
::GetFNum( "\pGeneva" , &m_macFontNum) ;
|
||||||
|
break ;
|
||||||
|
case wxMODERN :
|
||||||
|
::GetFNum( "\pMonaco" , &m_macFontNum) ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
Str255 name ;
|
||||||
|
GetFontName( m_macFontNum , name ) ;
|
||||||
|
m_faceName = wxMacMakeStringFromPascal( name ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( m_faceName == wxT("systemfont") )
|
||||||
|
m_macFontNum = ::GetSysFont() ;
|
||||||
|
else if ( m_faceName == wxT("applicationfont") )
|
||||||
|
m_macFontNum = ::GetAppFont() ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Str255 fontname ;
|
||||||
|
wxMacStringToPascal( m_faceName , fontname ) ;
|
||||||
|
::GetFNum( fontname, &m_macFontNum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_macFontStyle = 0;
|
||||||
|
if (m_weight == wxBOLD)
|
||||||
|
m_macFontStyle |= bold;
|
||||||
|
if (m_style == wxITALIC || m_style == wxSLANT)
|
||||||
|
m_macFontStyle |= italic;
|
||||||
|
if (m_underlined)
|
||||||
|
m_macFontStyle |= underline;
|
||||||
|
m_macFontSize = m_pointSize ;
|
||||||
|
|
||||||
|
//TODO:if we supply the style as an additional parameter we must make a testing
|
||||||
|
//sequence in order to degrade gracefully while trying to maintain most of the style
|
||||||
|
//information, meanwhile we just take the normal font and apply the features after
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
OSStatus status =
|
||||||
|
#endif // __WXDEBUG__
|
||||||
|
::ATSUFONDtoFontID(m_macFontNum, normal /*qdStyle*/, (UInt32*)&m_macATSUFontID);
|
||||||
|
/*
|
||||||
|
status = ATSUFindFontFromName ( (Ptr) m_faceName , strlen( m_faceName ) ,
|
||||||
|
kFontFullName, kFontMacintoshPlatform, kFontRomanScript , kFontNoLanguage , (UInt32*)&m_macATSUFontID ) ;
|
||||||
|
*/
|
||||||
|
wxASSERT_MSG( status == noErr , wxT("couldn't retrieve font identifier") ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFont
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxFont::Init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFont::Create(const wxNativeFontInfo& info)
|
||||||
|
{
|
||||||
|
return Create(info.pointSize, info.family, info.style, info.weight,
|
||||||
|
info.underlined, info.faceName, info.encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFont::wxFont(const wxString& fontdesc)
|
||||||
|
{
|
||||||
|
wxNativeFontInfo info;
|
||||||
|
if ( info.FromString(fontdesc) )
|
||||||
|
(void)Create(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFont::Create(int pointSize,
|
||||||
|
int family,
|
||||||
|
int style,
|
||||||
|
int weight,
|
||||||
|
bool underlined,
|
||||||
|
const wxString& faceName,
|
||||||
|
wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
UnRef();
|
||||||
|
m_refData = new wxFontRefData(pointSize, family, style, weight,
|
||||||
|
underlined, faceName, encoding);
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFont::~wxFont()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFont::RealizeResource()
|
||||||
|
{
|
||||||
|
M_FONTDATA->MacFindFont() ;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetEncoding(wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_encoding = encoding;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::Unshare()
|
||||||
|
{
|
||||||
|
// Don't change shared data
|
||||||
|
if (!m_refData)
|
||||||
|
{
|
||||||
|
m_refData = new wxFontRefData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData);
|
||||||
|
UnRef();
|
||||||
|
m_refData = ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetPointSize(int pointSize)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_pointSize = pointSize;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetFamily(int family)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_family = family;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetStyle(int style)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_style = style;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetWeight(int weight)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_weight = weight;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetFaceName(const wxString& faceName)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_faceName = faceName;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetUnderlined(bool underlined)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->m_underlined = underlined;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFont::SetNoAntiAliasing( bool no )
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_FONTDATA->SetNoAntiAliasing( no );
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// accessors
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO: insert checks everywhere for M_FONTDATA == NULL!
|
||||||
|
|
||||||
|
int wxFont::GetPointSize() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_pointSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxFont::GetFamily() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_family;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxFont::GetStyle() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_style;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxFont::GetWeight() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFont::GetUnderlined() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_underlined;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxFont::GetFaceName() const
|
||||||
|
{
|
||||||
|
wxString str;
|
||||||
|
if ( M_FONTDATA )
|
||||||
|
str = M_FONTDATA->m_faceName ;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFontEncoding wxFont::GetEncoding() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_encoding;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFont::GetNoAntiAliasing()
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_noAA;
|
||||||
|
}
|
||||||
|
|
||||||
|
short wxFont::GetMacFontNum() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_macFontNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
short wxFont::GetMacFontSize() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_macFontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxByte wxFont::GetMacFontStyle() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_macFontStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxUint32 wxFont::GetMacATSUFontID() const
|
||||||
|
{
|
||||||
|
return M_FONTDATA->m_macATSUFontID;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
|
||||||
|
|
||||||
|
M_FONTDATA->m_info.InitFromFont(*this);
|
||||||
|
|
||||||
|
return &(M_FONTDATA->m_info);
|
||||||
|
}
|
||||||
|
|
||||||
54
src/mac/classic/fontdlg.cpp
Normal file
54
src/mac/classic/fontdlg.cpp
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: fontdlg.cpp
|
||||||
|
// Purpose: wxFontDialog class. NOTE: you can use the generic class
|
||||||
|
// if you wish, instead of implementing this.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "fontdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/fontdlg.h"
|
||||||
|
#include "wx/cmndata.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxFontDialog
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxFontDialog::wxFontDialog()
|
||||||
|
{
|
||||||
|
m_dialogParent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data)
|
||||||
|
{
|
||||||
|
Create(parent, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data)
|
||||||
|
{
|
||||||
|
m_dialogParent = parent;
|
||||||
|
|
||||||
|
m_fontData = data;
|
||||||
|
|
||||||
|
// TODO: you may need to do dialog creation here, unless it's
|
||||||
|
// done in ShowModal.
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxFontDialog::ShowModal()
|
||||||
|
{
|
||||||
|
// TODO: show (maybe create) the dialog
|
||||||
|
return wxID_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
173
src/mac/classic/fontenum.cpp
Normal file
173
src/mac/classic/fontenum.cpp
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mac/fontenum.cpp
|
||||||
|
// Purpose: wxFontEnumerator class for MacOS
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "fontenum.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/font.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/fontenum.h"
|
||||||
|
#include "wx/fontutil.h"
|
||||||
|
#include "wx/fontmap.h"
|
||||||
|
#include "wx/fontutil.h"
|
||||||
|
#include "wx/encinfo.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxFontEnumeratorHelper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxFontEnumeratorHelper(wxFontEnumerator *fontEnum);
|
||||||
|
|
||||||
|
// control what exactly are we enumerating
|
||||||
|
bool SetEncoding(wxFontEncoding encoding);
|
||||||
|
void SetFixedOnly(bool fixedOnly)
|
||||||
|
{ m_fixedOnly = fixedOnly; }
|
||||||
|
|
||||||
|
// call to start enumeration
|
||||||
|
void DoEnumerate();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// the object we forward calls to OnFont() to
|
||||||
|
wxFontEnumerator *m_fontEnum;
|
||||||
|
|
||||||
|
// if != -1, enum only fonts which have this encoding
|
||||||
|
int m_charset;
|
||||||
|
|
||||||
|
// if not empty, enum only the fonts with this facename
|
||||||
|
wxString m_facename;
|
||||||
|
|
||||||
|
// if TRUE, enum only fixed fonts
|
||||||
|
bool m_fixedOnly;
|
||||||
|
};
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFontEnumeratorHelper
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum)
|
||||||
|
{
|
||||||
|
m_fontEnum = fontEnum;
|
||||||
|
m_charset = -1;
|
||||||
|
m_fixedOnly = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
wxNativeEncodingInfo info;
|
||||||
|
if ( !wxGetNativeFontEncoding(encoding, &info) )
|
||||||
|
{
|
||||||
|
if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
|
||||||
|
{
|
||||||
|
// no such encodings at all
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_charset = info.charset;
|
||||||
|
m_facename = info.facename;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFontEnumeratorHelper::DoEnumerate()
|
||||||
|
{
|
||||||
|
MenuHandle menu ;
|
||||||
|
Str255 p_name ;
|
||||||
|
|
||||||
|
short lines ;
|
||||||
|
|
||||||
|
menu = NewMenu( 32000 , "\pFont" ) ;
|
||||||
|
AppendResMenu( menu , 'FONT' ) ;
|
||||||
|
lines = CountMenuItems( menu ) ;
|
||||||
|
|
||||||
|
for ( int i = 1 ; i < lines+1 ; i ++ )
|
||||||
|
{
|
||||||
|
GetMenuItemText( menu , i , p_name ) ;
|
||||||
|
wxString c_name = wxMacMakeStringFromPascal(p_name) ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
if ( m_fixedOnly )
|
||||||
|
{
|
||||||
|
// check that it's a fixed pitch font (there is *no* error here, the
|
||||||
|
// flag name is misleading!)
|
||||||
|
if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH )
|
||||||
|
{
|
||||||
|
// not a fixed pitch font
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_charset != -1 )
|
||||||
|
{
|
||||||
|
// check that we have the right encoding
|
||||||
|
if ( lf->lfCharSet != m_charset )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
m_fontEnum->OnFacename( c_name ) ;
|
||||||
|
}
|
||||||
|
DisposeMenu( menu ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFontEnumerator
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
|
||||||
|
bool fixedWidthOnly)
|
||||||
|
{
|
||||||
|
wxFontEnumeratorHelper fe(this);
|
||||||
|
if ( fe.SetEncoding(encoding) )
|
||||||
|
{
|
||||||
|
fe.SetFixedOnly(fixedWidthOnly);
|
||||||
|
|
||||||
|
fe.DoEnumerate();
|
||||||
|
}
|
||||||
|
// else: no such fonts, unknown encoding
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontEnumerator::EnumerateEncodings(const wxString& family)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("wxFontEnumerator::EnumerateEncodings() not yet implemented"));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
117
src/mac/classic/fontutil.cpp
Normal file
117
src/mac/classic/fontutil.cpp
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: msw/fontutil.cpp
|
||||||
|
// Purpose: font-related helper functions for wxMSW
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Modified by:
|
||||||
|
// Created: 05.11.99
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "fontutil.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/string.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#endif //WX_PRECOMP
|
||||||
|
|
||||||
|
#include "wx/fontutil.h"
|
||||||
|
#include "wx/fontmap.h"
|
||||||
|
#include "wx/encinfo.h"
|
||||||
|
|
||||||
|
#include "wx/tokenzr.h"
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNativeEncodingInfo
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// convert to/from the string representation: format is
|
||||||
|
// facename[;charset]
|
||||||
|
|
||||||
|
bool wxNativeEncodingInfo::FromString(const wxString& s)
|
||||||
|
{
|
||||||
|
wxStringTokenizer tokenizer(s, _T(";"));
|
||||||
|
|
||||||
|
facename = tokenizer.GetNextToken();
|
||||||
|
if ( !facename )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
wxString tmp = tokenizer.GetNextToken();
|
||||||
|
if ( !tmp )
|
||||||
|
{
|
||||||
|
// default charset (don't use DEFAULT_CHARSET though because of subtle
|
||||||
|
// Windows 9x/NT differences in handling it)
|
||||||
|
charset = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( wxSscanf(tmp, _T("%u"), &charset) != 1 )
|
||||||
|
{
|
||||||
|
// should be a number!
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxNativeEncodingInfo::ToString() const
|
||||||
|
{
|
||||||
|
wxString s(facename);
|
||||||
|
if ( charset != 0 )
|
||||||
|
{
|
||||||
|
s << _T(';') << charset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// helper functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxGetNativeFontEncoding(wxFontEncoding encoding,
|
||||||
|
wxNativeEncodingInfo *info)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( info, FALSE, _T("bad pointer in wxGetNativeFontEncoding") );
|
||||||
|
|
||||||
|
if ( encoding == wxFONTENCODING_DEFAULT )
|
||||||
|
{
|
||||||
|
encoding = wxFont::GetDefaultEncoding();
|
||||||
|
}
|
||||||
|
|
||||||
|
info->encoding = encoding ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTestFontEncoding(const wxNativeEncodingInfo& info)
|
||||||
|
{
|
||||||
|
// basically we should be able to support every encoding via the OS
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
338
src/mac/classic/frame.cpp
Normal file
338
src/mac/classic/frame.cpp
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: frame.cpp
|
||||||
|
// Purpose: wxFrame
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "frame.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#include "wx/statusbr.h"
|
||||||
|
#include "wx/toolbar.h"
|
||||||
|
#include "wx/menuitem.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
#include "wx/dialog.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
extern wxWindowList wxModelessWindows;
|
||||||
|
extern wxList wxPendingDelete;
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
|
||||||
|
EVT_ACTIVATE(wxFrame::OnActivate)
|
||||||
|
// EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight)
|
||||||
|
EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
|
||||||
|
// EVT_IDLE(wxFrame::OnIdle)
|
||||||
|
// EVT_CLOSE(wxFrame::OnCloseWindow)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WX_MAC_STATUSBAR_HEIGHT 15
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// creation/destruction
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxFrame::Init()
|
||||||
|
{
|
||||||
|
m_frameMenuBar = NULL;
|
||||||
|
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
m_frameToolBar = NULL ;
|
||||||
|
#endif
|
||||||
|
m_frameStatusBar = NULL;
|
||||||
|
m_winLastFocused = NULL ;
|
||||||
|
|
||||||
|
m_iconized = FALSE;
|
||||||
|
|
||||||
|
#if wxUSE_TOOLTIPS
|
||||||
|
m_hwndToolTip = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPoint wxFrame::GetClientAreaOrigin() const
|
||||||
|
{
|
||||||
|
// on mac we are at position -1,-1 with the control
|
||||||
|
wxPoint pt(0, 0);
|
||||||
|
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
if ( GetToolBar() )
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
GetToolBar()->GetSize(& w, & h);
|
||||||
|
|
||||||
|
if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
|
||||||
|
{
|
||||||
|
pt.x += w - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pt.y += h - 1 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // wxUSE_TOOLBAR
|
||||||
|
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFrame::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& title,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
|
||||||
|
|
||||||
|
if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
|
||||||
|
|
||||||
|
m_macWindowBackgroundTheme = kThemeBrushDocumentWindowBackground ;
|
||||||
|
SetThemeWindowBackground( (WindowRef) m_macWindow , m_macWindowBackgroundTheme , false ) ;
|
||||||
|
|
||||||
|
wxModelessWindows.Append(this);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFrame::~wxFrame()
|
||||||
|
{
|
||||||
|
m_isBeingDeleted = TRUE;
|
||||||
|
DeleteAllBars();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxFrame::Enable(bool enable)
|
||||||
|
{
|
||||||
|
if ( !wxWindow::Enable(enable) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ( m_frameMenuBar && m_frameMenuBar == wxMenuBar::MacGetInstalledMenuBar() )
|
||||||
|
{
|
||||||
|
int iMaxMenu = m_frameMenuBar->GetMenuCount();
|
||||||
|
for ( int i = 0 ; i < iMaxMenu ; ++ i )
|
||||||
|
{
|
||||||
|
m_frameMenuBar->EnableTop( i , enable ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
wxStatusBar *statusBar = NULL;
|
||||||
|
|
||||||
|
statusBar = new wxStatusBar(this, id,
|
||||||
|
style, name);
|
||||||
|
statusBar->SetSize( 100 , 15 ) ;
|
||||||
|
statusBar->SetFieldsCount(number);
|
||||||
|
return statusBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::PositionStatusBar()
|
||||||
|
{
|
||||||
|
if (m_frameStatusBar )
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
GetClientSize(&w, &h);
|
||||||
|
int sw, sh;
|
||||||
|
m_frameStatusBar->GetSize(&sw, &sh);
|
||||||
|
|
||||||
|
// Since we wish the status bar to be directly under the client area,
|
||||||
|
// we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS.
|
||||||
|
m_frameStatusBar->SetSize(0, h, w, sh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Responds to colour changes, and passes event on to children.
|
||||||
|
void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
|
||||||
|
{
|
||||||
|
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
|
||||||
|
Refresh();
|
||||||
|
|
||||||
|
if ( m_frameStatusBar )
|
||||||
|
{
|
||||||
|
wxSysColourChangedEvent event2;
|
||||||
|
event2.SetEventObject( m_frameStatusBar );
|
||||||
|
m_frameStatusBar->ProcessEvent(event2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Propagate the event to the non-top-level children
|
||||||
|
wxWindow::OnSysColourChanged(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Default activation behaviour - set the focus for the first child
|
||||||
|
// subwindow found.
|
||||||
|
void wxFrame::OnActivate(wxActivateEvent& event)
|
||||||
|
{
|
||||||
|
if ( !event.GetActive() )
|
||||||
|
{
|
||||||
|
// remember the last focused child if it is our child
|
||||||
|
m_winLastFocused = FindFocus();
|
||||||
|
|
||||||
|
// so we NULL it out if it's a child from some other frame
|
||||||
|
wxWindow *win = m_winLastFocused;
|
||||||
|
while ( win )
|
||||||
|
{
|
||||||
|
if ( win->IsTopLevel() )
|
||||||
|
{
|
||||||
|
if ( win != this )
|
||||||
|
{
|
||||||
|
m_winLastFocused = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
win = win->GetParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// restore focus to the child which was last focused
|
||||||
|
wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent()
|
||||||
|
: NULL;
|
||||||
|
if ( !parent )
|
||||||
|
{
|
||||||
|
parent = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSetFocusToChild(parent, &m_winLastFocused);
|
||||||
|
|
||||||
|
if ( m_frameMenuBar != NULL )
|
||||||
|
{
|
||||||
|
m_frameMenuBar->MacInstallMenuBar() ;
|
||||||
|
}
|
||||||
|
else if (wxTheApp->GetTopWindow() && wxTheApp->GetTopWindow()->IsKindOf(CLASSINFO(wxFrame)))
|
||||||
|
{
|
||||||
|
// Trying toplevel frame menbar
|
||||||
|
if( ((wxFrame*)wxTheApp->GetTopWindow())->GetMenuBar() )
|
||||||
|
((wxFrame*)wxTheApp->GetTopWindow())->GetMenuBar()->MacInstallMenuBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::DetachMenuBar()
|
||||||
|
{
|
||||||
|
if ( m_frameMenuBar )
|
||||||
|
{
|
||||||
|
m_frameMenuBar->UnsetInvokingWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFrameBase::DetachMenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::AttachMenuBar( wxMenuBar *menuBar )
|
||||||
|
{
|
||||||
|
wxFrameBase::AttachMenuBar(menuBar);
|
||||||
|
|
||||||
|
if (m_frameMenuBar)
|
||||||
|
{
|
||||||
|
m_frameMenuBar->SetInvokingWindow( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::DoGetClientSize(int *x, int *y) const
|
||||||
|
{
|
||||||
|
wxWindow::DoGetClientSize( x , y ) ;
|
||||||
|
|
||||||
|
#if wxUSE_STATUSBAR
|
||||||
|
if ( GetStatusBar() && y )
|
||||||
|
{
|
||||||
|
int statusX, statusY;
|
||||||
|
GetStatusBar()->GetClientSize(&statusX, &statusY);
|
||||||
|
*y -= statusY;
|
||||||
|
}
|
||||||
|
#endif // wxUSE_STATUSBAR
|
||||||
|
|
||||||
|
wxPoint pt(GetClientAreaOrigin());
|
||||||
|
if ( y )
|
||||||
|
*y -= pt.y;
|
||||||
|
if ( x )
|
||||||
|
*x -= pt.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::DoSetClientSize(int clientwidth, int clientheight)
|
||||||
|
{
|
||||||
|
int currentclientwidth , currentclientheight ;
|
||||||
|
int currentwidth , currentheight ;
|
||||||
|
|
||||||
|
GetClientSize( ¤tclientwidth , ¤tclientheight ) ;
|
||||||
|
GetSize( ¤twidth , ¤theight ) ;
|
||||||
|
|
||||||
|
// find the current client size
|
||||||
|
|
||||||
|
// Find the difference between the entire window (title bar and all)
|
||||||
|
// and the client area; add this to the new client size to move the
|
||||||
|
// window
|
||||||
|
|
||||||
|
DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth ,
|
||||||
|
currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
|
||||||
|
{
|
||||||
|
if ( wxFrameBase::CreateToolBar(style, id, name) )
|
||||||
|
{
|
||||||
|
PositionToolBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_frameToolBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxFrame::PositionToolBar()
|
||||||
|
{
|
||||||
|
int cw, ch;
|
||||||
|
|
||||||
|
cw = m_width ;
|
||||||
|
ch = m_height ;
|
||||||
|
|
||||||
|
if ( GetStatusBar() )
|
||||||
|
{
|
||||||
|
int statusX, statusY;
|
||||||
|
GetStatusBar()->GetClientSize(&statusX, &statusY);
|
||||||
|
ch -= statusY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetToolBar())
|
||||||
|
{
|
||||||
|
int tw, th;
|
||||||
|
GetToolBar()->GetSize(& tw, & th);
|
||||||
|
|
||||||
|
if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
|
||||||
|
{
|
||||||
|
// Use the 'real' position. wxSIZE_NO_ADJUSTMENTS
|
||||||
|
// means, pretend we don't have toolbar/status bar, so we
|
||||||
|
// have the original client size.
|
||||||
|
GetToolBar()->SetSize(-1, -1, tw, ch + 2 , wxSIZE_NO_ADJUSTMENTS | wxSIZE_ALLOW_MINUS_ONE );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Use the 'real' position
|
||||||
|
GetToolBar()->SetSize(-1, -1, cw + 2, th, wxSIZE_NO_ADJUSTMENTS | wxSIZE_ALLOW_MINUS_ONE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
95
src/mac/classic/gauge.cpp
Normal file
95
src/mac/classic/gauge.cpp
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: gauge.cpp
|
||||||
|
// Purpose: wxGauge class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "gauge.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/gauge.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
bool wxGauge::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
int range,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& s,
|
||||||
|
long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxGaugeBase::Create(parent, id, range, pos, s, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxSize size = s ;
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
m_rangeMax = range ;
|
||||||
|
m_gaugePos = 0 ;
|
||||||
|
|
||||||
|
if ( size.x == wxDefaultSize.x && size.y == wxDefaultSize.y)
|
||||||
|
{
|
||||||
|
size = wxSize( 200 , 16 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style & 0xE0FFFFFF /* no borders on mac */ , validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , range,
|
||||||
|
kControlProgressBarProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGauge::SetShadowWidth(int w)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGauge::SetBezelFace(int w)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGauge::SetRange(int r)
|
||||||
|
{
|
||||||
|
m_rangeMax = r;
|
||||||
|
::SetControl32BitMaximum( (ControlHandle) m_macControl , m_rangeMax ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGauge::SetValue(int pos)
|
||||||
|
{
|
||||||
|
m_gaugePos = pos;
|
||||||
|
::SetControl32BitValue( (ControlHandle) m_macControl , m_gaugePos ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxGauge::GetShadowWidth() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxGauge::GetBezelFace() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxGauge::GetRange() const
|
||||||
|
{
|
||||||
|
return m_rangeMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxGauge::GetValue() const
|
||||||
|
{
|
||||||
|
return m_gaugePos;
|
||||||
|
}
|
||||||
|
|
||||||
22
src/mac/classic/gdiobj.cpp
Normal file
22
src/mac/classic/gdiobj.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: gdiobj.cpp
|
||||||
|
// Purpose: wxGDIObject class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "gdiobj.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/gdiobj.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxGDIObject, wxObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TODO: Nothing to do, unless you want to.
|
||||||
385
src/mac/classic/glcanvas.cpp
Normal file
385
src/mac/classic/glcanvas.cpp
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: glcanvas.cpp
|
||||||
|
// Purpose: wxGLCanvas, for using OpenGL with wxWindows under Macintosh
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "glcanvas.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__)
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxUSE_GLCANVAS
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/frame.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
#include "wx/glcanvas.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// DLL options compatibility check:
|
||||||
|
#include "wx/build.h"
|
||||||
|
WX_CHECK_BUILD_OPTIONS("wxGL")
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GLContext implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxGLContext::wxGLContext(
|
||||||
|
AGLPixelFormat fmt, wxGLCanvas *win,
|
||||||
|
const wxPalette& palette,
|
||||||
|
const wxGLContext *other /* for sharing display lists */
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m_window = win;
|
||||||
|
|
||||||
|
m_drawable = (AGLDrawable) UMAGetWindowPort(MAC_WXHWND(win->MacGetRootWindow()));
|
||||||
|
|
||||||
|
m_glContext = aglCreateContext(fmt, other ? other->m_glContext : NULL);
|
||||||
|
wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") );
|
||||||
|
|
||||||
|
GLboolean b;
|
||||||
|
b = aglSetDrawable(m_glContext, m_drawable);
|
||||||
|
wxCHECK_RET( b, wxT("Couldn't bind OpenGl context") );
|
||||||
|
aglEnable(m_glContext , AGL_BUFFER_RECT ) ;
|
||||||
|
b = aglSetCurrentContext(m_glContext);
|
||||||
|
wxCHECK_RET( b, wxT("Couldn't activate OpenGl context") );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGLContext::~wxGLContext()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
aglSetCurrentContext(NULL);
|
||||||
|
aglDestroyContext(m_glContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLContext::SwapBuffers()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
aglSwapBuffers(m_glContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLContext::SetCurrent()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
aglSetCurrentContext(m_glContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLContext::Update()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
aglUpdateContext(m_glContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLContext::SetColour(const wxChar *colour)
|
||||||
|
{
|
||||||
|
wxColour col = wxTheColourDatabase->Find(colour);
|
||||||
|
if (col.Ok())
|
||||||
|
{
|
||||||
|
float r = (float)(col.Red()/256.0);
|
||||||
|
float g = (float)(col.Green()/256.0);
|
||||||
|
float b = (float)(col.Blue()/256.0);
|
||||||
|
glColor3f( r, g, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxGLCanvas implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
IMPLEMENT_CLASS(wxGLCanvas, wxWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxGLCanvas, wxWindow)
|
||||||
|
EVT_SIZE(wxGLCanvas::OnSize)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
wxGLCanvas::wxGLCanvas(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name,
|
||||||
|
int *attribList, const wxPalette& palette)
|
||||||
|
{
|
||||||
|
Create(parent, NULL, id, pos, size, style, name, attribList, palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGLCanvas::wxGLCanvas( wxWindow *parent,
|
||||||
|
const wxGLContext *shared, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name,
|
||||||
|
int *attribList, const wxPalette& palette )
|
||||||
|
{
|
||||||
|
Create(parent, shared, id, pos, size, style, name, attribList, palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGLCanvas::wxGLCanvas( wxWindow *parent, const wxGLCanvas *shared, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name,
|
||||||
|
int *attribList, const wxPalette& palette )
|
||||||
|
{
|
||||||
|
Create(parent, shared ? shared->GetContext() : NULL, id, pos, size, style, name, attribList, palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGLCanvas::~wxGLCanvas()
|
||||||
|
{
|
||||||
|
if (m_glContext != NULL) {
|
||||||
|
delete m_glContext;
|
||||||
|
m_glContext = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static AGLPixelFormat ChoosePixelFormat(const int *attribList)
|
||||||
|
{
|
||||||
|
GLint data[512];
|
||||||
|
GLint defaultAttribs[] = { AGL_RGBA,
|
||||||
|
AGL_DOUBLEBUFFER,
|
||||||
|
AGL_MINIMUM_POLICY,
|
||||||
|
AGL_DEPTH_SIZE, 1, // use largest available depth buffer
|
||||||
|
AGL_RED_SIZE, 1,
|
||||||
|
AGL_GREEN_SIZE, 1,
|
||||||
|
AGL_BLUE_SIZE, 1,
|
||||||
|
AGL_ALPHA_SIZE, 0,
|
||||||
|
AGL_NONE };
|
||||||
|
GLint *attribs;
|
||||||
|
if (!attribList)
|
||||||
|
{
|
||||||
|
attribs = defaultAttribs;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int arg=0, p=0;
|
||||||
|
|
||||||
|
data[p++] = AGL_MINIMUM_POLICY; // make _SIZE tags behave more like GLX
|
||||||
|
while( (attribList[arg]!=0) && (p<512) )
|
||||||
|
{
|
||||||
|
switch( attribList[arg++] )
|
||||||
|
{
|
||||||
|
case WX_GL_RGBA: data[p++] = AGL_RGBA; break;
|
||||||
|
case WX_GL_BUFFER_SIZE:
|
||||||
|
data[p++]=AGL_BUFFER_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_LEVEL:
|
||||||
|
data[p++]=AGL_LEVEL; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_DOUBLEBUFFER: data[p++] = AGL_DOUBLEBUFFER; break;
|
||||||
|
case WX_GL_STEREO: data[p++] = AGL_STEREO; break;
|
||||||
|
case WX_GL_AUX_BUFFERS:
|
||||||
|
data[p++]=AGL_AUX_BUFFERS; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_RED:
|
||||||
|
data[p++]=AGL_RED_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_GREEN:
|
||||||
|
data[p++]=AGL_GREEN_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_BLUE:
|
||||||
|
data[p++]=AGL_BLUE_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_ALPHA:
|
||||||
|
data[p++]=AGL_ALPHA_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_DEPTH_SIZE:
|
||||||
|
data[p++]=AGL_DEPTH_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_STENCIL_SIZE:
|
||||||
|
data[p++]=AGL_STENCIL_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_ACCUM_RED:
|
||||||
|
data[p++]=AGL_ACCUM_RED_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_ACCUM_GREEN:
|
||||||
|
data[p++]=AGL_ACCUM_GREEN_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_ACCUM_BLUE:
|
||||||
|
data[p++]=AGL_ACCUM_BLUE_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
case WX_GL_MIN_ACCUM_ALPHA:
|
||||||
|
data[p++]=AGL_ACCUM_ALPHA_SIZE; data[p++]=attribList[arg++]; break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data[p] = 0;
|
||||||
|
|
||||||
|
attribs = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return aglChoosePixelFormat(NULL, 0, attribs);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID id,
|
||||||
|
const wxPoint& pos, const wxSize& size, long style, const wxString& name,
|
||||||
|
int *attribList, const wxPalette& palette)
|
||||||
|
{
|
||||||
|
wxWindow::Create( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
|
AGLPixelFormat fmt = ChoosePixelFormat(attribList);
|
||||||
|
wxCHECK_MSG( fmt, false, wxT("Couldn't create OpenGl pixel format") );
|
||||||
|
|
||||||
|
m_glContext = new wxGLContext(fmt, this, palette, shared);
|
||||||
|
m_macCanvasIsShown = true ;
|
||||||
|
aglDestroyPixelFormat(fmt);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::SwapBuffers()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
m_glContext->SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::UpdateContext()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
m_glContext->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::SetViewport()
|
||||||
|
{
|
||||||
|
// viewport is initially set to entire port
|
||||||
|
// adjust glViewport to just this window
|
||||||
|
int x = 0 ;
|
||||||
|
int y = 0 ;
|
||||||
|
|
||||||
|
wxWindow* iter = this ;
|
||||||
|
while( iter->GetParent() )
|
||||||
|
{
|
||||||
|
iter = iter->GetParent() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( iter && iter->IsTopLevel() )
|
||||||
|
{
|
||||||
|
MacClientToRootWindow( &x , &y ) ;
|
||||||
|
int width, height;
|
||||||
|
GetClientSize(& width, & height);
|
||||||
|
Rect bounds ;
|
||||||
|
GetWindowPortBounds( MAC_WXHWND(MacGetRootWindow()) , &bounds ) ;
|
||||||
|
GLint parms[4] ;
|
||||||
|
parms[0] = x ;
|
||||||
|
parms[1] = bounds.bottom - bounds.top - ( y + height ) ;
|
||||||
|
parms[2] = width ;
|
||||||
|
parms[3] = height ;
|
||||||
|
|
||||||
|
if ( !m_macCanvasIsShown )
|
||||||
|
parms[0] += 20000 ;
|
||||||
|
aglSetInteger( m_glContext->m_glContext , AGL_BUFFER_RECT , parms ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::OnSize(wxSizeEvent& event)
|
||||||
|
{
|
||||||
|
MacUpdateView() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::MacUpdateView()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
UpdateContext();
|
||||||
|
m_glContext->SetCurrent();
|
||||||
|
SetViewport();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::MacSuperChangedPosition()
|
||||||
|
{
|
||||||
|
MacUpdateView() ;
|
||||||
|
wxWindow::MacSuperChangedPosition() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::MacTopLevelWindowChangedPosition()
|
||||||
|
{
|
||||||
|
MacUpdateView() ;
|
||||||
|
wxWindow::MacTopLevelWindowChangedPosition() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::SetCurrent()
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
{
|
||||||
|
m_glContext->SetCurrent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::SetColour(const wxChar *colour)
|
||||||
|
{
|
||||||
|
if (m_glContext)
|
||||||
|
m_glContext->SetColour(colour);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxGLCanvas::Show(bool show)
|
||||||
|
{
|
||||||
|
if ( !wxWindow::Show( show ) )
|
||||||
|
return FALSE ;
|
||||||
|
|
||||||
|
if ( !show )
|
||||||
|
{
|
||||||
|
if ( m_macCanvasIsShown )
|
||||||
|
{
|
||||||
|
m_macCanvasIsShown = false ;
|
||||||
|
SetViewport() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( MacIsReallyShown() && !m_macCanvasIsShown )
|
||||||
|
{
|
||||||
|
m_macCanvasIsShown = true ;
|
||||||
|
SetViewport() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGLCanvas::MacSuperShown( bool show )
|
||||||
|
{
|
||||||
|
if ( !show )
|
||||||
|
{
|
||||||
|
if ( m_macCanvasIsShown )
|
||||||
|
{
|
||||||
|
m_macCanvasIsShown = false ;
|
||||||
|
SetViewport() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( MacIsReallyShown() && !m_macCanvasIsShown )
|
||||||
|
{
|
||||||
|
m_macCanvasIsShown = true ;
|
||||||
|
SetViewport() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWindow::MacSuperShown( show ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// wxGLApp
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
IMPLEMENT_CLASS(wxGLApp, wxApp)
|
||||||
|
|
||||||
|
bool wxGLApp::InitGLVisual(int *attribList)
|
||||||
|
{
|
||||||
|
AGLPixelFormat fmt = ChoosePixelFormat(attribList);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
aglDestroyPixelFormat(fmt);
|
||||||
|
return true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGLApp::~wxGLApp(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_GLCANVAS
|
||||||
1653
src/mac/classic/gsocket.c
Normal file
1653
src/mac/classic/gsocket.c
Normal file
File diff suppressed because it is too large
Load Diff
181
src/mac/classic/gsockosx.c
Normal file
181
src/mac/classic/gsockosx.c
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
/* -------------------------------------------------------------------------
|
||||||
|
* Project: GSocket (Generic Socket) for WX
|
||||||
|
* Name: gsockosx.c
|
||||||
|
* Purpose: GSocket: Mac OS X mach-o part
|
||||||
|
* CVSID: $Id$
|
||||||
|
* Mac code by Brian Victor, February 2002. Email comments to bhv1@psu.edu
|
||||||
|
* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxUSE_SOCKETS
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "wx/gsocket.h"
|
||||||
|
#include "wx/unix/gsockunx.h"
|
||||||
|
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
|
||||||
|
#define ALL_CALLBACK_TYPES (kCFSocketReadCallBack | kCFSocketWriteCallBack | kCFSocketConnectCallBack)
|
||||||
|
|
||||||
|
struct MacGSocketData
|
||||||
|
{
|
||||||
|
CFSocketRef socket;
|
||||||
|
CFRunLoopSourceRef source;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Mac_Socket_Callback(CFSocketRef s, CFSocketCallBackType callbackType,
|
||||||
|
CFDataRef address, const void* data, void* info)
|
||||||
|
{
|
||||||
|
GSocket* socket = (GSocket*)info;
|
||||||
|
struct MacGSocketData* macdata;
|
||||||
|
macdata = (struct MacGSocketData*)socket->m_gui_dependent;
|
||||||
|
if (!macdata) return;
|
||||||
|
switch (callbackType)
|
||||||
|
{
|
||||||
|
case kCFSocketConnectCallBack:
|
||||||
|
assert(!socket->m_server);
|
||||||
|
socket->m_functions->Detected_Write(socket);
|
||||||
|
break;
|
||||||
|
case kCFSocketReadCallBack:
|
||||||
|
socket->m_functions->Detected_Read(socket);
|
||||||
|
break;
|
||||||
|
case kCFSocketWriteCallBack:
|
||||||
|
socket->m_functions->Detected_Write(socket);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break; /* We shouldn't get here. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MacGSocketData* _GSocket_Get_Mac_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
/* If socket is already created, returns a pointer to the data */
|
||||||
|
/* Otherwise, creates socket and returns the pointer */
|
||||||
|
CFSocketContext cont;
|
||||||
|
struct MacGSocketData* data = (struct MacGSocketData*)socket->m_gui_dependent;
|
||||||
|
|
||||||
|
if (data && data->source) return data;
|
||||||
|
|
||||||
|
/* CFSocket has not been created, create it: */
|
||||||
|
if (socket->m_fd < 0 || !data) return NULL;
|
||||||
|
cont.version = 0; cont.retain = NULL;
|
||||||
|
cont.release = NULL; cont.copyDescription = NULL;
|
||||||
|
cont.info = socket;
|
||||||
|
|
||||||
|
CFSocketRef cf = CFSocketCreateWithNative(NULL, socket->m_fd,
|
||||||
|
ALL_CALLBACK_TYPES, Mac_Socket_Callback, &cont);
|
||||||
|
CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(NULL, cf, 0);
|
||||||
|
assert(source);
|
||||||
|
socket->m_gui_dependent = (char*)data;
|
||||||
|
|
||||||
|
/* Keep the source and the socket around. */
|
||||||
|
data->source = source;
|
||||||
|
data->socket = cf;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _GSocket_GUI_Init(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_GUI_Cleanup(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int _GSocket_GUI_Init_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData *data = malloc(sizeof(struct MacGSocketData));
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
socket->m_gui_dependent = (char*)data;
|
||||||
|
data->socket = NULL;
|
||||||
|
data->source = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_GUI_Destroy_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData *data = (struct MacGSocketData*)(socket->m_gui_dependent);
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
CFRelease(data->socket);
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case GSOCK_CONNECTION:
|
||||||
|
if(socket->m_server)
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
else
|
||||||
|
c = kCFSocketConnectCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_LOST:
|
||||||
|
case GSOCK_INPUT:
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_OUTPUT:
|
||||||
|
c = kCFSocketWriteCallBack;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
CFSocketEnableCallBacks(data->socket, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case GSOCK_CONNECTION:
|
||||||
|
if(socket->m_server)
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
else
|
||||||
|
c = kCFSocketConnectCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_LOST:
|
||||||
|
case GSOCK_INPUT:
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_OUTPUT:
|
||||||
|
c = kCFSocketWriteCallBack;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
CFSocketDisableCallBacks(data->socket, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Enable_Events(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
CFRunLoopAddSource(CFRunLoopGetCurrent(), data->source, kCFRunLoopDefaultMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Disable_Events(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
/* CFSocketInvalidate does CFRunLoopRemoveSource anyway */
|
||||||
|
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), data->source, kCFRunLoopCommonModes);
|
||||||
|
CFSocketInvalidate(data->socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_SOCKETS
|
||||||
181
src/mac/classic/gsockosx.cpp
Normal file
181
src/mac/classic/gsockosx.cpp
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
/* -------------------------------------------------------------------------
|
||||||
|
* Project: GSocket (Generic Socket) for WX
|
||||||
|
* Name: gsockosx.c
|
||||||
|
* Purpose: GSocket: Mac OS X mach-o part
|
||||||
|
* CVSID: $Id$
|
||||||
|
* Mac code by Brian Victor, February 2002. Email comments to bhv1@psu.edu
|
||||||
|
* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#if wxUSE_SOCKETS
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "wx/gsocket.h"
|
||||||
|
#include "wx/unix/gsockunx.h"
|
||||||
|
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
|
||||||
|
#define ALL_CALLBACK_TYPES (kCFSocketReadCallBack | kCFSocketWriteCallBack | kCFSocketConnectCallBack)
|
||||||
|
|
||||||
|
struct MacGSocketData
|
||||||
|
{
|
||||||
|
CFSocketRef socket;
|
||||||
|
CFRunLoopSourceRef source;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Mac_Socket_Callback(CFSocketRef s, CFSocketCallBackType callbackType,
|
||||||
|
CFDataRef address, const void* data, void* info)
|
||||||
|
{
|
||||||
|
GSocket* socket = (GSocket*)info;
|
||||||
|
struct MacGSocketData* macdata;
|
||||||
|
macdata = (struct MacGSocketData*)socket->m_gui_dependent;
|
||||||
|
if (!macdata) return;
|
||||||
|
switch (callbackType)
|
||||||
|
{
|
||||||
|
case kCFSocketConnectCallBack:
|
||||||
|
assert(!socket->m_server);
|
||||||
|
socket->m_functions->Detected_Write(socket);
|
||||||
|
break;
|
||||||
|
case kCFSocketReadCallBack:
|
||||||
|
socket->m_functions->Detected_Read(socket);
|
||||||
|
break;
|
||||||
|
case kCFSocketWriteCallBack:
|
||||||
|
socket->m_functions->Detected_Write(socket);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break; /* We shouldn't get here. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MacGSocketData* _GSocket_Get_Mac_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
/* If socket is already created, returns a pointer to the data */
|
||||||
|
/* Otherwise, creates socket and returns the pointer */
|
||||||
|
CFSocketContext cont;
|
||||||
|
struct MacGSocketData* data = (struct MacGSocketData*)socket->m_gui_dependent;
|
||||||
|
|
||||||
|
if (data && data->source) return data;
|
||||||
|
|
||||||
|
/* CFSocket has not been created, create it: */
|
||||||
|
if (socket->m_fd < 0 || !data) return NULL;
|
||||||
|
cont.version = 0; cont.retain = NULL;
|
||||||
|
cont.release = NULL; cont.copyDescription = NULL;
|
||||||
|
cont.info = socket;
|
||||||
|
|
||||||
|
CFSocketRef cf = CFSocketCreateWithNative(NULL, socket->m_fd,
|
||||||
|
ALL_CALLBACK_TYPES, Mac_Socket_Callback, &cont);
|
||||||
|
CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(NULL, cf, 0);
|
||||||
|
assert(source);
|
||||||
|
socket->m_gui_dependent = (char*)data;
|
||||||
|
|
||||||
|
/* Keep the source and the socket around. */
|
||||||
|
data->source = source;
|
||||||
|
data->socket = cf;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _GSocket_GUI_Init(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_GUI_Cleanup(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int _GSocket_GUI_Init_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData *data = malloc(sizeof(struct MacGSocketData));
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
socket->m_gui_dependent = (char*)data;
|
||||||
|
data->socket = NULL;
|
||||||
|
data->source = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_GUI_Destroy_Socket(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData *data = (struct MacGSocketData*)(socket->m_gui_dependent);
|
||||||
|
if (data)
|
||||||
|
{
|
||||||
|
CFRelease(data->socket);
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case GSOCK_CONNECTION:
|
||||||
|
if(socket->m_server)
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
else
|
||||||
|
c = kCFSocketConnectCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_LOST:
|
||||||
|
case GSOCK_INPUT:
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_OUTPUT:
|
||||||
|
c = kCFSocketWriteCallBack;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
CFSocketEnableCallBacks(data->socket, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case GSOCK_CONNECTION:
|
||||||
|
if(socket->m_server)
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
else
|
||||||
|
c = kCFSocketConnectCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_LOST:
|
||||||
|
case GSOCK_INPUT:
|
||||||
|
c = kCFSocketReadCallBack;
|
||||||
|
break;
|
||||||
|
case GSOCK_OUTPUT:
|
||||||
|
c = kCFSocketWriteCallBack;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
CFSocketDisableCallBacks(data->socket, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Enable_Events(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
CFRunLoopAddSource(CFRunLoopGetCurrent(), data->source, kCFRunLoopDefaultMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _GSocket_Disable_Events(GSocket *socket)
|
||||||
|
{
|
||||||
|
struct MacGSocketData* data = _GSocket_Get_Mac_Socket(socket);
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
/* CFSocketInvalidate does CFRunLoopRemoveSource anyway */
|
||||||
|
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), data->source, kCFRunLoopCommonModes);
|
||||||
|
CFSocketInvalidate(data->socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_SOCKETS
|
||||||
84
src/mac/classic/helpxxxx.cpp
Normal file
84
src/mac/classic/helpxxxx.cpp
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: helpxxxx.cpp
|
||||||
|
// Purpose: Help system: native implementation
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "helpxxxx.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/stubs/helpxxxx.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxXXXXHelpController, wxHelpControllerBase)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxXXXXHelpController::wxXXXXHelpController()
|
||||||
|
{
|
||||||
|
m_helpFile = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
wxXXXXHelpController::~wxXXXXHelpController()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::Initialize(const wxString& filename)
|
||||||
|
{
|
||||||
|
m_helpFile = filename;
|
||||||
|
// TODO any other inits
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::LoadFile(const wxString& file)
|
||||||
|
{
|
||||||
|
m_helpFile = file;
|
||||||
|
// TODO
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::DisplayContents()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::DisplaySection(int section)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::DisplayBlock(long block)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxXXXXHelpController::KeywordSearch(const wxString& k,
|
||||||
|
wxHelpSearchMode WXUNUSED(mode))
|
||||||
|
{
|
||||||
|
if (m_helpFile == "") return FALSE;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Can't close the help window explicitly in WinHelp
|
||||||
|
bool wxXXXXHelpController::Quit()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxXXXXHelpController::OnQuit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
417
src/mac/classic/hid.cpp
Normal file
417
src/mac/classic/hid.cpp
Normal file
@@ -0,0 +1,417 @@
|
|||||||
|
#include "hid.h"
|
||||||
|
|
||||||
|
#define wxFORCECHECK_MSG(arg, msg) \
|
||||||
|
{\
|
||||||
|
if (arg) \
|
||||||
|
{\
|
||||||
|
wxLogSysError(wxString::Format(wxT("Message:%s\nHID: %s failed!"), wxT(msg), wxT(#arg)));\
|
||||||
|
return false;\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
#define wxIOCHECK(arg, msg) wxFORCECHECK_MSG(arg != kIOReturnSuccess, msg)
|
||||||
|
#define wxKERNCHECK(arg, msg) wxFORCECHECK_MSG(arg != KERN_SUCCESS, msg)
|
||||||
|
#define wxSCHECK(arg, msg) wxFORCECHECK_MSG(arg != S_OK, msg)
|
||||||
|
|
||||||
|
void CFShowTypeIDDescription(CFTypeRef pData)
|
||||||
|
{
|
||||||
|
if(!pData)
|
||||||
|
{
|
||||||
|
wxMessageBox("AHHH!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMessageBox(
|
||||||
|
CFStringGetCStringPtr(
|
||||||
|
CFCopyTypeIDDescription(CFGetTypeID(pData)),CFStringGetSystemEncoding()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
bool wxHIDDevice::Create (const int& nClass, const int& nType)
|
||||||
|
{
|
||||||
|
//Create the mach port
|
||||||
|
wxIOCHECK(IOMasterPort(bootstrap_port, &m_pPort), "Could not create mach port");
|
||||||
|
|
||||||
|
//Dictionary that will hold first
|
||||||
|
//the matching dictionary for determining which kind of devices we want,
|
||||||
|
//then later some registry properties from an iterator (see below)
|
||||||
|
CFMutableDictionaryRef pDictionary;
|
||||||
|
|
||||||
|
//Create a dictionary
|
||||||
|
//The call to IOServiceMatching filters down the
|
||||||
|
//the services we want to hid services (and also eats the
|
||||||
|
//dictionary up for us (consumes one reference))
|
||||||
|
wxASSERT((pDictionary = IOServiceMatching(kIOHIDDeviceKey)) != NULL );
|
||||||
|
|
||||||
|
//Here we'll filter down the services to what we want
|
||||||
|
if (nType != -1)
|
||||||
|
{
|
||||||
|
CFNumberRef pType = CFNumberCreate(kCFAllocatorDefault,
|
||||||
|
kCFNumberIntType, &nType);
|
||||||
|
CFDictionarySetValue(pDictionary, CFSTR(kIOHIDPrimaryUsageKey), pType);
|
||||||
|
CFRelease(pType);
|
||||||
|
}
|
||||||
|
if (nClass != -1)
|
||||||
|
{
|
||||||
|
CFNumberRef pClass = CFNumberCreate(kCFAllocatorDefault,
|
||||||
|
kCFNumberIntType, &nClass);
|
||||||
|
CFDictionarySetValue(pDictionary, CFSTR(kIOHIDPrimaryUsagePageKey), pClass);
|
||||||
|
CFRelease(pClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Now get the maching services
|
||||||
|
io_iterator_t pIterator;
|
||||||
|
wxIOCHECK(IOServiceGetMatchingServices(m_pPort, pDictionary, &pIterator), "No Matching HID Services");
|
||||||
|
wxASSERT(pIterator != NULL);
|
||||||
|
|
||||||
|
//Now we iterate through them
|
||||||
|
io_object_t pObject;
|
||||||
|
while ( (pObject = IOIteratorNext(pIterator)) != NULL)
|
||||||
|
{
|
||||||
|
wxASSERT(IORegistryEntryCreateCFProperties(pObject, &pDictionary,
|
||||||
|
kCFAllocatorDefault, kNilOptions) == KERN_SUCCESS);
|
||||||
|
|
||||||
|
//Just for sanity :)
|
||||||
|
wxASSERT(CFGetTypeID(CFDictionaryGetValue(pDictionary, CFSTR(kIOHIDProductKey))) == CFStringGetTypeID());
|
||||||
|
|
||||||
|
//Get [product] name
|
||||||
|
m_szName = CFStringGetCStringPtr (
|
||||||
|
(CFStringRef) CFDictionaryGetValue(pDictionary, CFSTR(kIOHIDProductKey)),
|
||||||
|
CFStringGetSystemEncoding()
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
//Now the hard part - in order to scan things we need "cookies" -
|
||||||
|
//
|
||||||
|
wxCFArray CookieArray = CFDictionaryGetValue(pDictionary, CFSTR(kIOHIDElementKey));
|
||||||
|
BuildCookies(CookieArray);
|
||||||
|
if (m_ppQueue != NULL)
|
||||||
|
wxASSERT((*m_ppQueue)->start(m_ppQueue) == S_OK);
|
||||||
|
|
||||||
|
//Create the interface (good grief - long function names!)
|
||||||
|
SInt32 nScore;
|
||||||
|
IOCFPlugInInterface** ppPlugin;
|
||||||
|
wxIOCHECK(IOCreatePlugInInterfaceForService(pObject, kIOHIDDeviceUserClientTypeID,
|
||||||
|
kIOCFPlugInInterfaceID, &ppPlugin, &nScore), "");
|
||||||
|
|
||||||
|
//Now, the final thing we can check before we fall back to asserts
|
||||||
|
//(because the dtor only checks if the device is ok, so if anything
|
||||||
|
//fails from now on the dtor will delete the device anyway, so we can't break from this).
|
||||||
|
|
||||||
|
//Get the HID interface from the plugin to the mach port
|
||||||
|
wxSCHECK((*ppPlugin)->QueryInterface(ppPlugin,
|
||||||
|
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (void**) &m_ppDevice), "");
|
||||||
|
|
||||||
|
//release the plugin
|
||||||
|
(*ppPlugin)->Release(ppPlugin);
|
||||||
|
|
||||||
|
//open the HID interface...
|
||||||
|
wxASSERT((*m_ppDevice)->open(m_ppDevice, 0) == S_OK);
|
||||||
|
|
||||||
|
//cleanup
|
||||||
|
CFRelease(pDictionary);
|
||||||
|
IOObjectRelease(pObject);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//iterator cleanup
|
||||||
|
IOObjectRelease(pIterator);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}//end Create()
|
||||||
|
|
||||||
|
void wxHIDDevice::AddCookie(CFTypeRef Data, const int& i)
|
||||||
|
{
|
||||||
|
CFNumberGetValue(
|
||||||
|
(CFNumberRef) CFDictionaryGetValue ( (CFDictionaryRef) Data
|
||||||
|
, CFSTR(kIOHIDElementCookieKey)
|
||||||
|
),
|
||||||
|
kCFNumberIntType,
|
||||||
|
&m_pCookies[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxHIDDevice::AddCookieInQueue(CFTypeRef Data, const int& i)
|
||||||
|
{
|
||||||
|
AddCookie(Data, i);
|
||||||
|
wxASSERT((*m_ppQueue)->addElement(m_ppQueue, m_pCookies[i], 0) == S_OK);//3rd Param flags (none yet)
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxHIDDevice::InitCookies(const size_t& dwSize, bool bQueue)
|
||||||
|
{
|
||||||
|
m_pCookies = new IOHIDElementCookie[dwSize];
|
||||||
|
if (bQueue)
|
||||||
|
{
|
||||||
|
wxASSERT( m_ppQueue != NULL);
|
||||||
|
wxASSERT( (m_ppQueue = (*m_ppDevice)->allocQueue(m_ppDevice)) != NULL);
|
||||||
|
wxASSERT( (*m_ppQueue)->create(m_ppQueue, 0, 512) == S_OK); //Param 2, flags, none yet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxHIDDevice::IsActive(const int& nIndex)
|
||||||
|
{
|
||||||
|
wxASSERT(m_pCookies[nIndex] != NULL);
|
||||||
|
IOHIDEventStruct Event;
|
||||||
|
(*m_ppDevice)->getElementValue(m_ppDevice, m_pCookies[nIndex], &Event);
|
||||||
|
return !!Event.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxHIDDevice::~wxHIDDevice()
|
||||||
|
{
|
||||||
|
if (m_ppDevice != NULL)
|
||||||
|
{
|
||||||
|
(*m_ppDevice)->close(m_ppDevice);
|
||||||
|
(*m_ppDevice)->Release(m_ppDevice);
|
||||||
|
mach_port_deallocate(mach_task_self(), m_pPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pCookies != NULL)
|
||||||
|
{
|
||||||
|
delete [] m_pCookies;
|
||||||
|
if (m_ppQueue != NULL)
|
||||||
|
{
|
||||||
|
(*m_ppQueue)->stop(m_ppQueue);
|
||||||
|
(*m_ppQueue)->dispose(m_ppQueue);
|
||||||
|
(*m_ppQueue)->Release(m_ppQueue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kHIDUsage_KeyboardHyphen = 0x2D,
|
||||||
|
kHIDUsage_KeyboardEqualSign = 0x2E,
|
||||||
|
kHIDUsage_KeyboardOpenBracket = 0x2F,
|
||||||
|
kHIDUsage_KeyboardCloseBracket = 0x30,
|
||||||
|
kHIDUsage_KeyboardBackslash = 0x31, //* \ or | *
|
||||||
|
kHIDUsage_KeyboardNonUSPound = 0x32, /* Non-US # or _ *
|
||||||
|
kHIDUsage_KeyboardSemicolon = 0x33, /* ; or : *
|
||||||
|
kHIDUsage_KeyboardQuote = 0x34, /* ' or " *
|
||||||
|
kHIDUsage_KeyboardGraveAccentAndTilde = 0x35, /* Grave Accent and Tilde *
|
||||||
|
kHIDUsage_KeyboardComma = 0x36, /* , or < *
|
||||||
|
kHIDUsage_KeyboardPeriod = 0x37, /* . or > *
|
||||||
|
kHIDUsage_KeyboardSlash = 0x38, /* / or ? *
|
||||||
|
kHIDUsage_KeyboardCapsLock = 0x39, /* Caps Lock *
|
||||||
|
|
||||||
|
kHIDUsage_KeyboardPrintScreen = 0x46, /* Print Screen *
|
||||||
|
kHIDUsage_KeyboardScrollLock = 0x47, /* Scroll Lock *
|
||||||
|
kHIDUsage_KeyboardPause = 0x48, /* Pause *
|
||||||
|
kHIDUsage_KeyboardInsert = 0x49, /* Insert *
|
||||||
|
kHIDUsage_KeyboardHome = 0x4A, /* Home *
|
||||||
|
kHIDUsage_KeyboardDeleteForward = 0x4C, /* Delete Forward *
|
||||||
|
|
||||||
|
kHIDUsage_KeyboardUpArrow
|
||||||
|
kHIDUsage_KeypadNumLock
|
||||||
|
kHIDUsage_KeypadSlash
|
||||||
|
kHIDUsage_KeypadAsterisk
|
||||||
|
kHIDUsage_KeypadHyphen
|
||||||
|
kHIDUsage_KeypadPlus
|
||||||
|
kHIDUsage_KeypadEnter
|
||||||
|
kHIDUsage_KeypadPeriod
|
||||||
|
kHIDUsage_KeyboardNonUSBackslash
|
||||||
|
kHIDUsage_KeyboardApplication
|
||||||
|
kHIDUsage_KeyboardPower
|
||||||
|
kHIDUsage_KeypadEqualSign
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
enum wxKeyCode
|
||||||
|
{
|
||||||
|
|
||||||
|
WXK_START = 300,
|
||||||
|
WXK_LBUTTON,
|
||||||
|
WXK_RBUTTON,
|
||||||
|
WXK_CANCEL,
|
||||||
|
WXK_MBUTTON,
|
||||||
|
WXK_CLEAR,
|
||||||
|
WXK_SHIFT,
|
||||||
|
WXK_ALT,
|
||||||
|
WXK_CONTROL,
|
||||||
|
WXK_MENU,
|
||||||
|
WXK_PAUSE,
|
||||||
|
WXK_PRIOR, * Page up *
|
||||||
|
WXK_NEXT, * Page down *
|
||||||
|
WXK_END,
|
||||||
|
WXK_HOME,
|
||||||
|
WXK_LEFT,
|
||||||
|
WXK_UP,
|
||||||
|
WXK_RIGHT,
|
||||||
|
WXK_DOWN,
|
||||||
|
WXK_SELECT,
|
||||||
|
WXK_PRINT,
|
||||||
|
WXK_EXECUTE,
|
||||||
|
WXK_SNAPSHOT,
|
||||||
|
WXK_INSERT,
|
||||||
|
WXK_HELP,
|
||||||
|
WXK_MULTIPLY,
|
||||||
|
WXK_ADD,
|
||||||
|
WXK_SEPARATOR,
|
||||||
|
WXK_SUBTRACT,
|
||||||
|
WXK_DECIMAL,
|
||||||
|
WXK_DIVIDE,
|
||||||
|
WXK_PAGEUP,
|
||||||
|
WXK_PAGEDOWN,
|
||||||
|
|
||||||
|
WXK_NUMPAD_SPACE,
|
||||||
|
WXK_NUMPAD_TAB,
|
||||||
|
WXK_NUMPAD_ENTER,
|
||||||
|
WXK_NUMPAD_HOME,
|
||||||
|
WXK_NUMPAD_LEFT,
|
||||||
|
WXK_NUMPAD_UP,
|
||||||
|
WXK_NUMPAD_RIGHT,
|
||||||
|
WXK_NUMPAD_DOWN,
|
||||||
|
WXK_NUMPAD_PRIOR,
|
||||||
|
WXK_NUMPAD_PAGEUP,
|
||||||
|
WXK_NUMPAD_NEXT,
|
||||||
|
WXK_NUMPAD_PAGEDOWN,
|
||||||
|
WXK_NUMPAD_END,
|
||||||
|
WXK_NUMPAD_BEGIN,
|
||||||
|
WXK_NUMPAD_INSERT,
|
||||||
|
WXK_NUMPAD_DELETE,
|
||||||
|
WXK_NUMPAD_EQUAL,
|
||||||
|
WXK_NUMPAD_MULTIPLY,
|
||||||
|
WXK_NUMPAD_ADD,
|
||||||
|
WXK_NUMPAD_SEPARATOR,
|
||||||
|
WXK_NUMPAD_SUBTRACT,
|
||||||
|
WXK_NUMPAD_DECIMAL,
|
||||||
|
WXK_NUMPAD_DIVIDE,
|
||||||
|
|
||||||
|
WXK_WINDOWS_LEFT,
|
||||||
|
WXK_WINDOWS_RIGHT,
|
||||||
|
WXK_WINDOWS_MENU ,
|
||||||
|
WXK_COMMAND
|
||||||
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
WXK_RSHIFT = 400,
|
||||||
|
WXK_RALT,
|
||||||
|
WXK_RCONTROL,
|
||||||
|
WXK_RMENU
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
bool wxHIDKeyboard::Create()
|
||||||
|
{
|
||||||
|
return wxHIDDevice::Create(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxHIDKeyboard::BuildCookies(wxCFArray& Array)
|
||||||
|
{
|
||||||
|
Array = CFDictionaryGetValue((CFDictionaryRef)Array[0], CFSTR(kIOHIDElementKey));
|
||||||
|
InitCookies(500);
|
||||||
|
int i,
|
||||||
|
nUsage;
|
||||||
|
for (i = 0; i < Array.Count(); ++i)
|
||||||
|
{
|
||||||
|
CFNumberGetValue(
|
||||||
|
(CFNumberRef) CFDictionaryGetValue((CFDictionaryRef) Array[i], CFSTR(kIOHIDElementUsageKey)),
|
||||||
|
kCFNumberLongType, &nUsage);
|
||||||
|
|
||||||
|
if (nUsage >= kHIDUsage_KeyboardA && nUsage <= kHIDUsage_KeyboardZ)
|
||||||
|
AddCookie(Array[i], 'A' + (nUsage - kHIDUsage_KeyboardA) );
|
||||||
|
else if (nUsage >= kHIDUsage_Keyboard1 && nUsage <= kHIDUsage_Keyboard9)
|
||||||
|
AddCookie(Array[i], '1' + (nUsage - kHIDUsage_Keyboard1) );
|
||||||
|
else if (nUsage >= kHIDUsage_KeyboardF1 && nUsage <= kHIDUsage_KeyboardF12)
|
||||||
|
AddCookie(Array[i], WXK_F1 + (nUsage - kHIDUsage_KeyboardF1) );
|
||||||
|
else if (nUsage >= kHIDUsage_KeyboardF13 && nUsage <= kHIDUsage_KeyboardF24)
|
||||||
|
AddCookie(Array[i], WXK_F13 + (nUsage - kHIDUsage_KeyboardF13) );
|
||||||
|
else if (nUsage >= kHIDUsage_Keypad1 && nUsage <= kHIDUsage_Keypad9)
|
||||||
|
AddCookie(Array[i], WXK_NUMPAD1 + (nUsage - kHIDUsage_Keypad1) );
|
||||||
|
else switch (nUsage)
|
||||||
|
{
|
||||||
|
//0's (wx & ascii go 0-9, but HID goes 1-0)
|
||||||
|
case kHIDUsage_Keyboard0:
|
||||||
|
AddCookie(Array[i],'0');
|
||||||
|
break;
|
||||||
|
case kHIDUsage_Keypad0:
|
||||||
|
AddCookie(Array[i],WXK_NUMPAD0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//Basic
|
||||||
|
case kHIDUsage_KeyboardReturnOrEnter:
|
||||||
|
AddCookie(Array[i], WXK_RETURN);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardEscape:
|
||||||
|
AddCookie(Array[i], WXK_ESCAPE);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardDeleteOrBackspace:
|
||||||
|
AddCookie(Array[i], WXK_BACK);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardTab:
|
||||||
|
AddCookie(Array[i], WXK_TAB);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardSpacebar:
|
||||||
|
AddCookie(Array[i], WXK_SPACE);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardPageUp:
|
||||||
|
AddCookie(Array[i], WXK_PRIOR);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardEnd:
|
||||||
|
AddCookie(Array[i], WXK_END);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardPageDown:
|
||||||
|
AddCookie(Array[i], WXK_NEXT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardRightArrow:
|
||||||
|
AddCookie(Array[i], WXK_RIGHT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardLeftArrow:
|
||||||
|
AddCookie(Array[i], WXK_LEFT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardDownArrow:
|
||||||
|
AddCookie(Array[i], WXK_DOWN);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardUpArrow:
|
||||||
|
AddCookie(Array[i], WXK_UP);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//LEDS
|
||||||
|
case kHIDUsage_KeyboardCapsLock:
|
||||||
|
AddCookie(Array[i],WXK_CAPITAL);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeypadNumLock:
|
||||||
|
AddCookie(Array[i],WXK_NUMLOCK);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardScrollLock:
|
||||||
|
AddCookie(Array[i],WXK_SCROLL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//Menu keys, Shift, other specials
|
||||||
|
case kHIDUsage_KeyboardLeftControl:
|
||||||
|
AddCookie(Array[i],WXK_CONTROL);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardLeftShift:
|
||||||
|
AddCookie(Array[i],WXK_SHIFT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardLeftAlt:
|
||||||
|
AddCookie(Array[i],WXK_ALT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardLeftGUI:
|
||||||
|
AddCookie(Array[i],WXK_MENU);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardRightControl:
|
||||||
|
AddCookie(Array[i],WXK_RCONTROL);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardRightShift:
|
||||||
|
AddCookie(Array[i],WXK_RSHIFT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardRightAlt:
|
||||||
|
AddCookie(Array[i],WXK_RALT);
|
||||||
|
break;
|
||||||
|
case kHIDUsage_KeyboardRightGUI:
|
||||||
|
AddCookie(Array[i],WXK_RMENU);
|
||||||
|
break;
|
||||||
|
|
||||||
|
//Default
|
||||||
|
default:
|
||||||
|
//not in wx keycodes - do nothing....
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//end buildcookies
|
||||||
132
src/mac/classic/icon.cpp
Normal file
132
src/mac/classic/icon.cpp
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: icon.cpp
|
||||||
|
// Purpose: wxIcon class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "icon.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/icon.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Icons
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxIcon::wxIcon()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIcon::wxIcon(const char bits[], int width, int height) :
|
||||||
|
wxBitmap(bits, width, height)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIcon::wxIcon( const char **bits ) :
|
||||||
|
wxBitmap(bits)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIcon::wxIcon( char **bits ) :
|
||||||
|
wxBitmap(bits)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIcon::wxIcon(const wxString& icon_file, int flags,
|
||||||
|
int desiredWidth, int desiredHeight)
|
||||||
|
{
|
||||||
|
LoadFile(icon_file, (wxBitmapType) flags, desiredWidth, desiredHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIcon::~wxIcon()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type,
|
||||||
|
int desiredWidth, int desiredHeight)
|
||||||
|
{
|
||||||
|
UnRef();
|
||||||
|
|
||||||
|
m_refData = new wxBitmapRefData;
|
||||||
|
|
||||||
|
wxBitmapHandler *handler = FindHandler((wxBitmapType)type);
|
||||||
|
|
||||||
|
if ( handler )
|
||||||
|
return handler->LoadFile(this, filename, type, desiredWidth, desiredHeight);
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxIcon::CopyFromBitmap(const wxBitmap& bmp)
|
||||||
|
{
|
||||||
|
wxIcon *icon = (wxIcon*)(&bmp);
|
||||||
|
*this = *icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler)
|
||||||
|
|
||||||
|
bool wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
|
||||||
|
int desiredWidth, int desiredHeight)
|
||||||
|
{
|
||||||
|
short theId = -1 ;
|
||||||
|
if ( name == wxT("wxICON_INFORMATION") )
|
||||||
|
{
|
||||||
|
theId = kNoteIcon ;
|
||||||
|
}
|
||||||
|
else if ( name == wxT("wxICON_QUESTION") )
|
||||||
|
{
|
||||||
|
theId = kCautionIcon ;
|
||||||
|
}
|
||||||
|
else if ( name == wxT("wxICON_WARNING") )
|
||||||
|
{
|
||||||
|
theId = kCautionIcon ;
|
||||||
|
}
|
||||||
|
else if ( name == wxT("wxICON_ERROR") )
|
||||||
|
{
|
||||||
|
theId = kStopIcon ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Str255 theName ;
|
||||||
|
OSType theType ;
|
||||||
|
wxMacStringToPascal( name , theName ) ;
|
||||||
|
|
||||||
|
Handle resHandle = GetNamedResource( 'cicn' , theName ) ;
|
||||||
|
if ( resHandle != 0L )
|
||||||
|
{
|
||||||
|
GetResInfo( resHandle , &theId , &theType , theName ) ;
|
||||||
|
ReleaseResource( resHandle ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( theId != -1 )
|
||||||
|
{
|
||||||
|
CIconHandle theIcon = (CIconHandle ) GetCIcon( theId ) ;
|
||||||
|
if ( theIcon )
|
||||||
|
{
|
||||||
|
M_BITMAPHANDLERDATA->m_hIcon = theIcon ;
|
||||||
|
M_BITMAPHANDLERDATA->m_width = 32 ;
|
||||||
|
M_BITMAPHANDLERDATA->m_height = 32 ;
|
||||||
|
|
||||||
|
M_BITMAPHANDLERDATA->m_depth = 8 ;
|
||||||
|
M_BITMAPHANDLERDATA->m_ok = true ;
|
||||||
|
M_BITMAPHANDLERDATA->m_numColors = 256 ;
|
||||||
|
M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeIcon ;
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE ;
|
||||||
|
}
|
||||||
286
src/mac/classic/joystick.cpp
Normal file
286
src/mac/classic/joystick.cpp
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: joystick.cpp
|
||||||
|
// Purpose: wxJoystick class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "joystick.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
|
||||||
|
#include "wx/joystick.h"
|
||||||
|
|
||||||
|
#if wxUSE_JOYSTICK
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxJoystick, wxObject)
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
wxPoint wxJoystick::GetPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return wxPoint(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetZPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetButtonState() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetPOVPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetPOVCTSPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetRudderPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetUPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetVPosition() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetMovementThreshold() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxJoystick::SetMovementThreshold(int threshold)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Capabilities
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool wxJoystick::IsOk() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetNumberJoysticks() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetManufacturerId() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetProductId() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxJoystick::GetProductName() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return wxString(wxT(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetXMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetYMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetZMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetXMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetYMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetZMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetNumberButtons() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetNumberAxes() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetMaxButtons() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetMaxAxes() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetPollingMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetPollingMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetRudderMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetRudderMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetUMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetUMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetVMin() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxJoystick::GetVMax() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasRudder() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasZ() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasU() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasV() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasPOV() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasPOV4Dir() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::HasPOVCTS() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool wxJoystick::SetCapture(wxWindow* win, int pollingFreq)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxJoystick::ReleaseCapture()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// wxUSE_JOYSTICK
|
||||||
|
|
||||||
1023
src/mac/classic/listbox.cpp
Normal file
1023
src/mac/classic/listbox.cpp
Normal file
File diff suppressed because it is too large
Load Diff
162
src/mac/classic/macnotfy.cpp
Normal file
162
src/mac/classic/macnotfy.cpp
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
/* -------------------------------------------------------------------------
|
||||||
|
* Project: Mac Notifier Support
|
||||||
|
* Name: macnotfy.c
|
||||||
|
* Author: Stefan CSomor
|
||||||
|
* Purpose: Mac Notifier main file
|
||||||
|
* CVSID: $Id$
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wx/wx.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#include "wx/mac/macnotfy.h"
|
||||||
|
|
||||||
|
const short kMaxEvents = 1000 ;
|
||||||
|
|
||||||
|
struct wxMacNotificationEvents
|
||||||
|
{
|
||||||
|
short top ;
|
||||||
|
short bottom ;
|
||||||
|
|
||||||
|
wxMacNotificationProcPtr proc[kMaxEvents] ;
|
||||||
|
unsigned long events[kMaxEvents] ;
|
||||||
|
void* data[kMaxEvents] ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
typedef struct wxMacNotificationEvents wxMacNotificationEvents ;
|
||||||
|
static wxMacNotificationEvents gMacNotificationEvents ;
|
||||||
|
|
||||||
|
static ProcessSerialNumber gAppProcess ;
|
||||||
|
|
||||||
|
void wxMacWakeUp()
|
||||||
|
{
|
||||||
|
ProcessSerialNumber psn ;
|
||||||
|
Boolean isSame ;
|
||||||
|
psn.highLongOfPSN = 0 ;
|
||||||
|
psn.lowLongOfPSN = kCurrentProcess ;
|
||||||
|
SameProcess( &gAppProcess , &psn , &isSame ) ;
|
||||||
|
if ( isSame )
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
EventRef dummyEvent ;
|
||||||
|
OSStatus err = MacCreateEvent(nil, 'WXMC', 'WXMC', GetCurrentEventTime(),
|
||||||
|
kEventAttributeNone, &dummyEvent);
|
||||||
|
if (err == noErr)
|
||||||
|
{
|
||||||
|
err = PostEventToQueue(GetMainEventQueue(), dummyEvent,
|
||||||
|
kEventPriorityHigh);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
PostEvent( nullEvent , 0 ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WakeUpProcess( &gAppProcess ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCreateNotifierTable()
|
||||||
|
{
|
||||||
|
GetCurrentProcess(&gAppProcess);
|
||||||
|
gMacNotificationEvents.top = 0 ;
|
||||||
|
gMacNotificationEvents.bottom = 0 ;
|
||||||
|
for ( int i = 0 ; i < kMaxEvents ; ++i )
|
||||||
|
{
|
||||||
|
gMacNotificationEvents.proc[i] = NULL ;
|
||||||
|
gMacNotificationEvents.events[i] = NULL ;
|
||||||
|
gMacNotificationEvents.data[i] = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacDestroyNotifierTable()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacNotifierTableRef wxMacGetNotifierTable()
|
||||||
|
{
|
||||||
|
return (wxMacNotifierTableRef) &gMacNotificationEvents ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacAddEvent(
|
||||||
|
wxMacNotifierTableRef table ,
|
||||||
|
wxMacNotificationProcPtr handler ,
|
||||||
|
unsigned long event ,
|
||||||
|
void* data ,
|
||||||
|
short wakeUp )
|
||||||
|
{
|
||||||
|
wxMacNotificationEvents *e = (wxMacNotificationEvents *) table ;
|
||||||
|
wxASSERT_MSG( handler != NULL , wxT("illegal notification proc ptr") ) ;
|
||||||
|
/* this should be protected eventually */
|
||||||
|
short index = e->top++ ;
|
||||||
|
|
||||||
|
if ( e->top == kMaxEvents )
|
||||||
|
e->top = 0 ;
|
||||||
|
|
||||||
|
e->proc[index] = handler ;
|
||||||
|
e->events[index] = event ;
|
||||||
|
e->data[index] = data ;
|
||||||
|
if ( wakeUp )
|
||||||
|
wxMacWakeUp() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gInProcessing = false ;
|
||||||
|
|
||||||
|
void wxMacRemoveAllNotifiersForData( wxMacNotifierTableRef table , void* data )
|
||||||
|
{
|
||||||
|
wxMacNotificationEvents *e = (wxMacNotificationEvents *) table ;
|
||||||
|
/* this should be protected eventually */
|
||||||
|
short index = e->bottom ;
|
||||||
|
|
||||||
|
while ( e->top != index )
|
||||||
|
{
|
||||||
|
if ( e->data[index] == data )
|
||||||
|
e->data[index] = NULL ;
|
||||||
|
index++ ;
|
||||||
|
if ( index == kMaxEvents )
|
||||||
|
index = 0 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacProcessNotifierEvents()
|
||||||
|
{
|
||||||
|
// if ( gInProcessing )
|
||||||
|
// return ;
|
||||||
|
|
||||||
|
gInProcessing = true ;
|
||||||
|
if ( gMacNotificationEvents.top != gMacNotificationEvents.bottom )
|
||||||
|
{
|
||||||
|
// we only should process the notifiers that were here when we entered it
|
||||||
|
// otherwise we might never get out...
|
||||||
|
short count = gMacNotificationEvents.top - gMacNotificationEvents.bottom ;
|
||||||
|
if ( count < 0 )
|
||||||
|
count += kMaxEvents ;
|
||||||
|
|
||||||
|
while ( count-- )
|
||||||
|
{
|
||||||
|
// consume event at bottom
|
||||||
|
short index = gMacNotificationEvents.bottom++ ;
|
||||||
|
if ( gMacNotificationEvents.bottom == kMaxEvents )
|
||||||
|
gMacNotificationEvents.bottom = 0 ;
|
||||||
|
void* data = gMacNotificationEvents.data[index] ;
|
||||||
|
unsigned long event = gMacNotificationEvents.events[index] ;
|
||||||
|
wxMacNotificationProcPtr handler = gMacNotificationEvents.proc[index] ;
|
||||||
|
|
||||||
|
gMacNotificationEvents.data[index] = NULL ;
|
||||||
|
gMacNotificationEvents.events[index] = NULL ;
|
||||||
|
gMacNotificationEvents.proc[index] = NULL ;
|
||||||
|
|
||||||
|
if ( handler )
|
||||||
|
handler( event , data ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gInProcessing = false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacProcessNotifierAndPendingEvents()
|
||||||
|
{
|
||||||
|
wxMacProcessNotifierEvents() ;
|
||||||
|
wxTheApp->ProcessPendingEvents() ;
|
||||||
|
}
|
||||||
12
src/mac/classic/main.cpp
Normal file
12
src/mac/classic/main.cpp
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: main.cpp
|
||||||
|
// Purpose: Entry point
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// We don't put main() in the library any more. GD.
|
||||||
395
src/mac/classic/mdi.cpp
Normal file
395
src/mac/classic/mdi.cpp
Normal file
@@ -0,0 +1,395 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mdi.cpp
|
||||||
|
// Purpose: MDI classes
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "mdi.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mdi.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
extern wxWindowList wxModelessWindows;
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame)
|
||||||
|
EVT_ACTIVATE(wxMDIParentFrame::OnActivate)
|
||||||
|
EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxMDIClientWindow, wxWindow)
|
||||||
|
EVT_SCROLL(wxMDIClientWindow::OnScroll)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const int IDM_WINDOWTILE = 4001;
|
||||||
|
static const int IDM_WINDOWTILEHOR = 4001;
|
||||||
|
static const int IDM_WINDOWCASCADE = 4002;
|
||||||
|
static const int IDM_WINDOWICONS = 4003;
|
||||||
|
static const int IDM_WINDOWNEXT = 4004;
|
||||||
|
static const int IDM_WINDOWTILEVERT = 4005;
|
||||||
|
static const int IDM_WINDOWPREV = 4006;
|
||||||
|
|
||||||
|
// This range gives a maximum of 500 MDI children. Should be enough :-)
|
||||||
|
static const int wxFIRST_MDI_CHILD = 4100;
|
||||||
|
static const int wxLAST_MDI_CHILD = 4600;
|
||||||
|
|
||||||
|
// Status border dimensions
|
||||||
|
static const int wxTHICK_LINE_BORDER = 3;
|
||||||
|
|
||||||
|
// Parent frame
|
||||||
|
|
||||||
|
wxMDIParentFrame::wxMDIParentFrame()
|
||||||
|
{
|
||||||
|
m_clientWindow = NULL;
|
||||||
|
m_currentChild = NULL;
|
||||||
|
m_windowMenu = (wxMenu*) NULL;
|
||||||
|
m_parentFrameActive = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMDIParentFrame::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& title,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
m_clientWindow = NULL;
|
||||||
|
m_currentChild = NULL;
|
||||||
|
|
||||||
|
// this style can be used to prevent a window from having the standard MDI
|
||||||
|
// "Window" menu
|
||||||
|
if ( style & wxFRAME_NO_WINDOW_MENU )
|
||||||
|
{
|
||||||
|
m_windowMenu = (wxMenu *)NULL;
|
||||||
|
style -= wxFRAME_NO_WINDOW_MENU ;
|
||||||
|
}
|
||||||
|
else // normal case: we have the window menu, so construct it
|
||||||
|
{
|
||||||
|
m_windowMenu = new wxMenu;
|
||||||
|
|
||||||
|
m_windowMenu->Append(IDM_WINDOWCASCADE, wxT("&Cascade"));
|
||||||
|
m_windowMenu->Append(IDM_WINDOWTILEHOR, wxT("Tile &Horizontally"));
|
||||||
|
m_windowMenu->Append(IDM_WINDOWTILEVERT, wxT("Tile &Vertically"));
|
||||||
|
m_windowMenu->AppendSeparator();
|
||||||
|
m_windowMenu->Append(IDM_WINDOWICONS, wxT("&Arrange Icons"));
|
||||||
|
m_windowMenu->Append(IDM_WINDOWNEXT, wxT("&Next"));
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFrame::Create( parent , id , title , pos , size , style , name ) ;
|
||||||
|
m_parentFrameActive = TRUE;
|
||||||
|
|
||||||
|
OnCreateClient();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMDIParentFrame::~wxMDIParentFrame()
|
||||||
|
{
|
||||||
|
DestroyChildren();
|
||||||
|
// already delete by DestroyChildren()
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
m_frameToolBar = NULL;
|
||||||
|
#endif
|
||||||
|
#if wxUSE_STATUSBAR
|
||||||
|
m_frameStatusBar = NULL;
|
||||||
|
#endif
|
||||||
|
m_clientWindow = NULL ;
|
||||||
|
|
||||||
|
if (m_windowMenu)
|
||||||
|
{
|
||||||
|
delete m_windowMenu;
|
||||||
|
m_windowMenu = (wxMenu*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_clientWindow )
|
||||||
|
{
|
||||||
|
delete m_clientWindow;
|
||||||
|
m_clientWindow = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar)
|
||||||
|
{
|
||||||
|
wxFrame::SetMenuBar( menu_bar ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::MacActivate(long timestamp, bool activating)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("MDI PARENT=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact"));
|
||||||
|
if(activating)
|
||||||
|
{
|
||||||
|
if(s_macDeactivateWindow && s_macDeactivateWindow->GetParent()==this)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("child had been scheduled for deactivation, rehighlighting"));
|
||||||
|
UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true);
|
||||||
|
wxLogDebug(wxT("done highliting child"));
|
||||||
|
s_macDeactivateWindow = NULL;
|
||||||
|
}
|
||||||
|
else if(s_macDeactivateWindow == this)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("Avoided deactivation/activation of this=%p"), this);
|
||||||
|
s_macDeactivateWindow = NULL;
|
||||||
|
}
|
||||||
|
else // window to deactivate is NULL or is not us or one of our kids
|
||||||
|
{
|
||||||
|
// activate kid instead
|
||||||
|
if(m_currentChild)
|
||||||
|
m_currentChild->MacActivate(timestamp,activating);
|
||||||
|
else
|
||||||
|
wxFrame::MacActivate(timestamp,activating);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// We were scheduled for deactivation, and now we do it.
|
||||||
|
if(s_macDeactivateWindow==this)
|
||||||
|
{
|
||||||
|
s_macDeactivateWindow = NULL;
|
||||||
|
if(m_currentChild)
|
||||||
|
m_currentChild->MacActivate(timestamp,activating);
|
||||||
|
wxFrame::MacActivate(timestamp,activating);
|
||||||
|
}
|
||||||
|
else // schedule ourselves for deactivation
|
||||||
|
{
|
||||||
|
if(s_macDeactivateWindow)
|
||||||
|
wxLogDebug(wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow);
|
||||||
|
wxLogDebug(wxT("Scheduling delayed MDI Parent deactivation"));
|
||||||
|
s_macDeactivateWindow = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::OnActivate(wxActivateEvent& event)
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the active MDI child window
|
||||||
|
wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const
|
||||||
|
{
|
||||||
|
return m_currentChild ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the client window class (don't Create the window,
|
||||||
|
// just return a new class)
|
||||||
|
wxMDIClientWindow *wxMDIParentFrame::OnCreateClient()
|
||||||
|
{
|
||||||
|
m_clientWindow = new wxMDIClientWindow( this );
|
||||||
|
return m_clientWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Responds to colour changes, and passes event on to children.
|
||||||
|
void wxMDIParentFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
// Propagate the event to the non-top-level children
|
||||||
|
wxFrame::OnSysColourChanged(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MDI operations
|
||||||
|
void wxMDIParentFrame::Cascade()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::Tile()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::ArrangeIcons()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::ActivateNext()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIParentFrame::ActivatePrevious()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Child frame
|
||||||
|
|
||||||
|
wxMDIChildFrame::wxMDIChildFrame()
|
||||||
|
{
|
||||||
|
Init() ;
|
||||||
|
}
|
||||||
|
void wxMDIChildFrame::Init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& title,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
SetName(name);
|
||||||
|
|
||||||
|
if ( id > -1 )
|
||||||
|
m_windowId = id;
|
||||||
|
else
|
||||||
|
m_windowId = (int)NewControlId();
|
||||||
|
|
||||||
|
if (parent) parent->AddChild(this);
|
||||||
|
|
||||||
|
MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
|
||||||
|
|
||||||
|
m_macWindowBackgroundTheme = kThemeBrushDocumentWindowBackground ;
|
||||||
|
SetThemeWindowBackground( (WindowRef) m_macWindow , m_macWindowBackgroundTheme , false ) ;
|
||||||
|
|
||||||
|
wxModelessWindows.Append(this);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMDIChildFrame::~wxMDIChildFrame()
|
||||||
|
{
|
||||||
|
wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame);
|
||||||
|
wxASSERT(mdiparent);
|
||||||
|
if(mdiparent->m_currentChild == this)
|
||||||
|
mdiparent->m_currentChild = NULL;
|
||||||
|
DestroyChildren();
|
||||||
|
// already delete by DestroyChildren()
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
m_frameToolBar = NULL;
|
||||||
|
#endif
|
||||||
|
#if wxUSE_STATUSBAR
|
||||||
|
m_frameStatusBar = NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar)
|
||||||
|
{
|
||||||
|
return wxFrame::SetMenuBar( menu_bar ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIChildFrame::MacActivate(long timestamp, bool activating)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("MDI child=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact"));
|
||||||
|
wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame);
|
||||||
|
wxASSERT(mdiparent);
|
||||||
|
if(activating)
|
||||||
|
{
|
||||||
|
if(s_macDeactivateWindow == m_parent)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("parent had been scheduled for deactivation, rehighlighting"));
|
||||||
|
UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true);
|
||||||
|
wxLogDebug(wxT("done highliting parent"));
|
||||||
|
s_macDeactivateWindow = NULL;
|
||||||
|
}
|
||||||
|
else if((mdiparent->m_currentChild==this) || !s_macDeactivateWindow)
|
||||||
|
mdiparent->wxFrame::MacActivate(timestamp,activating);
|
||||||
|
|
||||||
|
if(mdiparent->m_currentChild && mdiparent->m_currentChild!=this)
|
||||||
|
mdiparent->m_currentChild->wxFrame::MacActivate(timestamp,false);
|
||||||
|
mdiparent->m_currentChild = this;
|
||||||
|
|
||||||
|
if(s_macDeactivateWindow==this)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("Avoided deactivation/activation of this=%p"),this);
|
||||||
|
s_macDeactivateWindow=NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
wxFrame::MacActivate(timestamp, activating);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// We were scheduled for deactivation, and now we do it.
|
||||||
|
if(s_macDeactivateWindow==this)
|
||||||
|
{
|
||||||
|
s_macDeactivateWindow = NULL;
|
||||||
|
wxFrame::MacActivate(timestamp,activating);
|
||||||
|
if(mdiparent->m_currentChild==this)
|
||||||
|
mdiparent->wxFrame::MacActivate(timestamp,activating);
|
||||||
|
}
|
||||||
|
else // schedule ourselves for deactivation
|
||||||
|
{
|
||||||
|
if(s_macDeactivateWindow)
|
||||||
|
wxLogDebug(wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow);
|
||||||
|
wxLogDebug(wxT("Scheduling delayed deactivation"));
|
||||||
|
s_macDeactivateWindow = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MDI operations
|
||||||
|
void wxMDIChildFrame::Maximize()
|
||||||
|
{
|
||||||
|
wxFrame::Maximize() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIChildFrame::Restore()
|
||||||
|
{
|
||||||
|
wxFrame::Restore() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMDIChildFrame::Activate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxMDIClientWindow
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxMDIClientWindow::wxMDIClientWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMDIClientWindow::~wxMDIClientWindow()
|
||||||
|
{
|
||||||
|
DestroyChildren();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_windowId = (int)NewControlId();
|
||||||
|
|
||||||
|
if ( parent )
|
||||||
|
{
|
||||||
|
parent->AddChild(this);
|
||||||
|
}
|
||||||
|
m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
|
||||||
|
|
||||||
|
wxModelessWindows.Append(this);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get size *available for subwindows* i.e. excluding menu bar.
|
||||||
|
void wxMDIClientWindow::DoGetClientSize(int *x, int *y) const
|
||||||
|
{
|
||||||
|
wxDisplaySize( x , y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly call default scroll behaviour
|
||||||
|
void wxMDIClientWindow::OnScroll(wxScrollEvent& event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
881
src/mac/classic/menu.cpp
Normal file
881
src/mac/classic/menu.cpp
Normal file
@@ -0,0 +1,881 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: menu.cpp
|
||||||
|
// Purpose: wxMenu, wxMenuBar, wxMenuItem
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "menu.h"
|
||||||
|
#pragma implementation "menuitem.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// headers & declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// wxWindows headers
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/menuitem.h"
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// other standard headers
|
||||||
|
// ----------------------
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// the (popup) menu title has this special id
|
||||||
|
static const int idMenuTitle = -2;
|
||||||
|
static MenuItemIndex firstUserHelpMenuItem = 0 ;
|
||||||
|
|
||||||
|
const short kwxMacMenuBarResource = 1 ;
|
||||||
|
const short kwxMacAppleMenuId = 1 ;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
static void wxMenubarUnsetInvokingWindow( wxMenu *menu ) ;
|
||||||
|
static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win );
|
||||||
|
|
||||||
|
// Menus
|
||||||
|
|
||||||
|
// Construct a menu with optional title (then use append)
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
short wxMenu::s_macNextMenuId = 3 ;
|
||||||
|
#else
|
||||||
|
short wxMenu::s_macNextMenuId = 2 ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void wxMenu::Init()
|
||||||
|
{
|
||||||
|
m_doBreak = FALSE;
|
||||||
|
m_startRadioGroup = -1;
|
||||||
|
|
||||||
|
// create the menu
|
||||||
|
m_macMenuId = s_macNextMenuId++;
|
||||||
|
m_hMenu = UMANewMenu(m_macMenuId, m_title, wxFont::GetDefaultEncoding() );
|
||||||
|
|
||||||
|
if ( !m_hMenu )
|
||||||
|
{
|
||||||
|
wxLogLastError(wxT("UMANewMenu failed"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we have a title, insert it in the beginning of the menu
|
||||||
|
if ( !!m_title )
|
||||||
|
{
|
||||||
|
Append(idMenuTitle, m_title) ;
|
||||||
|
AppendSeparator() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenu::~wxMenu()
|
||||||
|
{
|
||||||
|
if (MAC_WXHMENU(m_hMenu))
|
||||||
|
::DisposeMenu(MAC_WXHMENU(m_hMenu));
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenu::Break()
|
||||||
|
{
|
||||||
|
// not available on the mac platform
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenu::Attach(wxMenuBarBase *menubar)
|
||||||
|
{
|
||||||
|
wxMenuBase::Attach(menubar);
|
||||||
|
|
||||||
|
EndRadioGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
// function appends a new item or submenu to the menu
|
||||||
|
// append a new item or submenu to the menu
|
||||||
|
bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( pItem != NULL, wxT("can't append NULL item to the menu") );
|
||||||
|
|
||||||
|
if ( pItem->IsSeparator() )
|
||||||
|
{
|
||||||
|
if ( pos == (size_t)-1 )
|
||||||
|
MacAppendMenu(MAC_WXHMENU(m_hMenu), "\p-");
|
||||||
|
else
|
||||||
|
MacInsertMenuItem(MAC_WXHMENU(m_hMenu), "\p-" , pos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxMenu *pSubMenu = pItem->GetSubMenu() ;
|
||||||
|
if ( pSubMenu != NULL )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( pSubMenu->m_hMenu != NULL , wxT("invalid submenu added"));
|
||||||
|
pSubMenu->m_menuParent = this ;
|
||||||
|
|
||||||
|
if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar)
|
||||||
|
{
|
||||||
|
pSubMenu->MacBeforeDisplay( true ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( pos == (size_t)-1 )
|
||||||
|
UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), wxFont::GetDefaultEncoding() , pSubMenu->m_macMenuId);
|
||||||
|
else
|
||||||
|
UMAInsertSubMenuItem(MAC_WXHMENU(m_hMenu), pItem->GetText(), wxFont::GetDefaultEncoding() , pos, pSubMenu->m_macMenuId);
|
||||||
|
pItem->UpdateItemBitmap() ;
|
||||||
|
pItem->UpdateItemStatus() ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( pos == (size_t)-1 )
|
||||||
|
{
|
||||||
|
UMAAppendMenuItem(MAC_WXHMENU(m_hMenu), wxT("a") , wxFont::GetDefaultEncoding() );
|
||||||
|
pos = CountMenuItems(MAC_WXHMENU(m_hMenu)) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// MacOS counts menu items from 1 and inserts after, therefore having the
|
||||||
|
// same effect as wx 0 based and inserting before, we must correct pos
|
||||||
|
// after however for updates to be correct
|
||||||
|
UMAInsertMenuItem(MAC_WXHMENU(m_hMenu), wxT("a"), wxFont::GetDefaultEncoding(), pos);
|
||||||
|
pos += 1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMenuItemCommandID( MAC_WXHMENU(m_hMenu) , pos , pItem->GetId() ) ;
|
||||||
|
pItem->UpdateItemText() ;
|
||||||
|
pItem->UpdateItemBitmap() ;
|
||||||
|
pItem->UpdateItemStatus() ;
|
||||||
|
|
||||||
|
if ( pItem->GetId() == idMenuTitle )
|
||||||
|
{
|
||||||
|
UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , pos , false ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if we're already attached to the menubar, we must update it
|
||||||
|
if ( IsAttached() )
|
||||||
|
{
|
||||||
|
m_menuBar->Refresh();
|
||||||
|
}
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenu::EndRadioGroup()
|
||||||
|
{
|
||||||
|
// we're not inside a radio group any longer
|
||||||
|
m_startRadioGroup = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem* wxMenu::DoAppend(wxMenuItem *item)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( item, NULL, _T("NULL item in wxMenu::DoAppend") );
|
||||||
|
|
||||||
|
bool check = FALSE;
|
||||||
|
|
||||||
|
if ( item->GetKind() == wxITEM_RADIO )
|
||||||
|
{
|
||||||
|
int count = GetMenuItemCount();
|
||||||
|
|
||||||
|
if ( m_startRadioGroup == -1 )
|
||||||
|
{
|
||||||
|
// start a new radio group
|
||||||
|
m_startRadioGroup = count;
|
||||||
|
|
||||||
|
// for now it has just one element
|
||||||
|
item->SetAsRadioGroupStart();
|
||||||
|
item->SetRadioGroupEnd(m_startRadioGroup);
|
||||||
|
|
||||||
|
// ensure that we have a checked item in the radio group
|
||||||
|
check = TRUE;
|
||||||
|
}
|
||||||
|
else // extend the current radio group
|
||||||
|
{
|
||||||
|
// we need to update its end item
|
||||||
|
item->SetRadioGroupStart(m_startRadioGroup);
|
||||||
|
wxMenuItemList::Node *node = GetMenuItems().Item(m_startRadioGroup);
|
||||||
|
|
||||||
|
if ( node )
|
||||||
|
{
|
||||||
|
node->GetData()->SetRadioGroupEnd(count);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("where is the radio group start item?") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // not a radio item
|
||||||
|
{
|
||||||
|
EndRadioGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !wxMenuBase::DoAppend(item) || !DoInsertOrAppend(item) )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( check )
|
||||||
|
{
|
||||||
|
// check the item initially
|
||||||
|
item->Check(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item)
|
||||||
|
{
|
||||||
|
if (wxMenuBase::DoInsert(pos, item) && DoInsertOrAppend(item, pos))
|
||||||
|
return item;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
|
||||||
|
{
|
||||||
|
// we need to find the items position in the child list
|
||||||
|
size_t pos;
|
||||||
|
wxMenuItemList::Node *node = GetMenuItems().GetFirst();
|
||||||
|
for ( pos = 0; node; pos++ )
|
||||||
|
{
|
||||||
|
if ( node->GetData() == item )
|
||||||
|
break;
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
// DoRemove() (unlike Remove) can only be called for existing item!
|
||||||
|
wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") );
|
||||||
|
|
||||||
|
::DeleteMenuItem(MAC_WXHMENU(m_hMenu) , pos + 1);
|
||||||
|
|
||||||
|
if ( IsAttached() )
|
||||||
|
{
|
||||||
|
// otherwise, the change won't be visible
|
||||||
|
m_menuBar->Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
// and from internal data structures
|
||||||
|
return wxMenuBase::DoRemove(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenu::SetTitle(const wxString& label)
|
||||||
|
{
|
||||||
|
m_title = label ;
|
||||||
|
UMASetMenuTitle(MAC_WXHMENU(m_hMenu) , label , wxFont::GetDefaultEncoding() ) ;
|
||||||
|
}
|
||||||
|
bool wxMenu::ProcessCommand(wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
bool processed = FALSE;
|
||||||
|
|
||||||
|
// Try the menu's event handler
|
||||||
|
if ( !processed && GetEventHandler())
|
||||||
|
{
|
||||||
|
processed = GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try the window the menu was popped up from (and up through the
|
||||||
|
// hierarchy)
|
||||||
|
wxWindow *win = GetInvokingWindow();
|
||||||
|
if ( !processed && win )
|
||||||
|
processed = win->GetEventHandler()->ProcessEvent(event);
|
||||||
|
|
||||||
|
return processed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// other
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxWindow *wxMenu::GetWindow() const
|
||||||
|
{
|
||||||
|
if ( m_invokingWindow != NULL )
|
||||||
|
return m_invokingWindow;
|
||||||
|
else if ( m_menuBar != NULL)
|
||||||
|
return (wxWindow *) m_menuBar->GetFrame();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper functions returning the mac menu position for a certain item, note that this is
|
||||||
|
// mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
|
||||||
|
|
||||||
|
int wxMenu::MacGetIndexFromId( int id )
|
||||||
|
{
|
||||||
|
size_t pos;
|
||||||
|
wxMenuItemList::Node *node = GetMenuItems().GetFirst();
|
||||||
|
for ( pos = 0; node; pos++ )
|
||||||
|
{
|
||||||
|
if ( node->GetData()->GetId() == id )
|
||||||
|
break;
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return pos + 1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem )
|
||||||
|
{
|
||||||
|
size_t pos;
|
||||||
|
wxMenuItemList::Node *node = GetMenuItems().GetFirst();
|
||||||
|
for ( pos = 0; node; pos++ )
|
||||||
|
{
|
||||||
|
if ( node->GetData() == pItem )
|
||||||
|
break;
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return pos + 1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenu::MacEnableMenu( bool bDoEnable )
|
||||||
|
{
|
||||||
|
UMAEnableMenuItem(MAC_WXHMENU(m_hMenu) , 0 , bDoEnable ) ;
|
||||||
|
|
||||||
|
::DrawMenuBar() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MacOS needs to know about submenus somewhere within this menu
|
||||||
|
// before it can be displayed , also hide special menu items like preferences
|
||||||
|
// that are handled by the OS
|
||||||
|
void wxMenu::MacBeforeDisplay( bool isSubMenu )
|
||||||
|
{
|
||||||
|
wxMenuItem* previousItem = NULL ;
|
||||||
|
size_t pos ;
|
||||||
|
wxMenuItemList::Node *node;
|
||||||
|
wxMenuItem *item;
|
||||||
|
for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
|
||||||
|
{
|
||||||
|
item = (wxMenuItem *)node->GetData();
|
||||||
|
wxMenu* subMenu = item->GetSubMenu() ;
|
||||||
|
if (subMenu)
|
||||||
|
{
|
||||||
|
subMenu->MacBeforeDisplay( true ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 )
|
||||||
|
{
|
||||||
|
if ( item->GetId() == wxApp::s_macPreferencesMenuItemId || item->GetId() == wxApp::s_macExitMenuItemId)
|
||||||
|
{
|
||||||
|
ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos + 1, kMenuItemAttrHidden, 0 );
|
||||||
|
if ( GetMenuItems().GetCount() == pos + 1 &&
|
||||||
|
previousItem != NULL &&
|
||||||
|
previousItem->IsSeparator() )
|
||||||
|
{
|
||||||
|
ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos , kMenuItemAttrHidden, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
previousItem = item ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isSubMenu )
|
||||||
|
::InsertMenu(MAC_WXHMENU( GetHMenu()), -1);
|
||||||
|
|
||||||
|
}
|
||||||
|
// undo all changes from the MacBeforeDisplay call
|
||||||
|
void wxMenu::MacAfterDisplay( bool isSubMenu )
|
||||||
|
{
|
||||||
|
if ( isSubMenu )
|
||||||
|
::DeleteMenu(MacGetMenuId());
|
||||||
|
|
||||||
|
wxMenuItem* previousItem = NULL ;
|
||||||
|
int pos ;
|
||||||
|
wxMenuItemList::Node *node;
|
||||||
|
wxMenuItem *item;
|
||||||
|
for (pos = 0, node = GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
|
||||||
|
{
|
||||||
|
item = (wxMenuItem *)node->GetData();
|
||||||
|
wxMenu* subMenu = item->GetSubMenu() ;
|
||||||
|
if (subMenu)
|
||||||
|
{
|
||||||
|
subMenu->MacAfterDisplay( true ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no need to undo hidings
|
||||||
|
}
|
||||||
|
previousItem = item ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Menu Bar
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Mac Implementation note :
|
||||||
|
|
||||||
|
The Mac has only one global menubar, so we attempt to install the currently
|
||||||
|
active menubar from a frame, we currently don't take into account mdi-frames
|
||||||
|
which would ask for menu-merging
|
||||||
|
|
||||||
|
Secondly there is no mac api for changing a menubar that is not the current
|
||||||
|
menubar, so we have to wait for preparing the actual menubar until the
|
||||||
|
wxMenubar is to be used
|
||||||
|
|
||||||
|
We can in subsequent versions use MacInstallMenuBar to provide some sort of
|
||||||
|
auto-merge for MDI in case this will be necessary
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxMenuBar* wxMenuBar::s_macInstalledMenuBar = NULL ;
|
||||||
|
wxMenuBar* wxMenuBar::s_macCommonMenuBar = NULL ;
|
||||||
|
|
||||||
|
void wxMenuBar::Init()
|
||||||
|
{
|
||||||
|
m_eventHandler = this;
|
||||||
|
m_menuBarFrame = NULL;
|
||||||
|
m_invokingWindow = (wxWindow*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuBar::wxMenuBar()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuBar::wxMenuBar( long WXUNUSED(style) )
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[])
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
|
||||||
|
m_titles.Alloc(count);
|
||||||
|
|
||||||
|
for ( int i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
m_menus.Append(menus[i]);
|
||||||
|
m_titles.Add(titles[i]);
|
||||||
|
|
||||||
|
menus[i]->Attach(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuBar::~wxMenuBar()
|
||||||
|
{
|
||||||
|
if (s_macCommonMenuBar == this)
|
||||||
|
s_macCommonMenuBar = NULL;
|
||||||
|
if (s_macInstalledMenuBar == this)
|
||||||
|
{
|
||||||
|
::ClearMenuBar();
|
||||||
|
s_macInstalledMenuBar = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(rect))
|
||||||
|
{
|
||||||
|
wxCHECK_RET( IsAttached(), wxT("can't refresh unatteched menubar") );
|
||||||
|
|
||||||
|
DrawMenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::MacInstallMenuBar()
|
||||||
|
{
|
||||||
|
if ( s_macInstalledMenuBar == this )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxStAppResource resload ;
|
||||||
|
|
||||||
|
Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ;
|
||||||
|
wxString message ;
|
||||||
|
wxCHECK_RET( menubar != NULL, wxT("can't read MBAR resource") );
|
||||||
|
::SetMenuBar( menubar ) ;
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
::DisposeMenuBar( menubar ) ;
|
||||||
|
#else
|
||||||
|
::DisposeHandle( menubar ) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TARGET_API_MAC_OS8
|
||||||
|
MenuHandle menu = ::GetMenuHandle( kwxMacAppleMenuId ) ;
|
||||||
|
if ( CountMenuItems( menu ) == 2 )
|
||||||
|
{
|
||||||
|
::AppendResMenu(menu, 'DRVR');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// clean-up the help menu before adding new items
|
||||||
|
MenuHandle mh = NULL ;
|
||||||
|
if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr )
|
||||||
|
{
|
||||||
|
for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i )
|
||||||
|
{
|
||||||
|
DeleteMenuItem( mh , i ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mh = NULL ;
|
||||||
|
}
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 && wxApp::s_macPreferencesMenuItemId)
|
||||||
|
{
|
||||||
|
wxMenuItem *item = FindItem( wxApp::s_macPreferencesMenuItemId , NULL ) ;
|
||||||
|
if ( item == NULL || !(item->IsEnabled()) )
|
||||||
|
DisableMenuCommand( NULL , kHICommandPreferences ) ;
|
||||||
|
else
|
||||||
|
EnableMenuCommand( NULL , kHICommandPreferences ) ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (size_t i = 0; i < m_menus.GetCount(); i++)
|
||||||
|
{
|
||||||
|
wxMenuItemList::Node *node;
|
||||||
|
wxMenuItem *item;
|
||||||
|
int pos ;
|
||||||
|
wxMenu* menu = m_menus[i] , *subMenu = NULL ;
|
||||||
|
|
||||||
|
if( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?") || m_titles[i] == wxApp::s_macHelpMenuTitleName )
|
||||||
|
{
|
||||||
|
if ( mh == NULL )
|
||||||
|
{
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pos = 0 , node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext(), pos++)
|
||||||
|
{
|
||||||
|
item = (wxMenuItem *)node->GetData();
|
||||||
|
subMenu = item->GetSubMenu() ;
|
||||||
|
if (subMenu)
|
||||||
|
{
|
||||||
|
// we don't support hierarchical menus in the help menu yet
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( item->IsSeparator() )
|
||||||
|
{
|
||||||
|
if ( mh )
|
||||||
|
MacAppendMenu(mh, "\p-" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxAcceleratorEntry* entry = wxGetAccelFromString( item->GetText() ) ;
|
||||||
|
|
||||||
|
if ( item->GetId() == wxApp::s_macAboutMenuItemId )
|
||||||
|
{
|
||||||
|
UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetText() , wxFont::GetDefaultEncoding() );
|
||||||
|
UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 , true );
|
||||||
|
SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId ) , 1 , item->GetId() ) ;
|
||||||
|
UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId ) , 1 , entry ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( mh )
|
||||||
|
{
|
||||||
|
UMAAppendMenuItem(mh, item->GetText() , wxFont::GetDefaultEncoding(), entry);
|
||||||
|
SetMenuItemCommandID( mh , CountMenuItems(mh) , item->GetId() ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete entry ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , m_titles[i], m_font.GetEncoding() ) ;
|
||||||
|
m_menus[i]->MacBeforeDisplay(false) ;
|
||||||
|
::InsertMenu(MAC_WXHMENU(m_menus[i]->GetHMenu()), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::DrawMenuBar() ;
|
||||||
|
s_macInstalledMenuBar = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::EnableTop(size_t pos, bool enable)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
|
||||||
|
m_menus[pos]->MacEnableMenu( enable ) ;
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") );
|
||||||
|
|
||||||
|
m_titles[pos] = label;
|
||||||
|
|
||||||
|
if ( !IsAttached() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_menus[pos]->SetTitle( label ) ;
|
||||||
|
if (wxMenuBar::s_macInstalledMenuBar == this) // are we currently installed ?
|
||||||
|
{
|
||||||
|
::SetMenuBar( GetMenuBar() ) ;
|
||||||
|
::InvalMenuBar() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxMenuBar::GetLabelTop(size_t pos) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( pos < GetMenuCount(), wxEmptyString,
|
||||||
|
wxT("invalid menu index in wxMenuBar::GetLabelTop") );
|
||||||
|
|
||||||
|
return m_titles[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMenuBar::FindMenu(const wxString& title)
|
||||||
|
{
|
||||||
|
wxString menuTitle = wxStripMenuCodes(title);
|
||||||
|
|
||||||
|
size_t count = GetMenuCount();
|
||||||
|
for ( size_t i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
wxString title = wxStripMenuCodes(m_titles[i]);
|
||||||
|
if ( menuTitle == title )
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxNOT_FOUND;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// wxMenuBar construction
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// wxMenuBar construction
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
|
||||||
|
{
|
||||||
|
wxMenu *menuOld = wxMenuBarBase::Replace(pos, menu, title);
|
||||||
|
if ( !menuOld )
|
||||||
|
return FALSE;
|
||||||
|
m_titles[pos] = title;
|
||||||
|
|
||||||
|
if ( IsAttached() )
|
||||||
|
{
|
||||||
|
if (s_macInstalledMenuBar == this)
|
||||||
|
{
|
||||||
|
menuOld->MacAfterDisplay( false ) ;
|
||||||
|
::DeleteMenu( menuOld->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
|
||||||
|
{
|
||||||
|
menu->MacBeforeDisplay( false ) ;
|
||||||
|
UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title , m_font.GetEncoding() ) ;
|
||||||
|
if ( pos == m_menus.GetCount() - 1)
|
||||||
|
{
|
||||||
|
::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
return menuOld;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
|
||||||
|
{
|
||||||
|
if ( !wxMenuBarBase::Insert(pos, menu, title) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
m_titles.Insert(title, pos);
|
||||||
|
|
||||||
|
UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title , m_font.GetEncoding() ) ;
|
||||||
|
|
||||||
|
if ( IsAttached() && s_macInstalledMenuBar == this )
|
||||||
|
{
|
||||||
|
if (s_macInstalledMenuBar == this)
|
||||||
|
{
|
||||||
|
menu->MacBeforeDisplay( false ) ;
|
||||||
|
if ( pos == (size_t) -1 || pos + 1 == m_menus.GetCount() )
|
||||||
|
{
|
||||||
|
::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , m_menus[pos+1]->MacGetMenuId() ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenu *wxMenuBar::Remove(size_t pos)
|
||||||
|
{
|
||||||
|
wxMenu *menu = wxMenuBarBase::Remove(pos);
|
||||||
|
if ( !menu )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ( IsAttached() )
|
||||||
|
{
|
||||||
|
if (s_macInstalledMenuBar == this)
|
||||||
|
{
|
||||||
|
::DeleteMenu( menu->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_titles.RemoveAt(pos);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMenuBar::Append(wxMenu *menu, const wxString& title)
|
||||||
|
{
|
||||||
|
WXHMENU submenu = menu ? menu->GetHMenu() : 0;
|
||||||
|
wxCHECK_MSG( submenu, FALSE, wxT("can't append invalid menu to menubar") );
|
||||||
|
|
||||||
|
if ( !wxMenuBarBase::Append(menu, title) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
m_titles.Add(title);
|
||||||
|
|
||||||
|
UMASetMenuTitle( MAC_WXHMENU(menu->GetHMenu()) , title , m_font.GetEncoding() ) ;
|
||||||
|
|
||||||
|
if ( IsAttached() )
|
||||||
|
{
|
||||||
|
if (s_macInstalledMenuBar == this)
|
||||||
|
{
|
||||||
|
::InsertMenu( MAC_WXHMENU(menu->GetHMenu()) , 0 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
// m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables
|
||||||
|
// adding menu later on.
|
||||||
|
if (m_invokingWindow)
|
||||||
|
wxMenubarSetInvokingWindow( menu, m_invokingWindow );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wxMenubarUnsetInvokingWindow( wxMenu *menu )
|
||||||
|
{
|
||||||
|
menu->SetInvokingWindow( (wxWindow*) NULL );
|
||||||
|
|
||||||
|
wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxMenuItem *menuitem = node->GetData();
|
||||||
|
if (menuitem->IsSubMenu())
|
||||||
|
wxMenubarUnsetInvokingWindow( menuitem->GetSubMenu() );
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win )
|
||||||
|
{
|
||||||
|
menu->SetInvokingWindow( win );
|
||||||
|
|
||||||
|
wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxMenuItem *menuitem = node->GetData();
|
||||||
|
if (menuitem->IsSubMenu())
|
||||||
|
wxMenubarSetInvokingWindow( menuitem->GetSubMenu() , win );
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::UnsetInvokingWindow()
|
||||||
|
{
|
||||||
|
m_invokingWindow = (wxWindow*) NULL;
|
||||||
|
wxMenuList::Node *node = m_menus.GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxMenu *menu = node->GetData();
|
||||||
|
wxMenubarUnsetInvokingWindow( menu );
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::SetInvokingWindow(wxFrame *frame)
|
||||||
|
{
|
||||||
|
m_invokingWindow = frame;
|
||||||
|
wxMenuList::Node *node = m_menus.GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxMenu *menu = node->GetData();
|
||||||
|
wxMenubarSetInvokingWindow( menu, frame );
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::Detach()
|
||||||
|
{
|
||||||
|
wxMenuBarBase::Detach() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuBar::Attach(wxFrame *frame)
|
||||||
|
{
|
||||||
|
wxMenuBarBase::Attach( frame ) ;
|
||||||
|
}
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// wxMenuBar searching for menu items
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Find the itemString in menuString, and return the item id or wxNOT_FOUND
|
||||||
|
int wxMenuBar::FindMenuItem(const wxString& menuString,
|
||||||
|
const wxString& itemString) const
|
||||||
|
{
|
||||||
|
wxString menuLabel = wxStripMenuCodes(menuString);
|
||||||
|
size_t count = GetMenuCount();
|
||||||
|
for ( size_t i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
wxString title = wxStripMenuCodes(m_titles[i]);
|
||||||
|
if ( menuString == title )
|
||||||
|
return m_menus[i]->FindItem(itemString);
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxNOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem *wxMenuBar::FindItem(int id, wxMenu **itemMenu) const
|
||||||
|
{
|
||||||
|
if ( itemMenu )
|
||||||
|
*itemMenu = NULL;
|
||||||
|
|
||||||
|
wxMenuItem *item = NULL;
|
||||||
|
size_t count = GetMenuCount();
|
||||||
|
for ( size_t i = 0; !item && (i < count); i++ )
|
||||||
|
{
|
||||||
|
item = m_menus[i]->FindItem(id, itemMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
283
src/mac/classic/menuitem.cpp
Normal file
283
src/mac/classic/menuitem.cpp
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: menuitem.cpp
|
||||||
|
// Purpose: wxMenuItem implementation
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// headers & declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/menu.h"
|
||||||
|
#include "wx/menuitem.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// dynamic classes implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
|
||||||
|
#endif //USE_SHARED_LIBRARY
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxMenuItem
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//
|
||||||
|
// ctor & dtor
|
||||||
|
// -----------
|
||||||
|
|
||||||
|
wxMenuItem::wxMenuItem(wxMenu *pParentMenu,
|
||||||
|
int id,
|
||||||
|
const wxString& text,
|
||||||
|
const wxString& strHelp,
|
||||||
|
wxItemKind kind,
|
||||||
|
wxMenu *pSubMenu)
|
||||||
|
: wxMenuItemBase(pParentMenu, id, text, strHelp, kind, pSubMenu)
|
||||||
|
{
|
||||||
|
// TO DISCUSS on dev : whether we can veto id 0
|
||||||
|
// wxASSERT_MSG( id != 0 || pSubMenu != NULL , wxT("A MenuItem ID of Zero does not work under Mac") ) ;
|
||||||
|
|
||||||
|
// In other languages there is no difference in naming the Exit/Quit menu item between MacOS and Windows guidelines
|
||||||
|
// therefore these item must not be translated
|
||||||
|
if ( wxStripMenuCodes(m_text).Upper() == wxT("EXIT") )
|
||||||
|
{
|
||||||
|
m_text =wxT("Quit\tCtrl+Q") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_radioGroup.start = -1;
|
||||||
|
m_isRadioGroupStart = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem::~wxMenuItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// change item state
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
void wxMenuItem::SetBitmap(const wxBitmap& bitmap)
|
||||||
|
{
|
||||||
|
m_bitmap = bitmap;
|
||||||
|
UpdateItemBitmap() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::UpdateItemBitmap()
|
||||||
|
{
|
||||||
|
if ( !m_parentMenu )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
MenuHandle mhandle = MAC_WXHMENU(m_parentMenu->GetHMenu()) ;
|
||||||
|
MenuItemIndex index = m_parentMenu->MacGetIndexFromItem( this ) ;
|
||||||
|
if( mhandle == NULL || index == 0)
|
||||||
|
return ;
|
||||||
|
|
||||||
|
if ( m_bitmap.Ok() )
|
||||||
|
{
|
||||||
|
ControlButtonContentInfo info ;
|
||||||
|
wxMacCreateBitmapButton( &info , m_bitmap , kControlContentCIconHandle ) ;
|
||||||
|
if ( info.contentType != kControlNoContent )
|
||||||
|
{
|
||||||
|
if ( info.contentType == kControlContentCIconHandle )
|
||||||
|
SetMenuItemIconHandle( mhandle , index ,
|
||||||
|
kMenuColorIconType , (Handle) info.u.cIconHandle ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::UpdateItemStatus()
|
||||||
|
{
|
||||||
|
if ( !m_parentMenu )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 && GetId() == wxApp::s_macPreferencesMenuItemId)
|
||||||
|
{
|
||||||
|
if ( !IsEnabled() )
|
||||||
|
DisableMenuCommand( NULL , kHICommandPreferences ) ;
|
||||||
|
else
|
||||||
|
EnableMenuCommand( NULL , kHICommandPreferences ) ;
|
||||||
|
}
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 && GetId() == wxApp::s_macExitMenuItemId)
|
||||||
|
{
|
||||||
|
if ( !IsEnabled() )
|
||||||
|
DisableMenuCommand( NULL , kHICommandQuit ) ;
|
||||||
|
else
|
||||||
|
EnableMenuCommand( NULL , kHICommandQuit ) ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
MenuHandle mhandle = MAC_WXHMENU(m_parentMenu->GetHMenu()) ;
|
||||||
|
MenuItemIndex index = m_parentMenu->MacGetIndexFromItem( this ) ;
|
||||||
|
if( mhandle == NULL || index == 0)
|
||||||
|
return ;
|
||||||
|
|
||||||
|
UMAEnableMenuItem( mhandle , index , m_isEnabled ) ;
|
||||||
|
if ( IsCheckable() && IsChecked() )
|
||||||
|
::SetItemMark( mhandle , index , 0x12 ) ; // checkmark
|
||||||
|
else
|
||||||
|
::SetItemMark( mhandle , index , 0 ) ; // no mark
|
||||||
|
|
||||||
|
UMASetMenuItemText( mhandle , index , m_text , wxFont::GetDefaultEncoding() ) ;
|
||||||
|
wxAcceleratorEntry *entry = wxGetAccelFromString( m_text ) ;
|
||||||
|
UMASetMenuItemShortcut( mhandle , index , entry ) ;
|
||||||
|
delete entry ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::UpdateItemText()
|
||||||
|
{
|
||||||
|
if ( !m_parentMenu )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
MenuHandle mhandle = MAC_WXHMENU(m_parentMenu->GetHMenu()) ;
|
||||||
|
MenuItemIndex index = m_parentMenu->MacGetIndexFromItem( this ) ;
|
||||||
|
if( mhandle == NULL || index == 0)
|
||||||
|
return ;
|
||||||
|
|
||||||
|
UMASetMenuItemText( mhandle , index , m_text , wxFont::GetDefaultEncoding() ) ;
|
||||||
|
wxAcceleratorEntry *entry = wxGetAccelFromString( m_text ) ;
|
||||||
|
UMASetMenuItemShortcut( mhandle , index , entry ) ;
|
||||||
|
delete entry ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxMenuItem::Enable(bool bDoEnable)
|
||||||
|
{
|
||||||
|
if ( m_isEnabled != bDoEnable )
|
||||||
|
{
|
||||||
|
wxMenuItemBase::Enable( bDoEnable ) ;
|
||||||
|
UpdateItemStatus() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void wxMenuItem::UncheckRadio()
|
||||||
|
{
|
||||||
|
if ( m_isChecked )
|
||||||
|
{
|
||||||
|
wxMenuItemBase::Check( false ) ;
|
||||||
|
UpdateItemStatus() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::Check(bool bDoCheck)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") );
|
||||||
|
|
||||||
|
if ( m_isChecked != bDoCheck )
|
||||||
|
{
|
||||||
|
if ( GetKind() == wxITEM_RADIO )
|
||||||
|
{
|
||||||
|
if ( bDoCheck )
|
||||||
|
{
|
||||||
|
wxMenuItemBase::Check( bDoCheck ) ;
|
||||||
|
UpdateItemStatus() ;
|
||||||
|
|
||||||
|
// get the index of this item in the menu
|
||||||
|
const wxMenuItemList& items = m_parentMenu->GetMenuItems();
|
||||||
|
int pos = items.IndexOf(this);
|
||||||
|
wxCHECK_RET( pos != wxNOT_FOUND,
|
||||||
|
_T("menuitem not found in the menu items list?") );
|
||||||
|
|
||||||
|
// get the radio group range
|
||||||
|
int start,
|
||||||
|
end;
|
||||||
|
|
||||||
|
if ( m_isRadioGroupStart )
|
||||||
|
{
|
||||||
|
// we already have all information we need
|
||||||
|
start = pos;
|
||||||
|
end = m_radioGroup.end;
|
||||||
|
}
|
||||||
|
else // next radio group item
|
||||||
|
{
|
||||||
|
// get the radio group end from the start item
|
||||||
|
start = m_radioGroup.start;
|
||||||
|
end = items.Item(start)->GetData()->m_radioGroup.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// also uncheck all the other items in this radio group
|
||||||
|
wxMenuItemList::Node *node = items.Item(start);
|
||||||
|
for ( int n = start; n <= end && node; n++ )
|
||||||
|
{
|
||||||
|
if ( n != pos )
|
||||||
|
{
|
||||||
|
((wxMenuItem*)node->GetData())->UncheckRadio();
|
||||||
|
}
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxMenuItemBase::Check( bDoCheck ) ;
|
||||||
|
UpdateItemStatus() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::SetText(const wxString& text)
|
||||||
|
{
|
||||||
|
// don't do anything if label didn't change
|
||||||
|
if ( m_text == text )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxMenuItemBase::SetText(text);
|
||||||
|
|
||||||
|
UpdateItemText() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// radio group stuff
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
void wxMenuItem::SetAsRadioGroupStart()
|
||||||
|
{
|
||||||
|
m_isRadioGroupStart = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::SetRadioGroupStart(int start)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( !m_isRadioGroupStart,
|
||||||
|
_T("should only be called for the next radio items") );
|
||||||
|
|
||||||
|
m_radioGroup.start = start;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMenuItem::SetRadioGroupEnd(int end)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( m_isRadioGroupStart,
|
||||||
|
_T("should only be called for the first radio item") );
|
||||||
|
|
||||||
|
m_radioGroup.end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxMenuItemBase
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
|
||||||
|
{
|
||||||
|
return wxStripMenuCodes(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
|
||||||
|
int id,
|
||||||
|
const wxString& name,
|
||||||
|
const wxString& help,
|
||||||
|
wxItemKind kind,
|
||||||
|
wxMenu *subMenu)
|
||||||
|
{
|
||||||
|
return new wxMenuItem(parentMenu, id, name, help, kind, subMenu);
|
||||||
|
}
|
||||||
219
src/mac/classic/metafile.cpp
Normal file
219
src/mac/classic/metafile.cpp
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: metafile.cpp
|
||||||
|
// Purpose: wxMetaFile, wxMetaFileDC etc. These classes are optional.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "metafile.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/setup.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_METAFILE
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/metafile.h"
|
||||||
|
#include "wx/clipbrd.h"
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
extern bool wxClipboardIsOpen;
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject)
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Metafiles
|
||||||
|
* Currently, the only purpose for making a metafile is to put
|
||||||
|
* it on the clipboard.
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxMetafileRefData::wxMetafileRefData(void)
|
||||||
|
{
|
||||||
|
m_metafile = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMetafileRefData::~wxMetafileRefData(void)
|
||||||
|
{
|
||||||
|
if (m_metafile)
|
||||||
|
{
|
||||||
|
KillPicture( (PicHandle) m_metafile ) ;
|
||||||
|
m_metafile = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMetaFile::wxMetaFile(const wxString& file)
|
||||||
|
{
|
||||||
|
m_refData = new wxMetafileRefData;
|
||||||
|
|
||||||
|
|
||||||
|
M_METAFILEDATA->m_metafile = 0;
|
||||||
|
wxASSERT_MSG( file.IsEmpty() , wxT("no file based metafile support yet") ) ;
|
||||||
|
/*
|
||||||
|
if (!file.IsNull() && (file.Cmp("") == 0))
|
||||||
|
M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile(file);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMetaFile::~wxMetaFile()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMetaFile::SetClipboard(int width, int height)
|
||||||
|
{
|
||||||
|
#if wxUSE_DRAG_AND_DROP
|
||||||
|
//TODO finishi this port , we need the data obj first
|
||||||
|
if (!m_refData)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
bool alreadyOpen=wxTheClipboard->IsOpened() ;
|
||||||
|
if (!alreadyOpen)
|
||||||
|
{
|
||||||
|
wxTheClipboard->Open();
|
||||||
|
wxTheClipboard->Clear();
|
||||||
|
}
|
||||||
|
wxDataObject *data =
|
||||||
|
new wxMetafileDataObject( *this) ;
|
||||||
|
bool success = wxTheClipboard->SetData(data);
|
||||||
|
if (!alreadyOpen)
|
||||||
|
wxTheClipboard->Close();
|
||||||
|
return (bool) success;
|
||||||
|
#endif
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMetafile::SetHMETAFILE(WXHMETAFILE mf)
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
m_refData = new wxMetafileRefData;
|
||||||
|
if ( M_METAFILEDATA->m_metafile )
|
||||||
|
KillPicture( (PicHandle) M_METAFILEDATA->m_metafile ) ;
|
||||||
|
|
||||||
|
M_METAFILEDATA->m_metafile = mf;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMetaFile::Play(wxDC *dc)
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!dc->Ok() )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
wxMacPortSetter helper( dc ) ;
|
||||||
|
PicHandle pict = (PicHandle) GetHMETAFILE() ;
|
||||||
|
DrawPicture( pict , &(**pict).picFrame ) ;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxMetaFile::GetSize() const
|
||||||
|
{
|
||||||
|
wxSize size = wxDefaultSize ;
|
||||||
|
if ( Ok() )
|
||||||
|
{
|
||||||
|
PicHandle pict = (PicHandle) GetHMETAFILE() ;
|
||||||
|
Rect &r = (**pict).picFrame ;
|
||||||
|
size.x = r.right - r.left ;
|
||||||
|
size.y = r.bottom - r.top ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Metafile device context
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// New constructor that takes origin and extent. If you use this, don't
|
||||||
|
// give origin/extent arguments to wxMakeMetaFilePlaceable.
|
||||||
|
|
||||||
|
wxMetaFileDC::wxMetaFileDC(const wxString& filename ,
|
||||||
|
int width , int height ,
|
||||||
|
const wxString& WXUNUSED(description) )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( width == 0 || height == 0 , _T("no arbitration of metafilesize supported") ) ;
|
||||||
|
wxASSERT_MSG( filename.IsEmpty() , _T("no file based metafile support yet")) ;
|
||||||
|
|
||||||
|
m_metaFile = new wxMetaFile(filename) ;
|
||||||
|
Rect r={0,0,height,width} ;
|
||||||
|
|
||||||
|
RectRgn( (RgnHandle) m_macBoundaryClipRgn , &r ) ;
|
||||||
|
CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
|
||||||
|
|
||||||
|
m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ;
|
||||||
|
::GetPort( (GrafPtr*) &m_macPort ) ;
|
||||||
|
m_ok = TRUE ;
|
||||||
|
|
||||||
|
SetMapMode(wxMM_TEXT);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMetaFileDC::~wxMetaFileDC()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMetaFileDC::DoGetSize(int *width, int *height) const
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_metaFile , _T("GetSize() doesn't work without a metafile") );
|
||||||
|
|
||||||
|
wxSize sz = m_metaFile->GetSize() ;
|
||||||
|
if (width) (*width) = sz.x;
|
||||||
|
if (height) (*height) = sz.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMetaFile *wxMetaFileDC::Close()
|
||||||
|
{
|
||||||
|
ClosePicture() ;
|
||||||
|
return m_metaFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if wxUSE_DATAOBJ
|
||||||
|
size_t wxMetafileDataObject::GetDataSize() const
|
||||||
|
{
|
||||||
|
return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMetafileDataObject::GetDataHere(void *buf) const
|
||||||
|
{
|
||||||
|
memcpy( buf , (*(PicHandle)(*((wxMetafile*)&m_metafile)).GetHMETAFILE()) ,
|
||||||
|
GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ) ;
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMetafileDataObject::SetData(size_t len, const void *buf)
|
||||||
|
{
|
||||||
|
Handle handle = NewHandle( len ) ;
|
||||||
|
SetHandleSize( handle , len ) ;
|
||||||
|
memcpy( *handle , buf , len ) ;
|
||||||
|
m_metafile.SetHMETAFILE( handle ) ;
|
||||||
|
return true ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
228
src/mac/classic/mimetmac.cpp
Normal file
228
src/mac/classic/mimetmac.cpp
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mac/mimetype.cpp
|
||||||
|
// Purpose: classes and functions to manage MIME types
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Modified by:
|
||||||
|
// Created: 23.09.98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
||||||
|
// Licence: wxWindows licence (part of wxExtra library)
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "mimetype.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// for compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/string.h"
|
||||||
|
#if wxUSE_GUI
|
||||||
|
#include "wx/icon.h"
|
||||||
|
#endif
|
||||||
|
#endif //WX_PRECOMP
|
||||||
|
|
||||||
|
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/file.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
#include "wx/confbase.h"
|
||||||
|
|
||||||
|
#include "wx/mac/mimetype.h"
|
||||||
|
|
||||||
|
// other standard headers
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
// in case we're compiling in non-GUI mode
|
||||||
|
class WXDLLEXPORT wxIcon;
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::SetDefaultIcon(const wxString& strIcon, int index)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::GetCommand(wxString *command, const char *verb) const
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @@ this function is half implemented
|
||||||
|
bool wxFileTypeImpl::GetExtensions(wxArrayString& extensions)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::GetMimeType(wxString *mimeType) const
|
||||||
|
{
|
||||||
|
if ( m_strFileType.Length() > 0 )
|
||||||
|
{
|
||||||
|
*mimeType = m_strFileType ;
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::GetMimeTypes(wxArrayString& mimeTypes) const
|
||||||
|
{
|
||||||
|
wxString s;
|
||||||
|
|
||||||
|
if (GetMimeType(&s))
|
||||||
|
{
|
||||||
|
mimeTypes.Clear();
|
||||||
|
mimeTypes.Add(s);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::GetIcon(wxIconLocation *WXUNUSED(icon)) const
|
||||||
|
{
|
||||||
|
// no such file type or no value or incorrect icon entry
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileTypeImpl::GetDescription(wxString *desc) const
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
wxFileTypeImpl::GetAllCommands(wxArrayString * verbs, wxArrayString * commands,
|
||||||
|
const wxFileType::MessageParameters& params) const
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("wxFileTypeImpl::GetAllCommands() not yet implemented") );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxMimeTypesManagerImpl::Initialize(int mailcapStyles, const wxString& extraDir)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("wxMimeTypesManagerImpl::Initialize() not yet implemented") );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxMimeTypesManagerImpl::ClearData()
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("wxMimeTypesManagerImpl::ClearData() not yet implemented") );
|
||||||
|
}
|
||||||
|
|
||||||
|
// extension -> file type
|
||||||
|
wxFileType *
|
||||||
|
wxMimeTypesManagerImpl::GetFileTypeFromExtension(const wxString& e)
|
||||||
|
{
|
||||||
|
wxString ext = e ;
|
||||||
|
ext = ext.Lower() ;
|
||||||
|
if ( ext == wxT("txt") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("text/text"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("htm") || ext == wxT("html") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("text/html"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("gif") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/gif"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("png" ))
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/png"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("jpg" )|| ext == wxT("jpeg") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/jpeg"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("bmp") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/bmp"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("tif") || ext == wxT("tiff") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/tiff"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("xpm") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/xpm"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
else if ( ext == wxT("xbm") )
|
||||||
|
{
|
||||||
|
wxFileType *fileType = new wxFileType;
|
||||||
|
fileType->m_impl->SetFileType(wxT("image/xbm"));
|
||||||
|
fileType->m_impl->SetExt(ext);
|
||||||
|
return fileType;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unknown extension
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MIME type -> extension -> file type
|
||||||
|
wxFileType *
|
||||||
|
wxMimeTypesManagerImpl::GetFileTypeFromMimeType(const wxString& mimeType)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wxMimeTypesManagerImpl::EnumAllFileTypes(wxArrayString& mimetypes)
|
||||||
|
{
|
||||||
|
// VZ: don't know anything about this for Mac
|
||||||
|
wxFAIL_MSG( _T("wxMimeTypesManagerImpl::EnumAllFileTypes() not yet implemented") );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFileType *
|
||||||
|
wxMimeTypesManagerImpl::Associate(const wxFileTypeInfo& ftInfo)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("wxMimeTypesManagerImpl::Associate() not yet implemented") );
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wxMimeTypesManagerImpl::Unassociate(wxFileType *ft)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
22
src/mac/classic/minifram.cpp
Normal file
22
src/mac/classic/minifram.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: minifram.cpp
|
||||||
|
// Purpose: wxMiniFrame. Optional; identical to wxFrame if not supported.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "minifram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/minifram.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMiniFrame, wxFrame)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
262
src/mac/classic/msgdlg.cpp
Normal file
262
src/mac/classic/msgdlg.cpp
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: msgdlg.cpp
|
||||||
|
// Purpose: wxMessageDialog
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "msgdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
|
||||||
|
long style, const wxPoint& pos)
|
||||||
|
{
|
||||||
|
m_caption = caption;
|
||||||
|
m_message = message;
|
||||||
|
m_dialogStyle = style;
|
||||||
|
m_parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMessageDialog::ShowModal()
|
||||||
|
{
|
||||||
|
int resultbutton = wxID_CANCEL ;
|
||||||
|
|
||||||
|
short result ;
|
||||||
|
|
||||||
|
wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ;
|
||||||
|
|
||||||
|
AlertType alertType = kAlertPlainAlert ;
|
||||||
|
if (m_dialogStyle & wxICON_EXCLAMATION)
|
||||||
|
alertType = kAlertNoteAlert ;
|
||||||
|
else if (m_dialogStyle & wxICON_HAND)
|
||||||
|
alertType = kAlertStopAlert ;
|
||||||
|
else if (m_dialogStyle & wxICON_INFORMATION)
|
||||||
|
alertType = kAlertNoteAlert ;
|
||||||
|
else if (m_dialogStyle & wxICON_QUESTION)
|
||||||
|
alertType = kAlertCautionAlert ;
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 )
|
||||||
|
{
|
||||||
|
AlertStdCFStringAlertParamRec param ;
|
||||||
|
wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ;
|
||||||
|
wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ;
|
||||||
|
|
||||||
|
wxMacCFStringHolder cfTitle(m_caption , m_font.GetEncoding());
|
||||||
|
wxMacCFStringHolder cfText(m_message , m_font.GetEncoding());
|
||||||
|
|
||||||
|
param.movable = true;
|
||||||
|
param.flags = 0 ;
|
||||||
|
|
||||||
|
bool skipDialog = false ;
|
||||||
|
|
||||||
|
if (m_dialogStyle & wxYES_NO)
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
param.defaultText = cfYesString ;
|
||||||
|
param.cancelText = (CFStringRef) kAlertDefaultCancelText;
|
||||||
|
param.otherText = cfNoString ;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = kAlertStdAlertCancelButton;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
param.defaultText = cfYesString ;
|
||||||
|
param.cancelText = NULL;
|
||||||
|
param.otherText = cfNoString ;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// the msw implementation even shows an ok button if it is not specified, we'll do the same
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
// thats a cancel missing
|
||||||
|
param.defaultText = (CFStringRef) kAlertDefaultOKText ;
|
||||||
|
param.cancelText = (CFStringRef) kAlertDefaultCancelText ;
|
||||||
|
param.otherText = NULL;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
param.defaultText = (CFStringRef) kAlertDefaultOKText ;
|
||||||
|
param.cancelText = NULL;
|
||||||
|
param.otherText = NULL;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
else
|
||||||
|
{
|
||||||
|
skipDialog = true ;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
param.position = kWindowDefaultPosition;
|
||||||
|
if ( !skipDialog )
|
||||||
|
{
|
||||||
|
DialogRef alertRef ;
|
||||||
|
CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ;
|
||||||
|
RunStandardAlert( alertRef , NULL , &result ) ;
|
||||||
|
}
|
||||||
|
if ( skipDialog )
|
||||||
|
return wxID_CANCEL ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
AlertStdAlertParamRec param;
|
||||||
|
|
||||||
|
Str255 yesPString ;
|
||||||
|
Str255 noPString ;
|
||||||
|
|
||||||
|
Str255 pascalTitle ;
|
||||||
|
Str255 pascalText ;
|
||||||
|
wxMacStringToPascal( m_caption , pascalTitle ) ;
|
||||||
|
wxMacStringToPascal( _("Yes") , yesPString ) ;
|
||||||
|
wxMacStringToPascal( _("No") , noPString ) ;
|
||||||
|
wxMacStringToPascal( m_message , pascalText ) ;
|
||||||
|
|
||||||
|
param.movable = true;
|
||||||
|
param.filterProc = NULL ;
|
||||||
|
if (m_dialogStyle & wxYES_NO)
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
param.defaultText = yesPString ;
|
||||||
|
param.cancelText = (StringPtr) kAlertDefaultCancelText;
|
||||||
|
param.otherText = noPString ;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = kAlertStdAlertCancelButton;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
param.defaultText = yesPString ;
|
||||||
|
param.cancelText = NULL;
|
||||||
|
param.otherText = noPString ;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_dialogStyle & wxOK)
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
param.defaultText = (StringPtr) kAlertDefaultOKText ;
|
||||||
|
param.cancelText = (StringPtr) kAlertDefaultCancelText ;
|
||||||
|
param.otherText = NULL;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
param.defaultText = (StringPtr) kAlertDefaultOKText ;
|
||||||
|
param.cancelText = NULL;
|
||||||
|
param.otherText = NULL;
|
||||||
|
param.helpButton = false ;
|
||||||
|
param.defaultButton = kAlertStdAlertOKButton;
|
||||||
|
param.cancelButton = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return resultbutton ;
|
||||||
|
}
|
||||||
|
|
||||||
|
param.position = 0;
|
||||||
|
|
||||||
|
StandardAlert( alertType, pascalTitle, pascalText, ¶m, &result );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_dialogStyle & wxOK)
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
//TODO add Cancelbutton
|
||||||
|
switch( result )
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
resultbutton = wxID_OK ;
|
||||||
|
break ;
|
||||||
|
case 2 :
|
||||||
|
break ;
|
||||||
|
case 3 :
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch( result )
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
resultbutton = wxID_OK ;
|
||||||
|
break ;
|
||||||
|
case 2 :
|
||||||
|
break ;
|
||||||
|
case 3 :
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_dialogStyle & wxYES_NO)
|
||||||
|
{
|
||||||
|
if (m_dialogStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
switch( result )
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
resultbutton = wxID_YES ;
|
||||||
|
break ;
|
||||||
|
case 2 :
|
||||||
|
resultbutton = wxID_CANCEL ;
|
||||||
|
break ;
|
||||||
|
case 3 :
|
||||||
|
resultbutton = wxID_NO ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch( result )
|
||||||
|
{
|
||||||
|
case 1 :
|
||||||
|
resultbutton = wxID_YES ;
|
||||||
|
break ;
|
||||||
|
case 2 :
|
||||||
|
break ;
|
||||||
|
case 3 :
|
||||||
|
resultbutton = wxID_NO ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultbutton ;
|
||||||
|
}
|
||||||
|
|
||||||
729
src/mac/classic/notebmac.cpp
Normal file
729
src/mac/classic/notebmac.cpp
Normal file
@@ -0,0 +1,729 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: notebook.cpp
|
||||||
|
// Purpose: implementation of wxNotebook
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "notebook.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/string.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/imaglist.h"
|
||||||
|
#include "wx/image.h"
|
||||||
|
#include "wx/notebook.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// macros
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// check that the page index is valid
|
||||||
|
#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// event table
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
|
||||||
|
DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxNotebook, wxControl)
|
||||||
|
EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange)
|
||||||
|
EVT_MOUSE_EVENTS(wxNotebook::OnMouse)
|
||||||
|
|
||||||
|
EVT_SIZE(wxNotebook::OnSize)
|
||||||
|
EVT_SET_FOCUS(wxNotebook::OnSetFocus)
|
||||||
|
EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// The Appearance Manager docs show using tab controls in either edge to edge
|
||||||
|
// mode, or inset. I think edge to edge conforms better to the other ports,
|
||||||
|
// and inset mode is better accomplished with space around the wxNotebook rather
|
||||||
|
// than within it. --Robin
|
||||||
|
|
||||||
|
// CS : had to switch off tight spacing due to 10.3 problems
|
||||||
|
#define wxMAC_EDGE_TO_EDGE 0
|
||||||
|
|
||||||
|
static inline int wxMacTabMargin(long nbStyle, long side)
|
||||||
|
{
|
||||||
|
static int tabMargin = -1;
|
||||||
|
static int otherMargin = -1;
|
||||||
|
|
||||||
|
if ( tabMargin == -1)
|
||||||
|
{
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
tabMargin = 26; // From Appearance Manager docs for small tab control dimensions
|
||||||
|
#if wxMAC_EDGE_TO_EDGE
|
||||||
|
otherMargin = 0;
|
||||||
|
#else
|
||||||
|
// otherMargin = 20;
|
||||||
|
// JACS - this seems fine on 10.3; 20 is way too much
|
||||||
|
otherMargin = 8;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tabMargin = 30;
|
||||||
|
#if wxMAC_EDGE_TO_EDGE
|
||||||
|
otherMargin = 0;
|
||||||
|
#else
|
||||||
|
otherMargin = 16;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the style matches the side asked for then return the tab margin,
|
||||||
|
// but we have to special case wxNB_TOP since it is zero...
|
||||||
|
if ( side == wxNB_TOP)
|
||||||
|
{
|
||||||
|
if ( nbStyle != 0 && nbStyle & (wxNB_LEFT|wxNB_RIGHT|wxNB_BOTTOM))
|
||||||
|
{
|
||||||
|
return otherMargin;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return tabMargin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( nbStyle & side)
|
||||||
|
return tabMargin;
|
||||||
|
else
|
||||||
|
return otherMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int wxMacTabLeftMargin(long style)
|
||||||
|
{
|
||||||
|
return wxMacTabMargin(style, wxNB_LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int wxMacTabTopMargin(long style)
|
||||||
|
{
|
||||||
|
return wxMacTabMargin(style, wxNB_TOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int wxMacTabRightMargin(long style)
|
||||||
|
{
|
||||||
|
return wxMacTabMargin(style, wxNB_RIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int wxMacTabBottomMargin(long style)
|
||||||
|
{
|
||||||
|
return wxMacTabMargin(style, wxNB_BOTTOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook construction
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// common part of all ctors
|
||||||
|
void wxNotebook::Init()
|
||||||
|
{
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
// Should these depend on wxMAC_EDGE_TO_EDGE too?
|
||||||
|
m_macHorizontalBorder = 7;
|
||||||
|
m_macVerticalBorder = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_nSelection = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// default for dynamic class
|
||||||
|
wxNotebook::wxNotebook()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the same arguments as for wxControl
|
||||||
|
wxNotebook::wxNotebook(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
|
||||||
|
Create(parent, id, pos, size, style, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create() function
|
||||||
|
bool wxNotebook::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxNotebookBase::Create(parent, id, pos, size, style, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
int tabstyle = kControlTabSmallNorthProc ;
|
||||||
|
if ( HasFlag(wxNB_LEFT) )
|
||||||
|
tabstyle = kControlTabSmallWestProc ;
|
||||||
|
else if ( HasFlag( wxNB_RIGHT ) )
|
||||||
|
tabstyle = kControlTabSmallEastProc ;
|
||||||
|
else if ( HasFlag( wxNB_BOTTOM ) )
|
||||||
|
tabstyle = kControlTabSmallSouthProc ;
|
||||||
|
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
tabstyle , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
wxNotebook::~wxNotebook()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook accessors
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxNotebook::SetPadding(const wxSize& padding)
|
||||||
|
{
|
||||||
|
// unsupported by OS
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNotebook::SetTabSize(const wxSize& sz)
|
||||||
|
{
|
||||||
|
// unsupported by OS
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNotebook::SetPageSize(const wxSize& size)
|
||||||
|
{
|
||||||
|
SetSize( CalcSizeFromPage( size ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const
|
||||||
|
{
|
||||||
|
wxSize sizeTotal = sizePage;
|
||||||
|
sizeTotal.x += 2 * m_macHorizontalBorder + wxMacTabLeftMargin(GetWindowStyle()) +
|
||||||
|
wxMacTabRightMargin(GetWindowStyle()) ;
|
||||||
|
sizeTotal.y += 2 * m_macVerticalBorder + wxMacTabTopMargin(GetWindowStyle()) +
|
||||||
|
wxMacTabBottomMargin(GetWindowStyle()) ;
|
||||||
|
|
||||||
|
return sizeTotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxNotebook::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
// calculate the max page size
|
||||||
|
wxSize size(0, 0);
|
||||||
|
|
||||||
|
size_t count = GetPageCount();
|
||||||
|
if ( count )
|
||||||
|
{
|
||||||
|
for ( size_t n = 0; n < count; n++ )
|
||||||
|
{
|
||||||
|
wxSize sizePage = m_pages[n]->GetSize();
|
||||||
|
|
||||||
|
if ( size.x < sizePage.x )
|
||||||
|
size.x = sizePage.x;
|
||||||
|
if ( size.y < sizePage.y )
|
||||||
|
size.y = sizePage.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // no pages
|
||||||
|
{
|
||||||
|
// use some arbitrary default size
|
||||||
|
size.x =
|
||||||
|
size.y = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CalcSizeFromPage(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxNotebook::SetSelection(size_t nPage)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
|
||||||
|
|
||||||
|
if ( int(nPage) != m_nSelection )
|
||||||
|
{
|
||||||
|
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
|
||||||
|
event.SetSelection(nPage);
|
||||||
|
event.SetOldSelection(m_nSelection);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
|
||||||
|
{
|
||||||
|
// program allows the page change
|
||||||
|
event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
|
||||||
|
(void)GetEventHandler()->ProcessEvent(event);
|
||||||
|
|
||||||
|
ChangePage(m_nSelection, nPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_nSelection;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
|
||||||
|
{
|
||||||
|
wxASSERT( IS_VALID_PAGE(nPage) );
|
||||||
|
|
||||||
|
wxNotebookPage *page = m_pages[nPage];
|
||||||
|
page->SetLabel(strText);
|
||||||
|
MacSetupTabs();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxNotebook::GetPageText(size_t nPage) const
|
||||||
|
{
|
||||||
|
wxASSERT( IS_VALID_PAGE(nPage) );
|
||||||
|
|
||||||
|
wxNotebookPage *page = m_pages[nPage];
|
||||||
|
return page->GetLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxNotebook::GetPageImage(size_t nPage) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, _T("invalid notebook page") );
|
||||||
|
|
||||||
|
return m_images[nPage];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxNotebook::SetPageImage(size_t nPage, int nImage)
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, _T("invalid notebook page") );
|
||||||
|
|
||||||
|
wxCHECK_MSG( m_imageList && nImage < m_imageList->GetImageCount(), FALSE,
|
||||||
|
_T("invalid image index in SetPageImage()") );
|
||||||
|
|
||||||
|
if ( nImage != m_images[nPage] )
|
||||||
|
{
|
||||||
|
// if the item didn't have an icon before or, on the contrary, did have
|
||||||
|
// it but has lost it now, its size will change - but if the icon just
|
||||||
|
// changes, it won't
|
||||||
|
m_images[nPage] = nImage;
|
||||||
|
|
||||||
|
MacSetupTabs() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook operations
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// remove one page from the notebook, without deleting the window
|
||||||
|
wxNotebookPage* wxNotebook::DoRemovePage(size_t nPage)
|
||||||
|
{
|
||||||
|
wxCHECK( IS_VALID_PAGE(nPage), NULL );
|
||||||
|
wxNotebookPage* page = m_pages[nPage] ;
|
||||||
|
m_pages.RemoveAt(nPage);
|
||||||
|
|
||||||
|
MacSetupTabs();
|
||||||
|
|
||||||
|
if(m_nSelection >= (int)GetPageCount()) {
|
||||||
|
m_nSelection = GetPageCount() - 1;
|
||||||
|
}
|
||||||
|
if(m_nSelection >= 0) {
|
||||||
|
m_pages[m_nSelection]->Show(true);
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove all pages
|
||||||
|
bool wxNotebook::DeleteAllPages()
|
||||||
|
{
|
||||||
|
WX_CLEAR_ARRAY(m_pages) ;
|
||||||
|
MacSetupTabs();
|
||||||
|
m_nSelection = -1 ;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// same as AddPage() but does it at given position
|
||||||
|
bool wxNotebook::InsertPage(size_t nPage,
|
||||||
|
wxNotebookPage *pPage,
|
||||||
|
const wxString& strText,
|
||||||
|
bool bSelect,
|
||||||
|
int imageId)
|
||||||
|
{
|
||||||
|
if ( !wxNotebookBase::InsertPage(nPage, pPage, strText, bSelect, imageId) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxASSERT_MSG( pPage->GetParent() == this,
|
||||||
|
_T("notebook pages must have notebook as parent") );
|
||||||
|
|
||||||
|
// don't show pages by default (we'll need to adjust their size first)
|
||||||
|
pPage->Show( false ) ;
|
||||||
|
|
||||||
|
pPage->SetLabel(strText);
|
||||||
|
|
||||||
|
m_images.Insert(imageId, nPage);
|
||||||
|
|
||||||
|
MacSetupTabs();
|
||||||
|
|
||||||
|
wxRect rect = GetPageRect() ;
|
||||||
|
pPage->SetSize(rect);
|
||||||
|
if ( pPage->GetAutoLayout() ) {
|
||||||
|
pPage->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// now deal with the selection
|
||||||
|
// ---------------------------
|
||||||
|
|
||||||
|
// if the inserted page is before the selected one, we must update the
|
||||||
|
// index of the selected page
|
||||||
|
|
||||||
|
if ( int(nPage) <= m_nSelection )
|
||||||
|
{
|
||||||
|
m_nSelection++;
|
||||||
|
// while this still is the same page showing, we need to update the tabs
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// some page should be selected: either this one or the first one if there
|
||||||
|
// is still no selection
|
||||||
|
int selNew = -1;
|
||||||
|
if ( bSelect )
|
||||||
|
selNew = nPage;
|
||||||
|
else if ( m_nSelection == -1 )
|
||||||
|
selNew = 0;
|
||||||
|
|
||||||
|
if ( selNew != -1 )
|
||||||
|
SetSelection(selNew);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Added by Mark Newsam
|
||||||
|
* When a page is added or deleted to the notebook this function updates
|
||||||
|
* information held in the m_macControl so that it matches the order
|
||||||
|
* the user would expect.
|
||||||
|
*/
|
||||||
|
void wxNotebook::MacSetupTabs()
|
||||||
|
{
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , GetPageCount() ) ;
|
||||||
|
|
||||||
|
wxNotebookPage *page;
|
||||||
|
ControlTabInfoRec info;
|
||||||
|
|
||||||
|
const size_t countPages = GetPageCount();
|
||||||
|
for(size_t ii = 0; ii < countPages; ii++)
|
||||||
|
{
|
||||||
|
page = m_pages[ii];
|
||||||
|
info.version = 0;
|
||||||
|
info.iconSuiteID = 0;
|
||||||
|
wxMacStringToPascal( page->GetLabel() , info.name ) ;
|
||||||
|
|
||||||
|
SetControlData( (ControlHandle) m_macControl, ii+1, kControlTabInfoTag,
|
||||||
|
sizeof( ControlTabInfoRec) , (char*) &info ) ;
|
||||||
|
SetTabEnabled( (ControlHandle) m_macControl , ii+1 , true ) ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( GetImageList() && GetPageImage(ii) >= 0 && UMAGetSystemVersion() >= 0x1020 )
|
||||||
|
{
|
||||||
|
// tab controls only support very specific types of images, therefore we are doing an odyssee
|
||||||
|
// accross the icon worlds (even Apple DTS did not find a shorter path)
|
||||||
|
// in order not to pollute the icon registry we put every icon into (OSType) 1 and immediately
|
||||||
|
// afterwards Unregister it (IconRef is ref counted, so it will stay on the tab even if we
|
||||||
|
// unregister it) in case this will ever lead to having the same icon everywhere add some kind
|
||||||
|
// of static counter
|
||||||
|
const wxBitmap* bmap = GetImageList()->GetBitmap( GetPageImage(ii ) ) ;
|
||||||
|
if ( bmap )
|
||||||
|
{
|
||||||
|
wxBitmap scaledBitmap ;
|
||||||
|
if ( bmap->GetWidth() != 16 || bmap->GetHeight() != 16 )
|
||||||
|
{
|
||||||
|
scaledBitmap = wxBitmap( bmap->ConvertToImage().Scale(16,16) ) ;
|
||||||
|
bmap = &scaledBitmap ;
|
||||||
|
}
|
||||||
|
ControlButtonContentInfo info ;
|
||||||
|
wxMacCreateBitmapButton( &info , *bmap , kControlContentPictHandle) ;
|
||||||
|
IconFamilyHandle iconFamily = (IconFamilyHandle) NewHandle(0) ;
|
||||||
|
OSErr err = SetIconFamilyData( iconFamily, 'PICT' , (Handle) info.u.picture ) ;
|
||||||
|
wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
|
||||||
|
IconRef iconRef ;
|
||||||
|
err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) 1, iconFamily, &iconRef ) ;
|
||||||
|
wxASSERT_MSG( err == noErr , wxT("Error when adding bitmap") ) ;
|
||||||
|
info.contentType = kControlContentIconRef ;
|
||||||
|
info.u.iconRef = iconRef ;
|
||||||
|
SetControlData( (ControlHandle) m_macControl, ii+1,kControlTabImageContentTag,
|
||||||
|
sizeof( info ), (Ptr)&info );
|
||||||
|
wxASSERT_MSG( err == noErr , wxT("Error when setting icon on tab") ) ;
|
||||||
|
if ( UMAGetSystemVersion() < 0x1030 )
|
||||||
|
{
|
||||||
|
UnregisterIconRef( 'WXNG' , (OSType) 1 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseIconRef( iconRef ) ;
|
||||||
|
DisposeHandle( (Handle) iconFamily ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
Rect bounds;
|
||||||
|
GetControlBounds((ControlHandle)m_macControl, &bounds);
|
||||||
|
InvalWindowRect((WindowRef)MacGetRootWindow(), &bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxNotebook::GetPageRect() const
|
||||||
|
{
|
||||||
|
// fit the notebook page to the tab control's display area
|
||||||
|
int w, h;
|
||||||
|
GetSize(&w, &h);
|
||||||
|
|
||||||
|
return wxRect(
|
||||||
|
wxMacTabLeftMargin(GetWindowStyle()) + m_macHorizontalBorder,
|
||||||
|
wxMacTabTopMargin(GetWindowStyle()) + m_macVerticalBorder,
|
||||||
|
w - wxMacTabLeftMargin(GetWindowStyle()) - wxMacTabRightMargin(GetWindowStyle()) - 2*m_macHorizontalBorder,
|
||||||
|
h - wxMacTabTopMargin(GetWindowStyle()) - wxMacTabBottomMargin(GetWindowStyle()) - 2*m_macVerticalBorder);
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook callbacks
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// @@@ OnSize() is used for setting the font when it's called for the first
|
||||||
|
// time because doing it in ::Create() doesn't work (for unknown reasons)
|
||||||
|
void wxNotebook::OnSize(wxSizeEvent& event)
|
||||||
|
{
|
||||||
|
|
||||||
|
unsigned int nCount = m_pages.Count();
|
||||||
|
wxRect rect = GetPageRect() ;
|
||||||
|
for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) {
|
||||||
|
wxNotebookPage *pPage = m_pages[nPage];
|
||||||
|
pPage->SetSize(rect);
|
||||||
|
if ( pPage->GetAutoLayout() ) {
|
||||||
|
pPage->Layout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Processing continues to next OnSize
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNotebook::OnSelChange(wxNotebookEvent& event)
|
||||||
|
{
|
||||||
|
// is it our tab control?
|
||||||
|
if ( event.GetEventObject() == this )
|
||||||
|
ChangePage(event.GetOldSelection(), event.GetSelection());
|
||||||
|
|
||||||
|
// we want to give others a chance to process this message as well
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNotebook::OnSetFocus(wxFocusEvent& event)
|
||||||
|
{
|
||||||
|
// set focus to the currently selected page if any
|
||||||
|
if ( m_nSelection != -1 )
|
||||||
|
m_pages[m_nSelection]->SetFocus();
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
|
||||||
|
{
|
||||||
|
if ( event.IsWindowChange() ) {
|
||||||
|
// change pages
|
||||||
|
AdvanceSelection(event.GetDirection());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// we get this event in 2 cases
|
||||||
|
//
|
||||||
|
// a) one of our pages might have generated it because the user TABbed
|
||||||
|
// out from it in which case we should propagate the event upwards and
|
||||||
|
// our parent will take care of setting the focus to prev/next sibling
|
||||||
|
//
|
||||||
|
// or
|
||||||
|
//
|
||||||
|
// b) the parent panel wants to give the focus to us so that we
|
||||||
|
// forward it to our selected page. We can't deal with this in
|
||||||
|
// OnSetFocus() because we don't know which direction the focus came
|
||||||
|
// from in this case and so can't choose between setting the focus to
|
||||||
|
// first or last panel child
|
||||||
|
wxWindow *parent = GetParent();
|
||||||
|
// the cast is here to fic a GCC ICE
|
||||||
|
if ( ((wxWindow*)event.GetEventObject()) == parent )
|
||||||
|
{
|
||||||
|
// no, it doesn't come from child, case (b): forward to a page
|
||||||
|
if ( m_nSelection != -1 )
|
||||||
|
{
|
||||||
|
// so that the page knows that the event comes from it's parent
|
||||||
|
// and is being propagated downwards
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
wxWindow *page = m_pages[m_nSelection];
|
||||||
|
if ( !page->GetEventHandler()->ProcessEvent(event) )
|
||||||
|
{
|
||||||
|
page->SetFocus();
|
||||||
|
}
|
||||||
|
//else: page manages focus inside it itself
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we have no pages - still have to give focus to _something_
|
||||||
|
SetFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// it comes from our child, case (a), pass to the parent
|
||||||
|
if ( parent ) {
|
||||||
|
event.SetCurrentFocus(this);
|
||||||
|
parent->GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook base class virtuals
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if wxUSE_CONSTRAINTS
|
||||||
|
|
||||||
|
// override these 2 functions to do nothing: everything is done in OnSize
|
||||||
|
|
||||||
|
void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse))
|
||||||
|
{
|
||||||
|
// don't set the sizes of the pages - their correct size is not yet known
|
||||||
|
wxControl::SetConstraintSizes(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxNotebook::DoPhase(int WXUNUSED(nPhase))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_CONSTRAINTS
|
||||||
|
|
||||||
|
void wxNotebook::Command(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("wxNotebook::Command not implemented"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook helper functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// hide the currently active panel and show the new one
|
||||||
|
void wxNotebook::ChangePage(int nOldSel, int nSel)
|
||||||
|
{
|
||||||
|
if ( nOldSel != -1 )
|
||||||
|
{
|
||||||
|
m_pages[nOldSel]->Show(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( nSel != -1 )
|
||||||
|
{
|
||||||
|
wxNotebookPage *pPage = m_pages[nSel];
|
||||||
|
pPage->Show(TRUE);
|
||||||
|
pPage->SetFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_nSelection = nSel;
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , m_nSelection + 1 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxNotebook::OnMouse( wxMouseEvent &event )
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
{
|
||||||
|
event.Skip() ;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK )
|
||||||
|
{
|
||||||
|
int x = event.m_x ;
|
||||||
|
int y = event.m_y ;
|
||||||
|
|
||||||
|
MacClientToRootWindow( &x , &y ) ;
|
||||||
|
|
||||||
|
ControlHandle control ;
|
||||||
|
Point localwhere ;
|
||||||
|
SInt16 controlpart ;
|
||||||
|
|
||||||
|
localwhere.h = x ;
|
||||||
|
localwhere.v = y ;
|
||||||
|
|
||||||
|
short modifiers = 0;
|
||||||
|
|
||||||
|
if ( !event.m_leftDown && !event.m_rightDown )
|
||||||
|
modifiers |= btnState ;
|
||||||
|
|
||||||
|
if ( event.m_shiftDown )
|
||||||
|
modifiers |= shiftKey ;
|
||||||
|
|
||||||
|
if ( event.m_controlDown )
|
||||||
|
modifiers |= controlKey ;
|
||||||
|
|
||||||
|
if ( event.m_altDown )
|
||||||
|
modifiers |= optionKey ;
|
||||||
|
|
||||||
|
if ( event.m_metaDown )
|
||||||
|
modifiers |= cmdKey ;
|
||||||
|
|
||||||
|
control = (ControlHandle) m_macControl ;
|
||||||
|
if ( control && ::IsControlActive( control ) )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
wxNotebookEvent changing(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId,
|
||||||
|
::GetControl32BitValue(control) - 1, m_nSelection);
|
||||||
|
changing.SetEventObject(this);
|
||||||
|
GetEventHandler()->ProcessEvent(changing);
|
||||||
|
|
||||||
|
if(changing.IsAllowed())
|
||||||
|
{
|
||||||
|
controlpart = ::HandleControlClick(control, localwhere, modifiers,
|
||||||
|
(ControlActionUPP) -1);
|
||||||
|
wxTheApp->s_lastMouseDown = 0 ;
|
||||||
|
|
||||||
|
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId,
|
||||||
|
::GetControl32BitValue(control) - 1, m_nSelection);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxNotebook::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControl32BitValue((ControlHandle)m_macControl) - 1, m_nSelection);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
ProcessEvent(event);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
118
src/mac/classic/palette.cpp
Normal file
118
src/mac/classic/palette.cpp
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: palette.cpp
|
||||||
|
// Purpose: wxPalette
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "palette.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#if wxUSE_PALETTE
|
||||||
|
|
||||||
|
#include "wx/palette.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Palette
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxPaletteRefData::wxPaletteRefData()
|
||||||
|
{
|
||||||
|
m_palette = NULL ;
|
||||||
|
m_count = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPaletteRefData::~wxPaletteRefData()
|
||||||
|
{
|
||||||
|
if (m_palette != NULL) {
|
||||||
|
delete[] m_palette ;
|
||||||
|
m_palette = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPalette::wxPalette()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
|
||||||
|
{
|
||||||
|
Create(n, red, green, blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPalette::~wxPalette()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue)
|
||||||
|
{
|
||||||
|
UnRef();
|
||||||
|
|
||||||
|
m_refData = new wxPaletteRefData;
|
||||||
|
|
||||||
|
M_PALETTEDATA->m_count = n ;
|
||||||
|
M_PALETTEDATA->m_palette = new wxColour[n] ;
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < n ; ++i)
|
||||||
|
{
|
||||||
|
M_PALETTEDATA->m_palette[i].Set( red[i] , green[i] , blue[i] ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const
|
||||||
|
{
|
||||||
|
if ( !m_refData )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
long bestdiff = 3 * 256 ;
|
||||||
|
long bestpos = 0 ;
|
||||||
|
long currentdiff ;
|
||||||
|
|
||||||
|
for ( int i = 0 ; i < M_PALETTEDATA->m_count ; ++i )
|
||||||
|
{
|
||||||
|
const wxColour& col = &M_PALETTEDATA->m_palette[i] ;
|
||||||
|
currentdiff = abs ( col.Red() - red ) + abs( col.Green() - green ) + abs ( col.Blue() - blue ) ;
|
||||||
|
if ( currentdiff < bestdiff )
|
||||||
|
{
|
||||||
|
bestdiff = currentdiff ;
|
||||||
|
bestpos = i ;
|
||||||
|
if ( bestdiff == 0 )
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bestpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsigned char *blue) const
|
||||||
|
{
|
||||||
|
if ( !m_refData )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (index < 0 || index >= M_PALETTEDATA->m_count)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
const wxColour& col = &M_PALETTEDATA->m_palette[index] ;
|
||||||
|
*red = col.Red() ;
|
||||||
|
*green = col.Green() ;
|
||||||
|
*blue = col.Blue() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// wxUSE_PALETTE
|
||||||
|
|
||||||
186
src/mac/classic/pen.cpp
Normal file
186
src/mac/classic/pen.cpp
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: pen.cpp
|
||||||
|
// Purpose: wxPen
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "pen.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/setup.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/pen.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARIES
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxPenRefData::wxPenRefData()
|
||||||
|
{
|
||||||
|
m_style = wxSOLID;
|
||||||
|
m_width = 1;
|
||||||
|
m_join = wxJOIN_ROUND ;
|
||||||
|
m_cap = wxCAP_ROUND ;
|
||||||
|
m_nbDash = 0 ;
|
||||||
|
m_dash = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPenRefData::wxPenRefData(const wxPenRefData& data)
|
||||||
|
: wxGDIRefData()
|
||||||
|
{
|
||||||
|
m_style = data.m_style;
|
||||||
|
m_width = data.m_width;
|
||||||
|
m_join = data.m_join;
|
||||||
|
m_cap = data.m_cap;
|
||||||
|
m_nbDash = data.m_nbDash;
|
||||||
|
m_dash = data.m_dash;
|
||||||
|
m_colour = data.m_colour;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPenRefData::~wxPenRefData()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pens
|
||||||
|
|
||||||
|
wxPen::wxPen()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPen::~wxPen()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should implement Create
|
||||||
|
wxPen::wxPen(const wxColour& col, int Width, int Style)
|
||||||
|
{
|
||||||
|
m_refData = new wxPenRefData;
|
||||||
|
|
||||||
|
M_PENDATA->m_colour = col;
|
||||||
|
M_PENDATA->m_width = Width;
|
||||||
|
M_PENDATA->m_style = Style;
|
||||||
|
M_PENDATA->m_join = wxJOIN_ROUND ;
|
||||||
|
M_PENDATA->m_cap = wxCAP_ROUND ;
|
||||||
|
M_PENDATA->m_nbDash = 0 ;
|
||||||
|
M_PENDATA->m_dash = 0 ;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPen::wxPen(const wxBitmap& stipple, int Width)
|
||||||
|
{
|
||||||
|
m_refData = new wxPenRefData;
|
||||||
|
|
||||||
|
M_PENDATA->m_stipple = stipple;
|
||||||
|
M_PENDATA->m_width = Width;
|
||||||
|
M_PENDATA->m_style = wxSTIPPLE;
|
||||||
|
M_PENDATA->m_join = wxJOIN_ROUND ;
|
||||||
|
M_PENDATA->m_cap = wxCAP_ROUND ;
|
||||||
|
M_PENDATA->m_nbDash = 0 ;
|
||||||
|
M_PENDATA->m_dash = 0 ;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::Unshare()
|
||||||
|
{
|
||||||
|
// Don't change shared data
|
||||||
|
if (!m_refData)
|
||||||
|
{
|
||||||
|
m_refData = new wxPenRefData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData);
|
||||||
|
UnRef();
|
||||||
|
m_refData = ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetColour(const wxColour& col)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_colour = col;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetColour(unsigned char r, unsigned char g, unsigned char b)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_colour.Set(r, g, b);
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetWidth(int Width)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_width = Width;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetStyle(int Style)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_style = Style;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetStipple(const wxBitmap& Stipple)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_stipple = Stipple;
|
||||||
|
M_PENDATA->m_style = wxSTIPPLE;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetDashes(int nb_dashes, const wxDash *Dash)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_nbDash = nb_dashes;
|
||||||
|
M_PENDATA->m_dash = (wxDash *)Dash;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetJoin(int Join)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_join = Join;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPen::SetCap(int Cap)
|
||||||
|
{
|
||||||
|
Unshare();
|
||||||
|
|
||||||
|
M_PENDATA->m_cap = Cap;
|
||||||
|
|
||||||
|
RealizeResource();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPen::RealizeResource()
|
||||||
|
{
|
||||||
|
// nothing to do here for mac
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
904
src/mac/classic/pnghand.cpp
Normal file
904
src/mac/classic/pnghand.cpp
Normal file
@@ -0,0 +1,904 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: pnghand.cpp
|
||||||
|
// Purpose: Implements a PNG reader class + handler
|
||||||
|
// Author: Julian Smart
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
# pragma implementation "pngread.h"
|
||||||
|
# pragma implementation "pnghand.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
# pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if wxUSE_IOSTREAMH
|
||||||
|
# include <fstream.h>
|
||||||
|
#else
|
||||||
|
# include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#include "wx/palette.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
#include "wx/mac/pnghand.h"
|
||||||
|
#include "wx/mac/pngread.h"
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "png.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void png_read_init PNGARG((png_structp png_ptr));
|
||||||
|
extern "C" void png_write_init PNGARG((png_structp png_ptr));
|
||||||
|
|
||||||
|
extern CTabHandle wxMacCreateColorTable( int numColors ) ;
|
||||||
|
extern void wxMacDestroyColorTable( CTabHandle colors ) ;
|
||||||
|
extern void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ;
|
||||||
|
extern GWorldPtr wxMacCreateGWorld( int width , int height , int depth ) ;
|
||||||
|
extern void wxMacDestroyGWorld( GWorldPtr gw ) ;
|
||||||
|
|
||||||
|
void
|
||||||
|
ima_png_error(png_struct *png_ptr, char *message)
|
||||||
|
{
|
||||||
|
wxMessageBox(wxString::FromAscii(message), wxT("PNG error"));
|
||||||
|
longjmp(png_ptr->jmpbuf, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static wxGifReaderIter* iter;
|
||||||
|
wxPalette *wxCopyPalette(const wxPalette *cmap);
|
||||||
|
|
||||||
|
wxPNGReader::wxPNGReader(void)
|
||||||
|
{
|
||||||
|
filetype = 0;
|
||||||
|
RawImage = NULL; // Image data
|
||||||
|
|
||||||
|
Width = 0; Height = 0; // Dimensions
|
||||||
|
Depth = 0; // (bits x pixel)
|
||||||
|
ColorType = 0; // Bit 1 = Palette used
|
||||||
|
// Bit 2 = Color used
|
||||||
|
// Bit 3 = Alpha used
|
||||||
|
|
||||||
|
EfeWidth = 0; // Efective Width
|
||||||
|
|
||||||
|
lpbi = NULL;
|
||||||
|
bgindex = -1;
|
||||||
|
m_palette = 0;
|
||||||
|
imageOK = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPNGReader::wxPNGReader ( char* ImageFileName )
|
||||||
|
{
|
||||||
|
imageOK = FALSE;
|
||||||
|
filetype = 0;
|
||||||
|
RawImage = NULL; // Image data
|
||||||
|
|
||||||
|
Width = 0; Height = 0; // Dimensions
|
||||||
|
Depth = 0; // (bits x pixel)
|
||||||
|
ColorType = 0; // Bit 1 = m_palette used
|
||||||
|
// Bit 2 = Color used
|
||||||
|
// Bit 3 = Alpha used
|
||||||
|
|
||||||
|
EfeWidth = 0; // Efective Width
|
||||||
|
|
||||||
|
lpbi = NULL;
|
||||||
|
bgindex = -1;
|
||||||
|
m_palette = 0;
|
||||||
|
|
||||||
|
imageOK = ReadFile (ImageFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxPNGReader::Create(int width, int height, int depth, int colortype)
|
||||||
|
{
|
||||||
|
Width = width; Height = height; Depth = depth;
|
||||||
|
ColorType = (colortype>=0) ? colortype: ((Depth>8) ? COLORTYPE_COLOR: 0);
|
||||||
|
delete m_palette;
|
||||||
|
m_palette = NULL;
|
||||||
|
delete[] RawImage;
|
||||||
|
RawImage = NULL;
|
||||||
|
|
||||||
|
if (lpbi) {
|
||||||
|
wxMacDestroyGWorld( (GWorldPtr) lpbi ) ;
|
||||||
|
}
|
||||||
|
lpbi = wxMacCreateGWorld( Width , Height , Depth);
|
||||||
|
if (lpbi)
|
||||||
|
{
|
||||||
|
EfeWidth = (long)(((long)Width*Depth + 31) / 32) * 4;
|
||||||
|
int bitwidth = width ;
|
||||||
|
if ( EfeWidth > bitwidth )
|
||||||
|
bitwidth = EfeWidth ;
|
||||||
|
|
||||||
|
RawImage = (byte*) new char[ ( bitwidth * Height * ((Depth+7)>>3) ) ];
|
||||||
|
imageOK = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPNGReader::~wxPNGReader ( )
|
||||||
|
{
|
||||||
|
if (RawImage != NULL) {
|
||||||
|
delete[] RawImage ;
|
||||||
|
RawImage = NULL;
|
||||||
|
}
|
||||||
|
if (lpbi) {
|
||||||
|
wxMacDestroyGWorld( (GWorldPtr) lpbi ) ;
|
||||||
|
lpbi = NULL;
|
||||||
|
}
|
||||||
|
if (m_palette != NULL) {
|
||||||
|
delete m_palette;
|
||||||
|
m_palette = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int wxPNGReader::GetIndex(int x, int y)
|
||||||
|
{
|
||||||
|
if (!Inside(x, y) || (Depth>8)) return -1;
|
||||||
|
|
||||||
|
ImagePointerType ImagePointer = RawImage + EfeWidth*y + (x*Depth >> 3);
|
||||||
|
int index = (int)(*ImagePointer);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGReader::GetRGB(int x, int y, byte* r, byte* g, byte* b)
|
||||||
|
{
|
||||||
|
if (!Inside(x, y)) return FALSE;
|
||||||
|
|
||||||
|
if (m_palette) {
|
||||||
|
return m_palette->GetRGB(GetIndex(x, y), r, g, b);
|
||||||
|
/* PALETTEENTRY entry;
|
||||||
|
::GetPaletteEntries((HPALETTE) m_palette->GetHPALETTE(), GetIndex(x, y), 1, &entry);
|
||||||
|
*r = entry.peRed;
|
||||||
|
*g = entry.peGreen;
|
||||||
|
*b = entry.peBlue; */
|
||||||
|
} else {
|
||||||
|
ImagePointerType ImagePointer = RawImage + EfeWidth*y + (x*Depth >> 3);
|
||||||
|
*b = ImagePointer[0];
|
||||||
|
*g = ImagePointer[1];
|
||||||
|
*r = ImagePointer[2];
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxPNGReader::SetIndex(int x, int y, int index)
|
||||||
|
{
|
||||||
|
if (!Inside(x, y) || (Depth>8)) return FALSE;
|
||||||
|
|
||||||
|
ImagePointerType ImagePointer = RawImage + EfeWidth*y + (x*Depth >> 3);
|
||||||
|
*ImagePointer = index;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGReader::SetRGB(int x, int y, byte r, byte g, byte b)
|
||||||
|
{
|
||||||
|
if (!Inside(x, y)) return FALSE;
|
||||||
|
|
||||||
|
if (ColorType & COLORTYPE_PALETTE)
|
||||||
|
{
|
||||||
|
if (!m_palette) return FALSE;
|
||||||
|
SetIndex(x, y, m_palette->GetPixel(r, g, b));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ImagePointerType ImagePointer = RawImage + EfeWidth*y + (x*Depth >> 3);
|
||||||
|
ImagePointer[0] = b;
|
||||||
|
ImagePointer[1] = g;
|
||||||
|
ImagePointer[2] = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGReader::SetPalette(wxPalette* colourmap)
|
||||||
|
{
|
||||||
|
delete m_palette ;
|
||||||
|
if (!colourmap)
|
||||||
|
return FALSE;
|
||||||
|
ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
|
||||||
|
m_palette = new wxPalette( *colourmap );
|
||||||
|
return true ;
|
||||||
|
// return (DibSetUsage(lpbi, (HPALETTE) m_palette->GetHPALETTE(), WXIMA_COLORS ) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wxPNGReader::SetPalette(int n, byte *r, byte *g, byte *b)
|
||||||
|
{
|
||||||
|
delete m_palette ;
|
||||||
|
m_palette = new wxPalette();
|
||||||
|
if (!m_palette)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!g) g = r;
|
||||||
|
if (!b) b = g;
|
||||||
|
m_palette->Create(n, r, g, b);
|
||||||
|
ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
|
||||||
|
return true ;
|
||||||
|
// return (DibSetUsage(lpbi, (HPALETTE) m_palette->GetHPALETTE(), WXIMA_COLORS ) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wxPNGReader::SetPalette(int n, rgb_color_struct *rgb_struct)
|
||||||
|
{
|
||||||
|
delete m_palette ;
|
||||||
|
m_palette = new wxPalette();
|
||||||
|
if (!m_palette)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
byte r[256], g[256], b[256];
|
||||||
|
|
||||||
|
for(int i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
r[i] = rgb_struct[i].red;
|
||||||
|
g[i] = rgb_struct[i].green;
|
||||||
|
b[i] = rgb_struct[i].blue;
|
||||||
|
}
|
||||||
|
// Added by JACS copying from Andrew Davison's additions
|
||||||
|
// to GIF-reading code
|
||||||
|
// Make transparency colour black...
|
||||||
|
if (bgindex != -1)
|
||||||
|
r[bgindex] = g[bgindex] = b[bgindex] = 0;
|
||||||
|
|
||||||
|
m_palette->Create(n, r, g, b);
|
||||||
|
ColorType |= (COLORTYPE_PALETTE | COLORTYPE_COLOR);
|
||||||
|
return true ;
|
||||||
|
// return (DibSetUsage(lpbi, (HPALETTE) m_palette->GetHPALETTE(), WXIMA_COLORS ) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPNGReader::NullData()
|
||||||
|
{
|
||||||
|
if (lpbi) {
|
||||||
|
wxMacDestroyGWorld( (GWorldPtr) lpbi ) ;
|
||||||
|
lpbi = NULL;
|
||||||
|
}
|
||||||
|
if (m_palette != NULL) {
|
||||||
|
delete m_palette;
|
||||||
|
m_palette = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBitmap* wxPNGReader::GetBitmap(void)
|
||||||
|
{
|
||||||
|
wxBitmap *bitmap = new wxBitmap;
|
||||||
|
if ( InstantiateBitmap(bitmap) )
|
||||||
|
return bitmap;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete bitmap;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGReader::InstantiateBitmap(wxBitmap *bitmap)
|
||||||
|
{
|
||||||
|
if ( lpbi )
|
||||||
|
{
|
||||||
|
bitmap->SetHBITMAP((WXHBITMAP) lpbi);
|
||||||
|
bitmap->SetWidth(GetWidth());
|
||||||
|
bitmap->SetHeight(GetHeight());
|
||||||
|
bitmap->SetDepth(GetDepth());
|
||||||
|
if ( GetDepth() > 1 && m_palette )
|
||||||
|
bitmap->SetPalette(*m_palette);
|
||||||
|
bitmap->SetOk(TRUE);
|
||||||
|
|
||||||
|
|
||||||
|
// Make a mask if appropriate
|
||||||
|
/*
|
||||||
|
if ( bgindex > -1 )
|
||||||
|
{
|
||||||
|
wxMask *mask = CreateMask();
|
||||||
|
bitmap->SetMask(mask);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
lpbi = NULL ; // bitmap has taken over ownership
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
HDC dc = ::CreateCompatibleDC(NULL);
|
||||||
|
|
||||||
|
if (dc)
|
||||||
|
{
|
||||||
|
// tmpBitmap is a dummy, to satisfy ::CreateCompatibleDC (it
|
||||||
|
// is a memory dc that must have a bitmap selected into it)
|
||||||
|
HDC dc2 = GetDC(NULL);
|
||||||
|
HBITMAP tmpBitmap = ::CreateCompatibleBitmap(dc2, GetWidth(), GetHeight());
|
||||||
|
ReleaseDC(NULL, dc2);
|
||||||
|
HBITMAP oldBitmap = (HBITMAP) ::SelectObject(dc, tmpBitmap);
|
||||||
|
|
||||||
|
if ( m_palette )
|
||||||
|
{
|
||||||
|
HPALETTE oldPal = ::SelectPalette(dc, (HPALETTE) m_palette->GetHPALETTE(), FALSE);
|
||||||
|
::RealizePalette(dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
HBITMAP hBitmap = ::CreateDIBitmap(dc, lpbi,
|
||||||
|
CBM_INIT, RawImage, (LPBITMAPINFO) lpbi, DIB_PAL_COLORS);
|
||||||
|
|
||||||
|
::SelectPalette(dc, NULL, TRUE);
|
||||||
|
::SelectObject(dc, oldBitmap);
|
||||||
|
::DeleteObject(tmpBitmap);
|
||||||
|
::DeleteDC(dc);
|
||||||
|
|
||||||
|
if ( hBitmap )
|
||||||
|
{
|
||||||
|
bitmap->SetHBITMAP((WXHBITMAP) hBitmap);
|
||||||
|
bitmap->SetWidth(GetWidth());
|
||||||
|
bitmap->SetHeight(GetHeight());
|
||||||
|
bitmap->SetDepth(GetDepth());
|
||||||
|
if ( GetDepth() > 1 && m_palette )
|
||||||
|
bitmap->SetPalette(*m_palette);
|
||||||
|
bitmap->SetOk(TRUE);
|
||||||
|
|
||||||
|
|
||||||
|
// Make a mask if appropriate
|
||||||
|
if ( bgindex > -1 )
|
||||||
|
{
|
||||||
|
wxMask *mask = CreateMask();
|
||||||
|
bitmap->SetMask(mask);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPalette *wxCopyPalette(const wxPalette *cmap)
|
||||||
|
{
|
||||||
|
wxPalette *newCmap = new wxPalette( *cmap ) ;
|
||||||
|
return newCmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMask *wxPNGReader::CreateMask(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
HBITMAP hBitmap = ::CreateBitmap(GetWidth(), GetHeight(), 1, 1, NULL);
|
||||||
|
|
||||||
|
HDC dc = ::CreateCompatibleDC(NULL);
|
||||||
|
HBITMAP oldBitmap = (HBITMAP) ::SelectObject(dc, hBitmap);
|
||||||
|
|
||||||
|
int bgIndex = GetBGIndex();
|
||||||
|
|
||||||
|
int x,y;
|
||||||
|
|
||||||
|
for (x=0; x<GetWidth(); x++)
|
||||||
|
{
|
||||||
|
for (y=0; y<GetHeight(); y++)
|
||||||
|
{
|
||||||
|
int index = GetIndex(x, y);
|
||||||
|
if ( index == bgIndex )
|
||||||
|
::SetPixel(dc, x, GetHeight() - y - 1, RGB(0, 0, 0));
|
||||||
|
else
|
||||||
|
::SetPixel(dc, x, GetHeight() - y - 1, RGB(255, 255, 255));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::SelectObject(dc, oldBitmap);
|
||||||
|
wxMask *mask = new wxMask;
|
||||||
|
mask->SetMaskBitmap((WXHBITMAP) hBitmap);
|
||||||
|
return mask;
|
||||||
|
*/
|
||||||
|
return NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGReader::ReadFile(char * ImageFileName)
|
||||||
|
{
|
||||||
|
int number_passes;
|
||||||
|
|
||||||
|
if (ImageFileName)
|
||||||
|
strcpy(filename, ImageFileName);
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
png_struct *png_ptr;
|
||||||
|
png_info *info_ptr;
|
||||||
|
wxPNGReaderIter iter(this);
|
||||||
|
|
||||||
|
/* open the file */
|
||||||
|
fp = fopen( ImageFileName , "rb" );
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* allocate the necessary structures */
|
||||||
|
png_ptr = new (png_struct);
|
||||||
|
if (!png_ptr)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
info_ptr = new (png_info);
|
||||||
|
if (!info_ptr)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
delete png_ptr;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* set error handling */
|
||||||
|
if (setjmp(png_ptr->jmpbuf))
|
||||||
|
{
|
||||||
|
png_read_destroy(png_ptr, info_ptr, (png_info *)0);
|
||||||
|
fclose(fp);
|
||||||
|
delete png_ptr;
|
||||||
|
delete info_ptr;
|
||||||
|
|
||||||
|
/* If we get here, we had a problem reading the file */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
//png_set_error(ima_png_error, NULL);
|
||||||
|
|
||||||
|
/* initialize the structures, info first for error handling */
|
||||||
|
png_info_init(info_ptr);
|
||||||
|
png_read_init(png_ptr);
|
||||||
|
|
||||||
|
/* set up the input control */
|
||||||
|
png_init_io(png_ptr, fp);
|
||||||
|
|
||||||
|
/* read the file information */
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
/* allocate the memory to hold the image using the fields
|
||||||
|
of png_info. */
|
||||||
|
png_color_16 my_background={ 0, 31, 127, 255, 0 };
|
||||||
|
|
||||||
|
if (info_ptr->valid & PNG_INFO_bKGD)
|
||||||
|
{
|
||||||
|
png_set_background(png_ptr, &(info_ptr->background),
|
||||||
|
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
||||||
|
if ( info_ptr->num_palette > 0 )
|
||||||
|
bgindex = info_ptr->background.index;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
png_set_background(png_ptr, &my_background,
|
||||||
|
PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
|
||||||
|
|
||||||
|
// Added by JACS: guesswork!
|
||||||
|
if ( info_ptr->num_trans != 0 )
|
||||||
|
bgindex = info_ptr->num_trans - 1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tell libpng to strip 16 bit depth files down to 8 bits */
|
||||||
|
if (info_ptr->bit_depth == 16)
|
||||||
|
png_set_strip_16(png_ptr);
|
||||||
|
|
||||||
|
int pixel_depth=(info_ptr->pixel_depth<24) ? info_ptr->pixel_depth: 24;
|
||||||
|
Create(info_ptr->width, info_ptr->height, pixel_depth,
|
||||||
|
info_ptr->color_type);
|
||||||
|
|
||||||
|
if (info_ptr->num_palette>0)
|
||||||
|
{
|
||||||
|
SetPalette((int)info_ptr->num_palette, (rgb_color_struct*)info_ptr->palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
int row_stride = info_ptr->width * ((pixel_depth+7)>>3);
|
||||||
|
// printf("P = %d D = %d RS= %d ", info_ptr->num_palette, info_ptr->pixel_depth,row_stride);
|
||||||
|
// printf("CT = %d TRS = %d BD= %d ", info_ptr->color_type, info_ptr->valid & PNG_INFO_tRNS,info_ptr->bit_depth);
|
||||||
|
|
||||||
|
byte *row_pointers = new byte[row_stride];
|
||||||
|
|
||||||
|
/* turn on interlace handling */
|
||||||
|
if (info_ptr->interlace_type)
|
||||||
|
number_passes = png_set_interlace_handling(png_ptr);
|
||||||
|
else
|
||||||
|
number_passes = 1;
|
||||||
|
// printf("NP = %d ", number_passes);
|
||||||
|
|
||||||
|
for (int pass=0; pass< number_passes; pass++)
|
||||||
|
{
|
||||||
|
iter.upset();
|
||||||
|
int y=0;
|
||||||
|
CGrafPtr origPort ;
|
||||||
|
GDHandle origDevice ;
|
||||||
|
|
||||||
|
GetGWorld( &origPort , &origDevice ) ;
|
||||||
|
// ignore shapedc
|
||||||
|
SetGWorld( (GWorldPtr) lpbi , NULL ) ;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// (unsigned char *)iter.GetRow();
|
||||||
|
if (info_ptr->interlace_type)
|
||||||
|
{
|
||||||
|
if (pass>0)
|
||||||
|
iter.GetRow(row_pointers, row_stride);
|
||||||
|
png_read_row(png_ptr, row_pointers, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
png_read_row(png_ptr, row_pointers, NULL);
|
||||||
|
|
||||||
|
if ( info_ptr->palette )
|
||||||
|
{
|
||||||
|
if ( pixel_depth == 8 )
|
||||||
|
{
|
||||||
|
for ( size_t i = 0 ; i < info_ptr->width ; ++i )
|
||||||
|
{
|
||||||
|
png_color_struct* color ;
|
||||||
|
RGBColor col ;
|
||||||
|
|
||||||
|
int index = row_pointers[i] ;
|
||||||
|
color = &info_ptr->palette[index] ;
|
||||||
|
col.red = (((int)color->red) << 8) | ((int)color->red) ;
|
||||||
|
col.green = (((int)color->green) << 8) | ((int)color->green) ;
|
||||||
|
col.blue = (((int)color->blue) << 8) | ((int)color->blue) ;
|
||||||
|
SetCPixel( i, y, &col);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
png_color_struct* color ;
|
||||||
|
RGBColor col ;
|
||||||
|
unsigned char* p = &row_pointers[0] ;
|
||||||
|
PenNormal() ;
|
||||||
|
MoveTo( 0 , y ) ;
|
||||||
|
int index = *p ;
|
||||||
|
color = &info_ptr->palette[index] ;
|
||||||
|
col.red = (color->red << 8) | color->red ;
|
||||||
|
col.green = (color->green << 8) | color->green ;
|
||||||
|
col.blue = (color->blue << 8) | color->blue ;
|
||||||
|
RGBForeColor( &col ) ;
|
||||||
|
col.red = col.green = col.blue = 0xFFFF ;
|
||||||
|
RGBBackColor( &col ) ;
|
||||||
|
for ( int i = 0 ; i < info_ptr->width ; ++i , ++p)
|
||||||
|
{
|
||||||
|
if ( *p != index )
|
||||||
|
{
|
||||||
|
LineTo( i , y ) ;
|
||||||
|
index = *p ;
|
||||||
|
color = &info_ptr->palette[index] ;
|
||||||
|
col.red = (((int)color->red) << 8) | ((int)color->red) ;
|
||||||
|
col.green = (((int)color->green) << 8) | ((int)color->green) ;
|
||||||
|
col.blue = (((int)color->blue) << 8) | ((int)color->blue) ;
|
||||||
|
RGBForeColor( &col ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LineTo( info_ptr->width , y ) ;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( size_t i = 0 ; i < info_ptr->width ; ++i )
|
||||||
|
{
|
||||||
|
png_color_struct* color ;
|
||||||
|
RGBColor col ;
|
||||||
|
|
||||||
|
int byte = ( i * pixel_depth ) / 8 ;
|
||||||
|
int offset = ( 8 - pixel_depth ) - ( i * pixel_depth ) % 8 ;
|
||||||
|
|
||||||
|
int index = ( row_pointers[byte] >> offset ) & ( 0xFF >> ( 8 - pixel_depth ) );
|
||||||
|
color = &info_ptr->palette[index] ;
|
||||||
|
col.red = (((int)color->red) << 8) | ((int)color->red) ;
|
||||||
|
col.green = (((int)color->green) << 8) | ((int)color->green) ;
|
||||||
|
col.blue = (((int)color->blue) << 8) | ((int)color->blue) ;
|
||||||
|
SetCPixel( i, y, &col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( size_t i = 0 ; i < info_ptr->width ; ++i )
|
||||||
|
{
|
||||||
|
png_color_struct* color ;
|
||||||
|
RGBColor col ;
|
||||||
|
color =(png_color_struct*) (&row_pointers[i*3]) ;
|
||||||
|
col.red = (((int)color->red) << 8) | ((int)color->red) ;
|
||||||
|
col.green = (((int)color->green) << 8) | ((int)color->green) ;
|
||||||
|
col.blue = (((int)color->blue) << 8) | ((int)color->blue) ;
|
||||||
|
SetCPixel( i, y, &col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (number_passes)
|
||||||
|
iter.SetRow(row_pointers, row_stride);
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
while(iter.PrevRow());
|
||||||
|
SetGWorld( origPort , origDevice ) ;
|
||||||
|
|
||||||
|
// printf("Y=%d ",y);
|
||||||
|
}
|
||||||
|
delete[] row_pointers;
|
||||||
|
|
||||||
|
/* read the rest of the file, getting any additional chunks
|
||||||
|
in info_ptr */
|
||||||
|
png_read_end(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
/* clean up after the read, and free any memory allocated */
|
||||||
|
png_read_destroy(png_ptr, info_ptr, (png_info *)0);
|
||||||
|
|
||||||
|
/* free the structures */
|
||||||
|
delete png_ptr;
|
||||||
|
delete info_ptr;
|
||||||
|
|
||||||
|
/* close the file */
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* that's it */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* write a png file */
|
||||||
|
|
||||||
|
bool wxPNGReader::SaveFile(char * ImageFileName)
|
||||||
|
{
|
||||||
|
if (ImageFileName)
|
||||||
|
strcpy(filename, ImageFileName);
|
||||||
|
|
||||||
|
wxPNGReaderIter iter(this);
|
||||||
|
FILE *fp;
|
||||||
|
png_struct *png_ptr;
|
||||||
|
png_info *info_ptr;
|
||||||
|
|
||||||
|
/* open the file */
|
||||||
|
fp = fopen(filename, "wb");
|
||||||
|
if (!fp)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* allocate the necessary structures */
|
||||||
|
png_ptr = new (png_struct);
|
||||||
|
if (!png_ptr)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
info_ptr = new (png_info);
|
||||||
|
if (!info_ptr)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
delete png_ptr;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set error handling */
|
||||||
|
if (setjmp(png_ptr->jmpbuf))
|
||||||
|
{
|
||||||
|
png_write_destroy(png_ptr);
|
||||||
|
fclose(fp);
|
||||||
|
delete png_ptr;
|
||||||
|
delete info_ptr;
|
||||||
|
|
||||||
|
/* If we get here, we had a problem reading the file */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
//png_set_error(ima_png_error, NULL);
|
||||||
|
|
||||||
|
// printf("writig pg %s ", filename);
|
||||||
|
/* initialize the structures */
|
||||||
|
png_info_init(info_ptr);
|
||||||
|
png_write_init(png_ptr);
|
||||||
|
|
||||||
|
int row_stride = GetWidth() * ((GetDepth()+7)>>3);
|
||||||
|
/* set up the output control */
|
||||||
|
png_init_io(png_ptr, fp);
|
||||||
|
|
||||||
|
/* set the file information here */
|
||||||
|
info_ptr->width = GetWidth();
|
||||||
|
info_ptr->height = GetHeight();
|
||||||
|
info_ptr->pixel_depth = GetDepth();
|
||||||
|
info_ptr->channels = (GetDepth()>8) ? 3: 1;
|
||||||
|
info_ptr->bit_depth = GetDepth()/info_ptr->channels;
|
||||||
|
info_ptr->color_type = GetColorType();
|
||||||
|
info_ptr->compression_type = info_ptr->filter_type = info_ptr->interlace_type=0;
|
||||||
|
info_ptr->valid = 0;
|
||||||
|
info_ptr->rowbytes = row_stride;
|
||||||
|
|
||||||
|
|
||||||
|
// printf("P = %d D = %d RS= %d GD= %d CH= %d ", info_ptr->pixel_depth, info_ptr->bit_depth, row_stride, GetDepth(), info_ptr->channels);
|
||||||
|
/* set the palette if there is one */
|
||||||
|
if ((GetColorType() & COLORTYPE_PALETTE) && GetPalette())
|
||||||
|
{
|
||||||
|
// printf("writing paleta[%d %d %x]",GetColorType() ,COLORTYPE_PALETTE, GetPalette());
|
||||||
|
info_ptr->valid |= PNG_INFO_PLTE;
|
||||||
|
info_ptr->palette = new png_color[256];
|
||||||
|
info_ptr->num_palette = 256;
|
||||||
|
for (int i=0; i<256; i++)
|
||||||
|
GetPalette()->GetRGB(i, &info_ptr->palette[i].red, &info_ptr->palette[i].green, &info_ptr->palette[i].blue);
|
||||||
|
}
|
||||||
|
// printf("Paleta [%d %d %x]",GetColorType() ,COLORTYPE_PALETTE, GetPalette());
|
||||||
|
|
||||||
|
|
||||||
|
/* optional significant bit chunk */
|
||||||
|
// info_ptr->valid |= PNG_INFO_sBIT;
|
||||||
|
// info_ptr->sig_bit = true_bit_depth;
|
||||||
|
|
||||||
|
/* optional gamma chunk */
|
||||||
|
// info_ptr->valid |= PNG_INFO_gAMA;
|
||||||
|
// info_ptr->gamma = gamma;
|
||||||
|
|
||||||
|
/* other optional chunks */
|
||||||
|
|
||||||
|
/* write the file information */
|
||||||
|
png_write_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
/* set up the transformations you want. Note that these are
|
||||||
|
all optional. Only call them if you want them */
|
||||||
|
|
||||||
|
/* shift the pixels up to a legal bit depth and fill in
|
||||||
|
as appropriate to correctly scale the image */
|
||||||
|
// png_set_shift(png_ptr, &(info_ptr->sig_bit));
|
||||||
|
|
||||||
|
/* pack pixels into bytes */
|
||||||
|
// png_set_packing(png_ptr);
|
||||||
|
|
||||||
|
/* flip bgr pixels to rgb */
|
||||||
|
// png_set_bgr(png_ptr);
|
||||||
|
|
||||||
|
/* swap bytes of 16 bit files to most significant bit first */
|
||||||
|
// png_set_swap(png_ptr);
|
||||||
|
|
||||||
|
/* get rid of filler bytes, pack rgb into 3 bytes */
|
||||||
|
// png_set_rgbx(png_ptr);
|
||||||
|
|
||||||
|
/* If you are only writing one row at a time, this works */
|
||||||
|
|
||||||
|
byte *row_pointers = new byte[row_stride];
|
||||||
|
iter.upset();
|
||||||
|
do {
|
||||||
|
// (unsigned char *)iter.GetRow();
|
||||||
|
iter.GetRow(row_pointers, row_stride);
|
||||||
|
png_write_row(png_ptr, row_pointers);
|
||||||
|
} while(iter.PrevRow());
|
||||||
|
|
||||||
|
delete[] row_pointers;
|
||||||
|
|
||||||
|
/* write the rest of the file */
|
||||||
|
png_write_end(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
/* clean up after the write, and free any memory allocated */
|
||||||
|
png_write_destroy(png_ptr);
|
||||||
|
|
||||||
|
/* if you malloced the palette, free it here */
|
||||||
|
if (info_ptr->palette)
|
||||||
|
delete[] (info_ptr->palette);
|
||||||
|
|
||||||
|
/* free the structures */
|
||||||
|
delete png_ptr;
|
||||||
|
delete info_ptr;
|
||||||
|
|
||||||
|
/* close the file */
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* that's it */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Power(int x, int y)
|
||||||
|
{
|
||||||
|
int z = 1;
|
||||||
|
int i;
|
||||||
|
for ( i = 0; i < y; i++)
|
||||||
|
{
|
||||||
|
z *= x;
|
||||||
|
}
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char hexArray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
|
||||||
|
'C', 'D', 'E', 'F' };
|
||||||
|
|
||||||
|
static void DecToHex(int dec, char *buf)
|
||||||
|
{
|
||||||
|
int firstDigit = (int)(dec/16.0);
|
||||||
|
int secondDigit = (int)(dec - (firstDigit*16.0));
|
||||||
|
buf[0] = hexArray[firstDigit];
|
||||||
|
buf[1] = hexArray[secondDigit];
|
||||||
|
buf[2] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxPNGReader::SaveXPM(char *filename, char *name)
|
||||||
|
{
|
||||||
|
char nameStr[256];
|
||||||
|
if ( name )
|
||||||
|
strcpy(nameStr, name);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxString str = wxString::FromAscii(filename) ;
|
||||||
|
wxStripExtension( str ) ;
|
||||||
|
strcpy(nameStr, str.ToAscii() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( GetDepth() > 4 )
|
||||||
|
{
|
||||||
|
// Only a depth of 4 and below allowed
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !GetPalette() )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
wxSTD ofstream str(filename);
|
||||||
|
if ( str.bad() )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int noColours = Power(2, GetDepth());
|
||||||
|
|
||||||
|
// Output header
|
||||||
|
str << "/* XPM */\n";
|
||||||
|
str << "static char * " << nameStr << "_xpm[] = {\n";
|
||||||
|
str << "\"" << GetWidth() << " " << GetHeight() << " " << noColours << " 1\",\n";
|
||||||
|
|
||||||
|
// Output colourmap
|
||||||
|
int base = 97 ; // start from 'a'
|
||||||
|
|
||||||
|
unsigned char red, green, blue;
|
||||||
|
char hexBuf[4];
|
||||||
|
int i;
|
||||||
|
for ( i = 0; i < noColours; i ++)
|
||||||
|
{
|
||||||
|
str << "\"" << (char)(base + i) << " c #";
|
||||||
|
GetPalette()->GetRGB(i, &red, &green, &blue);
|
||||||
|
DecToHex(red, hexBuf);
|
||||||
|
str << hexBuf;
|
||||||
|
DecToHex(green, hexBuf);
|
||||||
|
str << hexBuf;
|
||||||
|
DecToHex(blue, hexBuf);
|
||||||
|
str << hexBuf;
|
||||||
|
str << "\",\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output the data
|
||||||
|
int x, y;
|
||||||
|
for ( y = 0; y < GetHeight(); y++)
|
||||||
|
{
|
||||||
|
str << "\"";
|
||||||
|
for ( x = 0; x < GetWidth(); x++)
|
||||||
|
{
|
||||||
|
int index = GetIndex(x, y);
|
||||||
|
str << (char)(base + index) ;
|
||||||
|
}
|
||||||
|
str << "\",\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
str << "};\n";
|
||||||
|
str.flush();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPNGFileHandler, wxBitmapHandler)
|
||||||
|
|
||||||
|
bool wxPNGFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
|
||||||
|
int desiredWidth, int desiredHeight)
|
||||||
|
{
|
||||||
|
wxPNGReader reader;
|
||||||
|
if (reader.ReadFile( (char*)(const char*) name.ToAscii() ) )
|
||||||
|
{
|
||||||
|
return reader.InstantiateBitmap(bitmap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPNGFileHandler::SaveFile(const wxBitmap *bitmap, const wxString& name, int type, const wxPalette *pal)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
124
src/mac/classic/printdlg.cpp
Normal file
124
src/mac/classic/printdlg.cpp
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: printdlg.cpp
|
||||||
|
// Purpose: wxPrintDialog, wxPageSetupDialog
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "printdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/object.h"
|
||||||
|
#include "wx/printdlg.h"
|
||||||
|
#include "wx/dcprint.h"
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#include "wx/mac/private/print.h"
|
||||||
|
|
||||||
|
// Use generic page setup dialog: use your own native one if one exists.
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPrintDialog, wxDialog)
|
||||||
|
IMPLEMENT_CLASS(wxPageSetupDialog, wxDialog)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxPrintDialog::wxPrintDialog()
|
||||||
|
{
|
||||||
|
m_dialogParent = NULL;
|
||||||
|
m_printerDC = NULL;
|
||||||
|
m_destroyDC = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintDialogData* data)
|
||||||
|
{
|
||||||
|
Create(p, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data)
|
||||||
|
{
|
||||||
|
wxPrintDialogData data2;
|
||||||
|
if ( data )
|
||||||
|
data2 = *data;
|
||||||
|
|
||||||
|
Create(p, &data2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPrintDialog::Create(wxWindow *p, wxPrintDialogData* data)
|
||||||
|
{
|
||||||
|
m_dialogParent = p;
|
||||||
|
m_printerDC = NULL;
|
||||||
|
m_destroyDC = TRUE;
|
||||||
|
|
||||||
|
if ( data )
|
||||||
|
m_printDialogData = *data;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPrintDialog::~wxPrintDialog()
|
||||||
|
{
|
||||||
|
if (m_destroyDC && m_printerDC) {
|
||||||
|
delete m_printerDC;
|
||||||
|
m_printerDC = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxPrintDialog::ShowModal()
|
||||||
|
{
|
||||||
|
m_printDialogData.ConvertToNative() ;
|
||||||
|
int result = m_printDialogData.GetPrintData().m_nativePrintData->ShowPrintDialog() ;
|
||||||
|
if ( result == wxID_OK )
|
||||||
|
m_printDialogData.ConvertFromNative() ;
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDC *wxPrintDialog::GetPrintDC()
|
||||||
|
{
|
||||||
|
return new wxPrinterDC( m_printDialogData.GetPrintData() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxPageSetupDialog
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxPageSetupDialog::wxPageSetupDialog():
|
||||||
|
wxDialog()
|
||||||
|
{
|
||||||
|
m_dialogParent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPageSetupDialog::wxPageSetupDialog(wxWindow *p, wxPageSetupData *data):
|
||||||
|
wxDialog()
|
||||||
|
{
|
||||||
|
Create(p, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxPageSetupDialog::Create(wxWindow *p, wxPageSetupData *data)
|
||||||
|
{
|
||||||
|
m_dialogParent = p;
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
m_pageSetupData = (*data);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPageSetupDialog::~wxPageSetupDialog()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxPageSetupDialog::ShowModal()
|
||||||
|
{
|
||||||
|
m_pageSetupData.ConvertToNative() ;
|
||||||
|
int result = m_pageSetupData.GetPrintData().m_nativePrintData->ShowPageSetupDialog() ;
|
||||||
|
if (result == wxID_OK )
|
||||||
|
m_pageSetupData.ConvertFromNative() ;
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
781
src/mac/classic/printmac.cpp
Normal file
781
src/mac/classic/printmac.cpp
Normal file
@@ -0,0 +1,781 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: printwin.cpp
|
||||||
|
// Purpose: wxMacPrinter framework
|
||||||
|
// Author: Julian Smart
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "printwin.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/msgdlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#include "wx/mac/printmac.h"
|
||||||
|
#include "wx/mac/private/print.h"
|
||||||
|
|
||||||
|
#define mm2pt 2.83464566929
|
||||||
|
#define pt2mm 0.352777777778
|
||||||
|
|
||||||
|
#include "wx/dcprint.h"
|
||||||
|
#include "wx/printdlg.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxMacPrinter, wxPrinterBase)
|
||||||
|
IMPLEMENT_CLASS(wxMacPrintPreview, wxPrintPreviewBase)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
|
||||||
|
wxNativePrintData* wxNativePrintData::Create()
|
||||||
|
{
|
||||||
|
return new wxMacCarbonPrintData() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacCarbonPrintData::wxMacCarbonPrintData()
|
||||||
|
{
|
||||||
|
m_macPageFormat = kPMNoPageFormat;
|
||||||
|
m_macPrintSettings = kPMNoPrintSettings;
|
||||||
|
m_macPrintSession = kPMNoReference ;
|
||||||
|
ValidateOrCreate() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacCarbonPrintData::~wxMacCarbonPrintData()
|
||||||
|
{
|
||||||
|
if (m_macPageFormat != kPMNoPageFormat)
|
||||||
|
{
|
||||||
|
(void)PMRelease(m_macPageFormat);
|
||||||
|
m_macPageFormat = kPMNoPageFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_macPrintSettings != kPMNoPrintSettings)
|
||||||
|
{
|
||||||
|
(void)PMRelease(m_macPrintSettings);
|
||||||
|
m_macPrintSettings = kPMNoPrintSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_macPrintSession != kPMNoReference )
|
||||||
|
{
|
||||||
|
(void)PMRelease(m_macPrintSession);
|
||||||
|
m_macPrintSession = kPMNoReference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::ValidateOrCreate()
|
||||||
|
{
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
if ( m_macPrintSession == kPMNoReference )
|
||||||
|
{
|
||||||
|
err = PMCreateSession( (PMPrintSession *) &m_macPrintSession ) ;
|
||||||
|
}
|
||||||
|
// Set up a valid PageFormat object.
|
||||||
|
if ( m_macPageFormat == kPMNoPageFormat)
|
||||||
|
{
|
||||||
|
err = PMCreatePageFormat((PMPageFormat *) &m_macPageFormat);
|
||||||
|
|
||||||
|
// Note that PMPageFormat is not session-specific, but calling
|
||||||
|
// PMSessionDefaultPageFormat assigns values specific to the printer
|
||||||
|
// associated with the current printing session.
|
||||||
|
if ((err == noErr) &&
|
||||||
|
( m_macPageFormat != kPMNoPageFormat))
|
||||||
|
{
|
||||||
|
err = PMSessionDefaultPageFormat((PMPrintSession) m_macPrintSession,
|
||||||
|
(PMPageFormat) m_macPageFormat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = PMSessionValidatePageFormat((PMPrintSession) m_macPrintSession,
|
||||||
|
(PMPageFormat) m_macPageFormat,
|
||||||
|
kPMDontWantBoolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up a valid PrintSettings object.
|
||||||
|
if ( m_macPrintSettings == kPMNoPrintSettings)
|
||||||
|
{
|
||||||
|
err = PMCreatePrintSettings((PMPrintSettings *) &m_macPrintSettings);
|
||||||
|
|
||||||
|
// Note that PMPrintSettings is not session-specific, but calling
|
||||||
|
// PMSessionDefaultPrintSettings assigns values specific to the printer
|
||||||
|
// associated with the current printing session.
|
||||||
|
if ((err == noErr) &&
|
||||||
|
( m_macPrintSettings != kPMNoPrintSettings))
|
||||||
|
{
|
||||||
|
err = PMSessionDefaultPrintSettings((PMPrintSession) m_macPrintSession,
|
||||||
|
(PMPrintSettings) m_macPrintSettings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = PMSessionValidatePrintSettings((PMPrintSession) m_macPrintSession,
|
||||||
|
(PMPrintSettings) m_macPrintSettings,
|
||||||
|
kPMDontWantBoolean);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferFrom( wxPrintData* data )
|
||||||
|
{
|
||||||
|
ValidateOrCreate() ;
|
||||||
|
PMSetCopies( (PMPrintSettings) m_macPrintSettings , data->GetNoCopies() , false ) ;
|
||||||
|
PMSetOrientation( (PMPageFormat) m_macPageFormat , ( data->GetOrientation() == wxLANDSCAPE ) ?
|
||||||
|
kPMLandscape : kPMPortrait , false ) ;
|
||||||
|
// collate cannot be set
|
||||||
|
#if 0 // not yet tested
|
||||||
|
if ( m_printerName.Length() > 0 )
|
||||||
|
PMSessionSetCurrentPrinter( (PMPrintSession) m_macPrintSession , wxMacCFStringHolder( m_printerName , wxFont::GetDefaultEncoding() ) ) ;
|
||||||
|
#endif
|
||||||
|
PMColorMode color ;
|
||||||
|
PMGetColorMode( (PMPrintSettings) m_macPrintSettings, &color ) ;
|
||||||
|
if ( data->GetColour() )
|
||||||
|
{
|
||||||
|
if ( color == kPMBlackAndWhite )
|
||||||
|
PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMColor ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
PMSetColorMode( (PMPrintSettings) m_macPrintSettings, kPMBlackAndWhite ) ;
|
||||||
|
|
||||||
|
// PMDuplexMode not yet accessible via API
|
||||||
|
// PMQualityMode not yet accessible via API
|
||||||
|
// todo paperSize
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferTo( wxPrintData* data )
|
||||||
|
{
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
|
||||||
|
UInt32 copies ;
|
||||||
|
err = PMGetCopies( m_macPrintSettings , &copies ) ;
|
||||||
|
if ( err == noErr )
|
||||||
|
data->SetNoCopies( copies ) ;
|
||||||
|
|
||||||
|
PMOrientation orientation ;
|
||||||
|
err = PMGetOrientation( m_macPageFormat , &orientation ) ;
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
if ( orientation == kPMPortrait || orientation == kPMReversePortrait )
|
||||||
|
data->SetOrientation( wxPORTRAIT );
|
||||||
|
else
|
||||||
|
data->SetOrientation( wxLANDSCAPE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// collate cannot be set
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
wxMacCFStringHolder name ;
|
||||||
|
PMPrinter printer ;
|
||||||
|
PMSessionGetCurrentPrinter( m_macPrintSession ,
|
||||||
|
&printer ) ;
|
||||||
|
m_printerName = name.AsString() ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PMColorMode color ;
|
||||||
|
err = PMGetColorMode( m_macPrintSettings, &color ) ;
|
||||||
|
if ( err == noErr )
|
||||||
|
data->SetColour( !(color == kPMBlackAndWhite) ) ;
|
||||||
|
|
||||||
|
// PMDuplexMode not yet accessible via API
|
||||||
|
// PMQualityMode not yet accessible via API
|
||||||
|
// todo paperSize
|
||||||
|
PMRect rPaper;
|
||||||
|
err = PMGetUnadjustedPaperRect( m_macPageFormat, &rPaper);
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
data->SetPaperSize( wxSize (
|
||||||
|
(int)(( rPaper.right - rPaper.left ) * pt2mm + 0.5 ) ,
|
||||||
|
(int)(( rPaper.bottom - rPaper.top ) * pt2mm + 0.5 ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferFrom( wxPageSetupData *data )
|
||||||
|
{
|
||||||
|
// should we setup the page rect here ?
|
||||||
|
// since MacOS sometimes has two same paper rects with different
|
||||||
|
// page rects we could make it roundtrip safe perhaps
|
||||||
|
#if TARGET_CARBON
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferTo( wxPageSetupData* data )
|
||||||
|
{
|
||||||
|
PMRect rPaper;
|
||||||
|
OSStatus err = PMGetUnadjustedPaperRect(m_macPageFormat, &rPaper);
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
PMRect rPage ;
|
||||||
|
err = PMGetUnadjustedPageRect(m_macPageFormat , &rPage ) ;
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
data->SetMinMarginTopLeft( wxPoint (
|
||||||
|
(int)(((double) rPage.left - rPaper.left ) * pt2mm) ,
|
||||||
|
(int)(((double) rPage.top - rPaper.top ) * pt2mm) ) ) ;
|
||||||
|
|
||||||
|
data->SetMinMarginBottomRight( wxPoint (
|
||||||
|
(wxCoord)(((double) rPaper.right - rPage.right ) * pt2mm),
|
||||||
|
(wxCoord)(((double) rPaper.bottom - rPage.bottom ) * pt2mm)) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferTo( wxPrintDialogData* data )
|
||||||
|
{
|
||||||
|
UInt32 minPage , maxPage ;
|
||||||
|
PMGetPageRange( m_macPrintSettings , &minPage , &maxPage ) ;
|
||||||
|
data->SetMinPage( minPage ) ;
|
||||||
|
data->SetMaxPage( maxPage ) ;
|
||||||
|
UInt32 copies ;
|
||||||
|
PMGetCopies( m_macPrintSettings , &copies ) ;
|
||||||
|
data->SetNoCopies( copies ) ;
|
||||||
|
UInt32 from , to ;
|
||||||
|
PMGetFirstPage( m_macPrintSettings , &from ) ;
|
||||||
|
PMGetLastPage( m_macPrintSettings , &to ) ;
|
||||||
|
data->SetFromPage( from ) ;
|
||||||
|
data->SetToPage( to ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::TransferFrom( wxPrintDialogData* data )
|
||||||
|
{
|
||||||
|
PMSetPageRange( m_macPrintSettings , data->GetMinPage() , data->GetMaxPage() ) ;
|
||||||
|
PMSetCopies( m_macPrintSettings , data->GetNoCopies() , false ) ;
|
||||||
|
PMSetFirstPage( m_macPrintSettings , data->GetFromPage() , false ) ;
|
||||||
|
|
||||||
|
int toPage = data->GetToPage();
|
||||||
|
if (toPage < 1)
|
||||||
|
toPage = data->GetFromPage();
|
||||||
|
PMSetLastPage( m_macPrintSettings , toPage , false ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacCarbonPrintData::CopyFrom( wxNativePrintData* d )
|
||||||
|
{
|
||||||
|
wxMacCarbonPrintData *data = (wxMacCarbonPrintData*) d ;
|
||||||
|
if ( data->m_macPrintSession != kPMNoReference )
|
||||||
|
PMRetain( data->m_macPrintSession ) ;
|
||||||
|
if ( m_macPrintSession != kPMNoReference )
|
||||||
|
{
|
||||||
|
PMRelease( m_macPrintSession ) ;
|
||||||
|
m_macPrintSession = kPMNoReference ;
|
||||||
|
}
|
||||||
|
if ( data->m_macPrintSession != kPMNoReference )
|
||||||
|
m_macPrintSession = data->m_macPrintSession ;
|
||||||
|
|
||||||
|
if ( data->m_macPrintSettings != kPMNoPrintSettings )
|
||||||
|
PMRetain( data->m_macPrintSettings ) ;
|
||||||
|
if ( m_macPrintSettings != kPMNoPrintSettings )
|
||||||
|
{
|
||||||
|
PMRelease( m_macPrintSettings ) ;
|
||||||
|
m_macPrintSettings = kPMNoPrintSettings ;
|
||||||
|
}
|
||||||
|
if ( data->m_macPrintSettings != kPMNoPrintSettings )
|
||||||
|
m_macPrintSettings = data->m_macPrintSettings ;
|
||||||
|
|
||||||
|
if ( data->m_macPageFormat != kPMNoPageFormat )
|
||||||
|
PMRetain( data->m_macPageFormat ) ;
|
||||||
|
if ( m_macPageFormat != kPMNoPageFormat )
|
||||||
|
{
|
||||||
|
PMRelease( m_macPageFormat ) ;
|
||||||
|
m_macPageFormat = kPMNoPageFormat ;
|
||||||
|
}
|
||||||
|
if ( data->m_macPageFormat != kPMNoPageFormat )
|
||||||
|
m_macPageFormat = data->m_macPageFormat ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMacCarbonPrintData::ShowPrintDialog()
|
||||||
|
{
|
||||||
|
int result = wxID_CANCEL ;
|
||||||
|
OSErr err = noErr ;
|
||||||
|
wxString message ;
|
||||||
|
|
||||||
|
Boolean accepted;
|
||||||
|
|
||||||
|
{
|
||||||
|
// Display the Print dialog.
|
||||||
|
if (err == noErr)
|
||||||
|
{
|
||||||
|
err = PMSessionPrintDialog( m_macPrintSession,
|
||||||
|
m_macPrintSettings,
|
||||||
|
m_macPageFormat,
|
||||||
|
&accepted);
|
||||||
|
if ((err == noErr) && !accepted)
|
||||||
|
{
|
||||||
|
err = kPMCancel; // user clicked Cancel button
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
result = wxID_OK ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((err != noErr) && (err != kPMCancel))
|
||||||
|
{
|
||||||
|
message.Printf( wxT("Print Error %d"), err ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMacCarbonPrintData::ShowPageSetupDialog()
|
||||||
|
{
|
||||||
|
int result = wxID_CANCEL ;
|
||||||
|
OSErr err = noErr ;
|
||||||
|
wxString message ;
|
||||||
|
|
||||||
|
Boolean accepted;
|
||||||
|
{
|
||||||
|
// Display the Page Setup dialog.
|
||||||
|
if (err == noErr)
|
||||||
|
{
|
||||||
|
err = PMSessionPageSetupDialog( m_macPrintSession,
|
||||||
|
m_macPageFormat,
|
||||||
|
&accepted);
|
||||||
|
if ((err == noErr) && !accepted)
|
||||||
|
{
|
||||||
|
err = kPMCancel; // user clicked Cancel button
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user did not cancel, flatten and save the PageFormat object
|
||||||
|
// with our document.
|
||||||
|
if (err == noErr) {
|
||||||
|
result = wxID_OK ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((err != noErr) && (err != kPMCancel))
|
||||||
|
{
|
||||||
|
message.Printf( wxT("Print Error %d"), err ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString, wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
wxNativePrintData* wxNativePrintData::Create()
|
||||||
|
{
|
||||||
|
return new wxMacClassicPrintData() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacClassicPrintData::wxMacClassicPrintData()
|
||||||
|
{
|
||||||
|
m_macPrintSettings = NULL ;
|
||||||
|
ValidateOrCreate() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacClassicPrintData::~wxMacClassicPrintData()
|
||||||
|
{
|
||||||
|
wxASSERT( m_macPrintSettings );
|
||||||
|
DisposeHandle( (Handle) m_macPrintSettings ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::ValidateOrCreate()
|
||||||
|
{
|
||||||
|
if ( m_macPrintSettings == NULL )
|
||||||
|
{
|
||||||
|
m_macPrintSettings = (THPrint) NewHandleClear( sizeof( TPrint ) );
|
||||||
|
(**m_macPrintSettings).iPrVersion = 0; // something invalid
|
||||||
|
|
||||||
|
(**m_macPrintSettings).prInfo.iHRes = 72;
|
||||||
|
(**m_macPrintSettings).prInfo.iVRes = 72;
|
||||||
|
Rect r1 = { 0, 0, 8*72 - 2 * 18, 11*72 - 2 * 36 };
|
||||||
|
(**m_macPrintSettings).prInfo.rPage = r1;// must have its top left & (0,0)
|
||||||
|
|
||||||
|
Rect r2 = { -18, -36, 8*72 - 18, 11*72 - 36 };
|
||||||
|
(**m_macPrintSettings).rPaper = r2;
|
||||||
|
(**m_macPrintSettings).prStl.iPageV = 11 * 120 ; // 11 inches in 120th of an inch
|
||||||
|
(**m_macPrintSettings).prStl.iPageH = 8 * 120 ; // 8 inches in 120th of an inch
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferFrom( wxPrintData* data )
|
||||||
|
{
|
||||||
|
ValidateOrCreate() ;
|
||||||
|
(**m_macPrintSettings).prJob.iCopies = data->GetNoCopies() ;
|
||||||
|
// on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0
|
||||||
|
// if all printing data is consolidated in on structure we will be able to set additional infos about pages
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferTo( wxPrintData* data )
|
||||||
|
{
|
||||||
|
data->SetNoCopies( (**m_macPrintSettings).prJob.iCopies );
|
||||||
|
data->SetPaperSize( wxSize(
|
||||||
|
((double) (**m_macPrintSettings).rPaper.right - (**m_macPrintSettings).rPaper.left ) * pt2mm ,
|
||||||
|
((double) (**m_macPrintSettings).rPaper.bottom - (**m_macPrintSettings).rPaper.top ) * pt2mm ) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferFrom( wxPageSetupData *data )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferTo( wxPageSetupData* data )
|
||||||
|
{
|
||||||
|
data->SetMinMarginTopLeft( wxPoint(
|
||||||
|
((double) (**m_macPrintSettings).prInfo.rPage.left -(**m_macPrintSettings).rPaper.left ) * pt2mm ,
|
||||||
|
((double) (**m_macPrintSettings).prInfo.rPage.top -(**m_macPrintSettings).rPaper.top ) * pt2mm ) ) ;
|
||||||
|
data->SetMinMarginBottomRight( wxPoint(
|
||||||
|
((double) (**m_macPrintSettings).rPaper.right - (**m_macPrintSettings).prInfo.rPage.right ) * pt2mm ,
|
||||||
|
((double)(**m_macPrintSettings).rPaper.bottom - (**m_macPrintSettings).prInfo.rPage.bottom ) * pt2mm ) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferFrom( wxPrintDialogData* data )
|
||||||
|
{
|
||||||
|
int toPage = data->GetToPage();
|
||||||
|
if (toPage < 1)
|
||||||
|
toPage = data->GetFromPage();
|
||||||
|
(**m_macPrintSettings).prJob.iFstPage = data->GetFromPage() ;
|
||||||
|
(**m_macPrintSettings).prJob.iLstPage = toPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::TransferTo( wxPrintDialogData* data )
|
||||||
|
{
|
||||||
|
data->SetFromPage( (**m_macPrintSettings).prJob.iFstPage ) ;
|
||||||
|
data->SetToPage( (**m_macPrintSettings).prJob.iLstPage ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacClassicPrintData::CopyFrom( wxNativePrintData* data )
|
||||||
|
{
|
||||||
|
DisposeHandle( (Handle) m_macPrintSettings ) ;
|
||||||
|
m_macPrintSettings = ((wxMacClassicPrintData*)data)->m_macPrintSettings;
|
||||||
|
HandToHand( (Handle*) &m_macPrintSettings );
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMacClassicPrintData::ShowPrintDialog()
|
||||||
|
{
|
||||||
|
int result = wxID_CANCEL ;
|
||||||
|
OSErr err = noErr ;
|
||||||
|
wxString message ;
|
||||||
|
|
||||||
|
err = ::UMAPrOpen() ;
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
if ( ::PrJobDialog( m_macPrintSettings ) )
|
||||||
|
{
|
||||||
|
result = wxID_OK ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.Printf( wxT("Print Error %d"), err ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxT(""), wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
::UMAPrClose() ;
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxMacClassicPrintData::ShowPageSetupDialog()
|
||||||
|
{
|
||||||
|
int result = wxID_CANCEL ;
|
||||||
|
OSErr err = noErr ;
|
||||||
|
wxString message ;
|
||||||
|
|
||||||
|
err = ::UMAPrOpen() ;
|
||||||
|
if ( err == noErr )
|
||||||
|
{
|
||||||
|
if ( ::PrStlDialog( m_macPrintSettings ) )
|
||||||
|
{
|
||||||
|
result = wxID_OK ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.Printf( wxT("Print Error %d"), err ) ;
|
||||||
|
wxMessageDialog dialog( NULL , message , wxEmptyString , wxICON_HAND | wxOK) ;
|
||||||
|
dialog.ShowModal();
|
||||||
|
}
|
||||||
|
::UMAPrClose() ;
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Printer
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxMacPrinter::wxMacPrinter(wxPrintDialogData *data):
|
||||||
|
wxPrinterBase(data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPrinter::~wxMacPrinter(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
|
||||||
|
{
|
||||||
|
sm_abortIt = FALSE;
|
||||||
|
sm_abortWindow = NULL;
|
||||||
|
|
||||||
|
if (!printout)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
printout->SetIsPreview(FALSE);
|
||||||
|
if (m_printDialogData.GetMinPage() < 1)
|
||||||
|
m_printDialogData.SetMinPage(1);
|
||||||
|
if (m_printDialogData.GetMaxPage() < 1)
|
||||||
|
m_printDialogData.SetMaxPage(9999);
|
||||||
|
|
||||||
|
// Create a suitable device context
|
||||||
|
wxDC *dc = NULL;
|
||||||
|
if (prompt)
|
||||||
|
{
|
||||||
|
wxPrintDialog dialog(parent, & m_printDialogData);
|
||||||
|
if (dialog.ShowModal() == wxID_OK)
|
||||||
|
{
|
||||||
|
dc = dialog.GetPrintDC();
|
||||||
|
m_printDialogData = dialog.GetPrintDialogData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc = new wxPrinterDC( m_printDialogData.GetPrintData() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// May have pressed cancel.
|
||||||
|
if (!dc || !dc->Ok())
|
||||||
|
{
|
||||||
|
if (dc) delete dc;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on the mac we have always pixels as addressing mode with 72 dpi
|
||||||
|
|
||||||
|
printout->SetPPIScreen(72, 72);
|
||||||
|
printout->SetPPIPrinter(72, 72);
|
||||||
|
|
||||||
|
// Set printout parameters
|
||||||
|
printout->SetDC(dc);
|
||||||
|
|
||||||
|
int w, h;
|
||||||
|
wxCoord ww, hh;
|
||||||
|
dc->GetSize(&w, &h);
|
||||||
|
printout->SetPageSizePixels((int)w, (int)h);
|
||||||
|
dc->GetSizeMM(&ww, &hh);
|
||||||
|
printout->SetPageSizeMM((int)ww, (int)hh);
|
||||||
|
|
||||||
|
// Create an abort window
|
||||||
|
wxBeginBusyCursor();
|
||||||
|
|
||||||
|
printout->OnPreparePrinting();
|
||||||
|
|
||||||
|
// Get some parameters from the printout, if defined
|
||||||
|
int fromPage, toPage;
|
||||||
|
int minPage, maxPage;
|
||||||
|
printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
|
||||||
|
|
||||||
|
if (maxPage == 0)
|
||||||
|
{
|
||||||
|
wxEndBusyCursor();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only set min and max, because from and to have been
|
||||||
|
// set by the user
|
||||||
|
m_printDialogData.SetMinPage(minPage);
|
||||||
|
m_printDialogData.SetMaxPage(maxPage);
|
||||||
|
|
||||||
|
wxWindow *win = CreateAbortWindow(parent, printout);
|
||||||
|
wxSafeYield(win,true);
|
||||||
|
|
||||||
|
if (!win)
|
||||||
|
{
|
||||||
|
wxEndBusyCursor();
|
||||||
|
wxMessageBox(wxT("Sorry, could not create an abort dialog."), wxT("Print Error"), wxOK, parent);
|
||||||
|
delete dc;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
sm_abortWindow = win;
|
||||||
|
sm_abortWindow->Show(TRUE);
|
||||||
|
wxSafeYield(win,true);
|
||||||
|
|
||||||
|
printout->OnBeginPrinting();
|
||||||
|
|
||||||
|
bool keepGoing = TRUE;
|
||||||
|
|
||||||
|
int copyCount;
|
||||||
|
for (copyCount = 1; copyCount <= m_printDialogData.GetNoCopies(); copyCount ++)
|
||||||
|
{
|
||||||
|
if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage()))
|
||||||
|
{
|
||||||
|
wxEndBusyCursor();
|
||||||
|
wxMessageBox(wxT("Could not start printing."), wxT("Print Error"), wxOK, parent);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sm_abortIt)
|
||||||
|
break;
|
||||||
|
|
||||||
|
int pn;
|
||||||
|
for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn);
|
||||||
|
pn++)
|
||||||
|
{
|
||||||
|
if (sm_abortIt)
|
||||||
|
{
|
||||||
|
keepGoing = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1000 )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
GrafPtr thePort ;
|
||||||
|
GetPort( &thePort ) ;
|
||||||
|
wxSafeYield(win,true);
|
||||||
|
SetPort( thePort ) ;
|
||||||
|
}
|
||||||
|
dc->StartPage();
|
||||||
|
keepGoing = printout->OnPrintPage(pn);
|
||||||
|
dc->EndPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printout->OnEndDocument();
|
||||||
|
}
|
||||||
|
|
||||||
|
printout->OnEndPrinting();
|
||||||
|
|
||||||
|
if (sm_abortWindow)
|
||||||
|
{
|
||||||
|
sm_abortWindow->Show(FALSE);
|
||||||
|
delete sm_abortWindow;
|
||||||
|
sm_abortWindow = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxEndBusyCursor();
|
||||||
|
|
||||||
|
delete dc;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDC* wxMacPrinter::PrintDialog(wxWindow *parent)
|
||||||
|
{
|
||||||
|
wxDC* dc = (wxDC*) NULL;
|
||||||
|
|
||||||
|
wxPrintDialog dialog(parent, & m_printDialogData);
|
||||||
|
int ret = dialog.ShowModal();
|
||||||
|
|
||||||
|
if (ret == wxID_OK)
|
||||||
|
{
|
||||||
|
dc = dialog.GetPrintDC();
|
||||||
|
m_printDialogData = dialog.GetPrintDialogData();
|
||||||
|
}
|
||||||
|
|
||||||
|
return dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMacPrinter::Setup(wxWindow *parent)
|
||||||
|
{
|
||||||
|
wxPrintDialog dialog(parent, & m_printDialogData);
|
||||||
|
dialog.GetPrintDialogData().SetSetupDialog(TRUE);
|
||||||
|
|
||||||
|
int ret = dialog.ShowModal();
|
||||||
|
|
||||||
|
if (ret == wxID_OK)
|
||||||
|
{
|
||||||
|
m_printDialogData = dialog.GetPrintDialogData();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ret == wxID_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print preview
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxMacPrintPreview::wxMacPrintPreview(wxPrintout *printout,
|
||||||
|
wxPrintout *printoutForPrinting,
|
||||||
|
wxPrintDialogData *data)
|
||||||
|
: wxPrintPreviewBase(printout, printoutForPrinting, data)
|
||||||
|
{
|
||||||
|
DetermineScaling();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPrintPreview::wxMacPrintPreview(wxPrintout *printout, wxPrintout *printoutForPrinting, wxPrintData *data):
|
||||||
|
wxPrintPreviewBase(printout, printoutForPrinting, data)
|
||||||
|
{
|
||||||
|
DetermineScaling();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPrintPreview::~wxMacPrintPreview(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMacPrintPreview::Print(bool interactive)
|
||||||
|
{
|
||||||
|
if (!m_printPrintout)
|
||||||
|
return FALSE;
|
||||||
|
wxMacPrinter printer(&m_printDialogData);
|
||||||
|
return printer.Print(m_previewFrame, m_printPrintout, interactive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacPrintPreview::DetermineScaling(void)
|
||||||
|
{
|
||||||
|
int screenWidth , screenHeight ;
|
||||||
|
wxDisplaySize( &screenWidth , &screenHeight ) ;
|
||||||
|
|
||||||
|
m_previewPrintout->SetPPIScreen( 72 , 72 ) ;
|
||||||
|
m_previewPrintout->SetPPIPrinter( 72 , 72 ) ;
|
||||||
|
m_previewPrintout->SetPageSizeMM( (int) (8.0 * 25.6), (int) (11.0 * 25.6) );
|
||||||
|
m_previewPrintout->SetPageSizePixels( 8 * 72 , 11 * 72 ) ;
|
||||||
|
m_pageWidth = 8 * 72 ;
|
||||||
|
m_pageHeight = 11 * 72 ;
|
||||||
|
m_previewScale = 1 ;
|
||||||
|
|
||||||
|
// Get a device context for the currently selected printer
|
||||||
|
wxPrinterDC printerDC(m_printDialogData.GetPrintData());
|
||||||
|
if (printerDC.Ok())
|
||||||
|
{
|
||||||
|
int x , y ;
|
||||||
|
wxCoord ww, hh;
|
||||||
|
printerDC.GetSizeMM(&ww, &hh);
|
||||||
|
printerDC.GetSize( &x , &y ) ;
|
||||||
|
m_previewPrintout->SetPageSizeMM((int)ww, (int)hh);
|
||||||
|
m_previewPrintout->SetPageSizePixels( x , y) ;
|
||||||
|
m_pageWidth = x ;
|
||||||
|
m_pageHeight = y ;
|
||||||
|
m_isOk = true ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_isOk = false ;
|
||||||
|
}
|
||||||
|
// At 100%, the page should look about page-size on the screen.
|
||||||
|
// m_previewScale = (float)((float)screenWidth/(float)printerWidth);
|
||||||
|
// m_previewScale = m_previewScale * (float)((float)screenXRes/(float)printerXRes);
|
||||||
|
|
||||||
|
m_previewScale = 1 ;
|
||||||
|
}
|
||||||
580
src/mac/classic/radiobox.cpp
Normal file
580
src/mac/classic/radiobox.cpp
Normal file
@@ -0,0 +1,580 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: 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
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "radioboxbase.h"
|
||||||
|
#pragma implementation "radiobox.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/arrstr.h"
|
||||||
|
|
||||||
|
#include "wx/radiobox.h"
|
||||||
|
#include "wx/radiobut.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> wxRadioBox()
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Default constructor
|
||||||
|
BEGIN_EVENT_TABLE(wxRadioBox, wxControl)
|
||||||
|
EVT_RADIOBUTTON( -1 , 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_majorDim = 0 ;
|
||||||
|
m_radioButtonCycle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> wxRadioBox(wxWindow*, wxWindowID, const wxString&, const wxPoint&,
|
||||||
|
// const wxSize&, int, const wxString[], int, long,
|
||||||
|
// const wxValidator&, const wxString&)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Contructor, creating and showing a radiobox
|
||||||
|
//
|
||||||
|
// inline defined
|
||||||
|
//
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> ~wxRadioBox
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Destructor, destroying the radiobox item
|
||||||
|
|
||||||
|
wxRadioBox::~wxRadioBox()
|
||||||
|
{
|
||||||
|
m_isBeingDeleted = TRUE;
|
||||||
|
|
||||||
|
wxRadioButton *next,*current;
|
||||||
|
|
||||||
|
current=m_radioButtonCycle->NextInCycle();
|
||||||
|
next=current->NextInCycle();
|
||||||
|
while (current!=m_radioButtonCycle) {
|
||||||
|
delete current;
|
||||||
|
current=next;
|
||||||
|
next=current->NextInCycle();
|
||||||
|
}
|
||||||
|
delete current;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Create
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size, style, val, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
m_noItems = n;
|
||||||
|
m_noRowsOrCols = majorDim;
|
||||||
|
m_radioButtonCycle = NULL;
|
||||||
|
|
||||||
|
if (majorDim==0)
|
||||||
|
m_majorDim = n ;
|
||||||
|
else
|
||||||
|
m_majorDim = majorDim ;
|
||||||
|
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxStripMenuCodes(label) , pos , size ,style, val , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlGroupBoxTextTitleProc , (long) this ) ;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
wxRadioButton *radBtn = new wxRadioButton
|
||||||
|
(
|
||||||
|
this,
|
||||||
|
wxID_ANY,
|
||||||
|
wxStripMenuCodes(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() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Enable(bool)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Enables or disables the entire radiobox
|
||||||
|
|
||||||
|
bool wxRadioBox::Enable(bool enable)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
if (!wxControl::Enable(enable))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
current = m_radioButtonCycle;
|
||||||
|
for (i = 0; i < m_noItems; i++) {
|
||||||
|
current->Enable(enable);
|
||||||
|
current = current->NextInCycle();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Enable(int, bool)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Enables or disables an given button
|
||||||
|
|
||||||
|
void wxRadioBox::Enable(int item, bool enable)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
if ((item < 0) || (item >= m_noItems))
|
||||||
|
return;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
current = m_radioButtonCycle;
|
||||||
|
while (i != item) {
|
||||||
|
i++;
|
||||||
|
current = current->NextInCycle();
|
||||||
|
}
|
||||||
|
current->Enable(enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> GetLabel()
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Returns the radiobox label
|
||||||
|
|
||||||
|
wxString wxRadioBox::GetLabel() const
|
||||||
|
{
|
||||||
|
return wxControl::GetLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> GetLabel(int)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Returns the label for the given button
|
||||||
|
|
||||||
|
wxString wxRadioBox::GetString(int item) const
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
if ((item < 0) || (item >= m_noItems))
|
||||||
|
return wxEmptyString;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
current = m_radioButtonCycle;
|
||||||
|
while (i != item) {
|
||||||
|
i++;
|
||||||
|
current = current->NextInCycle();
|
||||||
|
}
|
||||||
|
return current->GetLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> GetSelection
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Number
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Returns the number of buttons in the radiobox
|
||||||
|
//
|
||||||
|
// inline defined
|
||||||
|
//
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> SetLabel(const wxString&)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Sets the radiobox label
|
||||||
|
|
||||||
|
void wxRadioBox::SetLabel(const wxString& label)
|
||||||
|
{
|
||||||
|
return wxControl::SetLabel(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> SetLabel(int, const wxString&)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Sets the label of a given button
|
||||||
|
|
||||||
|
void wxRadioBox::SetString(int item,const wxString& label)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
if ((item < 0) || (item >= m_noItems))
|
||||||
|
return;
|
||||||
|
i=0;
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
while (i!=item) {
|
||||||
|
i++;
|
||||||
|
current=current->NextInCycle();
|
||||||
|
}
|
||||||
|
return current->SetLabel(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> SetSelection
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// 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 ((item < 0) || (item >= m_noItems))
|
||||||
|
return;
|
||||||
|
i=0;
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
while (i!=item) {
|
||||||
|
i++;
|
||||||
|
current=current->NextInCycle();
|
||||||
|
}
|
||||||
|
current->SetValue(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Show(bool)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Shows or hides the entire radiobox
|
||||||
|
|
||||||
|
bool wxRadioBox::Show(bool show)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
wxControl::Show(show);
|
||||||
|
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
for (i=0;i<m_noItems;i++) {
|
||||||
|
current->Show(show);
|
||||||
|
current=current->NextInCycle();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Show(int, bool)
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Shows or hides the given button
|
||||||
|
|
||||||
|
void wxRadioBox::Show(int item, bool show)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
if ((item < 0) || (item >= m_noItems))
|
||||||
|
return;
|
||||||
|
i=0;
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
while (i!=item) {
|
||||||
|
i++;
|
||||||
|
current=current->NextInCycle();
|
||||||
|
}
|
||||||
|
current->Show(show);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> Command
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Simulates the effect of the user issuing a command to the item
|
||||||
|
|
||||||
|
void wxRadioBox::Command (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
SetSelection (event.GetInt());
|
||||||
|
ProcessCommand (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> SetFocus
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Sets the selected button to receive keyboard input
|
||||||
|
|
||||||
|
void wxRadioBox::SetFocus()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
wxRadioButton *current;
|
||||||
|
|
||||||
|
i=0;
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
while (!current->GetValue()) {
|
||||||
|
i++;
|
||||||
|
current=current->NextInCycle();
|
||||||
|
}
|
||||||
|
current->SetFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> DoSetSize
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
x_offset = x;
|
||||||
|
y_offset = y;
|
||||||
|
GetPosition(&x_current, &y_current);
|
||||||
|
if ((x == -1) && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||||
|
x_offset = x_current;
|
||||||
|
if ((y == -1)&& !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||||
|
y_offset = y_current;
|
||||||
|
|
||||||
|
// define size
|
||||||
|
|
||||||
|
int charWidth,charHeight;
|
||||||
|
int maxWidth,maxHeight;
|
||||||
|
int eachWidth[128],eachHeight[128];
|
||||||
|
int totWidth,totHeight;
|
||||||
|
|
||||||
|
SetFont(GetParent()->GetFont());
|
||||||
|
GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &charWidth, &charHeight);
|
||||||
|
charWidth/=52;
|
||||||
|
|
||||||
|
maxWidth=-1;
|
||||||
|
maxHeight=-1;
|
||||||
|
for (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 + charHeight/2) + charHeight ;
|
||||||
|
totWidth = GetColumnCount() * (maxWidth + charWidth) + charWidth;
|
||||||
|
|
||||||
|
// only change our width/height if asked for
|
||||||
|
if ( width == -1 )
|
||||||
|
{
|
||||||
|
if ( sizeFlags & wxSIZE_AUTO_WIDTH )
|
||||||
|
width = totWidth ;
|
||||||
|
else
|
||||||
|
width = widthOld;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( height == -1 )
|
||||||
|
{
|
||||||
|
if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
|
||||||
|
height = totHeight ;
|
||||||
|
else
|
||||||
|
height = heightOld;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxControl::DoSetSize(x_offset,y_offset,width,height,wxSIZE_AUTO);
|
||||||
|
|
||||||
|
// arrange radiobuttons
|
||||||
|
|
||||||
|
int x_start,y_start;
|
||||||
|
|
||||||
|
|
||||||
|
x_start = charWidth;
|
||||||
|
y_start = 15 ;
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1030 )
|
||||||
|
{
|
||||||
|
//need to add a few more pixels for the top border on panther
|
||||||
|
y_start = y_start + 5; //how many exactly should this be to meet the HIG?
|
||||||
|
}
|
||||||
|
x_offset = x_start;
|
||||||
|
y_offset = y_start;
|
||||||
|
|
||||||
|
current=m_radioButtonCycle;
|
||||||
|
for ( i = 0 ; i < m_noItems; i++)
|
||||||
|
{
|
||||||
|
if (i&&((i%m_majorDim)==0)) // not to do for the zero button!
|
||||||
|
{
|
||||||
|
if (m_windowStyle & wxRA_VERTICAL)
|
||||||
|
{
|
||||||
|
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 = GetParent()->GetFont();
|
||||||
|
GetTextExtent(wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
|
||||||
|
&charWidth, &charHeight, NULL, NULL, &font);
|
||||||
|
charWidth /= 52;
|
||||||
|
|
||||||
|
maxWidth = -1;
|
||||||
|
maxHeight = -1;
|
||||||
|
|
||||||
|
for (int i = 0 ; i < m_noItems; i++)
|
||||||
|
{
|
||||||
|
GetTextExtent(GetString(i), &eachWidth, &eachHeight);
|
||||||
|
eachWidth = (int)(eachWidth + RADIO_SIZE) ;
|
||||||
|
eachHeight = (int)((3 * eachHeight) / 2);
|
||||||
|
if (maxWidth < eachWidth) maxWidth = eachWidth;
|
||||||
|
if (maxHeight < eachHeight) maxHeight = eachHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
totHeight = GetRowCount() * (maxHeight + charHeight/2) + charHeight ;
|
||||||
|
totWidth = GetColumnCount() * (maxWidth + charWidth) + charWidth;
|
||||||
|
|
||||||
|
if ( UMAGetSystemVersion() >= 0x1030 )
|
||||||
|
{
|
||||||
|
//need to add a few more pixels for the static boxborder on panther
|
||||||
|
totHeight = totHeight + 10; //how many exactly should this be to meet the HIG?
|
||||||
|
}
|
||||||
|
// handle radio box title as well
|
||||||
|
GetTextExtent(GetTitle(), &eachWidth, NULL);
|
||||||
|
eachWidth = (int)(eachWidth + RADIO_SIZE) + 3 * charWidth ;
|
||||||
|
if (totWidth < eachWidth)
|
||||||
|
totWidth = eachWidth;
|
||||||
|
|
||||||
|
return wxSize(totWidth, totHeight);
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> GetNumVer
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// return the number of buttons in the vertical direction
|
||||||
|
|
||||||
|
int wxRadioBox::GetRowCount() const
|
||||||
|
{
|
||||||
|
if ( m_windowStyle & wxRA_SPECIFY_ROWS )
|
||||||
|
{
|
||||||
|
return m_majorDim;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (m_noItems + m_majorDim - 1)/m_majorDim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// <20> GetNumHor
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// return the number of buttons in the horizontal direction
|
||||||
|
|
||||||
|
int wxRadioBox::GetColumnCount() const
|
||||||
|
{
|
||||||
|
if ( m_windowStyle & wxRA_SPECIFY_ROWS )
|
||||||
|
{
|
||||||
|
return (m_noItems + m_majorDim - 1)/m_majorDim;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return m_majorDim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
150
src/mac/classic/radiobut.cpp
Normal file
150
src/mac/classic/radiobut.cpp
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: radiobut.cpp
|
||||||
|
// Purpose: wxRadioButton
|
||||||
|
// Author: AUTHOR
|
||||||
|
// Modified by: JS Lair (99/11/15) adding the cyclic groupe notion for radiobox
|
||||||
|
// Created: ??/??/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) AUTHOR
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "radiobut.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/radiobut.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
bool wxRadioButton::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , label , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlRadioButtonProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
m_cycle = this ;
|
||||||
|
|
||||||
|
if (HasFlag(wxRB_GROUP))
|
||||||
|
{
|
||||||
|
AddInCycle( NULL ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* search backward for last group start */
|
||||||
|
wxRadioButton *chief = (wxRadioButton*) NULL;
|
||||||
|
wxWindowList::Node *node = parent->GetChildren().GetLast();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxWindow *child = node->GetData();
|
||||||
|
if (child->IsKindOf( CLASSINFO( wxRadioButton ) ) )
|
||||||
|
{
|
||||||
|
chief = (wxRadioButton*) child;
|
||||||
|
if (child->HasFlag(wxRB_GROUP)) break;
|
||||||
|
}
|
||||||
|
node = node->GetPrevious();
|
||||||
|
}
|
||||||
|
AddInCycle( chief ) ;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxRadioButton::SetValue(bool val)
|
||||||
|
{
|
||||||
|
wxRadioButton *cycle;
|
||||||
|
if ( GetControl32BitValue( (ControlHandle) m_macControl ) == val )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
::SetControl32BitValue( (ControlHandle) m_macControl , val ) ;
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
cycle=this->NextInCycle();
|
||||||
|
if (cycle!=NULL) {
|
||||||
|
while (cycle!=this) {
|
||||||
|
cycle->SetValue(false);
|
||||||
|
cycle=cycle->NextInCycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MacRedrawControl() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxRadioButton::GetValue() const
|
||||||
|
{
|
||||||
|
return ::GetControl32BitValue( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxRadioButton::Command (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
SetValue ( (event.GetInt() != 0) );
|
||||||
|
ProcessCommand (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxRadioButton::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED(mouseStillDown))
|
||||||
|
{
|
||||||
|
if ( GetValue() )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxRadioButton *cycle, *old = NULL ;
|
||||||
|
cycle=this->NextInCycle();
|
||||||
|
if (cycle!=NULL) {
|
||||||
|
while (cycle!=this) {
|
||||||
|
if ( cycle->GetValue() ) {
|
||||||
|
old = cycle ;
|
||||||
|
cycle->SetValue(false);
|
||||||
|
}
|
||||||
|
cycle=cycle->NextInCycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetValue(true) ;
|
||||||
|
|
||||||
|
if ( old ) {
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, old->m_windowId );
|
||||||
|
event.SetEventObject(old);
|
||||||
|
event.SetInt( false );
|
||||||
|
old->ProcessCommand(event);
|
||||||
|
}
|
||||||
|
wxCommandEvent event2(wxEVT_COMMAND_RADIOBUTTON_SELECTED, m_windowId );
|
||||||
|
event2.SetEventObject(this);
|
||||||
|
event2.SetInt( true );
|
||||||
|
ProcessCommand(event2);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRadioButton *wxRadioButton::AddInCycle(wxRadioButton *cycle)
|
||||||
|
{
|
||||||
|
wxRadioButton *next,*current;
|
||||||
|
|
||||||
|
if (cycle==NULL) {
|
||||||
|
m_cycle=this;
|
||||||
|
return(this);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
current=cycle;
|
||||||
|
while ((next=current->m_cycle)!=cycle)
|
||||||
|
current=current->m_cycle;
|
||||||
|
m_cycle=cycle;
|
||||||
|
current->m_cycle=this;
|
||||||
|
return(cycle);
|
||||||
|
}
|
||||||
|
}
|
||||||
437
src/mac/classic/region.cpp
Normal file
437
src/mac/classic/region.cpp
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: region.cpp
|
||||||
|
// Purpose: Region class
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Created: Fri Oct 24 10:46:34 MET 1997
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1997 Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "region.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/region.h"
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxRegionRefData implementation
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
|
||||||
|
public:
|
||||||
|
wxRegionRefData()
|
||||||
|
{
|
||||||
|
m_macRgn = NewRgn() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegionRefData(const wxRegionRefData& data)
|
||||||
|
: wxGDIRefData()
|
||||||
|
{
|
||||||
|
m_macRgn = NewRgn() ;
|
||||||
|
CopyRgn( data.m_macRgn , m_macRgn ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
~wxRegionRefData()
|
||||||
|
{
|
||||||
|
DisposeRgn( m_macRgn ) ;
|
||||||
|
}
|
||||||
|
RgnHandle m_macRgn ;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
|
||||||
|
#define OTHER_M_REGION(a) (((wxRegionRefData*)(a.m_refData))->m_macRgn)
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxRegion
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Create an empty region.
|
||||||
|
*/
|
||||||
|
wxRegion::wxRegion()
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion(WXHRGN hRegion )
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData;
|
||||||
|
CopyRgn( (RgnHandle) hRegion , (RgnHandle) M_REGION ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion(long x, long y, long w, long h)
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData;
|
||||||
|
SetRectRgn( (RgnHandle) M_REGION , x , y , x+w , y+h ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData;
|
||||||
|
SetRectRgn( (RgnHandle) M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion(const wxRect& rect)
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData;
|
||||||
|
SetRectRgn( (RgnHandle) M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Destroy the region.
|
||||||
|
*/
|
||||||
|
wxRegion::~wxRegion()
|
||||||
|
{
|
||||||
|
// m_refData unrefed in ~wxObject
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//# Modify region
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//! Clear current region
|
||||||
|
void wxRegion::Clear()
|
||||||
|
{
|
||||||
|
UnRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Combine rectangle (x, y, w, h) with this.
|
||||||
|
bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
|
||||||
|
{
|
||||||
|
// Don't change shared data
|
||||||
|
if (!m_refData)
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData();
|
||||||
|
}
|
||||||
|
else if (m_refData->GetRefCount() > 1)
|
||||||
|
{
|
||||||
|
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
|
||||||
|
UnRef();
|
||||||
|
m_refData = new wxRegionRefData(*ref);
|
||||||
|
}
|
||||||
|
RgnHandle rgn = NewRgn() ;
|
||||||
|
SetRectRgn( rgn , x , y, x+width,y + height ) ;
|
||||||
|
|
||||||
|
switch (op)
|
||||||
|
{
|
||||||
|
case wxRGN_AND:
|
||||||
|
SectRgn( M_REGION , rgn , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_OR:
|
||||||
|
UnionRgn( M_REGION , rgn , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_XOR:
|
||||||
|
XorRgn( M_REGION , rgn , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_DIFF:
|
||||||
|
DiffRgn( M_REGION , rgn , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_COPY:
|
||||||
|
default:
|
||||||
|
CopyRgn( rgn ,M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposeRgn( rgn ) ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Union /e region with this.
|
||||||
|
bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
|
||||||
|
{
|
||||||
|
if (region.Empty())
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// Don't change shared data
|
||||||
|
if (!m_refData) {
|
||||||
|
m_refData = new wxRegionRefData();
|
||||||
|
}
|
||||||
|
else if (m_refData->GetRefCount() > 1)
|
||||||
|
{
|
||||||
|
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
|
||||||
|
UnRef();
|
||||||
|
m_refData = new wxRegionRefData(*ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (op)
|
||||||
|
{
|
||||||
|
case wxRGN_AND:
|
||||||
|
SectRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_OR:
|
||||||
|
UnionRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_XOR:
|
||||||
|
XorRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_DIFF:
|
||||||
|
DiffRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
case wxRGN_COPY:
|
||||||
|
default:
|
||||||
|
CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
|
||||||
|
{
|
||||||
|
return Combine(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight(), op);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//# Information on region
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Outer bounds of region
|
||||||
|
void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const
|
||||||
|
{
|
||||||
|
if (m_refData)
|
||||||
|
{
|
||||||
|
Rect box ;
|
||||||
|
GetRegionBounds( M_REGION , &box ) ;
|
||||||
|
x = box.left ;
|
||||||
|
y = box.top ;
|
||||||
|
w = box.right - box.left ;
|
||||||
|
h = box.bottom - box.top ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = y = w = h = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxRegion::GetBox() const
|
||||||
|
{
|
||||||
|
wxCoord x, y, w, h;
|
||||||
|
GetBox(x, y, w, h);
|
||||||
|
return wxRect(x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is region empty?
|
||||||
|
bool wxRegion::Empty() const
|
||||||
|
{
|
||||||
|
return EmptyRgn( M_REGION ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
const WXHRGN wxRegion::GetWXHRGN() const
|
||||||
|
{
|
||||||
|
return M_REGION ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//# Tests
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Does the region contain the point (x,y)?
|
||||||
|
wxRegionContain wxRegion::Contains(long x, long y) const
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
return wxOutRegion;
|
||||||
|
|
||||||
|
// TODO. Return wxInRegion if within region.
|
||||||
|
if (0)
|
||||||
|
return wxInRegion;
|
||||||
|
return wxOutRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does the region contain the point pt?
|
||||||
|
wxRegionContain wxRegion::Contains(const wxPoint& pt) const
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
return wxOutRegion;
|
||||||
|
|
||||||
|
Point p = { pt.y , pt.x } ;
|
||||||
|
if (PtInRgn( p , M_REGION ) )
|
||||||
|
return wxInRegion;
|
||||||
|
|
||||||
|
return wxOutRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does the region contain the rectangle (x, y, w, h)?
|
||||||
|
wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
return wxOutRegion;
|
||||||
|
|
||||||
|
Rect rect = { y , x , y + h , x + w } ;
|
||||||
|
if (RectInRgn( &rect , M_REGION ) )
|
||||||
|
return wxInRegion;
|
||||||
|
else
|
||||||
|
return wxOutRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does the region contain the rectangle rect
|
||||||
|
wxRegionContain wxRegion::Contains(const wxRect& rect) const
|
||||||
|
{
|
||||||
|
if (!m_refData)
|
||||||
|
return wxOutRegion;
|
||||||
|
|
||||||
|
long x, y, w, h;
|
||||||
|
x = rect.x;
|
||||||
|
y = rect.y;
|
||||||
|
w = rect.GetWidth();
|
||||||
|
h = rect.GetHeight();
|
||||||
|
return Contains(x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// //
|
||||||
|
// wxRegionIterator //
|
||||||
|
// //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Initialize empty iterator
|
||||||
|
*/
|
||||||
|
wxRegionIterator::wxRegionIterator()
|
||||||
|
: m_current(0), m_numRects(0), m_rects(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegionIterator::~wxRegionIterator()
|
||||||
|
{
|
||||||
|
if (m_rects) {
|
||||||
|
delete[] m_rects;
|
||||||
|
m_rects = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegionIterator::wxRegionIterator(const wxRegionIterator& iterator)
|
||||||
|
: wxObject()
|
||||||
|
, m_current(iterator.m_current)
|
||||||
|
, m_numRects(0)
|
||||||
|
, m_rects(NULL)
|
||||||
|
{
|
||||||
|
SetRects(iterator.m_numRects, iterator.m_rects);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegionIterator& wxRegionIterator::operator=(const wxRegionIterator& iterator)
|
||||||
|
{
|
||||||
|
m_current = iterator.m_current;
|
||||||
|
SetRects(iterator.m_numRects, iterator.m_rects);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Set iterator rects for region
|
||||||
|
*/
|
||||||
|
void wxRegionIterator::SetRects(long numRects, wxRect *rects)
|
||||||
|
{
|
||||||
|
if (m_rects) {
|
||||||
|
delete[] m_rects;
|
||||||
|
m_rects = NULL;
|
||||||
|
}
|
||||||
|
if (rects)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
m_rects = new wxRect[numRects];
|
||||||
|
for (i = 0; i < numRects; i++)
|
||||||
|
m_rects[i] = rects[i];
|
||||||
|
}
|
||||||
|
m_numRects = numRects;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Initialize iterator for region
|
||||||
|
*/
|
||||||
|
wxRegionIterator::wxRegionIterator(const wxRegion& region)
|
||||||
|
{
|
||||||
|
m_rects = NULL;
|
||||||
|
|
||||||
|
Reset(region);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Reset iterator for a new /e region.
|
||||||
|
*/
|
||||||
|
void wxRegionIterator::Reset(const wxRegion& region)
|
||||||
|
{
|
||||||
|
m_current = 0;
|
||||||
|
m_region = region;
|
||||||
|
|
||||||
|
if (m_rects) {
|
||||||
|
delete[] m_rects;
|
||||||
|
m_rects = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_region.Empty())
|
||||||
|
m_numRects = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we cannot dissolve it into rects on mac
|
||||||
|
m_rects = new wxRect[1];
|
||||||
|
Rect rect ;
|
||||||
|
GetRegionBounds( OTHER_M_REGION( region ) , &rect ) ;
|
||||||
|
m_rects[0].x = rect.left;
|
||||||
|
m_rects[0].y = rect.top;
|
||||||
|
m_rects[0].width = rect.right - rect.left;
|
||||||
|
m_rects[0].height = rect.bottom - rect.top;
|
||||||
|
m_numRects = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Increment iterator. The rectangle returned is the one after the
|
||||||
|
* incrementation.
|
||||||
|
*/
|
||||||
|
wxRegionIterator& wxRegionIterator::operator ++ ()
|
||||||
|
{
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
++m_current;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Increment iterator. The rectangle returned is the one before the
|
||||||
|
* incrementation.
|
||||||
|
*/
|
||||||
|
wxRegionIterator wxRegionIterator::operator ++ (int)
|
||||||
|
{
|
||||||
|
wxRegionIterator previous(*this);
|
||||||
|
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
++m_current;
|
||||||
|
|
||||||
|
return previous;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxRegionIterator::GetX() const
|
||||||
|
{
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
return m_rects[m_current].x;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxRegionIterator::GetY() const
|
||||||
|
{
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
return m_rects[m_current].y;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxRegionIterator::GetW() const
|
||||||
|
{
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
return m_rects[m_current].width ;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxRegionIterator::GetH() const
|
||||||
|
{
|
||||||
|
if (m_current < m_numRects)
|
||||||
|
return m_rects[m_current].height;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
283
src/mac/classic/renderer.cpp
Normal file
283
src/mac/classic/renderer.cpp
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: mac/renderer.cpp
|
||||||
|
// Purpose: implementation of wxRendererNative for Mac
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Modified by:
|
||||||
|
// Created: 20.07.2003
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
|
||||||
|
// License: wxWindows license
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// for compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/string.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#endif //WX_PRECOMP
|
||||||
|
|
||||||
|
#include "wx/renderer.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxRendererMac: our wxRendererNative implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxRendererMac : public wxDelegateRendererNative
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// draw the header control button (used by wxListCtrl)
|
||||||
|
virtual void DrawHeaderButton(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxRect& rect,
|
||||||
|
int flags = 0);
|
||||||
|
|
||||||
|
// draw the expanded/collapsed icon for a tree control item
|
||||||
|
virtual void DrawTreeItemButton(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxRect& rect,
|
||||||
|
int flags = 0);
|
||||||
|
|
||||||
|
// draw a (vertical) sash
|
||||||
|
virtual void DrawSplitterSash(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxSize& size,
|
||||||
|
wxCoord position,
|
||||||
|
wxOrientation orient,
|
||||||
|
int flags = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// the tree buttons
|
||||||
|
wxBitmap m_bmpTreeExpanded,
|
||||||
|
m_bmpTreeCollapsed;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Aqua arrows
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* XPM */
|
||||||
|
static const char *aqua_arrow_right_xpm[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"13 11 4 1",
|
||||||
|
" c None",
|
||||||
|
"b c #C0C0C0",
|
||||||
|
"c c #707070",
|
||||||
|
"d c #A0A0A0",
|
||||||
|
/* pixels */
|
||||||
|
" b ",
|
||||||
|
" ddb ",
|
||||||
|
" cccdb ",
|
||||||
|
" cccccd ",
|
||||||
|
" ccccccdb ",
|
||||||
|
" ccccccccd",
|
||||||
|
" ccccccdb ",
|
||||||
|
" cccccb ",
|
||||||
|
" cccdb ",
|
||||||
|
" ddb ",
|
||||||
|
" b "
|
||||||
|
};
|
||||||
|
|
||||||
|
/* XPM */
|
||||||
|
static const char *aqua_arrow_down_xpm[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"13 11 4 1",
|
||||||
|
" c None",
|
||||||
|
"b c #C0C0C0",
|
||||||
|
"c c #707070",
|
||||||
|
"d c #A0A0A0",
|
||||||
|
/* pixels */
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" bdcccccccdb ",
|
||||||
|
" dcccccccd ",
|
||||||
|
" bcccccccb ",
|
||||||
|
" dcccccd ",
|
||||||
|
" bcccccb ",
|
||||||
|
" bcccd ",
|
||||||
|
" dcd ",
|
||||||
|
" bcb ",
|
||||||
|
" d "
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
wxRendererNative& wxRendererNative::GetDefault()
|
||||||
|
{
|
||||||
|
static wxRendererMac s_rendererMac;
|
||||||
|
|
||||||
|
return s_rendererMac;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxRendererMac::DrawHeaderButton(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxRect& rect,
|
||||||
|
int WXUNUSED(flags))
|
||||||
|
{
|
||||||
|
const int CORNER = 1;
|
||||||
|
|
||||||
|
const wxCoord x = rect.x-1,
|
||||||
|
y = rect.y-1,
|
||||||
|
w = rect.width,
|
||||||
|
h = rect.height;
|
||||||
|
|
||||||
|
int major,minor;
|
||||||
|
wxGetOsVersion( &major, &minor );
|
||||||
|
|
||||||
|
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
||||||
|
|
||||||
|
if (major >= 10)
|
||||||
|
{
|
||||||
|
dc.SetPen( wxPen( wxColour( 0xC5 , 0xC5 , 0xC5 ) , 1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( x, y+CORNER, 1, h-CORNER ); // left
|
||||||
|
// The right border is overdrawn by the left border of the right neighbouring
|
||||||
|
// header (to maintain a proper single pixel border). Except for the
|
||||||
|
// rightmost header of the listctrl.
|
||||||
|
dc.DrawRectangle( x+w+(CORNER*2), y+CORNER, 1, h-CORNER ); // right
|
||||||
|
dc.SetPen( wxPen( wxColour( 0xB1 , 0xB1 , 0xB1 ) , 1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( x, y+h, w+(CORNER*3), 1 ); // bottom
|
||||||
|
dc.DrawRectangle( x, y, w+(CORNER*3), 1 ); // top
|
||||||
|
|
||||||
|
// Do a fill of the interior for background:
|
||||||
|
dc.SetPen( wxPen( wxColour( 0xF6 , 0xF6 , 0xF6 ) , 1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( x+CORNER, y+CORNER, w+CORNER, h-CORNER );
|
||||||
|
|
||||||
|
// Do the gradient fill:
|
||||||
|
static int grayValues[] =
|
||||||
|
{
|
||||||
|
0xF6, 0xF2, 0xEF, 0xED, 0xED, 0xEB, 0xEA, 0xEA, 0xE8,
|
||||||
|
0xE8, 0xE2, 0xE5, 0xE8, 0xEB, 0xEF, 0xF2, 0xFD
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
for (i=0; i < h && i < (int)WXSIZEOF(grayValues); i++)
|
||||||
|
{
|
||||||
|
dc.SetPen( wxPen( wxColour( grayValues[i] , grayValues[i] , grayValues[i] ),
|
||||||
|
1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( x+CORNER, y+CORNER+i, w+CORNER, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc.SetPen( wxPen( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW ) , 1 , wxSOLID ) );
|
||||||
|
dc.DrawLine( x+w-CORNER+1, y, x+w, y+h ); // right (outer)
|
||||||
|
dc.DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer)
|
||||||
|
|
||||||
|
wxPen pen( wxColour( 0x88 , 0x88 , 0x88 ), 1, wxSOLID );
|
||||||
|
|
||||||
|
dc.SetPen( pen );
|
||||||
|
dc.DrawLine( x+w-CORNER, y, x+w-1, y+h ); // right (inner)
|
||||||
|
dc.DrawRectangle( x+1, y+h-1, w-2, 1 ); // bottom (inner)
|
||||||
|
|
||||||
|
dc.SetPen( *wxWHITE_PEN );
|
||||||
|
dc.DrawRectangle( x, y, w-CORNER+1, 1 ); // top (outer)
|
||||||
|
dc.DrawRectangle( x, y, 1, h ); // left (outer)
|
||||||
|
dc.DrawLine( x, y+h-1, x+1, y+h-1 );
|
||||||
|
dc.DrawLine( x+w-1, y, x+w-1, y+1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxRendererMac::DrawTreeItemButton(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxRect& rect,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
// init the buttons on demand
|
||||||
|
if ( !m_bmpTreeExpanded.Ok() )
|
||||||
|
{
|
||||||
|
m_bmpTreeExpanded = wxBitmap(aqua_arrow_down_xpm);
|
||||||
|
m_bmpTreeCollapsed = wxBitmap(aqua_arrow_right_xpm);
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw them
|
||||||
|
|
||||||
|
// VZ: this is the old code from treectlg.cpp which apparently doesn't work
|
||||||
|
// but I kept it here just in case it is needed -- if not, please
|
||||||
|
// remove it
|
||||||
|
#if 0 // def __WXMAC__
|
||||||
|
wxMacPortSetter helper(&dc) ;
|
||||||
|
wxMacWindowClipper clipper(this) ;
|
||||||
|
wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
|
||||||
|
|
||||||
|
int loc_x = x - 5 ;
|
||||||
|
int loc_y = y_mid - 6 ;
|
||||||
|
MacWindowToRootWindow( & loc_x , & loc_y ) ;
|
||||||
|
Rect bounds = { loc_y , loc_x , loc_y + 18 , loc_x + 12 } ;
|
||||||
|
ThemeButtonDrawInfo info = { kThemeStateActive , item->IsExpanded() ? kThemeDisclosureDown : kThemeDisclosureRight ,
|
||||||
|
kThemeAdornmentNone };
|
||||||
|
DrawThemeButton( &bounds, kThemeDisclosureButton ,
|
||||||
|
&info , NULL , NULL , NULL , NULL ) ;
|
||||||
|
#else // 1
|
||||||
|
dc.DrawBitmap(flags & wxCONTROL_EXPANDED ? m_bmpTreeExpanded
|
||||||
|
: m_bmpTreeCollapsed,
|
||||||
|
rect.x, rect.y, true /* use mask */);
|
||||||
|
#endif // 0/1
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxRendererMac::DrawSplitterSash(wxWindow *win,
|
||||||
|
wxDC& dc,
|
||||||
|
const wxSize& size,
|
||||||
|
wxCoord position,
|
||||||
|
wxOrientation orient,
|
||||||
|
int WXUNUSED(flags))
|
||||||
|
{
|
||||||
|
// VZ: we have to somehow determine if we're drawing a normal sash or
|
||||||
|
// a brushed metal one as they look quite differently... this is
|
||||||
|
// completely bogus anyhow, of course (TODO)
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
dc.SetPen(*wxLIGHT_GREY_PEN);
|
||||||
|
dc.SetBrush(*wxWHITE_BRUSH);
|
||||||
|
if ( orient == wxVERTICAL )
|
||||||
|
dc.DrawRectangle(position, 0, 7, size.y);
|
||||||
|
else
|
||||||
|
dc.DrawRectangle(0, position, size.x, 7);
|
||||||
|
#else
|
||||||
|
// Do the gradient fill:
|
||||||
|
static int grayValues[] =
|
||||||
|
{
|
||||||
|
0xA0, 0xF6, 0xED, 0xE4, 0xE2, 0xD0, 0xA0
|
||||||
|
};
|
||||||
|
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
||||||
|
if ( orient == wxVERTICAL )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i < (int)WXSIZEOF(grayValues); i++)
|
||||||
|
{
|
||||||
|
dc.SetPen( wxPen( wxColour( grayValues[i] , grayValues[i] , grayValues[i] ),
|
||||||
|
1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( position+i, 0, 1, size.y );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i < (int)WXSIZEOF(grayValues); i++)
|
||||||
|
{
|
||||||
|
dc.SetPen( wxPen( wxColour( grayValues[i] , grayValues[i] , grayValues[i] ),
|
||||||
|
1 , wxSOLID ) );
|
||||||
|
dc.DrawRectangle( 0, position+i, size.x, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
184
src/mac/classic/scrolbar.cpp
Normal file
184
src/mac/classic/scrolbar.cpp
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: scrolbar.cpp
|
||||||
|
// Purpose: wxScrollBar
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "scrolbar.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#endif // WX_PRECOMP
|
||||||
|
|
||||||
|
#include "wx/scrolbar.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxScrollBar, wxControl)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
|
||||||
|
|
||||||
|
// Scrollbar
|
||||||
|
bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl(MAC_WXHWND(parent->MacGetRootWindow()) ,
|
||||||
|
&bounds , title , false , 0 , 0 , 100,
|
||||||
|
kControlScrollBarLiveProc , (long) this) ;
|
||||||
|
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
::SetControlAction( (ControlHandle) m_macControl , wxMacLiveScrollbarActionUPP ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxScrollBar::~wxScrollBar()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxScrollBar::SetThumbPosition(int viewStart)
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( (ControlHandle) m_macControl , viewStart ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxScrollBar::GetThumbPosition() const
|
||||||
|
{
|
||||||
|
return ::GetControl32BitValue( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
|
||||||
|
bool refresh)
|
||||||
|
{
|
||||||
|
m_pageSize = pageSize;
|
||||||
|
m_viewSize = thumbSize;
|
||||||
|
m_objectSize = range;
|
||||||
|
|
||||||
|
int range1 = wxMax((m_objectSize - m_viewSize), 0) ;
|
||||||
|
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , range1 ) ;
|
||||||
|
SetControl32BitMinimum( (ControlHandle) m_macControl , 0 ) ;
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , position ) ;
|
||||||
|
|
||||||
|
if ( UMAGetAppearanceVersion() >= 0x0110 )
|
||||||
|
{
|
||||||
|
if ( SetControlViewSize != (void*) kUnresolvedCFragSymbolAddress )
|
||||||
|
{
|
||||||
|
SetControlViewSize( (ControlHandle) m_macControl , m_viewSize ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( refresh )
|
||||||
|
MacRedrawControl() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wxScrollBar::Command(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
SetThumbPosition(event.m_commandInt);
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxScrollBar::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool mouseStillDown )
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
int position = GetControl32BitValue( (ControlHandle) m_macControl) ;
|
||||||
|
int minPos = GetControl32BitMinimum( (ControlHandle) m_macControl) ;
|
||||||
|
int maxPos = GetControl32BitMaximum( (ControlHandle) m_macControl) ;
|
||||||
|
|
||||||
|
wxEventType scrollEvent = wxEVT_NULL;
|
||||||
|
int nScrollInc = 0;
|
||||||
|
|
||||||
|
// all events have already been reported during mouse down, except for THUMBRELEASE
|
||||||
|
if ( !mouseStillDown && controlpart !=kControlIndicatorPart )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
switch( controlpart )
|
||||||
|
{
|
||||||
|
case kControlUpButtonPart :
|
||||||
|
nScrollInc = -1;
|
||||||
|
scrollEvent = wxEVT_SCROLL_LINEUP;
|
||||||
|
break ;
|
||||||
|
case kControlDownButtonPart :
|
||||||
|
nScrollInc = 1;
|
||||||
|
scrollEvent = wxEVT_SCROLL_LINEDOWN;
|
||||||
|
break ;
|
||||||
|
case kControlPageUpPart :
|
||||||
|
nScrollInc = -m_pageSize;
|
||||||
|
scrollEvent = wxEVT_SCROLL_PAGEUP;
|
||||||
|
break ;
|
||||||
|
case kControlPageDownPart :
|
||||||
|
nScrollInc = m_pageSize;
|
||||||
|
scrollEvent = wxEVT_SCROLL_PAGEDOWN;
|
||||||
|
break ;
|
||||||
|
case kControlIndicatorPart :
|
||||||
|
nScrollInc = 0 ;
|
||||||
|
if ( mouseStillDown )
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBTRACK;
|
||||||
|
else
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
|
||||||
|
break ;
|
||||||
|
default :
|
||||||
|
wxFAIL_MSG(wxT("illegal scrollbar selector"));
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int new_pos = position + nScrollInc;
|
||||||
|
|
||||||
|
if (new_pos < minPos)
|
||||||
|
new_pos = minPos;
|
||||||
|
if (new_pos > maxPos)
|
||||||
|
new_pos = maxPos;
|
||||||
|
if ( nScrollInc )
|
||||||
|
SetThumbPosition(new_pos);
|
||||||
|
|
||||||
|
wxScrollEvent event(scrollEvent, m_windowId);
|
||||||
|
if ( m_windowStyle & wxHORIZONTAL )
|
||||||
|
{
|
||||||
|
event.SetOrientation( wxHORIZONTAL ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event.SetOrientation( wxVERTICAL ) ;
|
||||||
|
}
|
||||||
|
event.SetPosition(new_pos);
|
||||||
|
event.SetEventObject( this );
|
||||||
|
wxWindow* window = GetParent() ;
|
||||||
|
if (window && window->MacIsWindowScrollbar(this) )
|
||||||
|
{
|
||||||
|
// this is hardcoded
|
||||||
|
window->MacOnScroll(event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
279
src/mac/classic/settings.cpp
Normal file
279
src/mac/classic/settings.cpp
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: settings.cpp
|
||||||
|
// Purpose: wxSettings
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "settings.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#include "wx/gdicmn.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxSystemSettingsNative
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// colours
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxColour wxSystemSettingsNative::GetColour(wxSystemColour index)
|
||||||
|
{
|
||||||
|
int major,minor;
|
||||||
|
wxGetOsVersion( &major, &minor );
|
||||||
|
|
||||||
|
switch( index )
|
||||||
|
{
|
||||||
|
case wxSYS_COLOUR_SCROLLBAR :
|
||||||
|
case wxSYS_COLOUR_BACKGROUND:
|
||||||
|
case wxSYS_COLOUR_ACTIVECAPTION:
|
||||||
|
case wxSYS_COLOUR_INACTIVECAPTION:
|
||||||
|
case wxSYS_COLOUR_MENU:
|
||||||
|
case wxSYS_COLOUR_WINDOW:
|
||||||
|
case wxSYS_COLOUR_WINDOWFRAME:
|
||||||
|
case wxSYS_COLOUR_ACTIVEBORDER:
|
||||||
|
case wxSYS_COLOUR_INACTIVEBORDER:
|
||||||
|
case wxSYS_COLOUR_BTNFACE:
|
||||||
|
case wxSYS_COLOUR_MENUBAR:
|
||||||
|
return wxColor( 0xDD , 0xDD , 0xDD ) ;
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxSYS_COLOUR_LISTBOX :
|
||||||
|
{
|
||||||
|
if (major >= 10)
|
||||||
|
return *wxWHITE ;
|
||||||
|
else
|
||||||
|
return wxColor( 0xEE , 0xEE , 0xEE ) ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
case wxSYS_COLOUR_BTNSHADOW:
|
||||||
|
if (major >= 10)
|
||||||
|
return wxColor( 0xBE , 0xBE , 0xBE ) ;
|
||||||
|
else
|
||||||
|
return wxColor( 0x44 , 0x44 , 0x44 ) ;
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxSYS_COLOUR_BTNTEXT:
|
||||||
|
case wxSYS_COLOUR_MENUTEXT:
|
||||||
|
case wxSYS_COLOUR_WINDOWTEXT:
|
||||||
|
case wxSYS_COLOUR_CAPTIONTEXT:
|
||||||
|
case wxSYS_COLOUR_INFOTEXT:
|
||||||
|
case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
|
||||||
|
return *wxBLACK;
|
||||||
|
break ;
|
||||||
|
case wxSYS_COLOUR_HIGHLIGHT:
|
||||||
|
{
|
||||||
|
RGBColor hilite ;
|
||||||
|
LMGetHiliteRGB(&hilite) ;
|
||||||
|
return wxColor( hilite.red >> 8 , hilite.green >> 8 , hilite.blue >> 8 ) ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case wxSYS_COLOUR_BTNHIGHLIGHT:
|
||||||
|
case wxSYS_COLOUR_GRAYTEXT:
|
||||||
|
return wxColor( 0xCC , 0xCC , 0xCC ) ;
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxSYS_COLOUR_3DDKSHADOW:
|
||||||
|
return wxColor( 0x44 , 0x44 , 0x44 ) ;
|
||||||
|
break ;
|
||||||
|
case wxSYS_COLOUR_3DLIGHT:
|
||||||
|
return wxColor( 0xCC , 0xCC , 0xCC ) ;
|
||||||
|
break ;
|
||||||
|
case wxSYS_COLOUR_HIGHLIGHTTEXT :
|
||||||
|
{
|
||||||
|
RGBColor hilite ;
|
||||||
|
LMGetHiliteRGB(&hilite) ;
|
||||||
|
if ( ( hilite.red + hilite.green + hilite.blue ) == 0 )
|
||||||
|
return *wxWHITE ;
|
||||||
|
else
|
||||||
|
return *wxBLACK ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case wxSYS_COLOUR_INFOBK :
|
||||||
|
case wxSYS_COLOUR_APPWORKSPACE:
|
||||||
|
return *wxWHITE ;
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case wxSYS_COLOUR_HOTLIGHT:
|
||||||
|
case wxSYS_COLOUR_GRADIENTACTIVECAPTION:
|
||||||
|
case wxSYS_COLOUR_GRADIENTINACTIVECAPTION:
|
||||||
|
case wxSYS_COLOUR_MENUHILIGHT:
|
||||||
|
// TODO
|
||||||
|
return *wxBLACK;
|
||||||
|
|
||||||
|
case wxSYS_COLOUR_MAX:
|
||||||
|
wxFAIL_MSG( _T("unknown system colour index") );
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
return *wxWHITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// fonts
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxFont wxSystemSettingsNative::GetFont(wxSystemFont index)
|
||||||
|
{
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case wxSYS_ANSI_VAR_FONT :
|
||||||
|
case wxSYS_SYSTEM_FONT :
|
||||||
|
case wxSYS_DEVICE_DEFAULT_FONT :
|
||||||
|
case wxSYS_DEFAULT_GUI_FONT :
|
||||||
|
{
|
||||||
|
return *wxSMALL_FONT ;
|
||||||
|
} ;
|
||||||
|
break ;
|
||||||
|
case wxSYS_OEM_FIXED_FONT :
|
||||||
|
case wxSYS_ANSI_FIXED_FONT :
|
||||||
|
case wxSYS_SYSTEM_FIXED_FONT :
|
||||||
|
default :
|
||||||
|
{
|
||||||
|
return *wxNORMAL_FONT ;
|
||||||
|
} ;
|
||||||
|
break ;
|
||||||
|
|
||||||
|
}
|
||||||
|
return *wxNORMAL_FONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// system metrics/features
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Get a system metric, e.g. scrollbar size
|
||||||
|
int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
|
||||||
|
switch ( index)
|
||||||
|
{
|
||||||
|
case wxSYS_MOUSE_BUTTONS:
|
||||||
|
// we emulate a two button mouse (ctrl + click = right button )
|
||||||
|
return 2;
|
||||||
|
case wxSYS_BORDER_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_BORDER_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_CURSOR_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_CURSOR_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_DCLICK_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_DCLICK_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_DRAG_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_DRAG_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_EDGE_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_EDGE_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_HSCROLL_ARROW_X:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_HSCROLL_ARROW_Y:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_HTHUMB_X:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_ICON_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_ICON_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_ICONSPACING_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_ICONSPACING_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_WINDOWMIN_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_WINDOWMIN_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_SCREEN_X:
|
||||||
|
wxDisplaySize(&value, NULL);
|
||||||
|
return value;
|
||||||
|
case wxSYS_SCREEN_Y:
|
||||||
|
wxDisplaySize(NULL, &value);
|
||||||
|
return value;
|
||||||
|
case wxSYS_FRAMESIZE_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_FRAMESIZE_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_SMALLICON_X:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_SMALLICON_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_HSCROLL_Y:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_VSCROLL_X:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_VSCROLL_ARROW_X:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_VSCROLL_ARROW_Y:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_VTHUMB_Y:
|
||||||
|
return 16;
|
||||||
|
case wxSYS_CAPTION_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_MENU_Y:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_NETWORK_PRESENT:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_PENWINDOWS_PRESENT:
|
||||||
|
return 0;
|
||||||
|
case wxSYS_SHOW_SOUNDS:
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
case wxSYS_SWAP_BUTTONS:
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxSystemSettingsNative::HasFeature(wxSystemFeature index)
|
||||||
|
{
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case wxSYS_CAN_ICONIZE_FRAME:
|
||||||
|
case wxSYS_CAN_DRAW_FRAME_DECORATIONS:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
433
src/mac/classic/slider.cpp
Normal file
433
src/mac/classic/slider.cpp
Normal file
@@ -0,0 +1,433 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: slider.cpp
|
||||||
|
// Purpose: wxSlider
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "slider.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/slider.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxSlider, wxControl)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// The dimensions of the different styles of sliders (From Aqua document)
|
||||||
|
#define wxSLIDER_DIMENSIONACROSS 15
|
||||||
|
#define wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS 24
|
||||||
|
#define wxSLIDER_DIMENSIONACROSS_ARROW 18
|
||||||
|
|
||||||
|
// Distance between slider and text
|
||||||
|
#define wxSLIDER_BORDERTEXT 5
|
||||||
|
|
||||||
|
/* NB! The default orientation for a slider is horizontal however if the user specifies
|
||||||
|
* some slider styles but dosen't specify the orientation we have to assume he wants a
|
||||||
|
* horizontal one. Therefore in this file when testing for the sliders orientation
|
||||||
|
* vertical is tested for if this is not set then we use the horizontal one
|
||||||
|
* eg. if(GetWindowStyle() & wxSL_VERTICAL) {} else { horizontal case }>
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Slider
|
||||||
|
wxSlider::wxSlider()
|
||||||
|
{
|
||||||
|
m_pageSize = 1;
|
||||||
|
m_lineSize = 1;
|
||||||
|
m_rangeMax = 0;
|
||||||
|
m_rangeMin = 0;
|
||||||
|
m_tickFreq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
|
||||||
|
|
||||||
|
bool wxSlider::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
int value, int minValue, int maxValue,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
SInt16 procID;
|
||||||
|
|
||||||
|
m_macMinimumStatic = NULL ;
|
||||||
|
m_macMaximumStatic = NULL ;
|
||||||
|
m_macValueStatic = NULL ;
|
||||||
|
|
||||||
|
|
||||||
|
m_lineSize = 1;
|
||||||
|
m_tickFreq = 0;
|
||||||
|
|
||||||
|
m_rangeMax = maxValue;
|
||||||
|
m_rangeMin = minValue;
|
||||||
|
|
||||||
|
m_pageSize = (int)((maxValue-minValue)/10);
|
||||||
|
|
||||||
|
MacPreControlCreate( parent, id, wxEmptyString, pos, size, style,
|
||||||
|
validator, name, &bounds, title );
|
||||||
|
|
||||||
|
procID = kControlSliderProc + kControlSliderLiveFeedback;
|
||||||
|
if(style & wxSL_AUTOTICKS) {
|
||||||
|
procID += kControlSliderHasTickMarks;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, title, false,
|
||||||
|
value, minValue, maxValue, procID, (long) this);
|
||||||
|
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
::SetControlAction( (ControlHandle) m_macControl , wxMacLiveScrollbarActionUPP ) ;
|
||||||
|
|
||||||
|
if(style & wxSL_LABELS)
|
||||||
|
{
|
||||||
|
m_macMinimumStatic = new wxStaticText( this, -1, wxEmptyString );
|
||||||
|
m_macMaximumStatic = new wxStaticText( this, -1, wxEmptyString );
|
||||||
|
m_macValueStatic = new wxStaticText( this, -1, wxEmptyString );
|
||||||
|
SetRange(minValue, maxValue);
|
||||||
|
SetValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
m_macMinimumStatic = NULL ;
|
||||||
|
m_macMaximumStatic = NULL ;
|
||||||
|
m_macValueStatic = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(style & wxSL_VERTICAL) {
|
||||||
|
SetSizeHints(10, -1, 10, -1); // Forces SetSize to use the proper width
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SetSizeHints(-1, 10, -1, 10); // Forces SetSize to use the proper height
|
||||||
|
}
|
||||||
|
// NB! SetSizeHints is overloaded by wxSlider and will substitute 10 with the
|
||||||
|
// proper dimensions, it also means other people cannot bugger the slider with
|
||||||
|
// other values
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSlider::~wxSlider()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetValue() const
|
||||||
|
{
|
||||||
|
return GetControl32BitValue( (ControlHandle) m_macControl) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetValue(int value)
|
||||||
|
{
|
||||||
|
wxString valuestring ;
|
||||||
|
valuestring.Printf( wxT("%d") , value ) ;
|
||||||
|
if ( m_macValueStatic )
|
||||||
|
m_macValueStatic->SetLabel( valuestring ) ;
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , value ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetRange(int minValue, int maxValue)
|
||||||
|
{
|
||||||
|
wxString value;
|
||||||
|
|
||||||
|
m_rangeMin = minValue;
|
||||||
|
m_rangeMax = maxValue;
|
||||||
|
|
||||||
|
SetControl32BitMinimum( (ControlHandle) m_macControl, m_rangeMin);
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl, m_rangeMax);
|
||||||
|
|
||||||
|
if(m_macMinimumStatic) {
|
||||||
|
value.Printf(wxT("%d"), m_rangeMin);
|
||||||
|
m_macMinimumStatic->SetLabel(value);
|
||||||
|
}
|
||||||
|
if(m_macMaximumStatic) {
|
||||||
|
value.Printf(wxT("%d"), m_rangeMax);
|
||||||
|
m_macMaximumStatic->SetLabel(value);
|
||||||
|
}
|
||||||
|
SetValue(m_rangeMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For trackbars only
|
||||||
|
void wxSlider::SetTickFreq(int n, int pos)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
m_tickFreq = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetPageSize(int pageSize)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
m_pageSize = pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetPageSize() const
|
||||||
|
{
|
||||||
|
return m_pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::ClearSel()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::ClearTicks()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetLineSize(int lineSize)
|
||||||
|
{
|
||||||
|
m_lineSize = lineSize;
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetLineSize() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetSelEnd() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetSelStart() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetSelection(int minPos, int maxPos)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetThumbLength(int len)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSlider::GetThumbLength() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::SetTick(int tickPos)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::Command (wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
SetValue (event.GetInt());
|
||||||
|
ProcessCommand (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart, bool mouseStillDown )
|
||||||
|
{
|
||||||
|
SInt16 value = ::GetControl32BitValue( (ControlHandle) m_macControl ) ;
|
||||||
|
|
||||||
|
SetValue( value ) ;
|
||||||
|
|
||||||
|
wxEventType scrollEvent = wxEVT_NULL ;
|
||||||
|
|
||||||
|
if ( mouseStillDown )
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBTRACK;
|
||||||
|
else
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
|
||||||
|
|
||||||
|
wxScrollEvent event(scrollEvent, m_windowId);
|
||||||
|
event.SetPosition(value);
|
||||||
|
event.SetEventObject( this );
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
|
||||||
|
wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, m_windowId );
|
||||||
|
cevent.SetInt( value );
|
||||||
|
cevent.SetEventObject( this );
|
||||||
|
|
||||||
|
GetEventHandler()->ProcessEvent( cevent );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is overloaded in wxSlider so that the proper width/height will always be used
|
||||||
|
* for the slider different values would cause redrawing and mouse detection problems */
|
||||||
|
void wxSlider::SetSizeHints( int minW, int minH,
|
||||||
|
int maxW , int maxH ,
|
||||||
|
int incW , int incH )
|
||||||
|
{
|
||||||
|
wxSize size = GetBestSize();
|
||||||
|
|
||||||
|
if(GetWindowStyle() & wxSL_VERTICAL) {
|
||||||
|
wxWindow::SetSizeHints(size.x, minH, size.x, maxH, incW, incH);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wxWindow::SetSizeHints(minW, size.y, maxW, size.y, incW, incH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxSlider::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize size;
|
||||||
|
int textwidth, textheight;
|
||||||
|
|
||||||
|
if(GetWindowStyle() & wxSL_LABELS)
|
||||||
|
{
|
||||||
|
wxString text;
|
||||||
|
int ht, wd;
|
||||||
|
|
||||||
|
// Get maximum text label width and height
|
||||||
|
text.Printf(wxT("%d"), m_rangeMin);
|
||||||
|
GetTextExtent(text, &textwidth, &textheight);
|
||||||
|
text.Printf(wxT("%d"), m_rangeMax);
|
||||||
|
GetTextExtent(text, &wd, &ht);
|
||||||
|
if(ht > textheight) {
|
||||||
|
textheight = ht;
|
||||||
|
}
|
||||||
|
if (wd > textwidth) {
|
||||||
|
textwidth = wd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GetWindowStyle() & wxSL_VERTICAL)
|
||||||
|
{
|
||||||
|
if(GetWindowStyle() & wxSL_AUTOTICKS) {
|
||||||
|
size.x = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size.x = wxSLIDER_DIMENSIONACROSS_ARROW;
|
||||||
|
}
|
||||||
|
if(GetWindowStyle() & wxSL_LABELS) {
|
||||||
|
size.x += textwidth + wxSLIDER_BORDERTEXT;
|
||||||
|
}
|
||||||
|
size.y = 150;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(GetWindowStyle() & wxSL_AUTOTICKS) {
|
||||||
|
size.y = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size.y = wxSLIDER_DIMENSIONACROSS_ARROW;
|
||||||
|
}
|
||||||
|
if(GetWindowStyle() & wxSL_LABELS) {
|
||||||
|
size.y += textheight + wxSLIDER_BORDERTEXT;
|
||||||
|
}
|
||||||
|
size.x = 150;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
|
||||||
|
{
|
||||||
|
wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::MacUpdateDimensions()
|
||||||
|
{
|
||||||
|
// actually in the current systems this should never be possible, but later reparenting
|
||||||
|
// may become a reality
|
||||||
|
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
if ( GetParent() == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
|
||||||
|
if ( rootwindow == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
int xborder, yborder;
|
||||||
|
int minValWidth, maxValWidth, textwidth, textheight;
|
||||||
|
int sliderBreadth;
|
||||||
|
|
||||||
|
xborder = yborder = 0;
|
||||||
|
|
||||||
|
if (GetWindowStyle() & wxSL_LABELS)
|
||||||
|
{
|
||||||
|
wxString text;
|
||||||
|
int ht;
|
||||||
|
|
||||||
|
// Get maximum text label width and height
|
||||||
|
text.Printf(wxT("%d"), m_rangeMin);
|
||||||
|
GetTextExtent(text, &minValWidth, &textheight);
|
||||||
|
text.Printf(wxT("%d"), m_rangeMax);
|
||||||
|
GetTextExtent(text, &maxValWidth, &ht);
|
||||||
|
if(ht > textheight) {
|
||||||
|
textheight = ht;
|
||||||
|
}
|
||||||
|
textwidth = (minValWidth > maxValWidth ? minValWidth : maxValWidth);
|
||||||
|
|
||||||
|
xborder = textwidth + wxSLIDER_BORDERTEXT;
|
||||||
|
yborder = textheight + wxSLIDER_BORDERTEXT;
|
||||||
|
|
||||||
|
// Get slider breadth
|
||||||
|
if(GetWindowStyle() & wxSL_AUTOTICKS) {
|
||||||
|
sliderBreadth = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sliderBreadth = wxSLIDER_DIMENSIONACROSS_ARROW;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GetWindowStyle() & wxSL_VERTICAL)
|
||||||
|
{
|
||||||
|
m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT,
|
||||||
|
m_height - yborder - textheight);
|
||||||
|
m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0);
|
||||||
|
m_macValueStatic->Move(0, m_height - textheight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT);
|
||||||
|
m_macMaximumStatic->Move(m_width - xborder - maxValWidth / 2,
|
||||||
|
sliderBreadth + wxSLIDER_BORDERTEXT);
|
||||||
|
m_macValueStatic->Move(m_width - textwidth, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect oldBounds ;
|
||||||
|
GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ;
|
||||||
|
|
||||||
|
int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
|
||||||
|
int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
|
||||||
|
int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder - xborder ;
|
||||||
|
int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder - yborder ;
|
||||||
|
|
||||||
|
GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
|
||||||
|
bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
|
||||||
|
bool doResize = ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
|
||||||
|
if ( doMove || doResize )
|
||||||
|
{
|
||||||
|
InvalWindowRect( rootwindow, &oldBounds ) ;
|
||||||
|
if ( doMove )
|
||||||
|
{
|
||||||
|
UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
|
||||||
|
}
|
||||||
|
if ( doResize )
|
||||||
|
{
|
||||||
|
UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSlider::DoMoveWindow(int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
wxControl::DoMoveWindow(x,y,width,height) ;
|
||||||
|
}
|
||||||
243
src/mac/classic/sound.cpp
Normal file
243
src/mac/classic/sound.cpp
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: sound.cpp
|
||||||
|
// Purpose: wxSound class implementation: optional
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "sound.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/object.h"
|
||||||
|
#include "wx/string.h"
|
||||||
|
#include "wx/sound.h"
|
||||||
|
|
||||||
|
#if wxUSE_SOUND
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <Sound.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxSound::wxSound()
|
||||||
|
: m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSound::wxSound(const wxString& sFileName, bool isResource)
|
||||||
|
: m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(true)
|
||||||
|
{
|
||||||
|
Create(sFileName, isResource);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxSound::~wxSound()
|
||||||
|
{
|
||||||
|
FreeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSound::wxSound(int size, const wxByte* data)
|
||||||
|
: m_sndChan(0), m_hSnd(NULL), m_waveLength(0), m_isResource(false)
|
||||||
|
{
|
||||||
|
//TODO convert data
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxSound::Create(const wxString& fileName, bool isResource)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
m_sndname = fileName;
|
||||||
|
m_isResource = isResource;
|
||||||
|
|
||||||
|
if (m_isResource)
|
||||||
|
ret = true;
|
||||||
|
else
|
||||||
|
{ /*
|
||||||
|
if (sndChan)
|
||||||
|
{ // we're playing
|
||||||
|
FSClose(SndRefNum);
|
||||||
|
SndRefNum = 0;
|
||||||
|
SndDisposeChannel(sndChan, TRUE);
|
||||||
|
free(sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
KillTimer(0,timerID);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpSnd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (_access(lpSnd,0)) // no file, no service
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Allocate SndChannel
|
||||||
|
sndChan = (SndChannelPtr) malloc (sizeof(SndChannel));
|
||||||
|
|
||||||
|
if (!sndChan)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
sndChan->qLength = 128;
|
||||||
|
|
||||||
|
if (noErr != SndNewChannel (&sndChan, sampledSynth, initMono | initNoInterp, 0))
|
||||||
|
{
|
||||||
|
free(sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(SndRefNum = MacOpenSndFile ((char *)lpSnd)))
|
||||||
|
{
|
||||||
|
SndDisposeChannel(sndChan, TRUE);
|
||||||
|
free(sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool async = false;
|
||||||
|
|
||||||
|
if (fdwSound & SND_ASYNC)
|
||||||
|
async = true;
|
||||||
|
|
||||||
|
if (SndStartFilePlay(sndChan, SndRefNum, 0, 81920, 0, 0, 0, async) != noErr)
|
||||||
|
{
|
||||||
|
FSClose (SndRefNum);
|
||||||
|
SndRefNum = 0;
|
||||||
|
SndDisposeChannel (sndChan, TRUE);
|
||||||
|
free (sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (async)
|
||||||
|
{ // haven't finish yet
|
||||||
|
timerID = SetTimer(0, 0, 250, TimerCallBack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FSClose (SndRefNum);
|
||||||
|
SndRefNum = 0;
|
||||||
|
SndDisposeChannel (sndChan, TRUE);
|
||||||
|
free (sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//don't know what to do with looped, wth
|
||||||
|
bool wxSound::DoPlay(unsigned flags) const
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
if (m_isResource)
|
||||||
|
{
|
||||||
|
Str255 snd ;
|
||||||
|
wxMacStringToPascal( m_sndname , snd ) ;
|
||||||
|
SndListHandle hSnd;
|
||||||
|
|
||||||
|
hSnd = (SndListHandle) GetNamedResource('snd ', snd);
|
||||||
|
|
||||||
|
if ((hSnd != NULL) && (SndPlay((SndChannelPtr)m_sndChan, (SndListHandle) hSnd, (flags & wxSOUND_ASYNC)) == noErr))
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wxSound::FreeData()
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
if (m_isResource)
|
||||||
|
{
|
||||||
|
m_sndname.Empty();
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//TODO,
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//code below is from an old implementation used for telinfo with MSVC crossplatform support
|
||||||
|
//technology proceeds, so it would be the wisest to drop this code, but it's left here just
|
||||||
|
//for the sake of a reference. BTW: Wave files can now be played with QT, starting from V3
|
||||||
|
|
||||||
|
/*static short MacOpenSndFile (char * path)
|
||||||
|
{
|
||||||
|
VolumeParam vp;
|
||||||
|
FSSpec fspec;
|
||||||
|
Str255 name;
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
// first, get the volume reference number for the file. Start by
|
||||||
|
// making a Pstring with just the volume name
|
||||||
|
strcpy ((char *) name, path);
|
||||||
|
if (c = strchr ((char *) name, ':'))
|
||||||
|
{
|
||||||
|
c++;
|
||||||
|
*c = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
c2pstr ((char *) name);
|
||||||
|
vp.ioCompletion = 0;
|
||||||
|
vp.ioVolIndex = -1;
|
||||||
|
vp.ioNamePtr = name;
|
||||||
|
vp.ioVRefNum = 0;
|
||||||
|
|
||||||
|
if (PBGetVInfo((ParamBlockRec *)&vp, 0) != noErr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// next, buld an FSSpec for the file
|
||||||
|
strcpy ((char *) name, path);
|
||||||
|
c2pstr ((char *) name);
|
||||||
|
if (FSMakeFSSpec (vp.ioVRefNum, 0, name, &fspec) != noErr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
short frefnum;
|
||||||
|
// now open the file, and return it's reference number
|
||||||
|
if (FSpOpenDF(&fspec, fsRdPerm, &frefnum) != noErr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return frefnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TimerCallBack(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
|
||||||
|
{
|
||||||
|
if(!sndChan)
|
||||||
|
{
|
||||||
|
KillTimer(0,timerID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCStatus scstat;
|
||||||
|
|
||||||
|
if (noErr == SndChannelStatus (sndChan, sizeof (SCStatus), &scstat)) {
|
||||||
|
if (scstat.scChannelPaused || scstat.scChannelBusy)
|
||||||
|
return; // not done yet
|
||||||
|
}
|
||||||
|
|
||||||
|
// either error or done.
|
||||||
|
FSClose (SndRefNum);
|
||||||
|
SndRefNum = 0;
|
||||||
|
SndDisposeChannel (sndChan, TRUE);
|
||||||
|
free (sndChan);
|
||||||
|
sndChan = 0;
|
||||||
|
KillTimer(0,timerID);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
182
src/mac/classic/spinbutt.cpp
Normal file
182
src/mac/classic/spinbutt.cpp
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: spinbutt.cpp
|
||||||
|
// Purpose: wxSpinButton
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "spinbutt.h"
|
||||||
|
#pragma implementation "spinbuttbase.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/spinbutt.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxWin macros
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent, wxScrollEvent)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxSpinButton::wxSpinButton()
|
||||||
|
: wxSpinButtonBase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxSpinButton::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||||
|
long style, const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxSpinButtonBase::Create(parent, id, pos, size,
|
||||||
|
style, wxDefaultValidator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_min = 0;
|
||||||
|
m_max = 100;
|
||||||
|
|
||||||
|
if (!parent)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style,*( (wxValidator*) NULL ) , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 100,
|
||||||
|
kControlLittleArrowsProc , (long) this ) ;
|
||||||
|
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSpinButton::~wxSpinButton()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int wxSpinButton::GetMin() const
|
||||||
|
{
|
||||||
|
return m_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSpinButton::GetMax() const
|
||||||
|
{
|
||||||
|
return m_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSpinButton::GetValue() const
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinButton::SetValue(int val)
|
||||||
|
{
|
||||||
|
m_value = val ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinButton::SetRange(int minVal, int maxVal)
|
||||||
|
{
|
||||||
|
m_min = minVal;
|
||||||
|
m_max = maxVal;
|
||||||
|
SetControl32BitMaximum( (ControlHandle) m_macControl , maxVal ) ;
|
||||||
|
SetControl32BitMinimum((ControlHandle) m_macControl , minVal ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinButton::MacHandleValueChanged( int inc )
|
||||||
|
{
|
||||||
|
|
||||||
|
wxEventType scrollEvent = wxEVT_NULL;
|
||||||
|
int oldValue = m_value ;
|
||||||
|
|
||||||
|
m_value = oldValue + inc;
|
||||||
|
|
||||||
|
if (m_value < m_min)
|
||||||
|
{
|
||||||
|
if ( m_windowStyle & wxSP_WRAP )
|
||||||
|
m_value = m_max;
|
||||||
|
else
|
||||||
|
m_value = m_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_value > m_max)
|
||||||
|
{
|
||||||
|
if ( m_windowStyle & wxSP_WRAP )
|
||||||
|
m_value = m_min;
|
||||||
|
else
|
||||||
|
m_value = m_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_value - oldValue == -1 )
|
||||||
|
scrollEvent = wxEVT_SCROLL_LINEDOWN ;
|
||||||
|
else if ( m_value - oldValue == 1 )
|
||||||
|
scrollEvent = wxEVT_SCROLL_LINEUP ;
|
||||||
|
else
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBTRACK ;
|
||||||
|
|
||||||
|
wxSpinEvent event(scrollEvent, m_windowId);
|
||||||
|
|
||||||
|
event.SetPosition(m_value);
|
||||||
|
event.SetEventObject( this );
|
||||||
|
if ((GetEventHandler()->ProcessEvent( event )) &&
|
||||||
|
!event.IsAllowed() )
|
||||||
|
{
|
||||||
|
m_value = oldValue ;
|
||||||
|
}
|
||||||
|
SetControl32BitValue( (ControlHandle) m_macControl , m_value ) ;
|
||||||
|
|
||||||
|
/* always send a thumbtrack event */
|
||||||
|
if (scrollEvent != wxEVT_SCROLL_THUMBTRACK)
|
||||||
|
{
|
||||||
|
scrollEvent = wxEVT_SCROLL_THUMBTRACK;
|
||||||
|
wxSpinEvent event2( scrollEvent, GetId());
|
||||||
|
event2.SetPosition( m_value );
|
||||||
|
event2.SetEventObject( this );
|
||||||
|
GetEventHandler()->ProcessEvent( event2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinButton::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED(mouseStillDown))
|
||||||
|
{
|
||||||
|
if ( (ControlHandle) m_macControl == NULL )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
int nScrollInc = 0;
|
||||||
|
|
||||||
|
switch( controlpart )
|
||||||
|
{
|
||||||
|
case kControlUpButtonPart :
|
||||||
|
nScrollInc = 1;
|
||||||
|
break ;
|
||||||
|
case kControlDownButtonPart :
|
||||||
|
nScrollInc = -1;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
MacHandleValueChanged( nScrollInc ) ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// size calculation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxSize wxSpinButton::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
return wxSize(16,24);
|
||||||
|
}
|
||||||
|
|
||||||
333
src/mac/classic/spinctrl.cpp
Normal file
333
src/mac/classic/spinctrl.cpp
Normal file
@@ -0,0 +1,333 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: spinbutt.cpp
|
||||||
|
// Purpose: wxSpinCtrl
|
||||||
|
// Author: Robert
|
||||||
|
// Modified by: Mark Newsam (Based on GTK file)
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Robert Roebling
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "spinctlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/textctrl.h"
|
||||||
|
#endif //WX_PRECOMP
|
||||||
|
|
||||||
|
#if wxUSE_SPINCTRL
|
||||||
|
|
||||||
|
#include "wx/spinbutt.h"
|
||||||
|
#include "wx/spinctrl.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "wx/spinctrl.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// the margin between the text control and the spin
|
||||||
|
static const wxCoord MARGIN = 2;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxSpinCtrlText: text control used by spin control
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxSpinCtrlText : public wxTextCtrl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value)
|
||||||
|
: wxTextCtrl(spin , -1, value)
|
||||||
|
{
|
||||||
|
m_spin = spin;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnTextChange(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
if ( m_spin->GetTextValue(&val) )
|
||||||
|
{
|
||||||
|
m_spin->GetSpinButton()->SetValue(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProcessEvent(wxEvent &event)
|
||||||
|
{
|
||||||
|
// Hand button down events to wxSpinCtrl. Doesn't work.
|
||||||
|
if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event ))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return wxTextCtrl::ProcessEvent( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxSpinCtrl *m_spin;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl)
|
||||||
|
EVT_TEXT(-1, wxSpinCtrlText::OnTextChange)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxSpinCtrlButton: spin button used by spin control
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxSpinCtrlButton : public wxSpinButton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxSpinCtrlButton(wxSpinCtrl *spin, int style)
|
||||||
|
: wxSpinButton(spin )
|
||||||
|
{
|
||||||
|
m_spin = spin;
|
||||||
|
|
||||||
|
SetWindowStyle(style | wxSP_VERTICAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnSpinButton(wxSpinEvent& eventSpin)
|
||||||
|
{
|
||||||
|
#if defined(__WXMAC__) || defined(__WXMOTIF__)
|
||||||
|
m_spin->SetTextValue(eventSpin.GetPosition());
|
||||||
|
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId());
|
||||||
|
event.SetEventObject(m_spin);
|
||||||
|
event.SetInt(eventSpin.GetPosition());
|
||||||
|
|
||||||
|
m_spin->GetEventHandler()->ProcessEvent(event);
|
||||||
|
#else
|
||||||
|
m_spin->SetTextValue(eventSpin.GetPosition());
|
||||||
|
eventSpin.Skip();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxSpinCtrl *m_spin;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton)
|
||||||
|
EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl)
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxSpinCtrl creation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxSpinCtrl::Init()
|
||||||
|
{
|
||||||
|
m_text = NULL;
|
||||||
|
m_btn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxSpinCtrl::Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxString& value,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
int min,
|
||||||
|
int max,
|
||||||
|
int initial,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style,
|
||||||
|
wxDefaultValidator, name) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the string value overrides the numeric one (for backwards compatibility
|
||||||
|
// reasons and also because it is simpler to satisfy the string value which
|
||||||
|
// comes much sooner in the list of arguments and leave the initial
|
||||||
|
// parameter unspecified)
|
||||||
|
if ( !value.empty() )
|
||||||
|
{
|
||||||
|
long l;
|
||||||
|
if ( value.ToLong(&l) )
|
||||||
|
initial = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize csize = size ;
|
||||||
|
m_text = new wxSpinCtrlText(this, value);
|
||||||
|
m_btn = new wxSpinCtrlButton(this, style);
|
||||||
|
|
||||||
|
m_btn->SetRange(min, max);
|
||||||
|
m_btn->SetValue(initial);
|
||||||
|
|
||||||
|
if ( size.y == -1 ) {
|
||||||
|
csize.y = m_text->GetSize().y ;
|
||||||
|
}
|
||||||
|
DoSetSize(pos.x , pos.y , csize.x, csize.y);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSpinCtrl::~wxSpinCtrl()
|
||||||
|
{
|
||||||
|
// delete the controls now, don't leave them alive even though they would
|
||||||
|
// still be eventually deleted by our parent - but it will be too late, the
|
||||||
|
// user code expects them to be gone now
|
||||||
|
delete m_text;
|
||||||
|
m_text = NULL ;
|
||||||
|
delete m_btn;
|
||||||
|
m_btn = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// geometry
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxSize wxSpinCtrl::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize sizeBtn = m_btn->GetBestSize(),
|
||||||
|
sizeText = m_text->GetBestSize();
|
||||||
|
|
||||||
|
return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
wxControl::DoMoveWindow(x, y, width, height);
|
||||||
|
|
||||||
|
// position the subcontrols inside the client area
|
||||||
|
wxSize sizeBtn = m_btn->GetSize();
|
||||||
|
|
||||||
|
wxCoord wText = width - sizeBtn.x;
|
||||||
|
m_text->SetSize(0, 0, wText, height);
|
||||||
|
m_btn->SetSize(0 + wText + MARGIN, 0, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// operations forwarded to the subcontrols
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxSpinCtrl::Enable(bool enable)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Enable(enable) )
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxSpinCtrl::Show(bool show)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Show(show) )
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// value and range access
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxSpinCtrl::GetTextValue(int *val) const
|
||||||
|
{
|
||||||
|
long l;
|
||||||
|
if ( !m_text->GetValue().ToLong(&l) )
|
||||||
|
{
|
||||||
|
// not a number at all
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( l < GetMin() || l > GetMax() )
|
||||||
|
{
|
||||||
|
// out of range
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*val = l;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSpinCtrl::GetValue() const
|
||||||
|
{
|
||||||
|
return m_btn ? m_btn->GetValue() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSpinCtrl::GetMin() const
|
||||||
|
{
|
||||||
|
return m_btn ? m_btn->GetMin() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxSpinCtrl::GetMax() const
|
||||||
|
{
|
||||||
|
return m_btn ? m_btn->GetMax() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// changing value and range
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxSpinCtrl::SetTextValue(int val)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") );
|
||||||
|
|
||||||
|
m_text->SetValue(wxString::Format(_T("%d"), val));
|
||||||
|
|
||||||
|
// select all text
|
||||||
|
m_text->SetSelection(0, -1);
|
||||||
|
|
||||||
|
// and give focus to the control!
|
||||||
|
// m_text->SetFocus(); Why???? TODO.
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinCtrl::SetValue(int val)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") );
|
||||||
|
|
||||||
|
SetTextValue(val);
|
||||||
|
|
||||||
|
m_btn->SetValue(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinCtrl::SetValue(const wxString& text)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") );
|
||||||
|
|
||||||
|
long val;
|
||||||
|
if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) )
|
||||||
|
{
|
||||||
|
SetValue((int)val);
|
||||||
|
}
|
||||||
|
else // not a number at all or out of range
|
||||||
|
{
|
||||||
|
m_text->SetValue(text);
|
||||||
|
m_text->SetSelection(0, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinCtrl::SetRange(int min, int max)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") );
|
||||||
|
|
||||||
|
m_btn->SetRange(min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxSpinCtrl::SetSelection(long from, long to)
|
||||||
|
{
|
||||||
|
// if from and to are both -1, it means (in wxWindows) that all text should
|
||||||
|
// be selected
|
||||||
|
if ( (from == -1) && (to == -1) )
|
||||||
|
{
|
||||||
|
from = 0;
|
||||||
|
}
|
||||||
|
m_text->SetSelection(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_SPINCTRL
|
||||||
86
src/mac/classic/statbmp.cpp
Normal file
86
src/mac/classic/statbmp.cpp
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: statbmp.cpp
|
||||||
|
// Purpose: wxStaticBitmap
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "statbmp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/statbmp.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxStaticBitmap
|
||||||
|
*/
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxStaticBitmap, wxStaticBitmapBase)
|
||||||
|
EVT_PAINT(wxStaticBitmap::OnPaint)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxBitmap& bitmap,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& s,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
SetName(name);
|
||||||
|
wxSize size = s ;
|
||||||
|
if ( bitmap.Ok() )
|
||||||
|
{
|
||||||
|
if ( size.x == -1 )
|
||||||
|
size.x = bitmap.GetWidth() ;
|
||||||
|
if ( size.y == -1 )
|
||||||
|
size.y = bitmap.GetHeight() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||||
|
m_foregroundColour = parent->GetForegroundColour() ;
|
||||||
|
|
||||||
|
m_bitmap = bitmap;
|
||||||
|
if ( id == -1 )
|
||||||
|
m_windowId = (int)NewControlId();
|
||||||
|
else
|
||||||
|
m_windowId = id;
|
||||||
|
|
||||||
|
m_windowStyle = style;
|
||||||
|
|
||||||
|
bool ret = wxControl::Create( parent, id, pos, size, style , wxDefaultValidator , name );
|
||||||
|
SetBestSize( size ) ;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap)
|
||||||
|
{
|
||||||
|
m_bitmap = bitmap;
|
||||||
|
SetSize(wxSize(bitmap.GetWidth(), bitmap.GetHeight()));
|
||||||
|
Refresh() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticBitmap::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
PrepareDC(dc);
|
||||||
|
|
||||||
|
dc.DrawBitmap( m_bitmap , 0 , 0 , TRUE ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxStaticBitmap::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
return wxWindow::DoGetBestSize() ;
|
||||||
|
}
|
||||||
|
|
||||||
56
src/mac/classic/statbox.cpp
Normal file
56
src/mac/classic/statbox.cpp
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: statbox.cpp
|
||||||
|
// Purpose: wxStaticBox
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "statbox.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/statbox.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxStaticBox, wxControl)
|
||||||
|
EVT_ERASE_BACKGROUND(wxStaticBox::OnEraseBackground)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Static box
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size,
|
||||||
|
style, wxDefaultValidator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , label , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlGroupBoxTextTitleProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
155
src/mac/classic/statbrma.cpp
Normal file
155
src/mac/classic/statbrma.cpp
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: statbar.cpp
|
||||||
|
// Purpose: native implementation of wxStatusBar (optional)
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1998 Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "statbrma.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "wx/statusbr.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxStatusBarMac, wxStatusBarGeneric)
|
||||||
|
EVT_PAINT(wxStatusBarMac::OnPaint)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxStatusBarMac class
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxStatusBarMac::wxStatusBarMac()
|
||||||
|
{
|
||||||
|
SetParent(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxStatusBarMac::~wxStatusBarMac()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxStatusBarMac::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
long style ,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
return wxStatusBarGeneric::Create( parent , id , style , name ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStatusBarMac::DrawFieldText(wxDC& dc, int i)
|
||||||
|
{
|
||||||
|
int leftMargin = 2;
|
||||||
|
|
||||||
|
wxRect rect;
|
||||||
|
GetFieldRect(i, rect);
|
||||||
|
|
||||||
|
if ( !IsWindowHilited( MAC_WXHWND( MacGetRootWindow() ) ) )
|
||||||
|
{
|
||||||
|
dc.SetTextForeground( wxColour( 0x80 , 0x80 , 0x80 ) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString text(GetStatusText(i));
|
||||||
|
|
||||||
|
long x, y;
|
||||||
|
|
||||||
|
dc.GetTextExtent(text, &x, &y);
|
||||||
|
|
||||||
|
int xpos = rect.x + leftMargin + 1 ;
|
||||||
|
int ypos = 1 ;
|
||||||
|
|
||||||
|
dc.SetClippingRegion(rect.x, 0, rect.width, m_height);
|
||||||
|
|
||||||
|
dc.DrawText(text, xpos, ypos);
|
||||||
|
|
||||||
|
dc.DestroyClippingRegion();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStatusBarMac::DrawField(wxDC& dc, int i)
|
||||||
|
{
|
||||||
|
DrawFieldText(dc, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStatusBarMac::SetStatusText(const wxString& text, int number)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( (number >= 0) && (number < m_nFields),
|
||||||
|
_T("invalid status bar field index") );
|
||||||
|
|
||||||
|
m_statusStrings[number] = text;
|
||||||
|
wxRect rect;
|
||||||
|
GetFieldRect(number, rect);
|
||||||
|
rect.y=0;
|
||||||
|
rect.height = m_height ;
|
||||||
|
Refresh( TRUE , &rect ) ;
|
||||||
|
Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStatusBarMac::OnPaint(wxPaintEvent& WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
dc.Clear() ;
|
||||||
|
|
||||||
|
int major,minor;
|
||||||
|
wxGetOsVersion( &major, &minor );
|
||||||
|
|
||||||
|
if ( IsWindowHilited( MAC_WXHWND( MacGetRootWindow() ) ) )
|
||||||
|
{
|
||||||
|
wxPen white( wxWHITE , 1 , wxSOLID ) ;
|
||||||
|
if (major >= 10)
|
||||||
|
{
|
||||||
|
//Finder statusbar border color: (Project builder similar is 9B9B9B)
|
||||||
|
dc.SetPen(wxPen(wxColour(0xB1,0xB1,0xB1),1,wxSOLID));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxPen black( wxBLACK , 1 , wxSOLID ) ;
|
||||||
|
dc.SetPen(black);
|
||||||
|
}
|
||||||
|
dc.DrawLine(0, 0 ,
|
||||||
|
m_width , 0);
|
||||||
|
dc.SetPen(white);
|
||||||
|
dc.DrawLine(0, 1 ,
|
||||||
|
m_width , 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (major >= 10)
|
||||||
|
//Finder statusbar border color: (Project builder similar is 9B9B9B)
|
||||||
|
dc.SetPen(wxPen(wxColour(0xB1,0xB1,0xB1),1,wxSOLID));
|
||||||
|
else
|
||||||
|
dc.SetPen(wxPen(wxColour(0x80,0x80,0x80),1,wxSOLID));
|
||||||
|
|
||||||
|
dc.DrawLine(0, 0 ,
|
||||||
|
m_width , 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
if ( GetFont().Ok() )
|
||||||
|
dc.SetFont(GetFont());
|
||||||
|
dc.SetBackgroundMode(wxTRANSPARENT);
|
||||||
|
|
||||||
|
for ( i = 0; i < m_nFields; i ++ )
|
||||||
|
DrawField(dc, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStatusBarMac::MacSuperEnabled( bool enabled )
|
||||||
|
{
|
||||||
|
Refresh(FALSE) ;
|
||||||
|
wxWindow::MacSuperEnabled( enabled ) ;
|
||||||
|
}
|
||||||
61
src/mac/classic/statline.cpp
Normal file
61
src/mac/classic/statline.cpp
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: generic/statline.cpp
|
||||||
|
// Purpose: a generic wxStaticLine class
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Created: 28.06.99
|
||||||
|
// Version: $Id$
|
||||||
|
// Copyright: (c) 1998 Vadim Zeitlin
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "statline.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/statline.h"
|
||||||
|
#include "wx/statbox.h"
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxStaticLine, wxControl)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxStaticLine
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxStaticLine::Create( wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint &pos,
|
||||||
|
const wxSize &size,
|
||||||
|
long style,
|
||||||
|
const wxString &name)
|
||||||
|
{
|
||||||
|
if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// ok, this is ugly but it's better than nothing: use a thin static box to
|
||||||
|
// emulate static line
|
||||||
|
|
||||||
|
wxSize sizeReal = AdjustSize(size);
|
||||||
|
|
||||||
|
// m_statbox = new wxStaticBox(parent, id, wxT(""), pos, sizeReal, style, name);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
67
src/mac/classic/statlmac.cpp
Normal file
67
src/mac/classic/statlmac.cpp
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: generic/statline.cpp
|
||||||
|
// Purpose: a generic wxStaticLine class
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Created: 28.06.99
|
||||||
|
// Version: $Id$
|
||||||
|
// Copyright: (c) 1998 Vadim Zeitlin
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declarations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "statline.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/statline.h"
|
||||||
|
#include "wx/statbox.h"
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxStaticLine, wxControl)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxStaticLine
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxStaticLine::Create( wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint &pos,
|
||||||
|
const wxSize &size,
|
||||||
|
long style,
|
||||||
|
const wxString &name)
|
||||||
|
{
|
||||||
|
if ( !wxStaticLineBase::Create(parent, id, pos, size,
|
||||||
|
style, wxDefaultValidator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlSeparatorLineProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
262
src/mac/classic/stattext.cpp
Normal file
262
src/mac/classic/stattext.cpp
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: stattext.cpp
|
||||||
|
// Purpose: wxStaticText
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "stattext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/stattext.h"
|
||||||
|
#include "wx/notebook.h"
|
||||||
|
#include "wx/tabctrl.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxStaticText, wxStaticTextBase)
|
||||||
|
EVT_PAINT(wxStaticText::OnPaint)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size,
|
||||||
|
long style,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
m_label = wxStripMenuCodes(label) ;
|
||||||
|
|
||||||
|
if ( !wxControl::Create( parent, id, pos, size, style,
|
||||||
|
wxDefaultValidator , name ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetBestSize( size ) ;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wxString punct = wxT(" ,.-;:!?");
|
||||||
|
|
||||||
|
void wxStaticText::DrawParagraph(wxDC &dc, wxString paragraph, int &y)
|
||||||
|
{
|
||||||
|
long width, height ;
|
||||||
|
|
||||||
|
if (paragraph.Length() == 0)
|
||||||
|
{
|
||||||
|
// empty line
|
||||||
|
dc.GetTextExtent( wxT("H"), &width, &height );
|
||||||
|
y += height;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = 0 ;
|
||||||
|
|
||||||
|
bool linedrawn = true;
|
||||||
|
while( paragraph.Length() > 0 )
|
||||||
|
{
|
||||||
|
dc.GetTextExtent( paragraph , &width , &height ) ;
|
||||||
|
|
||||||
|
if ( width > m_width )
|
||||||
|
{
|
||||||
|
for ( size_t p = paragraph.Length() - 1 ; p > 0 ; --p )
|
||||||
|
{
|
||||||
|
if ((punct.Find(paragraph[p]) != wxNOT_FOUND) || !linedrawn)
|
||||||
|
{
|
||||||
|
int blank = (paragraph[p] == ' ') ? 0 : 1;
|
||||||
|
|
||||||
|
dc.GetTextExtent( paragraph.Left(p + blank) , &width , &height ) ;
|
||||||
|
|
||||||
|
if ( width <= m_width )
|
||||||
|
{
|
||||||
|
int pos = x ;
|
||||||
|
if ( HasFlag( wxALIGN_CENTER ) )
|
||||||
|
{
|
||||||
|
pos += ( m_width - width ) / 2 ;
|
||||||
|
}
|
||||||
|
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||||
|
{
|
||||||
|
pos += ( m_width - width ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.DrawText( paragraph.Left(p + blank), pos , y) ;
|
||||||
|
y += height ;
|
||||||
|
paragraph = paragraph.Mid(p+1) ;
|
||||||
|
linedrawn = true;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
linedrawn = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pos = x ;
|
||||||
|
if ( HasFlag( wxALIGN_CENTER ) )
|
||||||
|
{
|
||||||
|
pos += ( m_width - width ) / 2 ;
|
||||||
|
}
|
||||||
|
else if ( HasFlag( wxALIGN_RIGHT ) )
|
||||||
|
{
|
||||||
|
pos += ( m_width - width ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc.DrawText( paragraph, pos , y) ;
|
||||||
|
paragraph=wxEmptyString;
|
||||||
|
y += height ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticText::OnDraw( wxDC &dc )
|
||||||
|
{
|
||||||
|
if (m_width <= 0 || m_height <= 0)
|
||||||
|
return;
|
||||||
|
/*
|
||||||
|
dc.Clear() ;
|
||||||
|
wxRect rect(0,0,m_width,m_height) ;
|
||||||
|
dc.SetFont(*wxSMALL_FONT) ;
|
||||||
|
|
||||||
|
dc.DrawRectangle(rect) ;
|
||||||
|
*/
|
||||||
|
if ( !IsWindowHilited( (WindowRef) MacGetRootWindow() ) &&
|
||||||
|
( GetBackgroundColour() == wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE )
|
||||||
|
|| GetBackgroundColour() == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) )
|
||||||
|
{
|
||||||
|
dc.SetTextForeground( wxColour( 0x80 , 0x80 , 0x80 ) ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dc.SetTextForeground( GetForegroundColour() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString paragraph;
|
||||||
|
size_t i = 0 ;
|
||||||
|
wxString text = m_label;
|
||||||
|
int y = 0 ;
|
||||||
|
while (i < text.Length())
|
||||||
|
{
|
||||||
|
|
||||||
|
if (text[i] == 13 || text[i] == 10)
|
||||||
|
{
|
||||||
|
DrawParagraph(dc, paragraph,y);
|
||||||
|
paragraph = wxEmptyString ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
paragraph += text[i];
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
if (paragraph.Length() > 0)
|
||||||
|
DrawParagraph(dc, paragraph,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticText::OnPaint( wxPaintEvent & WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
OnDraw( dc ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxStaticText::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
int widthTextMax = 0, widthLine,
|
||||||
|
heightTextTotal = 0, heightLineDefault = 0, heightLine = 0;
|
||||||
|
|
||||||
|
wxString curLine;
|
||||||
|
for ( const wxChar *pc = m_label; ; pc++ )
|
||||||
|
{
|
||||||
|
if ( *pc == wxT('\n') || *pc == wxT('\r') || *pc == wxT('\0') )
|
||||||
|
{
|
||||||
|
if ( !curLine )
|
||||||
|
{
|
||||||
|
// we can't use GetTextExtent - it will return 0 for both width
|
||||||
|
// and height and an empty line should count in height
|
||||||
|
// calculation
|
||||||
|
if ( !heightLineDefault )
|
||||||
|
heightLineDefault = heightLine;
|
||||||
|
if ( !heightLineDefault )
|
||||||
|
GetTextExtent(_T("W"), NULL, &heightLineDefault);
|
||||||
|
|
||||||
|
heightTextTotal += heightLineDefault;
|
||||||
|
|
||||||
|
heightTextTotal++; // FIXME: why is this necessary?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetTextExtent(curLine, &widthLine, &heightLine);
|
||||||
|
if ( widthLine > widthTextMax )
|
||||||
|
widthTextMax = widthLine;
|
||||||
|
heightTextTotal += heightLine;
|
||||||
|
|
||||||
|
heightTextTotal++; // FIXME: why is this necessary?
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( *pc == wxT('\n') || *pc == wxT('\r')) {
|
||||||
|
curLine.Empty();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// the end of string
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
curLine += *pc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxSize(widthTextMax, heightTextTotal);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStaticText::SetLabel(const wxString& st )
|
||||||
|
{
|
||||||
|
SetTitle( st ) ;
|
||||||
|
m_label = st ;
|
||||||
|
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
|
||||||
|
{
|
||||||
|
// temporary fix until layout measurement and drawing are in synch again
|
||||||
|
Refresh() ;
|
||||||
|
SetSize( GetBestSize() ) ;
|
||||||
|
}
|
||||||
|
Refresh() ;
|
||||||
|
Update() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxStaticText::SetFont(const wxFont& font)
|
||||||
|
{
|
||||||
|
bool ret = wxControl::SetFont(font);
|
||||||
|
|
||||||
|
if ( ret )
|
||||||
|
{
|
||||||
|
// adjust the size of the window to fit to the label unless autoresizing is
|
||||||
|
// disabled
|
||||||
|
if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
|
||||||
|
{
|
||||||
|
// temporary fix until layout measurement and drawing are in synch again
|
||||||
|
Refresh() ;
|
||||||
|
SetSize( GetBestSize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
206
src/mac/classic/tabctrl.cpp
Normal file
206
src/mac/classic/tabctrl.cpp
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: tabctrl.cpp
|
||||||
|
// Purpose: wxTabCtrl
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "tabctrl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#include "wx/control.h"
|
||||||
|
#include "wx/tabctrl.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxTabCtrl, wxControl)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxTabCtrl, wxControl)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxTabCtrl::wxTabCtrl()
|
||||||
|
{
|
||||||
|
m_imageList = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTabCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||||
|
long style, const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size,
|
||||||
|
style, wxDefaultValidator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
m_imageList = NULL;
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, wxDefaultValidator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , 0 , 1,
|
||||||
|
kControlTabSmallProc , (long) this ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTabCtrl::~wxTabCtrl()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTabCtrl::Command(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete all items
|
||||||
|
bool wxTabCtrl::DeleteAllItems()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete an item
|
||||||
|
bool wxTabCtrl::DeleteItem(int item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the selection
|
||||||
|
int wxTabCtrl::GetSelection() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the tab with the current keyboard focus
|
||||||
|
int wxTabCtrl::GetCurFocus() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the associated image list
|
||||||
|
wxImageList* wxTabCtrl::GetImageList() const
|
||||||
|
{
|
||||||
|
return m_imageList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the number of items
|
||||||
|
int wxTabCtrl::GetItemCount() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the rect corresponding to the tab
|
||||||
|
bool wxTabCtrl::GetItemRect(int item, wxRect& wxrect) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the number of rows
|
||||||
|
int wxTabCtrl::GetRowCount() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the item text
|
||||||
|
wxString wxTabCtrl::GetItemText(int item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the item image
|
||||||
|
int wxTabCtrl::GetItemImage(int item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the item data
|
||||||
|
void* wxTabCtrl::GetItemData(int item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hit test
|
||||||
|
int wxTabCtrl::HitTest(const wxPoint& pt, long& flags)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert an item
|
||||||
|
bool wxTabCtrl::InsertItem(int item, const wxString& text, int imageId, void* data)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the selection
|
||||||
|
int wxTabCtrl::SetSelection(int item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the image list
|
||||||
|
void wxTabCtrl::SetImageList(wxImageList* imageList)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the text for an item
|
||||||
|
bool wxTabCtrl::SetItemText(int item, const wxString& text)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the image for an item
|
||||||
|
bool wxTabCtrl::SetItemImage(int item, int image)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the data for an item
|
||||||
|
bool wxTabCtrl::SetItemData(int item, void* data)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the size for a fixed-width tab control
|
||||||
|
void wxTabCtrl::SetItemSize(const wxSize& size)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the padding between tabs
|
||||||
|
void wxTabCtrl::SetPadding(const wxSize& padding)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tab event
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxTabEvent, wxCommandEvent)
|
||||||
|
|
||||||
|
wxTabEvent::wxTabEvent(wxEventType commandType, int id):
|
||||||
|
wxCommandEvent(commandType, id)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
1810
src/mac/classic/textctrl.cpp
Normal file
1810
src/mac/classic/textctrl.cpp
Normal file
File diff suppressed because it is too large
Load Diff
127
src/mac/classic/tglbtn.cpp
Normal file
127
src/mac/classic/tglbtn.cpp
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: src/mac/tglbtn.cpp
|
||||||
|
// Purpose: Definition of the wxToggleButton class, which implements a
|
||||||
|
// toggle button under wxMac.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 08.02.01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 2000 Johnny C. Norris II
|
||||||
|
// License: Rocketeer license
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// declatations
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "button.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/tglbtn.h"
|
||||||
|
|
||||||
|
#if wxUSE_TOGGLEBTN
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
// Button
|
||||||
|
|
||||||
|
static const int kMacOSXHorizontalBorder = 2 ;
|
||||||
|
static const int kMacOSXVerticalBorder = 4 ;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// macros
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||||
|
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxToggleButton
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Single check box item
|
||||||
|
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size, long style,
|
||||||
|
const wxValidator& validator,
|
||||||
|
const wxString& name)
|
||||||
|
{
|
||||||
|
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Rect bounds ;
|
||||||
|
Str255 title ;
|
||||||
|
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
m_macHorizontalBorder = kMacOSXHorizontalBorder;
|
||||||
|
m_macVerticalBorder = kMacOSXVerticalBorder;
|
||||||
|
}
|
||||||
|
|
||||||
|
MacPreControlCreate( parent , id , label , pos , size ,style, validator , name , &bounds , title ) ;
|
||||||
|
|
||||||
|
m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , 0 , kControlBehaviorToggles , 1,
|
||||||
|
kControlBevelButtonNormalBevelProc , (long) this ) ;
|
||||||
|
wxASSERT_MSG( (ControlHandle) m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||||
|
|
||||||
|
MacPostControlCreate() ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize wxToggleButton::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
int wBtn = 70 ;
|
||||||
|
int hBtn = 20 ;
|
||||||
|
|
||||||
|
int lBtn = m_label.Length() * 8 + 12 ;
|
||||||
|
if (lBtn > wBtn)
|
||||||
|
wBtn = lBtn;
|
||||||
|
|
||||||
|
if ( UMAHasAquaLayout() )
|
||||||
|
{
|
||||||
|
wBtn += 2 * kMacOSXHorizontalBorder ;
|
||||||
|
hBtn += 2 * kMacOSXVerticalBorder ;
|
||||||
|
}
|
||||||
|
return wxSize ( wBtn , hBtn ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToggleButton::SetValue(bool val)
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( (ControlHandle) m_macControl , val ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxToggleButton::GetValue() const
|
||||||
|
{
|
||||||
|
return GetControl32BitValue( (ControlHandle) m_macControl ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToggleButton::Command(wxCommandEvent & event)
|
||||||
|
{
|
||||||
|
SetValue((event.GetInt() != 0));
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToggleButton::MacHandleControlClick( WXWidget WXUNUSED(control) , wxInt16 controlpart , bool WXUNUSED(mouseStillDown) )
|
||||||
|
{
|
||||||
|
if ( controlpart != kControlNoPart )
|
||||||
|
{
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
|
||||||
|
event.SetInt(GetValue());
|
||||||
|
event.SetEventObject(this);
|
||||||
|
ProcessCommand(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_TOGGLEBTN
|
||||||
|
|
||||||
921
src/mac/classic/thread.cpp
Normal file
921
src/mac/classic/thread.cpp
Normal file
@@ -0,0 +1,921 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: thread.cpp
|
||||||
|
// Purpose: wxThread Implementation
|
||||||
|
// Author: Original from Wolfram Gloger/Guilhem Lavaux/Vadim Zeitlin
|
||||||
|
// Modified by: Stefan Csomor
|
||||||
|
// Created: 04/22/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998),
|
||||||
|
// Vadim Zeitlin (1999) , Stefan Csomor (2000)
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "thread.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__)
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/wx.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
|
||||||
|
#include "wx/module.h"
|
||||||
|
#include "wx/thread.h"
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
#include <Threads.h>
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include "wx/mac/macnotfy.h"
|
||||||
|
#include <Timer.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define INFINITE 0xFFFFFFFF
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// the possible states of the thread ("=>" shows all possible transitions from
|
||||||
|
// this state)
|
||||||
|
enum wxThreadState
|
||||||
|
{
|
||||||
|
STATE_NEW, // didn't start execution yet (=> RUNNING)
|
||||||
|
STATE_RUNNING, // thread is running (=> PAUSED, CANCELED)
|
||||||
|
STATE_PAUSED, // thread is temporarily suspended (=> RUNNING)
|
||||||
|
STATE_CANCELED, // thread should terminate a.s.a.p. (=> EXITED)
|
||||||
|
STATE_EXITED // thread is terminating
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// this module globals
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static ThreadID gs_idMainThread = kNoThreadID ;
|
||||||
|
static bool gs_waitingForThread = FALSE ;
|
||||||
|
size_t g_numberOfThreads = 0;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// MacOS implementation of thread classes
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
class wxMacStCritical
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
wxMacStCritical()
|
||||||
|
{
|
||||||
|
if ( UMASystemIsInitialized() )
|
||||||
|
ThreadBeginCritical() ;
|
||||||
|
}
|
||||||
|
~wxMacStCritical()
|
||||||
|
{
|
||||||
|
if ( UMASystemIsInitialized() )
|
||||||
|
ThreadEndCritical() ;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxMutex implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxMutexInternal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxMutexInternal(wxMutexType WXUNUSED(mutexType))
|
||||||
|
{
|
||||||
|
m_owner = kNoThreadID ;
|
||||||
|
m_locked = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
~wxMutexInternal()
|
||||||
|
{
|
||||||
|
if ( m_locked > 0 )
|
||||||
|
{
|
||||||
|
wxLogDebug(_T("Warning: freeing a locked mutex (%ld locks)."), m_locked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsOk() const { return true; }
|
||||||
|
|
||||||
|
wxMutexError Lock() ;
|
||||||
|
wxMutexError TryLock() ;
|
||||||
|
wxMutexError Unlock();
|
||||||
|
public:
|
||||||
|
ThreadID m_owner ;
|
||||||
|
wxArrayLong m_waiters ;
|
||||||
|
long m_locked ;
|
||||||
|
};
|
||||||
|
|
||||||
|
wxMutexError wxMutexInternal::Lock()
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
if ( UMASystemIsInitialized() )
|
||||||
|
{
|
||||||
|
OSErr err ;
|
||||||
|
ThreadID current = kNoThreadID;
|
||||||
|
err = ::MacGetCurrentThread(¤t);
|
||||||
|
// if we are not the owner, add this thread to the list of waiting threads, stop this thread
|
||||||
|
// and invoke the scheduler to continue executing the owner's thread
|
||||||
|
while ( m_owner != kNoThreadID && m_owner != current)
|
||||||
|
{
|
||||||
|
m_waiters.Add(current);
|
||||||
|
err = ::SetThreadStateEndCritical(kCurrentThreadID, kStoppedThreadState, m_owner);
|
||||||
|
err = ::ThreadBeginCritical();
|
||||||
|
}
|
||||||
|
m_owner = current;
|
||||||
|
}
|
||||||
|
m_locked++;
|
||||||
|
|
||||||
|
return wxMUTEX_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMutexError wxMutexInternal::TryLock()
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
if ( UMASystemIsInitialized() )
|
||||||
|
{
|
||||||
|
ThreadID current = kNoThreadID;
|
||||||
|
::MacGetCurrentThread(¤t);
|
||||||
|
// if we are not the owner, give an error back
|
||||||
|
if ( m_owner != kNoThreadID && m_owner != current )
|
||||||
|
return wxMUTEX_BUSY;
|
||||||
|
|
||||||
|
m_owner = current;
|
||||||
|
}
|
||||||
|
m_locked++;
|
||||||
|
|
||||||
|
return wxMUTEX_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMutexError wxMutexInternal::Unlock()
|
||||||
|
{
|
||||||
|
if ( UMASystemIsInitialized() )
|
||||||
|
{
|
||||||
|
OSErr err;
|
||||||
|
err = ::ThreadBeginCritical();
|
||||||
|
|
||||||
|
if (m_locked > 0)
|
||||||
|
m_locked--;
|
||||||
|
|
||||||
|
// this mutex is not owned by anybody anmore
|
||||||
|
m_owner = kNoThreadID;
|
||||||
|
|
||||||
|
// now pass on to the first waiting thread
|
||||||
|
ThreadID firstWaiting = kNoThreadID;
|
||||||
|
bool found = false;
|
||||||
|
while (!m_waiters.IsEmpty() && !found)
|
||||||
|
{
|
||||||
|
firstWaiting = m_waiters[0];
|
||||||
|
err = ::SetThreadState(firstWaiting, kReadyThreadState, kNoThreadID);
|
||||||
|
// in case this was not successful (dead thread), we just loop on and reset the id
|
||||||
|
found = (err != threadNotFoundErr);
|
||||||
|
if ( !found )
|
||||||
|
firstWaiting = kNoThreadID ;
|
||||||
|
m_waiters.RemoveAt(0) ;
|
||||||
|
}
|
||||||
|
// now we have a valid firstWaiting thread, which has been scheduled to run next, just end the
|
||||||
|
// critical section and invoke the scheduler
|
||||||
|
err = ::SetThreadStateEndCritical(kCurrentThreadID, kReadyThreadState, firstWaiting);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_locked > 0)
|
||||||
|
m_locked--;
|
||||||
|
}
|
||||||
|
return wxMUTEX_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// wxSemaphore
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO not yet implemented
|
||||||
|
|
||||||
|
class wxSemaphoreInternal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxSemaphoreInternal(int initialcount, int maxcount);
|
||||||
|
~wxSemaphoreInternal();
|
||||||
|
|
||||||
|
bool IsOk() const { return true ; }
|
||||||
|
|
||||||
|
wxSemaError Wait() { return WaitTimeout(INFINITE); }
|
||||||
|
wxSemaError TryWait() { return WaitTimeout(0); }
|
||||||
|
wxSemaError WaitTimeout(unsigned long milliseconds);
|
||||||
|
|
||||||
|
wxSemaError Post();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount)
|
||||||
|
{
|
||||||
|
if ( maxcount == 0 )
|
||||||
|
{
|
||||||
|
// make it practically infinite
|
||||||
|
maxcount = INT_MAX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSemaphoreInternal::~wxSemaphoreInternal()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long milliseconds)
|
||||||
|
{
|
||||||
|
return wxSEMA_MISC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSemaError wxSemaphoreInternal::Post()
|
||||||
|
{
|
||||||
|
return wxSEMA_MISC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxCondition implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO this is not yet completed
|
||||||
|
|
||||||
|
class wxConditionInternal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxConditionInternal(wxMutex& mutex) : m_mutex(mutex)
|
||||||
|
{
|
||||||
|
m_excessSignals = 0 ;
|
||||||
|
}
|
||||||
|
~wxConditionInternal()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsOk() const { return m_mutex.IsOk() ; }
|
||||||
|
|
||||||
|
wxCondError Wait()
|
||||||
|
{
|
||||||
|
return WaitTimeout(0xFFFFFFFF );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCondError WaitTimeout(unsigned long msectimeout)
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
if ( m_excessSignals > 0 )
|
||||||
|
{
|
||||||
|
--m_excessSignals ;
|
||||||
|
return wxCOND_NO_ERROR ;
|
||||||
|
}
|
||||||
|
else if ( msectimeout == 0 )
|
||||||
|
{
|
||||||
|
return wxCOND_MISC_ERROR ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
waiters++;
|
||||||
|
|
||||||
|
// FIXME this should be MsgWaitForMultipleObjects() as well probably
|
||||||
|
DWORD rc = ::WaitForSingleObject(event, timeout);
|
||||||
|
|
||||||
|
waiters--;
|
||||||
|
|
||||||
|
return rc != WAIT_TIMEOUT;
|
||||||
|
*/
|
||||||
|
return wxCOND_NO_ERROR ;
|
||||||
|
}
|
||||||
|
wxCondError Signal()
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
return wxCOND_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCondError Broadcast()
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
return wxCOND_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxArrayLong m_waiters ;
|
||||||
|
wxInt32 m_excessSignals ;
|
||||||
|
wxMutex& m_mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxCriticalSection implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// it's implemented as a mutex on mac os, so it is defined in the headers
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxThread implementation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// wxThreadInternal class
|
||||||
|
// ----------------------
|
||||||
|
|
||||||
|
class wxThreadInternal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxThreadInternal()
|
||||||
|
{
|
||||||
|
m_tid = kNoThreadID ;
|
||||||
|
m_state = STATE_NEW;
|
||||||
|
m_priority = WXTHREAD_DEFAULT_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
~wxThreadInternal()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Free()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new (suspended) thread (for the given thread object)
|
||||||
|
bool Create(wxThread *thread, unsigned int stackSize);
|
||||||
|
|
||||||
|
// suspend/resume/terminate
|
||||||
|
bool Suspend();
|
||||||
|
bool Resume();
|
||||||
|
void Cancel() { m_state = STATE_CANCELED; }
|
||||||
|
|
||||||
|
// thread state
|
||||||
|
void SetState(wxThreadState state) { m_state = state; }
|
||||||
|
wxThreadState GetState() const { return m_state; }
|
||||||
|
|
||||||
|
// thread priority
|
||||||
|
void SetPriority(unsigned int priority);
|
||||||
|
unsigned int GetPriority() const { return m_priority; }
|
||||||
|
|
||||||
|
void SetResult( void *res ) { m_result = res ; }
|
||||||
|
void *GetResult() { return m_result ; }
|
||||||
|
|
||||||
|
// thread handle and id
|
||||||
|
ThreadID GetId() const { return m_tid; }
|
||||||
|
|
||||||
|
// thread function
|
||||||
|
static pascal void* MacThreadStart(wxThread* arg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxThreadState m_state; // state, see wxThreadState enum
|
||||||
|
unsigned int m_priority; // thread priority in "wx" units
|
||||||
|
ThreadID m_tid; // thread id
|
||||||
|
void* m_result;
|
||||||
|
static ThreadEntryUPP s_threadEntry ;
|
||||||
|
};
|
||||||
|
|
||||||
|
static wxArrayPtrVoid s_threads ;
|
||||||
|
|
||||||
|
ThreadEntryUPP wxThreadInternal::s_threadEntry = NULL ;
|
||||||
|
pascal void* wxThreadInternal::MacThreadStart(wxThread *thread)
|
||||||
|
{
|
||||||
|
// first of all, check whether we hadn't been cancelled already
|
||||||
|
if ( thread->m_internal->GetState() == STATE_EXITED )
|
||||||
|
{
|
||||||
|
return (void*)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* rc = thread->Entry();
|
||||||
|
|
||||||
|
// enter m_critsect before changing the thread state
|
||||||
|
thread->m_critsect.Enter();
|
||||||
|
bool wasCancelled = thread->m_internal->GetState() == STATE_CANCELED;
|
||||||
|
thread->m_internal->SetState(STATE_EXITED);
|
||||||
|
thread->m_critsect.Leave();
|
||||||
|
|
||||||
|
thread->OnExit();
|
||||||
|
|
||||||
|
// if the thread was cancelled (from Delete()), then it the handle is still
|
||||||
|
// needed there
|
||||||
|
if ( thread->IsDetached() && !wasCancelled )
|
||||||
|
{
|
||||||
|
// auto delete
|
||||||
|
delete thread;
|
||||||
|
}
|
||||||
|
//else: the joinable threads handle will be closed when Wait() is done
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
void wxThreadInternal::SetPriority(unsigned int priority)
|
||||||
|
{
|
||||||
|
// Priorities don't exist on Mac
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize)
|
||||||
|
{
|
||||||
|
if ( s_threadEntry == NULL )
|
||||||
|
{
|
||||||
|
s_threadEntry = NewThreadEntryUPP( (ThreadEntryProcPtr) MacThreadStart ) ;
|
||||||
|
}
|
||||||
|
OSErr err = NewThread( kCooperativeThread,
|
||||||
|
s_threadEntry,
|
||||||
|
(void*) thread,
|
||||||
|
stackSize,
|
||||||
|
kNewSuspend,
|
||||||
|
&m_result,
|
||||||
|
&m_tid );
|
||||||
|
|
||||||
|
if ( err != noErr )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Can't create thread"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_priority != WXTHREAD_DEFAULT_PRIORITY )
|
||||||
|
{
|
||||||
|
SetPriority(m_priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_state = STATE_NEW;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThreadInternal::Suspend()
|
||||||
|
{
|
||||||
|
OSErr err ;
|
||||||
|
|
||||||
|
::ThreadBeginCritical();
|
||||||
|
|
||||||
|
if ( m_state != STATE_RUNNING )
|
||||||
|
{
|
||||||
|
::ThreadEndCritical() ;
|
||||||
|
wxLogSysError(_("Can not suspend thread %x"), m_tid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_state = STATE_PAUSED;
|
||||||
|
|
||||||
|
err = ::SetThreadStateEndCritical(m_tid, kStoppedThreadState, kNoThreadID);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThreadInternal::Resume()
|
||||||
|
{
|
||||||
|
ThreadID current ;
|
||||||
|
OSErr err ;
|
||||||
|
err = MacGetCurrentThread( ¤t ) ;
|
||||||
|
|
||||||
|
wxASSERT( err == noErr ) ;
|
||||||
|
wxASSERT( current != m_tid ) ;
|
||||||
|
|
||||||
|
::ThreadBeginCritical();
|
||||||
|
if ( m_state != STATE_PAUSED && m_state != STATE_NEW )
|
||||||
|
{
|
||||||
|
::ThreadEndCritical() ;
|
||||||
|
wxLogSysError(_("Can not resume thread %x"), m_tid);
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
err = ::SetThreadStateEndCritical(m_tid, kReadyThreadState, kNoThreadID);
|
||||||
|
wxASSERT( err == noErr ) ;
|
||||||
|
|
||||||
|
m_state = STATE_RUNNING;
|
||||||
|
::ThreadEndCritical() ;
|
||||||
|
::YieldToAnyThread() ;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static functions
|
||||||
|
// ----------------
|
||||||
|
wxThread *wxThread::This()
|
||||||
|
{
|
||||||
|
wxMacStCritical critical ;
|
||||||
|
|
||||||
|
ThreadID current ;
|
||||||
|
OSErr err ;
|
||||||
|
|
||||||
|
err = MacGetCurrentThread( ¤t ) ;
|
||||||
|
|
||||||
|
for ( size_t i = 0 ; i < s_threads.Count() ; ++i )
|
||||||
|
{
|
||||||
|
if ( ( (wxThread*) s_threads[i] )->GetId() == current )
|
||||||
|
return (wxThread*) s_threads[i] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogSysError(_("Couldn't get the current thread pointer"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::IsMain()
|
||||||
|
{
|
||||||
|
ThreadID current ;
|
||||||
|
OSErr err ;
|
||||||
|
|
||||||
|
err = MacGetCurrentThread( ¤t ) ;
|
||||||
|
return current == gs_idMainThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef Yield
|
||||||
|
#undef Yield
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void wxThread::Yield()
|
||||||
|
{
|
||||||
|
::YieldToAnyThread() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxThread::Sleep(unsigned long milliseconds)
|
||||||
|
{
|
||||||
|
UnsignedWide start, now;
|
||||||
|
|
||||||
|
Microseconds(&start);
|
||||||
|
|
||||||
|
double mssleep = milliseconds * 1000 ;
|
||||||
|
double msstart, msnow ;
|
||||||
|
msstart = (start.hi * 4294967296.0 + start.lo) ;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
YieldToAnyThread();
|
||||||
|
Microseconds(&now);
|
||||||
|
msnow = (now.hi * 4294967296.0 + now.lo) ;
|
||||||
|
} while( msnow - msstart < mssleep );
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxThread::GetCPUCount()
|
||||||
|
{
|
||||||
|
// we will use whatever MP API will be used for the new MP Macs
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long wxThread::GetCurrentId()
|
||||||
|
{
|
||||||
|
ThreadID current ;
|
||||||
|
MacGetCurrentThread( ¤t ) ;
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::SetConcurrency(size_t level)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( IsMain(), _T("should only be called from the main thread") );
|
||||||
|
|
||||||
|
// ok only for the default one
|
||||||
|
if ( level == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// how many CPUs have we got?
|
||||||
|
if ( GetCPUCount() == 1 )
|
||||||
|
{
|
||||||
|
// don't bother with all this complicated stuff - on a single
|
||||||
|
// processor system it doesn't make much sense anyhow
|
||||||
|
return level == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ctor and dtor
|
||||||
|
// -------------
|
||||||
|
|
||||||
|
wxThread::wxThread(wxThreadKind kind)
|
||||||
|
{
|
||||||
|
g_numberOfThreads++;
|
||||||
|
m_internal = new wxThreadInternal();
|
||||||
|
|
||||||
|
m_isDetached = kind == wxTHREAD_DETACHED;
|
||||||
|
s_threads.Add( (void*) this ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxThread::~wxThread()
|
||||||
|
{
|
||||||
|
if (g_numberOfThreads>0)
|
||||||
|
{
|
||||||
|
g_numberOfThreads--;
|
||||||
|
}
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("More threads deleted than created."));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_threads.Remove( (void*) this ) ;
|
||||||
|
if (m_internal != NULL) {
|
||||||
|
delete m_internal;
|
||||||
|
m_internal = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create/start thread
|
||||||
|
// -------------------
|
||||||
|
|
||||||
|
wxThreadError wxThread::Create(unsigned int stackSize)
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
if ( !m_internal->Create(this, stackSize) )
|
||||||
|
return wxTHREAD_NO_RESOURCE;
|
||||||
|
|
||||||
|
return wxTHREAD_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxThreadError wxThread::Run()
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
if ( m_internal->GetState() != STATE_NEW )
|
||||||
|
{
|
||||||
|
// actually, it may be almost any state at all, not only STATE_RUNNING
|
||||||
|
return wxTHREAD_RUNNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the thread has just been created and is still suspended - let it run
|
||||||
|
return Resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
// suspend/resume thread
|
||||||
|
// ---------------------
|
||||||
|
|
||||||
|
wxThreadError wxThread::Pause()
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
return m_internal->Suspend() ? wxTHREAD_NO_ERROR : wxTHREAD_MISC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxThreadError wxThread::Resume()
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
return m_internal->Resume() ? wxTHREAD_NO_ERROR : wxTHREAD_MISC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stopping thread
|
||||||
|
// ---------------
|
||||||
|
|
||||||
|
wxThread::ExitCode wxThread::Wait()
|
||||||
|
{
|
||||||
|
// although under MacOS we can wait for any thread, it's an error to
|
||||||
|
// wait for a detached one in wxWin API
|
||||||
|
wxCHECK_MSG( !IsDetached(), (ExitCode)-1,
|
||||||
|
_T("can't wait for detached thread") );
|
||||||
|
|
||||||
|
ExitCode rc = (ExitCode)-1;
|
||||||
|
|
||||||
|
(void)Delete(&rc);
|
||||||
|
|
||||||
|
m_internal->Free();
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxThreadError wxThread::Delete(ExitCode *pRc)
|
||||||
|
{
|
||||||
|
ExitCode rc = 0;
|
||||||
|
|
||||||
|
// Delete() is always safe to call, so consider all possible states
|
||||||
|
|
||||||
|
// has the thread started to run?
|
||||||
|
bool shouldResume = FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
if ( m_internal->GetState() == STATE_NEW )
|
||||||
|
{
|
||||||
|
// WinThreadStart() will see it and terminate immediately
|
||||||
|
m_internal->SetState(STATE_EXITED);
|
||||||
|
|
||||||
|
shouldResume = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// is the thread paused?
|
||||||
|
if ( shouldResume || IsPaused() )
|
||||||
|
Resume();
|
||||||
|
|
||||||
|
// does is still run?
|
||||||
|
if ( IsRunning() )
|
||||||
|
{
|
||||||
|
if ( IsMain() )
|
||||||
|
{
|
||||||
|
// set flag for wxIsWaitingForThread()
|
||||||
|
gs_waitingForThread = TRUE;
|
||||||
|
|
||||||
|
#if wxUSE_GUI
|
||||||
|
wxBeginBusyCursor();
|
||||||
|
#endif // wxUSE_GUI
|
||||||
|
}
|
||||||
|
|
||||||
|
// ask the thread to terminate
|
||||||
|
{
|
||||||
|
wxCriticalSectionLocker lock(m_critsect);
|
||||||
|
|
||||||
|
m_internal->Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if wxUSE_GUI
|
||||||
|
// simply wait for the thread to terminate
|
||||||
|
while( TestDestroy() )
|
||||||
|
{
|
||||||
|
::YieldToAnyThread() ;
|
||||||
|
}
|
||||||
|
#else // !wxUSE_GUI
|
||||||
|
// simply wait for the thread to terminate
|
||||||
|
while( TestDestroy() )
|
||||||
|
{
|
||||||
|
::YieldToAnyThread() ;
|
||||||
|
}
|
||||||
|
#endif // wxUSE_GUI/!wxUSE_GUI
|
||||||
|
|
||||||
|
if ( IsMain() )
|
||||||
|
{
|
||||||
|
gs_waitingForThread = FALSE;
|
||||||
|
|
||||||
|
#if wxUSE_GUI
|
||||||
|
wxEndBusyCursor();
|
||||||
|
#endif // wxUSE_GUI
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( IsDetached() )
|
||||||
|
{
|
||||||
|
// if the thread exits normally, this is done in WinThreadStart, but in
|
||||||
|
// this case it would have been too early because
|
||||||
|
// MsgWaitForMultipleObject() would fail if the therad handle was
|
||||||
|
// closed while we were waiting on it, so we must do it here
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( pRc )
|
||||||
|
*pRc = rc;
|
||||||
|
|
||||||
|
return rc == (ExitCode)-1 ? wxTHREAD_MISC_ERROR : wxTHREAD_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxThreadError wxThread::Kill()
|
||||||
|
{
|
||||||
|
if ( !IsRunning() )
|
||||||
|
return wxTHREAD_NOT_RUNNING;
|
||||||
|
|
||||||
|
// if ( !::TerminateThread(m_internal->GetHandle(), (DWORD)-1) )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Couldn't terminate thread"));
|
||||||
|
|
||||||
|
return wxTHREAD_MISC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_internal->Free();
|
||||||
|
|
||||||
|
if ( IsDetached() )
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxTHREAD_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxThread::Exit(ExitCode status)
|
||||||
|
{
|
||||||
|
m_internal->Free();
|
||||||
|
|
||||||
|
if ( IsDetached() )
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_internal->SetResult( status ) ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
#if defined(__VISUALC__) || (defined(__BORLANDC__) && (__BORLANDC__ >= 0x500))
|
||||||
|
_endthreadex((unsigned)status);
|
||||||
|
#else // !VC++
|
||||||
|
::ExitThread((DWORD)status);
|
||||||
|
#endif // VC++/!VC++
|
||||||
|
*/
|
||||||
|
wxFAIL_MSG(wxT("Couldn't return from ExitThread()!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// priority setting
|
||||||
|
// ----------------
|
||||||
|
|
||||||
|
// since all these calls are execute cooperatively we don't have to use the critical section
|
||||||
|
|
||||||
|
void wxThread::SetPriority(unsigned int prio)
|
||||||
|
{
|
||||||
|
m_internal->SetPriority(prio);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int wxThread::GetPriority() const
|
||||||
|
{
|
||||||
|
return m_internal->GetPriority();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long wxThread::GetId() const
|
||||||
|
{
|
||||||
|
return (unsigned long)m_internal->GetId();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::IsRunning() const
|
||||||
|
{
|
||||||
|
return m_internal->GetState() == STATE_RUNNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::IsAlive() const
|
||||||
|
{
|
||||||
|
return (m_internal->GetState() == STATE_RUNNING) ||
|
||||||
|
(m_internal->GetState() == STATE_PAUSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::IsPaused() const
|
||||||
|
{
|
||||||
|
return m_internal->GetState() == STATE_PAUSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxThread::TestDestroy()
|
||||||
|
{
|
||||||
|
return m_internal->GetState() == STATE_CANCELED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Automatic initialization for thread module
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxThreadModule : public wxModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool OnInit();
|
||||||
|
virtual void OnExit();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxThreadModule)
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxThreadModule, wxModule)
|
||||||
|
|
||||||
|
bool wxThreadModule::OnInit()
|
||||||
|
{
|
||||||
|
long response;
|
||||||
|
bool hasThreadManager ;
|
||||||
|
hasThreadManager = Gestalt( gestaltThreadMgrAttr, &response) == noErr && response & 1;
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
#if GENERATINGCFM
|
||||||
|
// verify presence of shared library
|
||||||
|
hasThreadManager = hasThreadManager && ((Ptr)NewThread != (Ptr)kUnresolvedCFragSymbolAddress);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
if ( !hasThreadManager )
|
||||||
|
{
|
||||||
|
wxLogSysError( wxT("Thread Support is not available on this System") );
|
||||||
|
return FALSE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no error return for GetCurrentThreadId()
|
||||||
|
MacGetCurrentThread( &gs_idMainThread ) ;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxThreadModule::OnExit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// under MacOS we don't have currently preemptive threads, so any thread may access
|
||||||
|
// the GUI at any time
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void WXDLLEXPORT wxMutexGuiEnter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void WXDLLEXPORT wxMutexGuiLeave()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void WXDLLEXPORT wxMutexGuiLeaveOrEnter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WXDLLEXPORT wxGuiOwnedByMainThread()
|
||||||
|
{
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// wake up the main thread
|
||||||
|
void WXDLLEXPORT wxWakeUpMainThread()
|
||||||
|
{
|
||||||
|
wxMacWakeUp() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WXDLLEXPORT wxIsWaitingForThread()
|
||||||
|
{
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "wx/thrimpl.cpp"
|
||||||
|
|
||||||
|
#endif // wxUSE_THREADS
|
||||||
143
src/mac/classic/timer.cpp
Normal file
143
src/mac/classic/timer.cpp
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: timer.cpp
|
||||||
|
// Purpose: wxTimer implementation
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "timer.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/timer.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
#endif
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <Timer.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
|
||||||
|
typedef struct MacTimerInfo
|
||||||
|
{
|
||||||
|
TMTask m_task;
|
||||||
|
wxMacNotifierTableRef m_table ;
|
||||||
|
wxTimer* m_timer ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
static void wxProcessTimer( unsigned long event , void *data ) ;
|
||||||
|
|
||||||
|
static pascal void MacTimerProc( TMTask * t )
|
||||||
|
{
|
||||||
|
MacTimerInfo * tm = (MacTimerInfo*) t ;
|
||||||
|
wxMacAddEvent( tm->m_table , wxProcessTimer, 0 , (void*) tm->m_timer , TRUE ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we need this array to track timers that are being deleted within the Notify procedure
|
||||||
|
// adding the timer before the Notify call and checking after whether it still is in there
|
||||||
|
// as the destructor would have removed it from the array
|
||||||
|
|
||||||
|
wxArrayPtrVoid gTimersInProcess ;
|
||||||
|
|
||||||
|
static void wxProcessTimer( unsigned long event , void *data )
|
||||||
|
{
|
||||||
|
if ( !data )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxTimer* timer = (wxTimer*) data ;
|
||||||
|
|
||||||
|
if ( timer->IsOneShot() )
|
||||||
|
timer->Stop() ;
|
||||||
|
|
||||||
|
gTimersInProcess.Add( timer ) ;
|
||||||
|
|
||||||
|
timer->Notify();
|
||||||
|
|
||||||
|
int index = gTimersInProcess.Index( timer ) ;
|
||||||
|
|
||||||
|
if ( index != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
gTimersInProcess.RemoveAt( index ) ;
|
||||||
|
|
||||||
|
if ( !timer->IsOneShot() && timer->m_info->m_task.tmAddr )
|
||||||
|
{
|
||||||
|
PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTimer::Init()
|
||||||
|
{
|
||||||
|
m_info = new MacTimerInfo() ;
|
||||||
|
m_info->m_task.tmAddr = NULL ;
|
||||||
|
m_info->m_task.tmWakeUp = 0 ;
|
||||||
|
m_info->m_task.tmReserved = 0 ;
|
||||||
|
m_info->m_task.qType = 0 ;
|
||||||
|
m_info->m_table = wxMacGetNotifierTable() ;
|
||||||
|
m_info->m_timer = this ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTimer::IsRunning() const
|
||||||
|
{
|
||||||
|
// as the qType may already indicate it is elapsed, but it
|
||||||
|
// was not handled internally yet
|
||||||
|
return ( m_info->m_task.tmAddr != NULL ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTimer::~wxTimer()
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
if (m_info != NULL) {
|
||||||
|
delete m_info ;
|
||||||
|
m_info = NULL ;
|
||||||
|
}
|
||||||
|
int index = gTimersInProcess.Index( this ) ;
|
||||||
|
if ( index != wxNOT_FOUND )
|
||||||
|
gTimersInProcess.RemoveAt( index ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTimer::Start(int milliseconds,bool mode)
|
||||||
|
{
|
||||||
|
(void)wxTimerBase::Start(milliseconds, mode);
|
||||||
|
|
||||||
|
wxCHECK_MSG( m_milli > 0, FALSE, wxT("invalid value for timer timeout") );
|
||||||
|
wxCHECK_MSG( m_info->m_task.tmAddr == NULL , FALSE, wxT("attempting to restart a timer") );
|
||||||
|
|
||||||
|
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
||||||
|
m_info->m_task.tmAddr = NewTimerUPP( MacTimerProc ) ;
|
||||||
|
#else
|
||||||
|
m_info->m_task.tmAddr = NewTimerProc( MacTimerProc ) ;
|
||||||
|
#endif
|
||||||
|
m_info->m_task.tmWakeUp = 0 ;
|
||||||
|
m_info->m_task.tmReserved = 0 ;
|
||||||
|
m_info->m_task.qType = 0 ;
|
||||||
|
m_info->m_timer = this ;
|
||||||
|
InsXTime((QElemPtr) &m_info->m_task ) ;
|
||||||
|
PrimeTime( (QElemPtr) &m_info->m_task , m_milli ) ;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTimer::Stop()
|
||||||
|
{
|
||||||
|
if ( m_info->m_task.tmAddr )
|
||||||
|
{
|
||||||
|
RmvTime( (QElemPtr) &m_info->m_task ) ;
|
||||||
|
DisposeTimerUPP(m_info->m_task.tmAddr) ;
|
||||||
|
m_info->m_task.tmAddr = NULL ;
|
||||||
|
}
|
||||||
|
wxMacRemoveAllNotifiersForData( wxMacGetNotifierTable() , this ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
620
src/mac/classic/toolbar.cpp
Normal file
620
src/mac/classic/toolbar.cpp
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: toolbar.cpp
|
||||||
|
// Purpose: wxToolBar
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: The wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "toolbar.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/wx.h"
|
||||||
|
|
||||||
|
#if wxUSE_TOOLBAR
|
||||||
|
|
||||||
|
#include "wx/toolbar.h"
|
||||||
|
#include "wx/notebook.h"
|
||||||
|
#include "wx/tabctrl.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
|
||||||
|
EVT_MOUSE_EVENTS( wxToolBar::OnMouse )
|
||||||
|
EVT_PAINT( wxToolBar::OnPaint )
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
#include "wx/geometry.h"
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxToolBarTool : public wxToolBarToolBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxToolBarTool(wxToolBar *tbar,
|
||||||
|
int id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxBitmap& bmpNormal,
|
||||||
|
const wxBitmap& bmpDisabled,
|
||||||
|
wxItemKind kind,
|
||||||
|
wxObject *clientData,
|
||||||
|
const wxString& shortHelp,
|
||||||
|
const wxString& longHelp) ;
|
||||||
|
|
||||||
|
wxToolBarTool(wxToolBar *tbar, wxControl *control)
|
||||||
|
: wxToolBarToolBase(tbar, control)
|
||||||
|
{
|
||||||
|
Init() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
~wxToolBarTool()
|
||||||
|
{
|
||||||
|
if ( m_controlHandle )
|
||||||
|
DisposeControl( m_controlHandle ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ControlHandle GetControlHandle() { return m_controlHandle ; }
|
||||||
|
void SetControlHandle( ControlHandle handle ) { m_controlHandle = handle ; }
|
||||||
|
|
||||||
|
void SetSize(const wxSize& size) ;
|
||||||
|
void SetPosition( const wxPoint& position ) ;
|
||||||
|
wxSize GetSize() const
|
||||||
|
{
|
||||||
|
if ( IsControl() )
|
||||||
|
{
|
||||||
|
return GetControl()->GetSize() ;
|
||||||
|
}
|
||||||
|
else if ( IsButton() )
|
||||||
|
{
|
||||||
|
return GetToolBar()->GetToolSize() ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxSize sz = GetToolBar()->GetToolSize() ;
|
||||||
|
sz.x /= 4 ;
|
||||||
|
sz.y /= 4 ;
|
||||||
|
return sz ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wxPoint GetPosition() const
|
||||||
|
{
|
||||||
|
return wxPoint(m_x, m_y);
|
||||||
|
}
|
||||||
|
private :
|
||||||
|
void Init()
|
||||||
|
{
|
||||||
|
m_controlHandle = NULL ;
|
||||||
|
}
|
||||||
|
ControlHandle m_controlHandle ;
|
||||||
|
|
||||||
|
wxCoord m_x;
|
||||||
|
wxCoord m_y;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// implementation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxToolBarTool
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxToolBarTool::SetSize(const wxSize& size)
|
||||||
|
{
|
||||||
|
if ( IsControl() )
|
||||||
|
{
|
||||||
|
GetControl()->SetSize( size ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBarTool::SetPosition(const wxPoint& position)
|
||||||
|
{
|
||||||
|
m_x = position.x;
|
||||||
|
m_y = position.y;
|
||||||
|
|
||||||
|
if ( IsButton() )
|
||||||
|
{
|
||||||
|
int x , y ;
|
||||||
|
x = y = 0 ;
|
||||||
|
WindowRef rootwindow = (WindowRef) GetToolBar()->MacGetRootWindow() ;
|
||||||
|
GetToolBar()->MacWindowToRootWindow( &x , &y ) ;
|
||||||
|
int mac_x = x + position.x ;
|
||||||
|
int mac_y = y + position.y ;
|
||||||
|
|
||||||
|
|
||||||
|
Rect contrlRect ;
|
||||||
|
GetControlBounds( m_controlHandle , &contrlRect ) ;
|
||||||
|
int former_mac_x = contrlRect.left ;
|
||||||
|
int former_mac_y = contrlRect.top ;
|
||||||
|
wxSize sz = GetToolBar()->GetToolSize() ;
|
||||||
|
|
||||||
|
if ( mac_x != former_mac_x || mac_y != former_mac_y )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Rect inval = { former_mac_y , former_mac_x , former_mac_y + sz.y , former_mac_x + sz.x } ;
|
||||||
|
InvalWindowRect( rootwindow , &inval ) ;
|
||||||
|
}
|
||||||
|
UMAMoveControl( m_controlHandle , mac_x , mac_y ) ;
|
||||||
|
{
|
||||||
|
Rect inval = { mac_y , mac_x , mac_y + sz.y , mac_x + sz.x } ;
|
||||||
|
InvalWindowRect( rootwindow , &inval ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( IsControl() )
|
||||||
|
{
|
||||||
|
GetControl()->Move( position ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const short kwxMacToolBarToolDefaultWidth = 24 ;
|
||||||
|
const short kwxMacToolBarToolDefaultHeight = 22 ;
|
||||||
|
const short kwxMacToolBarTopMargin = 2 ;
|
||||||
|
const short kwxMacToolBarLeftMargin = 2 ;
|
||||||
|
|
||||||
|
wxToolBarTool::wxToolBarTool(wxToolBar *tbar,
|
||||||
|
int id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxBitmap& bmpNormal,
|
||||||
|
const wxBitmap& bmpDisabled,
|
||||||
|
wxItemKind kind,
|
||||||
|
wxObject *clientData,
|
||||||
|
const wxString& shortHelp,
|
||||||
|
const wxString& longHelp)
|
||||||
|
: wxToolBarToolBase(tbar, id, label, bmpNormal, bmpDisabled, kind,
|
||||||
|
clientData, shortHelp, longHelp)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
|
||||||
|
if (id == wxID_SEPARATOR) return;
|
||||||
|
|
||||||
|
WindowRef window = (WindowRef) tbar->MacGetRootWindow() ;
|
||||||
|
wxSize toolSize = tbar->GetToolSize() ;
|
||||||
|
Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ;
|
||||||
|
|
||||||
|
ControlButtonContentInfo info ;
|
||||||
|
wxMacCreateBitmapButton( &info , GetNormalBitmap() ) ;
|
||||||
|
|
||||||
|
SInt16 behaviour = kControlBehaviorOffsetContents ;
|
||||||
|
if ( CanBeToggled() )
|
||||||
|
behaviour += kControlBehaviorToggles ;
|
||||||
|
|
||||||
|
if ( info.contentType != kControlNoContent )
|
||||||
|
{
|
||||||
|
m_controlHandle = ::NewControl( window , &toolrect , "\p" , false , 0 ,
|
||||||
|
behaviour + info.contentType , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
|
||||||
|
|
||||||
|
::SetControlData( m_controlHandle , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_controlHandle = ::NewControl( window , &toolrect , "\p" , false , 0 ,
|
||||||
|
behaviour , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
|
||||||
|
}
|
||||||
|
UMAShowControl( m_controlHandle ) ;
|
||||||
|
if ( !IsEnabled() )
|
||||||
|
{
|
||||||
|
UMADeactivateControl( m_controlHandle ) ;
|
||||||
|
}
|
||||||
|
if ( CanBeToggled() && IsToggled() )
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( m_controlHandle , 1 ) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( m_controlHandle , 0 ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ControlHandle container = (ControlHandle) tbar->MacGetContainerForEmbedding() ;
|
||||||
|
wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
|
||||||
|
::EmbedControl( m_controlHandle , container ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxToolBarToolBase *wxToolBar::CreateTool(int id,
|
||||||
|
const wxString& label,
|
||||||
|
const wxBitmap& bmpNormal,
|
||||||
|
const wxBitmap& bmpDisabled,
|
||||||
|
wxItemKind kind,
|
||||||
|
wxObject *clientData,
|
||||||
|
const wxString& shortHelp,
|
||||||
|
const wxString& longHelp)
|
||||||
|
{
|
||||||
|
return new wxToolBarTool(this, id, label, bmpNormal, bmpDisabled, kind,
|
||||||
|
clientData, shortHelp, longHelp);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
|
||||||
|
{
|
||||||
|
return new wxToolBarTool(this, control);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::Init()
|
||||||
|
{
|
||||||
|
m_maxWidth = -1;
|
||||||
|
m_maxHeight = -1;
|
||||||
|
m_defaultWidth = kwxMacToolBarToolDefaultWidth;
|
||||||
|
m_defaultHeight = kwxMacToolBarToolDefaultHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||||
|
long style, const wxString& name)
|
||||||
|
{
|
||||||
|
int x = pos.x;
|
||||||
|
int y = pos.y;
|
||||||
|
int width = size.x;
|
||||||
|
int height = size.y;
|
||||||
|
|
||||||
|
if (width <= 0)
|
||||||
|
width = 100;
|
||||||
|
if (height <= 0)
|
||||||
|
height = 30;
|
||||||
|
if (x < 0)
|
||||||
|
x = 0;
|
||||||
|
if (y < 0)
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
SetName(name);
|
||||||
|
|
||||||
|
m_windowStyle = style;
|
||||||
|
parent->AddChild(this);
|
||||||
|
|
||||||
|
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||||
|
m_foregroundColour = parent->GetForegroundColour() ;
|
||||||
|
|
||||||
|
if (id == -1)
|
||||||
|
m_windowId = NewControlId();
|
||||||
|
else
|
||||||
|
m_windowId = id;
|
||||||
|
|
||||||
|
{
|
||||||
|
m_width = size.x ;
|
||||||
|
m_height = size.y ;
|
||||||
|
int x = pos.x ;
|
||||||
|
int y = pos.y ;
|
||||||
|
AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING);
|
||||||
|
m_x = x ;
|
||||||
|
m_y = y ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxToolBar::~wxToolBar()
|
||||||
|
{
|
||||||
|
// we must refresh the frame size when the toolbar is deleted but the frame
|
||||||
|
// is not - otherwise toolbar leaves a hole in the place it used to occupy
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxToolBar::Realize()
|
||||||
|
{
|
||||||
|
if (m_tools.GetCount() == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int x = m_xMargin + kwxMacToolBarLeftMargin ;
|
||||||
|
int y = m_yMargin + kwxMacToolBarTopMargin ;
|
||||||
|
|
||||||
|
int tw, th;
|
||||||
|
GetSize(& tw, & th);
|
||||||
|
|
||||||
|
int maxWidth = 0 ;
|
||||||
|
int maxHeight = 0 ;
|
||||||
|
|
||||||
|
int maxToolWidth = 0;
|
||||||
|
int maxToolHeight = 0;
|
||||||
|
|
||||||
|
// Find the maximum tool width and height
|
||||||
|
wxToolBarToolsList::Node *node = m_tools.GetFirst();
|
||||||
|
while ( node )
|
||||||
|
{
|
||||||
|
wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
|
||||||
|
wxSize sz = tool->GetSize() ;
|
||||||
|
|
||||||
|
if ( sz.x > maxToolWidth )
|
||||||
|
maxToolWidth = sz.x ;
|
||||||
|
if (sz.y> maxToolHeight)
|
||||||
|
maxToolHeight = sz.y;
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
node = m_tools.GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
|
||||||
|
wxSize cursize = tool->GetSize() ;
|
||||||
|
|
||||||
|
// for the moment we just do a single row/column alignement
|
||||||
|
if ( x + cursize.x > maxWidth )
|
||||||
|
maxWidth = x + cursize.x ;
|
||||||
|
if ( y + cursize.y > maxHeight )
|
||||||
|
maxHeight = y + cursize.y ;
|
||||||
|
|
||||||
|
tool->SetPosition( wxPoint( x , y ) ) ;
|
||||||
|
|
||||||
|
if ( GetWindowStyleFlag() & wxTB_VERTICAL )
|
||||||
|
{
|
||||||
|
y += cursize.y ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x += cursize.x ;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
|
||||||
|
{
|
||||||
|
if ( m_maxRows == 0 )
|
||||||
|
{
|
||||||
|
// if not set yet, only one row
|
||||||
|
SetRows(1);
|
||||||
|
}
|
||||||
|
maxWidth = tw ;
|
||||||
|
maxHeight += m_yMargin + kwxMacToolBarTopMargin;
|
||||||
|
m_maxHeight = maxHeight ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( GetToolsCount() > 0 && m_maxRows == 0 )
|
||||||
|
{
|
||||||
|
// if not set yet, have one column
|
||||||
|
SetRows(GetToolsCount());
|
||||||
|
}
|
||||||
|
maxHeight = th ;
|
||||||
|
maxWidth += m_xMargin + kwxMacToolBarLeftMargin;
|
||||||
|
m_maxWidth = maxWidth ;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSize(maxWidth, maxHeight);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::SetToolBitmapSize(const wxSize& size)
|
||||||
|
{
|
||||||
|
m_defaultWidth = size.x+4; m_defaultHeight = size.y+4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The button size is bigger than the bitmap size
|
||||||
|
wxSize wxToolBar::GetToolSize() const
|
||||||
|
{
|
||||||
|
return wxSize(m_defaultWidth + 4, m_defaultHeight + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
|
||||||
|
{
|
||||||
|
wxToolBarToolsList::Node *node;
|
||||||
|
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
|
||||||
|
{
|
||||||
|
wxToolBarTool* tool = (wxToolBarTool*) node->GetData() ;
|
||||||
|
if ( tool->IsButton() )
|
||||||
|
{
|
||||||
|
if( tool->GetControlHandle() == control )
|
||||||
|
{
|
||||||
|
if ( tool->CanBeToggled() )
|
||||||
|
{
|
||||||
|
tool->Toggle( GetControl32BitValue( (ControlHandle) control ) ) ;
|
||||||
|
}
|
||||||
|
OnLeftClick( tool->GetId() , tool -> IsToggled() ) ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::SetRows(int nRows)
|
||||||
|
{
|
||||||
|
if ( nRows == m_maxRows )
|
||||||
|
{
|
||||||
|
// avoid resizing the frame uselessly
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_maxRows = nRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::MacSuperChangedPosition()
|
||||||
|
{
|
||||||
|
wxWindow::MacSuperChangedPosition() ;
|
||||||
|
Realize() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
|
||||||
|
{
|
||||||
|
wxToolBarToolsList::Node *node = m_tools.GetFirst();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxToolBarTool *tool = (wxToolBarTool *)node->GetData() ;
|
||||||
|
wxRect2DInt r( tool->GetPosition() , tool->GetSize() ) ;
|
||||||
|
if ( r.Contains( wxPoint( x , y ) ) )
|
||||||
|
{
|
||||||
|
return tool;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->GetNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (wxToolBarToolBase *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxToolBar::MacGetToolTipString( wxPoint &pt )
|
||||||
|
{
|
||||||
|
wxToolBarToolBase* tool = FindToolForPosition( pt.x , pt.y ) ;
|
||||||
|
if ( tool )
|
||||||
|
{
|
||||||
|
return tool->GetShortHelp() ;
|
||||||
|
}
|
||||||
|
return wxEmptyString ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::DoEnableTool(wxToolBarToolBase *t, bool enable)
|
||||||
|
{
|
||||||
|
if (!IsShown())
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxToolBarTool *tool = (wxToolBarTool *)t;
|
||||||
|
if ( tool->IsControl() )
|
||||||
|
{
|
||||||
|
tool->GetControl()->Enable( enable ) ;
|
||||||
|
}
|
||||||
|
else if ( tool->IsButton() )
|
||||||
|
{
|
||||||
|
if ( enable )
|
||||||
|
UMAActivateControl( tool->GetControlHandle() ) ;
|
||||||
|
else
|
||||||
|
UMADeactivateControl( tool->GetControlHandle() ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle)
|
||||||
|
{
|
||||||
|
if (!IsShown())
|
||||||
|
return ;
|
||||||
|
|
||||||
|
wxToolBarTool *tool = (wxToolBarTool *)t;
|
||||||
|
if ( tool->IsButton() )
|
||||||
|
{
|
||||||
|
::SetControl32BitValue( tool->GetControlHandle() , toggle ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
|
||||||
|
wxToolBarToolBase *tool)
|
||||||
|
{
|
||||||
|
// nothing special to do here - we relayout in Realize() later
|
||||||
|
tool->Attach(this);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle))
|
||||||
|
{
|
||||||
|
wxFAIL_MSG( _T("not implemented") );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
|
||||||
|
{
|
||||||
|
wxToolBarToolsList::Node *node;
|
||||||
|
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
|
||||||
|
{
|
||||||
|
wxToolBarToolBase *tool2 = node->GetData();
|
||||||
|
if ( tool2 == tool )
|
||||||
|
{
|
||||||
|
// let node point to the next node in the list
|
||||||
|
node = node->GetNext();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxSize sz = ((wxToolBarTool*)tool)->GetSize() ;
|
||||||
|
|
||||||
|
tool->Detach();
|
||||||
|
|
||||||
|
// and finally reposition all the controls after this one
|
||||||
|
|
||||||
|
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
|
||||||
|
{
|
||||||
|
wxToolBarTool *tool2 = (wxToolBarTool*) node->GetData();
|
||||||
|
wxPoint pt = tool2->GetPosition() ;
|
||||||
|
|
||||||
|
if ( GetWindowStyleFlag() & wxTB_VERTICAL )
|
||||||
|
{
|
||||||
|
pt.y -= sz.y ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pt.x -= sz.x ;
|
||||||
|
}
|
||||||
|
tool2->SetPosition( pt ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::OnPaint(wxPaintEvent& event)
|
||||||
|
{
|
||||||
|
wxPaintDC dc(this) ;
|
||||||
|
wxMacPortSetter helper(&dc) ;
|
||||||
|
|
||||||
|
Rect toolbarrect = { dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
|
||||||
|
dc.YLOG2DEVMAC(m_height) , dc.XLOG2DEVMAC(m_width) } ;
|
||||||
|
UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
|
||||||
|
{
|
||||||
|
wxToolBarToolsList::Node *node;
|
||||||
|
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
|
||||||
|
{
|
||||||
|
wxToolBarTool* tool = (wxToolBarTool*) node->GetData() ;
|
||||||
|
if ( tool->IsButton() )
|
||||||
|
{
|
||||||
|
UMADrawControl( tool->GetControlHandle() ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolBar::OnMouse( wxMouseEvent &event )
|
||||||
|
{
|
||||||
|
if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK )
|
||||||
|
{
|
||||||
|
|
||||||
|
int x = event.m_x ;
|
||||||
|
int y = event.m_y ;
|
||||||
|
|
||||||
|
MacClientToRootWindow( &x , &y ) ;
|
||||||
|
|
||||||
|
ControlHandle control ;
|
||||||
|
Point localwhere ;
|
||||||
|
SInt16 controlpart ;
|
||||||
|
WindowRef window = (WindowRef) MacGetRootWindow() ;
|
||||||
|
|
||||||
|
localwhere.h = x ;
|
||||||
|
localwhere.v = y ;
|
||||||
|
|
||||||
|
short modifiers = 0;
|
||||||
|
|
||||||
|
if ( !event.m_leftDown && !event.m_rightDown )
|
||||||
|
modifiers |= btnState ;
|
||||||
|
|
||||||
|
if ( event.m_shiftDown )
|
||||||
|
modifiers |= shiftKey ;
|
||||||
|
|
||||||
|
if ( event.m_controlDown )
|
||||||
|
modifiers |= controlKey ;
|
||||||
|
|
||||||
|
if ( event.m_altDown )
|
||||||
|
modifiers |= optionKey ;
|
||||||
|
|
||||||
|
if ( event.m_metaDown )
|
||||||
|
modifiers |= cmdKey ;
|
||||||
|
|
||||||
|
controlpart = ::FindControl( localwhere , window , &control ) ;
|
||||||
|
{
|
||||||
|
if ( control && ::IsControlActive( control ) )
|
||||||
|
{
|
||||||
|
{
|
||||||
|
controlpart = ::HandleControlClick( control , localwhere , modifiers , (ControlActionUPP) -1 ) ;
|
||||||
|
wxTheApp->s_lastMouseDown = 0 ;
|
||||||
|
if ( control && controlpart != kControlNoPart ) // otherwise we will get the event twice
|
||||||
|
{
|
||||||
|
MacHandleControlClick( control , controlpart , false /* not down anymore */ ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_TOOLBAR
|
||||||
|
|
||||||
408
src/mac/classic/tooltip.cpp
Normal file
408
src/mac/classic/tooltip.cpp
Normal file
@@ -0,0 +1,408 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: tooltip.cpp
|
||||||
|
// Purpose: wxToolTip implementation
|
||||||
|
// Author: Robert Roebling
|
||||||
|
// Id: $Id$
|
||||||
|
// Copyright: (c) 1998 Robert Roebling
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "tooltip.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#if wxUSE_TOOLTIPS
|
||||||
|
|
||||||
|
#include "wx/app.h"
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/window.h"
|
||||||
|
#include "wx/tooltip.h"
|
||||||
|
#include "wx/timer.h"
|
||||||
|
#include "wx/geometry.h"
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// global data
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxMacToolTipTimer ;
|
||||||
|
|
||||||
|
class wxMacToolTip
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
wxMacToolTip( ) ;
|
||||||
|
~wxMacToolTip() ;
|
||||||
|
|
||||||
|
void Setup( WindowRef window , const wxString& text , wxPoint localPosition ) ;
|
||||||
|
long GetMark() { return m_mark ; }
|
||||||
|
void Draw() ;
|
||||||
|
void Clear() ;
|
||||||
|
bool IsShown() { return m_shown ; }
|
||||||
|
private :
|
||||||
|
|
||||||
|
wxString m_label ;
|
||||||
|
wxPoint m_position ;
|
||||||
|
Rect m_rect ;
|
||||||
|
WindowRef m_window ;
|
||||||
|
PicHandle m_backpict ;
|
||||||
|
bool m_shown ;
|
||||||
|
long m_mark ;
|
||||||
|
wxMacToolTipTimer* m_timer ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
wxMacCFStringHolder m_helpTextRef ;
|
||||||
|
#endif
|
||||||
|
} ;
|
||||||
|
|
||||||
|
class wxMacToolTipTimer : public wxTimer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxMacToolTipTimer() {} ;
|
||||||
|
wxMacToolTipTimer(wxMacToolTip* tip, int iMilliseconds) ;
|
||||||
|
virtual ~wxMacToolTipTimer() {} ;
|
||||||
|
void Notify()
|
||||||
|
{
|
||||||
|
if ( m_mark == m_tip->GetMark() )
|
||||||
|
m_tip->Draw() ;
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
wxMacToolTip* m_tip;
|
||||||
|
long m_mark ;
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxToolTip
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
static long s_ToolTipDelay = 500 ;
|
||||||
|
static bool s_ShowToolTips = true ;
|
||||||
|
static wxMacToolTip s_ToolTip ;
|
||||||
|
static wxWindow* s_LastWindowEntered = NULL ;
|
||||||
|
static wxRect2DInt s_ToolTipArea ;
|
||||||
|
static WindowRef s_ToolTipWindowRef = NULL ;
|
||||||
|
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxToolTip, wxObject)
|
||||||
|
|
||||||
|
wxToolTip::wxToolTip( const wxString &tip )
|
||||||
|
{
|
||||||
|
m_text = tip;
|
||||||
|
m_window = (wxWindow*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxToolTip::~wxToolTip()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::SetTip( const wxString &tip )
|
||||||
|
{
|
||||||
|
m_text = tip;
|
||||||
|
|
||||||
|
if ( m_window )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
// update it immediately
|
||||||
|
wxToolInfo ti(GetHwndOf(m_window));
|
||||||
|
ti.lpszText = (wxChar *)m_text.c_str();
|
||||||
|
|
||||||
|
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::SetWindow( wxWindow *win )
|
||||||
|
{
|
||||||
|
m_window = win ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::Enable( bool flag )
|
||||||
|
{
|
||||||
|
if ( s_ShowToolTips != flag )
|
||||||
|
{
|
||||||
|
s_ShowToolTips = flag ;
|
||||||
|
if ( s_ShowToolTips )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_ToolTip.Clear() ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::SetDelay( long msecs )
|
||||||
|
{
|
||||||
|
s_ToolTipDelay = msecs ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::RelayEvent( wxWindow *win , wxMouseEvent &event )
|
||||||
|
{
|
||||||
|
if ( s_ShowToolTips )
|
||||||
|
{
|
||||||
|
if ( event.GetEventType() == wxEVT_LEAVE_WINDOW )
|
||||||
|
{
|
||||||
|
s_ToolTip.Clear() ;
|
||||||
|
}
|
||||||
|
else if (event.GetEventType() == wxEVT_ENTER_WINDOW || event.GetEventType() == wxEVT_MOTION )
|
||||||
|
{
|
||||||
|
wxPoint2DInt where( event.m_x , event.m_y ) ;
|
||||||
|
if ( s_LastWindowEntered == win && s_ToolTipArea.Contains( where ) )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_ToolTip.Clear() ;
|
||||||
|
s_ToolTipArea = wxRect2DInt( event.m_x - 2 , event.m_y - 2 , 4 , 4 ) ;
|
||||||
|
s_LastWindowEntered = win ;
|
||||||
|
|
||||||
|
WindowRef window = MAC_WXHWND( win->MacGetRootWindow() ) ;
|
||||||
|
int x = event.m_x ;
|
||||||
|
int y = event.m_y ;
|
||||||
|
wxPoint local( x , y ) ;
|
||||||
|
win->MacClientToRootWindow( &x, &y ) ;
|
||||||
|
wxPoint windowlocal( x , y ) ;
|
||||||
|
s_ToolTip.Setup( window , win->MacGetToolTipString( local ) , windowlocal ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::RemoveToolTips()
|
||||||
|
{
|
||||||
|
s_ToolTip.Clear() ;
|
||||||
|
}
|
||||||
|
// --- mac specific
|
||||||
|
|
||||||
|
wxMacToolTipTimer::wxMacToolTipTimer( wxMacToolTip *tip , int msec )
|
||||||
|
{
|
||||||
|
m_tip = tip;
|
||||||
|
m_mark = tip->GetMark() ;
|
||||||
|
Start(msec, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacToolTip::wxMacToolTip()
|
||||||
|
{
|
||||||
|
m_window = NULL ;
|
||||||
|
m_backpict = NULL ;
|
||||||
|
m_mark = 0 ;
|
||||||
|
m_shown = false ;
|
||||||
|
m_timer = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacToolTip::Setup( WindowRef win , const wxString& text , wxPoint localPosition )
|
||||||
|
{
|
||||||
|
m_mark++ ;
|
||||||
|
Clear() ;
|
||||||
|
m_position = localPosition ;
|
||||||
|
m_label = text ;
|
||||||
|
m_window =win;
|
||||||
|
s_ToolTipWindowRef = m_window ;
|
||||||
|
m_backpict = NULL ;
|
||||||
|
if ( m_timer )
|
||||||
|
delete m_timer ;
|
||||||
|
m_timer = new wxMacToolTipTimer( this , s_ToolTipDelay ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacToolTip::~wxMacToolTip()
|
||||||
|
{
|
||||||
|
if ( m_timer ) {
|
||||||
|
delete m_timer ;
|
||||||
|
m_timer = NULL;
|
||||||
|
}
|
||||||
|
if ( m_backpict )
|
||||||
|
Clear() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
const short kTipBorder = 2 ;
|
||||||
|
const short kTipOffset = 5 ;
|
||||||
|
|
||||||
|
void wxMacToolTip::Draw()
|
||||||
|
{
|
||||||
|
if ( m_label.Length() == 0 )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
if ( m_window == s_ToolTipWindowRef )
|
||||||
|
{
|
||||||
|
m_shown = true ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
HMHelpContentRec tag ;
|
||||||
|
tag.version = kMacHelpVersion;
|
||||||
|
SetRect( &tag.absHotRect , m_position.x - 2 , m_position.y - 2 , m_position.x + 2 , m_position.y + 2 ) ;
|
||||||
|
GrafPtr port ;
|
||||||
|
GetPort( &port ) ;
|
||||||
|
SetPortWindowPort(m_window) ;
|
||||||
|
LocalToGlobal( (Point *) &tag.absHotRect.top );
|
||||||
|
LocalToGlobal( (Point *) &tag.absHotRect.bottom );
|
||||||
|
SetPort( port );
|
||||||
|
m_helpTextRef.Assign( m_label , wxFONTENCODING_DEFAULT ) ;
|
||||||
|
tag.content[kHMMinimumContentIndex].contentType = kHMCFStringContent ;
|
||||||
|
tag.content[kHMMinimumContentIndex].u.tagCFString = m_helpTextRef ;
|
||||||
|
tag.content[kHMMaximumContentIndex].contentType = kHMCFStringContent ;
|
||||||
|
tag.content[kHMMaximumContentIndex].u.tagCFString = m_helpTextRef ;
|
||||||
|
tag.tagSide = kHMDefaultSide;
|
||||||
|
HMDisplayTag( &tag );
|
||||||
|
#else
|
||||||
|
wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) );
|
||||||
|
FontFamilyID fontId ;
|
||||||
|
Str255 fontName ;
|
||||||
|
SInt16 fontSize ;
|
||||||
|
Style fontStyle ;
|
||||||
|
GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
|
||||||
|
GetFNum( fontName, &fontId );
|
||||||
|
|
||||||
|
TextFont( fontId ) ;
|
||||||
|
TextSize( fontSize ) ;
|
||||||
|
TextFace( fontStyle ) ;
|
||||||
|
FontInfo fontInfo;
|
||||||
|
::GetFontInfo(&fontInfo);
|
||||||
|
short lineh = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
|
||||||
|
short height = 0 ;
|
||||||
|
|
||||||
|
int i = 0 ;
|
||||||
|
int length = m_label.Length() ;
|
||||||
|
int width = 0 ;
|
||||||
|
int thiswidth = 0 ;
|
||||||
|
int laststop = 0 ;
|
||||||
|
wxCharBuffer text = m_label.mb_str( wxConvLocal) ;
|
||||||
|
|
||||||
|
while( i < length )
|
||||||
|
{
|
||||||
|
if( text[i] == 13 || text[i] == 10)
|
||||||
|
{
|
||||||
|
thiswidth = ::TextWidth( text , laststop , i - laststop ) ;
|
||||||
|
if ( thiswidth > width )
|
||||||
|
width = thiswidth ;
|
||||||
|
|
||||||
|
height += lineh ;
|
||||||
|
laststop = i+1 ;
|
||||||
|
}
|
||||||
|
i++ ;
|
||||||
|
}
|
||||||
|
if ( i - laststop > 0 )
|
||||||
|
{
|
||||||
|
thiswidth = ::TextWidth( text , laststop , i - laststop ) ;
|
||||||
|
if ( thiswidth > width )
|
||||||
|
width = thiswidth ;
|
||||||
|
height += lineh ;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_rect.left = m_position.x + kTipOffset;
|
||||||
|
m_rect.top = m_position.y + kTipOffset;
|
||||||
|
m_rect.right = m_rect.left + width + 2 * kTipBorder;
|
||||||
|
|
||||||
|
m_rect.bottom = m_rect.top + height + 2 * kTipBorder;
|
||||||
|
Rect r ;
|
||||||
|
GetPortBounds( GetWindowPort( m_window ) , &r ) ;
|
||||||
|
if ( m_rect.top < 0 )
|
||||||
|
{
|
||||||
|
m_rect.bottom += -m_rect.top ;
|
||||||
|
m_rect.top = 0 ;
|
||||||
|
}
|
||||||
|
if ( m_rect.left < 0 )
|
||||||
|
{
|
||||||
|
m_rect.right += -m_rect.left ;
|
||||||
|
m_rect.left = 0 ;
|
||||||
|
}
|
||||||
|
if ( m_rect.right > r.right )
|
||||||
|
{
|
||||||
|
m_rect.left -= (m_rect.right - r.right ) ;
|
||||||
|
m_rect.right = r.right ;
|
||||||
|
}
|
||||||
|
if ( m_rect.bottom > r.bottom )
|
||||||
|
{
|
||||||
|
m_rect.top -= (m_rect.bottom - r.bottom) ;
|
||||||
|
m_rect.bottom = r.bottom ;
|
||||||
|
}
|
||||||
|
ClipRect( &m_rect ) ;
|
||||||
|
BackColor( whiteColor ) ;
|
||||||
|
ForeColor(blackColor ) ;
|
||||||
|
GWorldPtr port ;
|
||||||
|
NewGWorld( &port , wxDisplayDepth() , &m_rect , NULL , NULL , 0 ) ;
|
||||||
|
CGrafPtr origPort ;
|
||||||
|
GDHandle origDevice ;
|
||||||
|
|
||||||
|
GetGWorld( &origPort , &origDevice ) ;
|
||||||
|
SetGWorld( port , NULL ) ;
|
||||||
|
|
||||||
|
m_backpict = OpenPicture(&m_rect);
|
||||||
|
|
||||||
|
CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window)),
|
||||||
|
GetPortBitMapForCopyBits(port),
|
||||||
|
&m_rect,
|
||||||
|
&m_rect,
|
||||||
|
srcCopy,
|
||||||
|
NULL);
|
||||||
|
ClosePicture();
|
||||||
|
SetGWorld( origPort , origDevice ) ;
|
||||||
|
DisposeGWorld( port ) ;
|
||||||
|
PenNormal() ;
|
||||||
|
|
||||||
|
RGBColor tooltipbackground = { 0xFFFF , 0xFFFF , 0xC000 } ;
|
||||||
|
BackColor( whiteColor ) ;
|
||||||
|
RGBForeColor( &tooltipbackground ) ;
|
||||||
|
|
||||||
|
PaintRect( &m_rect ) ;
|
||||||
|
ForeColor(blackColor ) ;
|
||||||
|
FrameRect( &m_rect ) ;
|
||||||
|
SetThemeTextColor(kThemeTextColorNotification,wxDisplayDepth(),true) ;
|
||||||
|
::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder);
|
||||||
|
|
||||||
|
i = 0 ;
|
||||||
|
laststop = 0 ;
|
||||||
|
height = 0 ;
|
||||||
|
|
||||||
|
while( i < length )
|
||||||
|
{
|
||||||
|
if( text[i] == 13 || text[i] == 10)
|
||||||
|
{
|
||||||
|
::DrawText( text , laststop , i - laststop ) ;
|
||||||
|
height += lineh ;
|
||||||
|
::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder + height );
|
||||||
|
laststop = i+1 ;
|
||||||
|
}
|
||||||
|
i++ ;
|
||||||
|
}
|
||||||
|
::DrawText( text , laststop , i - laststop ) ;
|
||||||
|
::TextMode( srcOr ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxToolTip::NotifyWindowDelete( WXHWND win )
|
||||||
|
{
|
||||||
|
if ( win == s_ToolTipWindowRef )
|
||||||
|
{
|
||||||
|
s_ToolTipWindowRef = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacToolTip::Clear()
|
||||||
|
{
|
||||||
|
m_mark++ ;
|
||||||
|
if ( m_timer )
|
||||||
|
{
|
||||||
|
delete m_timer ;
|
||||||
|
m_timer = NULL ;
|
||||||
|
}
|
||||||
|
if ( !m_shown )
|
||||||
|
return ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
HMHideTag() ;
|
||||||
|
m_helpTextRef.Release() ;
|
||||||
|
#else
|
||||||
|
if ( m_window == s_ToolTipWindowRef && m_backpict )
|
||||||
|
{
|
||||||
|
wxMacPortStateHelper help( (GrafPtr) GetWindowPort(m_window) ) ;
|
||||||
|
|
||||||
|
m_shown = false ;
|
||||||
|
|
||||||
|
BackColor( whiteColor ) ;
|
||||||
|
ForeColor(blackColor ) ;
|
||||||
|
DrawPicture(m_backpict, &m_rect);
|
||||||
|
KillPicture(m_backpict);
|
||||||
|
m_backpict = NULL ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
1463
src/mac/classic/toplevel.cpp
Normal file
1463
src/mac/classic/toplevel.cpp
Normal file
File diff suppressed because it is too large
Load Diff
419
src/mac/classic/treectrl.cpp
Normal file
419
src/mac/classic/treectrl.cpp
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: treectrl.cpp
|
||||||
|
// Purpose: wxTreeCtrl. See also Robert's generic wxTreeCtrl.
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "treectrl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/stubs/textctrl.h"
|
||||||
|
#include "wx/treebase.h"
|
||||||
|
#include "wx/stubs/treectrl.h"
|
||||||
|
|
||||||
|
#if !USE_SHARED_LIBRARY
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl)
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxTreeItem, wxObject)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wxTreeCtrl::wxTreeCtrl()
|
||||||
|
{
|
||||||
|
m_imageListNormal = NULL;
|
||||||
|
m_imageListState = NULL;
|
||||||
|
m_textCtrl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
|
||||||
|
long style, const wxValidator& validator, const wxString& name)
|
||||||
|
{
|
||||||
|
SetName(name);
|
||||||
|
SetValidator(validator);
|
||||||
|
|
||||||
|
m_imageListNormal = NULL;
|
||||||
|
m_imageListState = NULL;
|
||||||
|
m_textCtrl = NULL;
|
||||||
|
|
||||||
|
m_windowStyle = style;
|
||||||
|
|
||||||
|
SetParent(parent);
|
||||||
|
|
||||||
|
m_windowId = (id == -1) ? NewControlId() : id;
|
||||||
|
|
||||||
|
if (parent) parent->AddChild(this);
|
||||||
|
|
||||||
|
// TODO create tree control
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTreeCtrl::~wxTreeCtrl()
|
||||||
|
{
|
||||||
|
if (m_textCtrl)
|
||||||
|
{
|
||||||
|
delete m_textCtrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
int wxTreeCtrl::GetCount() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxTreeCtrl::GetIndent() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::SetIndent(int indent)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
wxImageList *wxTreeCtrl::GetImageList(int which) const
|
||||||
|
{
|
||||||
|
if ( which == wxIMAGE_LIST_NORMAL )
|
||||||
|
{
|
||||||
|
return m_imageListNormal;
|
||||||
|
}
|
||||||
|
else if ( which == wxIMAGE_LIST_STATE )
|
||||||
|
{
|
||||||
|
return m_imageListState;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::SetImageList(wxImageList *imageList, int which)
|
||||||
|
{
|
||||||
|
if ( which == wxIMAGE_LIST_NORMAL )
|
||||||
|
{
|
||||||
|
m_imageListNormal = imageList;
|
||||||
|
}
|
||||||
|
else if ( which == wxIMAGE_LIST_STATE )
|
||||||
|
{
|
||||||
|
m_imageListState = imageList;
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetNextItem(long item, int code) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::ItemHasChildren(long item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetChild(long item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetItemParent(long item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetFirstVisibleItem() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetNextVisibleItem(long item) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetSelection() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetRootItem() const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::GetItem(wxTreeItem& info) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SetItem(wxTreeItem& info)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxTreeCtrl::GetItemState(long item, long stateMask) const
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_STATE ;
|
||||||
|
info.m_stateMask = stateMask;
|
||||||
|
info.m_itemId = item;
|
||||||
|
|
||||||
|
if (!GetItem(info))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return info.m_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SetItemState(long item, long state, long stateMask)
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_STATE ;
|
||||||
|
info.m_state = state;
|
||||||
|
info.m_stateMask = stateMask;
|
||||||
|
info.m_itemId = item;
|
||||||
|
|
||||||
|
return SetItem(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SetItemImage(long item, int image, int selImage)
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_IMAGE ;
|
||||||
|
info.m_image = image;
|
||||||
|
if ( selImage > -1)
|
||||||
|
{
|
||||||
|
info.m_selectedImage = selImage;
|
||||||
|
info.m_mask |= wxTREE_MASK_SELECTED_IMAGE;
|
||||||
|
}
|
||||||
|
info.m_itemId = item;
|
||||||
|
|
||||||
|
return SetItem(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString wxTreeCtrl::GetItemText(long item) const
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_TEXT ;
|
||||||
|
info.m_itemId = item;
|
||||||
|
|
||||||
|
if (!GetItem(info))
|
||||||
|
return wxString("");
|
||||||
|
return info.m_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::SetItemText(long item, const wxString& str)
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_TEXT ;
|
||||||
|
info.m_itemId = item;
|
||||||
|
info.m_text = str;
|
||||||
|
|
||||||
|
SetItem(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::GetItemData(long item) const
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_DATA ;
|
||||||
|
info.m_itemId = item;
|
||||||
|
|
||||||
|
if (!GetItem(info))
|
||||||
|
return 0;
|
||||||
|
return info.m_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SetItemData(long item, long data)
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
|
||||||
|
info.m_mask = wxTREE_MASK_DATA ;
|
||||||
|
info.m_itemId = item;
|
||||||
|
info.m_data = data;
|
||||||
|
|
||||||
|
return SetItem(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::GetItemRect(long item, wxRect& rect, bool textOnly) const
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTextCtrl* wxTreeCtrl::GetEditControl() const
|
||||||
|
{
|
||||||
|
return m_textCtrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
bool wxTreeCtrl::DeleteItem(long item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::ExpandItem(long item, int action)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
switch ( action )
|
||||||
|
{
|
||||||
|
case wxTREE_EXPAND_EXPAND:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxTREE_EXPAND_COLLAPSE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxTREE_EXPAND_COLLAPSE_RESET:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxTREE_EXPAND_TOGGLE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bOk = FALSE; // TODO expand item
|
||||||
|
|
||||||
|
// May not send messages, so emulate them
|
||||||
|
if ( bOk ) {
|
||||||
|
wxTreeEvent event(wxEVT_NULL, m_windowId);
|
||||||
|
event.m_item.m_itemId = item;
|
||||||
|
event.m_item.m_mask =
|
||||||
|
event.m_item.m_stateMask = 0xffff; // get all
|
||||||
|
GetItem(event.m_item);
|
||||||
|
|
||||||
|
bool bIsExpanded = (event.m_item.m_state & wxTREE_STATE_EXPANDED) != 0;
|
||||||
|
|
||||||
|
event.m_code = action;
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
// @@@ return values of {EXPAND|COLLAPS}ING event handler is discarded
|
||||||
|
event.SetEventType(bIsExpanded ? wxEVT_COMMAND_TREE_ITEM_EXPANDING
|
||||||
|
: wxEVT_COMMAND_TREE_ITEM_COLLAPSING);
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
|
||||||
|
event.SetEventType(bIsExpanded ? wxEVT_COMMAND_TREE_ITEM_EXPANDED
|
||||||
|
: wxEVT_COMMAND_TREE_ITEM_COLLAPSED);
|
||||||
|
GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, int selImage,
|
||||||
|
long insertAfter)
|
||||||
|
{
|
||||||
|
wxTreeItem info;
|
||||||
|
info.m_text = label;
|
||||||
|
info.m_mask = wxTREE_MASK_TEXT;
|
||||||
|
if ( image > -1 )
|
||||||
|
{
|
||||||
|
info.m_mask |= wxTREE_MASK_IMAGE | wxTREE_MASK_SELECTED_IMAGE;
|
||||||
|
info.m_image = image;
|
||||||
|
if ( selImage == -1 )
|
||||||
|
info.m_selectedImage = image;
|
||||||
|
else
|
||||||
|
info.m_selectedImage = selImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return InsertItem(parent, info, insertAfter);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SelectItem(long item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::ScrollTo(long item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::DeleteAllItems()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTextCtrl* wxTreeCtrl::EditLabel(long item, wxClassInfo* textControlClass)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// End label editing, optionally cancelling the edit
|
||||||
|
bool wxTreeCtrl::EndEditLabel(bool cancel)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::SortChildren(long item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTreeCtrl::EnsureVisible(long item)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tree item structure
|
||||||
|
wxTreeItem::wxTreeItem()
|
||||||
|
{
|
||||||
|
m_mask = 0;
|
||||||
|
m_itemId = 0;
|
||||||
|
m_state = 0;
|
||||||
|
m_stateMask = 0;
|
||||||
|
m_image = -1;
|
||||||
|
m_selectedImage = -1;
|
||||||
|
m_children = 0;
|
||||||
|
m_data = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tree event
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent)
|
||||||
|
|
||||||
|
wxTreeEvent::wxTreeEvent(wxEventType commandType, int id):
|
||||||
|
wxCommandEvent(commandType, id)
|
||||||
|
{
|
||||||
|
m_code = 0;
|
||||||
|
m_oldItem = 0;
|
||||||
|
}
|
||||||
|
|
||||||
815
src/mac/classic/uma.cpp
Normal file
815
src/mac/classic/uma.cpp
Normal file
@@ -0,0 +1,815 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: uma.cpp
|
||||||
|
// Purpose: UMA support
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by:
|
||||||
|
// Created: 04/01/98
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: The wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
|
||||||
|
#if wxUSE_GUI
|
||||||
|
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include <MacTextEditor.h>
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
# include <Navigation.h>
|
||||||
|
# if defined(TARGET_CARBON)
|
||||||
|
# if PM_USE_SESSION_APIS
|
||||||
|
# include <PMCore.h>
|
||||||
|
# endif
|
||||||
|
# include <PMApplication.h>
|
||||||
|
# else
|
||||||
|
# include <Printing.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#include <Scrap.h>
|
||||||
|
#endif
|
||||||
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
|
||||||
|
// since we have decided that we only support 8.6 upwards we are
|
||||||
|
// checking for these minimum requirements in the startup code of
|
||||||
|
// the application so all wxWindows code can safely assume that appearance 1.1
|
||||||
|
// windows manager, control manager, navigation services etc. are
|
||||||
|
// present
|
||||||
|
|
||||||
|
static bool sUMAHasAppearance = false ;
|
||||||
|
static long sUMAAppearanceVersion = 0 ;
|
||||||
|
static long sUMASystemVersion = 0 ;
|
||||||
|
static bool sUMAHasAquaLayout = false ;
|
||||||
|
|
||||||
|
static bool sUMAHasInittedAppearance = false;
|
||||||
|
|
||||||
|
extern int gAGABackgroundColor ;
|
||||||
|
bool UMAHasAppearance() { return sUMAHasAppearance ; }
|
||||||
|
long UMAGetAppearanceVersion() { return sUMAAppearanceVersion ; }
|
||||||
|
long UMAGetSystemVersion() { return sUMASystemVersion ; }
|
||||||
|
|
||||||
|
static bool sUMAHasWindowManager = false ;
|
||||||
|
static long sUMAWindowManagerAttr = 0 ;
|
||||||
|
|
||||||
|
bool UMAHasWindowManager() { return sUMAHasWindowManager ; }
|
||||||
|
long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr ; }
|
||||||
|
bool UMAHasAquaLayout() { return sUMAHasAquaLayout ; }
|
||||||
|
|
||||||
|
|
||||||
|
void UMACleanupToolbox()
|
||||||
|
{
|
||||||
|
if (sUMAHasInittedAppearance)
|
||||||
|
{
|
||||||
|
UnregisterAppearanceClient() ;
|
||||||
|
}
|
||||||
|
if ( NavServicesAvailable() )
|
||||||
|
{
|
||||||
|
NavUnload() ;
|
||||||
|
}
|
||||||
|
if ( TXNTerminateTextension != (void*) kUnresolvedCFragSymbolAddress )
|
||||||
|
TXNTerminateTextension( ) ;
|
||||||
|
}
|
||||||
|
void UMAInitToolbox( UInt16 inMoreMastersCalls, bool isEmbedded )
|
||||||
|
{
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
::MaxApplZone();
|
||||||
|
for (long i = 1; i <= inMoreMastersCalls; i++)
|
||||||
|
::MoreMasters();
|
||||||
|
|
||||||
|
if (!isEmbedded)
|
||||||
|
{
|
||||||
|
::InitGraf(&qd.thePort);
|
||||||
|
::InitFonts();
|
||||||
|
::InitMenus();
|
||||||
|
::TEInit();
|
||||||
|
::InitDialogs(0L);
|
||||||
|
::FlushEvents(everyEvent, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
long total,contig;
|
||||||
|
PurgeSpace(&total, &contig);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
::InitCursor();
|
||||||
|
|
||||||
|
if ( Gestalt(gestaltSystemVersion, &sUMASystemVersion) != noErr)
|
||||||
|
sUMASystemVersion = 0x0000 ;
|
||||||
|
|
||||||
|
long theAppearance ;
|
||||||
|
if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr )
|
||||||
|
{
|
||||||
|
sUMAHasAppearance = true ;
|
||||||
|
OSStatus status = RegisterAppearanceClient();
|
||||||
|
// If status equals appearanceProcessRegisteredErr it means the
|
||||||
|
// appearance client already was registered (For example if we run
|
||||||
|
// embedded, the host might have registered it). In such a case
|
||||||
|
// we don't unregister it later on.
|
||||||
|
if (status != appearanceProcessRegisteredErr)
|
||||||
|
{
|
||||||
|
// Appearance client wasn't registered yet.
|
||||||
|
sUMAHasInittedAppearance = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr )
|
||||||
|
{
|
||||||
|
sUMAAppearanceVersion = theAppearance ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sUMAAppearanceVersion = 0x0100 ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( Gestalt( gestaltWindowMgrAttr, &sUMAWindowManagerAttr ) == noErr )
|
||||||
|
{
|
||||||
|
sUMAHasWindowManager = sUMAWindowManagerAttr & gestaltWindowMgrPresent ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
// Call currently implicitely done : InitFloatingWindows() ;
|
||||||
|
#else
|
||||||
|
if (!isEmbedded)
|
||||||
|
{
|
||||||
|
if ( sUMAHasWindowManager )
|
||||||
|
InitFloatingWindows() ;
|
||||||
|
else
|
||||||
|
InitWindows();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( NavServicesAvailable() )
|
||||||
|
{
|
||||||
|
NavLoad() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
long menuMgrAttr ;
|
||||||
|
Gestalt( gestaltMenuMgrAttr , &menuMgrAttr ) ;
|
||||||
|
if ( menuMgrAttr & gestaltMenuMgrAquaLayoutMask )
|
||||||
|
sUMAHasAquaLayout = true ;
|
||||||
|
|
||||||
|
if ( TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress )
|
||||||
|
{
|
||||||
|
FontFamilyID fontId ;
|
||||||
|
Str255 fontName ;
|
||||||
|
SInt16 fontSize ;
|
||||||
|
Style fontStyle ;
|
||||||
|
GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
|
||||||
|
GetFNum( fontName, &fontId );
|
||||||
|
|
||||||
|
TXNMacOSPreferredFontDescription fontDescriptions[] =
|
||||||
|
{
|
||||||
|
{ fontId , (fontSize << 16) ,kTXNDefaultFontStyle, kTXNSystemDefaultEncoding }
|
||||||
|
} ;
|
||||||
|
int noOfFontDescriptions = sizeof( fontDescriptions ) / sizeof(TXNMacOSPreferredFontDescription) ;
|
||||||
|
|
||||||
|
// kTXNAlwaysUseQuickDrawTextMask might be desirable because of speed increases but it crashes the app under OS X upon key stroke
|
||||||
|
#if 0
|
||||||
|
// leads to unexpected content for clients, TODO configurable
|
||||||
|
OptionBits options = kTXNWantMoviesMask | kTXNWantSoundMask | kTXNWantGraphicsMask ;
|
||||||
|
#else
|
||||||
|
OptionBits options = 0 ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if TARGET_CARBON
|
||||||
|
if ( !UMAHasAquaLayout() )
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
options |= kTXNAlwaysUseQuickDrawTextMask ;
|
||||||
|
}
|
||||||
|
TXNInitTextension(fontDescriptions, noOfFontDescriptions, options );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UMASetSystemIsInitialized(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Boolean CanUseATSUI()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
OSErr err = Gestalt(gestaltATSUVersion, &result);
|
||||||
|
return (err == noErr);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// process manager
|
||||||
|
long UMAGetProcessMode()
|
||||||
|
{
|
||||||
|
OSErr err ;
|
||||||
|
ProcessInfoRec processinfo;
|
||||||
|
ProcessSerialNumber procno ;
|
||||||
|
|
||||||
|
procno.highLongOfPSN = NULL ;
|
||||||
|
procno.lowLongOfPSN = kCurrentProcess ;
|
||||||
|
processinfo.processInfoLength = sizeof(ProcessInfoRec);
|
||||||
|
processinfo.processName = NULL;
|
||||||
|
processinfo.processAppSpec = NULL;
|
||||||
|
|
||||||
|
err = ::GetProcessInformation( &procno , &processinfo ) ;
|
||||||
|
wxASSERT( err == noErr ) ;
|
||||||
|
return processinfo.processMode ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UMAGetProcessModeDoesActivateOnFGSwitch()
|
||||||
|
{
|
||||||
|
return UMAGetProcessMode() & modeDoesActivateOnFGSwitch ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// menu manager
|
||||||
|
|
||||||
|
MenuRef UMANewMenu( SInt16 id , const wxString& title , wxFontEncoding encoding )
|
||||||
|
{
|
||||||
|
wxString str = wxStripMenuCodes( title ) ;
|
||||||
|
MenuRef menu ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
CreateNewMenu( id , 0 , &menu ) ;
|
||||||
|
SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding ) ) ;
|
||||||
|
#else
|
||||||
|
Str255 ptitle ;
|
||||||
|
wxMacStringToPascal( str , ptitle ) ;
|
||||||
|
menu = ::NewMenu( id , ptitle ) ;
|
||||||
|
#endif
|
||||||
|
return menu ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASetMenuTitle( MenuRef menu , const wxString& title , wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
wxString str = wxStripMenuCodes( title ) ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SetMenuTitleWithCFString( menu , wxMacCFStringHolder(str , encoding) ) ;
|
||||||
|
#else
|
||||||
|
Str255 ptitle ;
|
||||||
|
wxMacStringToPascal( str , ptitle ) ;
|
||||||
|
SetMenuTitle( menu , ptitle ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASetMenuItemText( MenuRef menu, MenuItemIndex item, const wxString& title , wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
wxString str = wxStripMenuCodes( title ) ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SetMenuItemTextWithCFString( menu , item , wxMacCFStringHolder(str , encoding) ) ;
|
||||||
|
#else
|
||||||
|
Str255 ptitle ;
|
||||||
|
wxMacStringToPascal( str , ptitle ) ;
|
||||||
|
SetMenuItemText( menu , item , ptitle ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UInt32 UMAMenuEvent( EventRecord *inEvent )
|
||||||
|
{
|
||||||
|
return MenuEvent( inEvent ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAEnableMenuItem( MenuRef inMenu , MenuItemIndex inItem , bool enable)
|
||||||
|
{
|
||||||
|
if ( enable )
|
||||||
|
EnableMenuItem( inMenu , inItem ) ;
|
||||||
|
else
|
||||||
|
DisableMenuItem( inMenu , inItem ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAAppendSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , SInt16 id )
|
||||||
|
{
|
||||||
|
MacAppendMenu(menu, "\pA");
|
||||||
|
UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding );
|
||||||
|
SetMenuItemHierarchicalID( menu , CountMenuItems( menu ) , id ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAInsertSubMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , SInt16 id )
|
||||||
|
{
|
||||||
|
MacInsertMenuItem(menu, "\pA" , item);
|
||||||
|
UMASetMenuItemText(menu, item , title , encoding);
|
||||||
|
SetMenuItemHierarchicalID( menu , item , id ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASetMenuItemShortcut( MenuRef menu , MenuItemIndex item , wxAcceleratorEntry *entry )
|
||||||
|
{
|
||||||
|
if ( !entry )
|
||||||
|
return ;
|
||||||
|
|
||||||
|
UInt8 modifiers = 0 ;
|
||||||
|
SInt16 key = entry->GetKeyCode() ;
|
||||||
|
if ( key )
|
||||||
|
{
|
||||||
|
bool explicitCommandKey = false ;
|
||||||
|
|
||||||
|
if ( entry->GetFlags() & wxACCEL_CTRL )
|
||||||
|
{
|
||||||
|
explicitCommandKey = true ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry->GetFlags() & wxACCEL_ALT )
|
||||||
|
{
|
||||||
|
modifiers |= kMenuOptionModifier ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry->GetFlags() & wxACCEL_SHIFT)
|
||||||
|
{
|
||||||
|
modifiers |= kMenuShiftModifier ;
|
||||||
|
}
|
||||||
|
|
||||||
|
SInt16 glyph = 0 ;
|
||||||
|
SInt16 macKey = key ;
|
||||||
|
if ( key >= WXK_F1 && key <= WXK_F15 )
|
||||||
|
{
|
||||||
|
// for some reasons this must be 0 right now
|
||||||
|
// everything else leads to just the first function key item
|
||||||
|
// to be selected. Thanks to Ryan Wilcox for finding out.
|
||||||
|
macKey = 0 ;
|
||||||
|
glyph = kMenuF1Glyph + ( key - WXK_F1 ) ;
|
||||||
|
if ( key >= WXK_F13 )
|
||||||
|
glyph += 13 ;
|
||||||
|
if ( !explicitCommandKey )
|
||||||
|
modifiers |= kMenuNoCommandModifier ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch( key )
|
||||||
|
{
|
||||||
|
case WXK_BACK :
|
||||||
|
macKey = kBackspaceCharCode ;
|
||||||
|
glyph = kMenuDeleteLeftGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_TAB :
|
||||||
|
macKey = kTabCharCode ;
|
||||||
|
glyph = kMenuTabRightGlyph ;
|
||||||
|
break ;
|
||||||
|
case kEnterCharCode :
|
||||||
|
macKey = kEnterCharCode ;
|
||||||
|
glyph = kMenuEnterGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_RETURN :
|
||||||
|
macKey = kReturnCharCode ;
|
||||||
|
glyph = kMenuReturnGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_ESCAPE :
|
||||||
|
macKey = kEscapeCharCode ;
|
||||||
|
glyph = kMenuEscapeGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_SPACE :
|
||||||
|
macKey = ' ' ;
|
||||||
|
glyph = kMenuSpaceGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_DELETE :
|
||||||
|
macKey = kDeleteCharCode ;
|
||||||
|
glyph = kMenuDeleteRightGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_CLEAR :
|
||||||
|
macKey = kClearCharCode ;
|
||||||
|
glyph = kMenuClearGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_PRIOR : // PAGE UP
|
||||||
|
macKey = kPageUpCharCode ;
|
||||||
|
glyph = kMenuPageUpGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_NEXT :
|
||||||
|
macKey = kPageDownCharCode ;
|
||||||
|
glyph = kMenuPageDownGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_LEFT :
|
||||||
|
macKey = kLeftArrowCharCode ;
|
||||||
|
glyph = kMenuLeftArrowGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_UP :
|
||||||
|
macKey = kUpArrowCharCode ;
|
||||||
|
glyph = kMenuUpArrowGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_RIGHT :
|
||||||
|
macKey = kRightArrowCharCode ;
|
||||||
|
glyph = kMenuRightArrowGlyph ;
|
||||||
|
break ;
|
||||||
|
case WXK_DOWN :
|
||||||
|
macKey = kDownArrowCharCode ;
|
||||||
|
glyph = kMenuDownArrowGlyph ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetItemCmd( menu, item , macKey );
|
||||||
|
SetMenuItemModifiers(menu, item , modifiers ) ;
|
||||||
|
|
||||||
|
if ( glyph )
|
||||||
|
SetMenuItemKeyGlyph(menu, item , glyph ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAAppendMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , wxAcceleratorEntry *entry )
|
||||||
|
{
|
||||||
|
MacAppendMenu(menu, "\pA");
|
||||||
|
UMASetMenuItemText(menu, (SInt16) ::CountMenuItems(menu), title , encoding );
|
||||||
|
UMASetMenuItemShortcut( menu , (SInt16) ::CountMenuItems(menu), entry ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAInsertMenuItem( MenuRef menu , const wxString& title, wxFontEncoding encoding , MenuItemIndex item , wxAcceleratorEntry *entry )
|
||||||
|
{
|
||||||
|
MacInsertMenuItem( menu , "\pA" , item) ;
|
||||||
|
UMASetMenuItemText(menu, item+1 , title , encoding );
|
||||||
|
UMASetMenuItemShortcut( menu , item+1 , entry ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// quickdraw
|
||||||
|
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
|
||||||
|
int gPrOpenCounter = 0 ;
|
||||||
|
|
||||||
|
OSStatus UMAPrOpen()
|
||||||
|
{
|
||||||
|
OSErr err = noErr ;
|
||||||
|
++gPrOpenCounter ;
|
||||||
|
if ( gPrOpenCounter == 1 )
|
||||||
|
{
|
||||||
|
PrOpen() ;
|
||||||
|
err = PrError() ;
|
||||||
|
wxASSERT( err == noErr ) ;
|
||||||
|
}
|
||||||
|
return err ;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSStatus UMAPrClose()
|
||||||
|
{
|
||||||
|
OSErr err = noErr ;
|
||||||
|
wxASSERT( gPrOpenCounter >= 1 ) ;
|
||||||
|
if ( gPrOpenCounter == 1 )
|
||||||
|
{
|
||||||
|
PrClose() ;
|
||||||
|
err = PrError() ;
|
||||||
|
wxASSERT( err == noErr ) ;
|
||||||
|
}
|
||||||
|
--gPrOpenCounter ;
|
||||||
|
return err ;
|
||||||
|
}
|
||||||
|
|
||||||
|
pascal QDGlobalsPtr GetQDGlobalsPtr (void) ;
|
||||||
|
pascal QDGlobalsPtr GetQDGlobalsPtr (void)
|
||||||
|
{
|
||||||
|
return QDGlobalsPtr (* (Ptr*) LMGetCurrentA5 ( ) - 0xCA);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void UMAShowWatchCursor()
|
||||||
|
{
|
||||||
|
OSErr err = noErr;
|
||||||
|
|
||||||
|
CursHandle watchFob = GetCursor (watchCursor);
|
||||||
|
|
||||||
|
if (!watchFob)
|
||||||
|
err = nilHandleErr;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
// Cursor preservedArrow;
|
||||||
|
// GetQDGlobalsArrow (&preservedArrow);
|
||||||
|
// SetQDGlobalsArrow (*watchFob);
|
||||||
|
// InitCursor ( );
|
||||||
|
// SetQDGlobalsArrow (&preservedArrow);
|
||||||
|
SetCursor (*watchFob);
|
||||||
|
#else
|
||||||
|
SetCursor (*watchFob);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAShowArrowCursor()
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
Cursor arrow;
|
||||||
|
SetCursor (GetQDGlobalsArrow (&arrow));
|
||||||
|
#else
|
||||||
|
SetCursor (&(qd.arrow));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// window manager
|
||||||
|
|
||||||
|
GrafPtr UMAGetWindowPort( WindowRef inWindowRef )
|
||||||
|
{
|
||||||
|
wxASSERT( inWindowRef != NULL ) ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
return (GrafPtr) GetWindowPort( inWindowRef ) ;
|
||||||
|
#else
|
||||||
|
return (GrafPtr) inWindowRef ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMADisposeWindow( WindowRef inWindowRef )
|
||||||
|
{
|
||||||
|
wxASSERT( inWindowRef != NULL ) ;
|
||||||
|
DisposeWindow( inWindowRef ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASetWTitle( WindowRef inWindowRef , const wxString& title , wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SetWindowTitleWithCFString( inWindowRef , wxMacCFStringHolder(title , encoding) ) ;
|
||||||
|
#else
|
||||||
|
Str255 ptitle ;
|
||||||
|
wxMacStringToPascal( title , ptitle ) ;
|
||||||
|
SetWTitle( inWindowRef , ptitle ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// appearance additions
|
||||||
|
|
||||||
|
void UMASetControlTitle( ControlHandle inControl , const wxString& title , wxFontEncoding encoding)
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
SetControlTitleWithCFString( inControl , wxMacCFStringHolder(title , encoding) ) ;
|
||||||
|
#else
|
||||||
|
Str255 ptitle ;
|
||||||
|
wxMacStringToPascal( title , ptitle ) ;
|
||||||
|
SetControlTitle( inControl , ptitle ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAActivateControl( ControlHandle inControl )
|
||||||
|
{
|
||||||
|
// we have to add the control after again to the update rgn
|
||||||
|
// otherwise updates get lost
|
||||||
|
if ( !IsControlActive( inControl ) )
|
||||||
|
{
|
||||||
|
bool visible = IsControlVisible( inControl ) ;
|
||||||
|
if ( visible )
|
||||||
|
SetControlVisibility( inControl , false , false ) ;
|
||||||
|
::ActivateControl( inControl ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , true , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMADrawControl( ControlHandle inControl )
|
||||||
|
{
|
||||||
|
WindowRef theWindow = GetControlOwner(inControl) ;
|
||||||
|
wxMacPortStateHelper help( (GrafPtr) GetWindowPort(theWindow) ) ;
|
||||||
|
RgnHandle updateRgn = NewRgn() ;
|
||||||
|
GetWindowUpdateRgn( theWindow , updateRgn ) ;
|
||||||
|
Point zero = { 0 , 0 } ;
|
||||||
|
LocalToGlobal( &zero ) ;
|
||||||
|
OffsetRgn( updateRgn , -zero.h , -zero.v ) ;
|
||||||
|
::DrawControlInCurrentPort( inControl ) ;
|
||||||
|
InvalWindowRgn( theWindow, updateRgn) ;
|
||||||
|
DisposeRgn( updateRgn ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMAMoveControl( ControlHandle inControl , short x , short y )
|
||||||
|
{
|
||||||
|
bool visible = IsControlVisible( inControl ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , false , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
::MoveControl( inControl , x , y ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , true , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASizeControl( ControlHandle inControl , short x , short y )
|
||||||
|
{
|
||||||
|
bool visible = IsControlVisible( inControl ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , false , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
::SizeControl( inControl , x , y ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , true , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMADeactivateControl( ControlHandle inControl )
|
||||||
|
{
|
||||||
|
// we have to add the control after again to the update rgn
|
||||||
|
// otherwise updates get lost
|
||||||
|
bool visible = IsControlVisible( inControl ) ;
|
||||||
|
if ( visible )
|
||||||
|
SetControlVisibility( inControl , false , false ) ;
|
||||||
|
::DeactivateControl( inControl ) ;
|
||||||
|
if ( visible ) {
|
||||||
|
SetControlVisibility( inControl , true , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// shows the control and adds the region to the update region
|
||||||
|
void UMAShowControl (ControlHandle inControl)
|
||||||
|
{
|
||||||
|
SetControlVisibility( inControl , true , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// shows the control and adds the region to the update region
|
||||||
|
void UMAHideControl (ControlHandle inControl)
|
||||||
|
{
|
||||||
|
SetControlVisibility( inControl , false , false ) ;
|
||||||
|
Rect ctrlBounds ;
|
||||||
|
InvalWindowRect(GetControlOwner(inControl),GetControlBounds(inControl,&ctrlBounds) ) ;
|
||||||
|
}
|
||||||
|
// keyboard focus
|
||||||
|
OSErr UMASetKeyboardFocus (WindowPtr inWindow,
|
||||||
|
ControlHandle inControl,
|
||||||
|
ControlFocusPart inPart)
|
||||||
|
{
|
||||||
|
OSErr err = noErr;
|
||||||
|
GrafPtr port ;
|
||||||
|
GetPort( &port ) ;
|
||||||
|
|
||||||
|
SetPortWindowPort( inWindow ) ;
|
||||||
|
|
||||||
|
err = SetKeyboardFocus( inWindow , inControl , inPart ) ;
|
||||||
|
SetPort( port ) ;
|
||||||
|
return err ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// events
|
||||||
|
void UMAUpdateControls( WindowPtr inWindow , RgnHandle inRgn )
|
||||||
|
{
|
||||||
|
wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) inWindow) ) ;
|
||||||
|
RgnHandle updateRgn = NewRgn() ;
|
||||||
|
GetWindowUpdateRgn( inWindow , updateRgn ) ;
|
||||||
|
|
||||||
|
Point zero = { 0 , 0 } ;
|
||||||
|
LocalToGlobal( &zero ) ;
|
||||||
|
OffsetRgn( updateRgn , -zero.h , -zero.v ) ;
|
||||||
|
|
||||||
|
UpdateControls( inWindow , inRgn ) ;
|
||||||
|
InvalWindowRgn( inWindow, updateRgn) ;
|
||||||
|
DisposeRgn( updateRgn ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UMAIsWindowFloating( WindowRef inWindow )
|
||||||
|
{
|
||||||
|
WindowClass cl ;
|
||||||
|
|
||||||
|
GetWindowClass( inWindow , &cl ) ;
|
||||||
|
return cl == kFloatingWindowClass ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UMAIsWindowModal( WindowRef inWindow )
|
||||||
|
{
|
||||||
|
WindowClass cl ;
|
||||||
|
|
||||||
|
GetWindowClass( inWindow , &cl ) ;
|
||||||
|
return cl < kFloatingWindowClass ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// others
|
||||||
|
|
||||||
|
void UMAHighlightAndActivateWindow( WindowRef inWindowRef , bool inActivate )
|
||||||
|
{
|
||||||
|
if ( inWindowRef )
|
||||||
|
{
|
||||||
|
// bool isHighlighted = IsWindowHighlited( inWindowRef ) ;
|
||||||
|
// if ( inActivate != isHightlited )
|
||||||
|
GrafPtr port ;
|
||||||
|
GetPort( &port ) ;
|
||||||
|
SetPortWindowPort( inWindowRef ) ;
|
||||||
|
HiliteWindow( inWindowRef , inActivate ) ;
|
||||||
|
ControlHandle control = NULL ;
|
||||||
|
::GetRootControl( inWindowRef , & control ) ;
|
||||||
|
if ( control )
|
||||||
|
{
|
||||||
|
if ( inActivate )
|
||||||
|
UMAActivateControl( control ) ;
|
||||||
|
else
|
||||||
|
UMADeactivateControl( control ) ;
|
||||||
|
}
|
||||||
|
SetPort( port ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OSStatus UMADrawThemePlacard( const Rect *inRect , ThemeDrawState inState )
|
||||||
|
{
|
||||||
|
return ::DrawThemePlacard( inRect , inState ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
static OSStatus helpMenuStatus = noErr ;
|
||||||
|
static MenuItemIndex firstCustomItemIndex = 0 ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OSStatus UMAGetHelpMenu(
|
||||||
|
MenuRef * outHelpMenu,
|
||||||
|
MenuItemIndex * outFirstCustomItemIndex)
|
||||||
|
{
|
||||||
|
#if TARGET_CARBON
|
||||||
|
return HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ;
|
||||||
|
#else
|
||||||
|
MenuRef helpMenuHandle ;
|
||||||
|
helpMenuStatus = HMGetHelpMenuHandle( &helpMenuHandle ) ;
|
||||||
|
if ( firstCustomItemIndex == 0 && helpMenuStatus == noErr )
|
||||||
|
{
|
||||||
|
firstCustomItemIndex = CountMenuItems( helpMenuHandle ) + 1 ;
|
||||||
|
}
|
||||||
|
if ( outFirstCustomItemIndex )
|
||||||
|
{
|
||||||
|
*outFirstCustomItemIndex = firstCustomItemIndex ;
|
||||||
|
}
|
||||||
|
*outHelpMenu = helpMenuHandle ;
|
||||||
|
return helpMenuStatus ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport)
|
||||||
|
{
|
||||||
|
m_clip = NULL ;
|
||||||
|
Setup( newport ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPortStateHelper::wxMacPortStateHelper()
|
||||||
|
{
|
||||||
|
m_clip = NULL ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxMacPortStateHelper::Setup( GrafPtr newport )
|
||||||
|
{
|
||||||
|
GetPort( &m_oldPort ) ;
|
||||||
|
SetPort( newport ) ;
|
||||||
|
SetOrigin(0,0);
|
||||||
|
wxASSERT_MSG( m_clip == NULL , wxT("Cannot call setup twice") ) ;
|
||||||
|
m_clip = NewRgn() ;
|
||||||
|
GetClip( m_clip );
|
||||||
|
m_textFont = GetPortTextFont( (CGrafPtr) newport);
|
||||||
|
m_textSize = GetPortTextSize( (CGrafPtr) newport);
|
||||||
|
m_textStyle = GetPortTextFace( (CGrafPtr) newport);
|
||||||
|
m_textMode = GetPortTextMode( (CGrafPtr) newport);
|
||||||
|
GetThemeDrawingState( &m_drawingState ) ;
|
||||||
|
m_currentPort = newport ;
|
||||||
|
}
|
||||||
|
void wxMacPortStateHelper::Clear()
|
||||||
|
{
|
||||||
|
if ( m_clip )
|
||||||
|
{
|
||||||
|
DisposeRgn( m_clip ) ;
|
||||||
|
DisposeThemeDrawingState( m_drawingState ) ;
|
||||||
|
m_clip = NULL ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMacPortStateHelper::~wxMacPortStateHelper()
|
||||||
|
{
|
||||||
|
if ( m_clip )
|
||||||
|
{
|
||||||
|
SetPort( m_currentPort ) ;
|
||||||
|
SetClip( m_clip ) ;
|
||||||
|
DisposeRgn( m_clip ) ;
|
||||||
|
TextFont( m_textFont );
|
||||||
|
TextSize( m_textSize );
|
||||||
|
TextFace( m_textStyle );
|
||||||
|
TextMode( m_textMode );
|
||||||
|
SetThemeDrawingState( m_drawingState , true ) ;
|
||||||
|
SetPort( m_oldPort ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OSStatus UMAPutScrap( Size size , OSType type , void *data )
|
||||||
|
{
|
||||||
|
OSStatus err = noErr ;
|
||||||
|
#if !TARGET_CARBON
|
||||||
|
err = PutScrap( size , type , data ) ;
|
||||||
|
#else
|
||||||
|
ScrapRef scrap;
|
||||||
|
err = GetCurrentScrap (&scrap);
|
||||||
|
if ( !err )
|
||||||
|
{
|
||||||
|
err = PutScrapFlavor (scrap, type , 0, size, data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return err ;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_GUI
|
||||||
|
|
||||||
|
#if wxUSE_BASE
|
||||||
|
|
||||||
|
static bool sUMASystemInitialized = false ;
|
||||||
|
|
||||||
|
bool UMASystemIsInitialized()
|
||||||
|
{
|
||||||
|
return sUMASystemInitialized ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UMASetSystemIsInitialized(bool val)
|
||||||
|
{
|
||||||
|
sUMASystemInitialized = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // wxUSE_BASE
|
||||||
1395
src/mac/classic/utils.cpp
Normal file
1395
src/mac/classic/utils.cpp
Normal file
File diff suppressed because it is too large
Load Diff
223
src/mac/classic/utilsexc.cpp
Normal file
223
src/mac/classic/utilsexc.cpp
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: utilsexec.cpp
|
||||||
|
// Purpose: Execution-related utilities
|
||||||
|
// Author: Stefan Csomor
|
||||||
|
// Modified by: David Elliott
|
||||||
|
// Created: 1998-01-01
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Stefan Csomor
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
//#pragma implementation
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/utils.h"
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
#include "wx/unix/execute.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
extern "C" {
|
||||||
|
#include <mach/mach.h>
|
||||||
|
}
|
||||||
|
#include <CoreFoundation/CFMachPort.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef __DARWIN__
|
||||||
|
#define wxEXECUTE_WIN_MESSAGE 10000
|
||||||
|
|
||||||
|
#include "wx/mac/private.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Below FinderLaunch function comes from:
|
||||||
|
http://developer.apple.com/technotes/tn/tn1002.html#fndrask
|
||||||
|
*/
|
||||||
|
/* FinderLaunch converts a list of nTargets FSSpec records
|
||||||
|
pointed to by the targetList parameter and converts the
|
||||||
|
list to an Apple Event. It then sends that event to the
|
||||||
|
Finder. The array of FSSpec records pointed to by the
|
||||||
|
targetList parameter may contain references to files,
|
||||||
|
folders, or applications. The net effect of this command
|
||||||
|
is equivalent to the user selecting an icon in one of the
|
||||||
|
Finder's windows and then choosing the open command from
|
||||||
|
the Finder's file menu. */
|
||||||
|
static OSErr FinderLaunch(long nTargets, FSSpec *targetList) {
|
||||||
|
OSErr err;
|
||||||
|
AppleEvent theAEvent, theReply;
|
||||||
|
AEAddressDesc fndrAddress;
|
||||||
|
AEDescList targetListDesc;
|
||||||
|
OSType fndrCreator;
|
||||||
|
Boolean wasChanged;
|
||||||
|
AliasHandle targetAlias;
|
||||||
|
long index;
|
||||||
|
|
||||||
|
/* set up locals */
|
||||||
|
AECreateDesc(typeNull, NULL, 0, &theAEvent);
|
||||||
|
AECreateDesc(typeNull, NULL, 0, &fndrAddress);
|
||||||
|
AECreateDesc(typeNull, NULL, 0, &theReply);
|
||||||
|
AECreateDesc(typeNull, NULL, 0, &targetListDesc);
|
||||||
|
targetAlias = NULL;
|
||||||
|
fndrCreator = 'MACS';
|
||||||
|
|
||||||
|
/* verify parameters */
|
||||||
|
if ((nTargets == 0) || (targetList == NULL)) {
|
||||||
|
err = paramErr;
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create an open documents event targeting the
|
||||||
|
finder */
|
||||||
|
err = AECreateDesc(typeApplSignature, (Ptr) &fndrCreator,
|
||||||
|
sizeof(fndrCreator), &fndrAddress);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
err = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
|
||||||
|
&fndrAddress, kAutoGenerateReturnID,
|
||||||
|
kAnyTransactionID, &theAEvent);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
|
||||||
|
/* create the list of files to open */
|
||||||
|
err = AECreateList(NULL, 0, false, &targetListDesc);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
for ( index=0; index < nTargets; index++) {
|
||||||
|
if (targetAlias == NULL)
|
||||||
|
err = NewAlias(NULL, (targetList + index),
|
||||||
|
&targetAlias);
|
||||||
|
else err = UpdateAlias(NULL, (targetList + index),
|
||||||
|
targetAlias, &wasChanged);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
HLock((Handle) targetAlias);
|
||||||
|
err = AEPutPtr(&targetListDesc, (index + 1),
|
||||||
|
typeAlias, *targetAlias,
|
||||||
|
GetHandleSize((Handle) targetAlias));
|
||||||
|
HUnlock((Handle) targetAlias);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add the file list to the Apple Event */
|
||||||
|
err = AEPutParamDesc(&theAEvent, keyDirectObject,
|
||||||
|
&targetListDesc);
|
||||||
|
if (err != noErr) goto bail;
|
||||||
|
|
||||||
|
/* send the event to the Finder */
|
||||||
|
err = AESend(&theAEvent, &theReply, kAENoReply,
|
||||||
|
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
|
||||||
|
|
||||||
|
/* clean up and leave */
|
||||||
|
bail:
|
||||||
|
if (targetAlias != NULL) DisposeHandle((Handle) targetAlias);
|
||||||
|
AEDisposeDesc(&targetListDesc);
|
||||||
|
AEDisposeDesc(&theAEvent);
|
||||||
|
AEDisposeDesc(&fndrAddress);
|
||||||
|
AEDisposeDesc(&theReply);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wxExecute(const wxString& command, int flags, wxProcess *WXUNUSED(handler))
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( flags == wxEXEC_ASYNC,
|
||||||
|
wxT("wxExecute: Only wxEXEC_ASYNC is supported") );
|
||||||
|
|
||||||
|
FSSpec fsSpec;
|
||||||
|
wxMacFilename2FSSpec(command, &fsSpec);
|
||||||
|
|
||||||
|
// 0 means execution failed. Returning non-zero is a PID, but not
|
||||||
|
// on Mac where PIDs are 64 bits and won't fit in a long, so we
|
||||||
|
// return a dummy value for now.
|
||||||
|
return ( FinderLaunch(1 /*one file*/, &fsSpec) == noErr ) ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
void wxMAC_MachPortEndProcessDetect(CFMachPortRef port, void *data)
|
||||||
|
{
|
||||||
|
wxEndProcessData *proc_data = (wxEndProcessData*)data;
|
||||||
|
wxLogDebug(wxT("Wow.. this actually worked!"));
|
||||||
|
int status = 0;
|
||||||
|
int rc = waitpid(abs(proc_data->pid), &status, WNOHANG);
|
||||||
|
if(!rc)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("Mach port was invalidated, but process hasn't terminated!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if((rc != -1) && WIFEXITED(status))
|
||||||
|
proc_data->exitcode = WEXITSTATUS(status);
|
||||||
|
else
|
||||||
|
proc_data->exitcode = -1;
|
||||||
|
wxHandleProcessTermination(proc_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid)
|
||||||
|
{
|
||||||
|
if(pid < 1)
|
||||||
|
return -1;
|
||||||
|
kern_return_t kernResult;
|
||||||
|
mach_port_t taskOfOurProcess;
|
||||||
|
mach_port_t machPortForProcess;
|
||||||
|
taskOfOurProcess = mach_task_self();
|
||||||
|
if(taskOfOurProcess == MACH_PORT_NULL)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("No mach_task_self()"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
wxLogDebug(wxT("pid=%d"),pid);
|
||||||
|
kernResult = task_for_pid(taskOfOurProcess,pid, &machPortForProcess);
|
||||||
|
if(kernResult != KERN_SUCCESS)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("no task_for_pid()"));
|
||||||
|
// try seeing if it is already dead or something
|
||||||
|
// FIXME: a better method would be to call the callback function
|
||||||
|
// from idle time until the process terminates. Of course, how
|
||||||
|
// likely is it that it will take more than 0.1 seconds for the
|
||||||
|
// mach terminate event to make its way to the BSD subsystem?
|
||||||
|
usleep(100); // sleep for 0.1 seconds
|
||||||
|
wxMAC_MachPortEndProcessDetect(NULL, (void*)proc_data);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
CFMachPortContext termcb_contextinfo;
|
||||||
|
termcb_contextinfo.version = NULL;
|
||||||
|
termcb_contextinfo.info = (void*)proc_data;
|
||||||
|
termcb_contextinfo.retain = NULL;
|
||||||
|
termcb_contextinfo.release = NULL;
|
||||||
|
termcb_contextinfo.copyDescription = NULL;
|
||||||
|
CFMachPortRef CFMachPortForProcess;
|
||||||
|
Boolean ShouldFreePort;
|
||||||
|
CFMachPortForProcess = CFMachPortCreateWithPort(NULL, machPortForProcess, NULL, &termcb_contextinfo, &ShouldFreePort);
|
||||||
|
if(!CFMachPortForProcess)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("No CFMachPortForProcess"));
|
||||||
|
mach_port_deallocate(taskOfOurProcess, machPortForProcess);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(ShouldFreePort)
|
||||||
|
{
|
||||||
|
kernResult = mach_port_deallocate(taskOfOurProcess, machPortForProcess);
|
||||||
|
if(kernResult!=KERN_SUCCESS)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("Couldn't deallocate mach port"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CFMachPortSetInvalidationCallBack(CFMachPortForProcess, &wxMAC_MachPortEndProcessDetect);
|
||||||
|
CFRunLoopSourceRef runloopsource;
|
||||||
|
runloopsource = CFMachPortCreateRunLoopSource(NULL,CFMachPortForProcess, (CFIndex)0);
|
||||||
|
if(!runloopsource)
|
||||||
|
{
|
||||||
|
wxLogDebug(wxT("Couldn't create runloopsource"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease(CFMachPortForProcess);
|
||||||
|
|
||||||
|
CFRunLoopAddSource(CFRunLoopGetCurrent(),runloopsource,kCFRunLoopDefaultMode);
|
||||||
|
CFRelease(runloopsource);
|
||||||
|
wxLogDebug(wxT("Successfully added notification to the runloop"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2096
src/mac/classic/window.cpp
Normal file
2096
src/mac/classic/window.cpp
Normal file
File diff suppressed because it is too large
Load Diff
BIN
src/mac/classic/wxmac.icns
Normal file
BIN
src/mac/classic/wxmac.icns
Normal file
Binary file not shown.
Reference in New Issue
Block a user