From 5b781a6729859abc77e6ca5b1f81cbaad974a78f Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Thu, 8 Feb 2001 21:13:12 +0000 Subject: [PATCH] updated mac sources (CW 5.3 working , CW6 still having code gen problems) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9334 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/app.h | 2 +- include/wx/cmndata.h | 13 ++- include/wx/datetime.h | 13 +++ include/wx/datetime.inl | 6 +- include/wx/filefn.h | 10 +- include/wx/geometry.h | 4 + include/wx/mac/app.h | 8 +- include/wx/mac/choice.h | 5 +- include/wx/mac/dcprint.h | 4 + include/wx/mac/filedlg.h | 4 + include/wx/mac/statusbr.h | 6 +- include/wx/mac/uma.h | 10 +- include/wx/mac/wave.h | 7 +- include/wx/mac/window.h | 7 +- include/wx/utils.h | 6 ++ include/wx/wave.h | 2 + samples/minimal/makemac.mcp | Bin 177903 -> 177903 bytes src/common/cmndata.cpp | 70 +++++++++---- src/common/cwlex_yy.c | 2 +- src/common/cwy_tab.c | 11 ++- src/common/file.cpp | 16 ++- src/common/fileconf.cpp | 14 +-- src/common/filefn.cpp | 45 +++++++-- src/mac/aga.cpp | 1 + src/mac/app.cpp | 46 ++++++--- src/mac/carbon/aga.cpp | 1 + src/mac/carbon/app.cpp | 46 ++++++--- src/mac/carbon/choice.cpp | 9 ++ src/mac/carbon/corersrc.r | 10 +- src/mac/carbon/dc.cpp | 13 ++- src/mac/carbon/dcprint.cpp | 79 +++++++++++---- src/mac/carbon/dirdlg.cpp | 121 +++++++++++++++++++++-- src/mac/carbon/filedlg.cpp | 175 ++++++++++++++++++++++++++++++++- src/mac/carbon/font.cpp | 13 +-- src/mac/carbon/fontenum.cpp | 1 + src/mac/carbon/frame.cpp | 10 +- src/mac/carbon/listbox.cpp | 11 +++ src/mac/carbon/menu.cpp | 31 +++++- src/mac/carbon/notebmac.cpp | 3 + src/mac/carbon/printmac.cpp | 7 +- src/mac/carbon/textctrl.cpp | 13 ++- src/mac/carbon/thread.cpp | 4 +- src/mac/carbon/uma.cpp | 52 ++++++++-- src/mac/carbon/utils.cpp | 8 ++ src/mac/carbon/wave.cpp | 190 +++++++++++++++++++++++++++++++++--- src/mac/carbon/window.cpp | 84 ++++++++++++++-- src/mac/choice.cpp | 9 ++ src/mac/corersrc.r | 10 +- src/mac/dc.cpp | 13 ++- src/mac/dcprint.cpp | 79 +++++++++++---- src/mac/dirdlg.cpp | 121 +++++++++++++++++++++-- src/mac/filedlg.cpp | 175 ++++++++++++++++++++++++++++++++- src/mac/font.cpp | 13 +-- src/mac/fontenum.cpp | 1 + src/mac/frame.cpp | 10 +- src/mac/listbox.cpp | 11 +++ src/mac/menu.cpp | 31 +++++- src/mac/notebmac.cpp | 3 + src/mac/printmac.cpp | 7 +- src/mac/textctrl.cpp | 13 ++- src/mac/thread.cpp | 4 +- src/mac/uma.cpp | 52 ++++++++-- src/mac/utils.cpp | 8 ++ src/mac/wave.cpp | 190 +++++++++++++++++++++++++++++++++--- src/mac/window.cpp | 84 ++++++++++++++-- src/mac/xpm/data.c | 2 +- src/makemac.mcp | Bin 527388 -> 527388 bytes 67 files changed, 1772 insertions(+), 257 deletions(-) diff --git a/include/wx/app.h b/include/wx/app.h index 5538e053bd..0ff464639c 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -370,7 +370,7 @@ public: // be in your main program (e.g. hello.cpp). Now IMPLEMENT_APP should add this // code if required. -#if !wxUSE_GUI || defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__) +#if !wxUSE_GUI || defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__) || (defined(__DARWIN__) && defined(__WXMAC__)) #define IMPLEMENT_WXWIN_MAIN \ extern int wxEntry( int argc, char *argv[] ); \ int main(int argc, char *argv[]) { return wxEntry(argc, argv); } diff --git a/include/wx/cmndata.h b/include/wx/cmndata.h index 028c27fe4f..49afce9415 100644 --- a/include/wx/cmndata.h +++ b/include/wx/cmndata.h @@ -21,6 +21,10 @@ #include "wx/colour.h" #include "wx/gdicmn.h" +#if defined( __WXMAC__ ) && defined( TARGET_CARBON ) +#include +#endif + #if (defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXPM__)) && wxUSE_POSTSCRIPT class WXDLLEXPORT wxPrintSetupData; #endif @@ -187,8 +191,13 @@ public: void* m_devMode; void* m_devNames; #elif defined( __WXMAC__ ) +#if TARGET_CARBON + PMPageFormat m_macPageFormat ; + PMPrintSettings m_macPrintSettings ; +#else THPrint m_macPrintInfo ; #endif +#endif private: @@ -284,8 +293,6 @@ class WXDLLEXPORT wxPrintDialogData: public wxObject #ifdef __WXMSW__ void* m_printDlgData; -#elif defined( __WXMAC__ ) - THPrint m_macPrintInfo ; #endif private: @@ -388,8 +395,6 @@ public: #if defined(__WIN95__) void* m_pageSetupData; -#elif defined( __WXMAC__ ) - THPrint m_macPageSetupInfo ; #endif private: diff --git a/include/wx/datetime.h b/include/wx/datetime.h index 69872ce28a..a9842fd982 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -36,6 +36,19 @@ class WXDLLEXPORT wxDateSpan; #define inline #endif // Debug +// not all c-runtimes are based on 1/1/1970 being (time_t) 0 +// set this to the corresponding value in seconds 1/1/1970 has on your +// systems c-runtime + +#ifdef __WXMAC__ +#if __MSL__ < 0x6000 + #define WX_TIME_BASE_OFFSET ( 2082844800L + 126144000L ) +#else + #define WX_TIME_BASE_OFFSET 0 +#endif +#else + #define WX_TIME_BASE_OFFSET 0 +#endif /* * TODO * diff --git a/include/wx/datetime.inl b/include/wx/datetime.inl index 302d65c195..3089b32111 100644 --- a/include/wx/datetime.inl +++ b/include/wx/datetime.inl @@ -66,7 +66,7 @@ inline wxDateTime wxDateTime::Today() inline wxDateTime& wxDateTime::Set(time_t timet) { // assign first to avoid long multiplication overflow! - m_time = timet; + m_time = timet - WX_TIME_BASE_OFFSET ; m_time *= TIME_T_FACTOR; return *this; @@ -146,10 +146,10 @@ inline time_t wxDateTime::GetTicks() const return (time_t)-1; } - return (time_t)((m_time / (long)TIME_T_FACTOR).GetLo()); + return (time_t)((m_time / (long)TIME_T_FACTOR).GetLo())+WX_TIME_BASE_OFFSET ; } -inline bool wxDateTime::SetToLastWeekDay(WeekDay weekday, +bool wxDateTime::SetToLastWeekDay(WeekDay weekday, Month month, int year) { diff --git a/include/wx/filefn.h b/include/wx/filefn.h index e7a4d4f2ae..2502dc1a06 100644 --- a/include/wx/filefn.h +++ b/include/wx/filefn.h @@ -25,7 +25,8 @@ // ---------------------------------------------------------------------------- // define off_t -#ifndef __WXMAC__ + +#if !defined(__WXMAC__) || defined(__DARWIN__) #include #else typedef long off_t; @@ -264,7 +265,12 @@ WXDLLEXPORT bool wxRmdir(const wxString& dir, int flags = 0); #define wxFILE_SEP_PATH wxFILE_SEP_PATH_UNIX #define wxPATH_SEP wxPATH_SEP_UNIX #elif defined(__MAC__) - #define wxFILE_SEP_PATH wxFILE_SEP_PATH_MAC + +// TODO find out whether we can really switch back to native file names +// previously this mac was emulating unix/win filename structures +// #define wxFILE_SEP_PATH wxFILE_SEP_PATH_MAC + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_DOS + #define wxPATH_SEP wxPATH_SEP_DOS #else // Windows and OS/2 #define wxFILE_SEP_PATH wxFILE_SEP_PATH_DOS #define wxPATH_SEP wxPATH_SEP_DOS diff --git a/include/wx/geometry.h b/include/wx/geometry.h index 47c083420a..2a8a8fb396 100644 --- a/include/wx/geometry.h +++ b/include/wx/geometry.h @@ -18,6 +18,10 @@ #include "wx/defs.h" +#ifndef wxUSE_GEOMETRY + #define wxUSE_GEOMETRY 0 +#endif + #if wxUSE_GEOMETRY #include "wx/utils.h" diff --git a/include/wx/mac/app.h b/include/wx/mac/app.h index 145c023274..e28f626e38 100644 --- a/include/wx/mac/app.h +++ b/include/wx/mac/app.h @@ -147,10 +147,10 @@ public : virtual void MacHandleHighLevelEvent( EventRecord *ev ) ; virtual void MacHandleMenuSelect( int menuid , int menuitem ) ; - virtual OSErr MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) ; - virtual OSErr MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) ; - virtual OSErr MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) ; - virtual OSErr MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) ; + virtual OSErr MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply) ; + virtual OSErr MacHandleAEPDoc(const AppleEvent *event , AppleEvent *reply) ; + virtual OSErr MacHandleAEOApp(const AppleEvent *event , AppleEvent *reply) ; + virtual OSErr MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply) ; DECLARE_EVENT_TABLE() }; diff --git a/include/wx/mac/choice.h b/include/wx/mac/choice.h index 7e8d94d2a9..f641fad419 100644 --- a/include/wx/mac/choice.h +++ b/include/wx/mac/choice.h @@ -26,9 +26,10 @@ class WXDLLEXPORT wxChoice: public wxControl DECLARE_DYNAMIC_CLASS(wxChoice) public: - inline wxChoice() {} + wxChoice() {} + ~wxChoice() ; - inline wxChoice(wxWindow *parent, wxWindowID id, + wxChoice(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int n = 0, const wxString choices[] = NULL, diff --git a/include/wx/mac/dcprint.h b/include/wx/mac/dcprint.h index 07f876fc85..e2e11819a3 100644 --- a/include/wx/mac/dcprint.h +++ b/include/wx/mac/dcprint.h @@ -33,7 +33,11 @@ class WXDLLEXPORT wxPrinterDC: public wxDC virtual void StartPage(void) ; virtual void EndPage(void) ; protected : + #if TARGET_CARBON + PMPrintContext m_macPrintPort ; + #else TPPrPort m_macPrintPort ; + #endif wxPrintData m_printData ; }; diff --git a/include/wx/mac/filedlg.h b/include/wx/mac/filedlg.h index 911f7ffe85..1ce921758e 100644 --- a/include/wx/mac/filedlg.h +++ b/include/wx/mac/filedlg.h @@ -35,6 +35,8 @@ protected: wxString m_dir; wxString m_path; // Full path wxString m_fileName; + wxArrayString m_fileNames; + wxArrayString m_paths; wxString m_wildCard; int m_filterIndex; public: @@ -54,6 +56,8 @@ public: inline wxString GetPath() const { return m_path; } inline wxString GetDirectory() const { return m_dir; } inline wxString GetFilename() const { return m_fileName; } + void GetPaths(wxArrayString& paths) const { paths = m_paths; } + void GetFilenames(wxArrayString& files) const { files = m_fileNames; } inline wxString GetWildcard() const { return m_wildCard; } inline long GetStyle() const { return m_dialogStyle; } inline int GetFilterIndex() const { return m_filterIndex ; } diff --git a/include/wx/mac/statusbr.h b/include/wx/mac/statusbr.h index c45b276306..622cbab452 100644 --- a/include/wx/mac/statusbr.h +++ b/include/wx/mac/statusbr.h @@ -23,8 +23,8 @@ class WXDLLEXPORT wxStatusBarMac : public wxStatusBarGeneric { DECLARE_DYNAMIC_CLASS(wxStatusBarMac); - wxStatusBarMac(void); - inline wxStatusBarMac(wxWindow *parent, wxWindowID id, + wxStatusBarMac(); + wxStatusBarMac(wxWindow *parent, wxWindowID id, long style = 0, const wxString& name = wxPanelNameStr) { @@ -34,7 +34,7 @@ class WXDLLEXPORT wxStatusBarMac : public wxStatusBarGeneric ~wxStatusBarMac(); bool Create(wxWindow *parent, wxWindowID id, - long style, + long style , const wxString& name = wxPanelNameStr) ; virtual void DrawFieldText(wxDC& dc, int i); diff --git a/include/wx/mac/uma.h b/include/wx/mac/uma.h index 927be963cd..85ad8863b1 100644 --- a/include/wx/mac/uma.h +++ b/include/wx/mac/uma.h @@ -16,6 +16,11 @@ #define UMA_USE_8_6 0 +#if TARGET_CARBON +#undef UMA_USE_8_6 +#define UMA_USE_8_6 1 +#endif + #if defined(__POWERPC__) || defined(__MACH__) #define UMA_USE_APPEARANCE 1 #define UMA_USE_WINDOWMGR 1 @@ -35,6 +40,7 @@ #endif void UMAInitToolbox( UInt16 inMoreMastersCalls) ; +void UMACleanupToolbox() ; bool UMAHasAppearance() ; long UMAGetAppearanceVersion() ; @@ -69,8 +75,8 @@ void UMADrawMenuBar() ; void UMAShowWatchCursor() ; void UMAShowArrowCursor() ; -void UMAPrOpen() ; -void UMAPrClose() ; +OSStatus UMAPrOpen() ; +OSStatus UMAPrClose() ; // window manager diff --git a/include/wx/mac/wave.h b/include/wx/mac/wave.h index e55bd5aa5f..e4934dedf8 100644 --- a/include/wx/mac/wave.h +++ b/include/wx/mac/wave.h @@ -28,14 +28,17 @@ public: public: bool Create(const wxString& fileName, bool isResource = FALSE); - bool IsOk() const { return (m_waveData ? TRUE : FALSE); }; + bool IsOk() const { return !m_sndname.IsEmpty(); } bool Play(bool async = TRUE, bool looped = FALSE) const; protected: bool Free(); private: - char* m_waveData; + SndChannelPtr m_sndChan; + + wxString m_sndname; + SndListHandle m_hSnd; int m_waveLength; bool m_isResource; }; diff --git a/include/wx/mac/window.h b/include/wx/mac/window.h index 98bccb0324..3692c3cfb8 100644 --- a/include/wx/mac/window.h +++ b/include/wx/mac/window.h @@ -246,7 +246,12 @@ public : WindowRef GetMacRootWindow() const ; virtual ControlHandle MacGetContainerForEmbedding() ; - virtual long MacGetBorderSize() const ; + + virtual long MacGetLeftBorderSize() const ; + virtual long MacGetRightBorderSize() const ; + virtual long MacGetTopBorderSize() const ; + virtual long MacGetBottomBorderSize() const ; + static long MacRemoveBordersFromStyle( long style ) ; virtual void MacSuperChangedPosition() ; virtual void MacSuperShown( bool show ) ; diff --git a/include/wx/utils.h b/include/wx/utils.h index 09094b4877..81941fe6f0 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -255,6 +255,12 @@ WXDLLEXPORT const wxMB2WXbuf wxGetUserHome(const wxString& user = wxEmptyString) WXDLLEXPORT wxChar* wxGetUserHome(const wxString& user = wxEmptyString); #endif +#ifdef __WXMAC__ +WXDLLEXPORT wxString wxMacFindFolder(short vRefNum, + OSType folderType, + Boolean createFolder); +#endif + #if wxUSE_GUI // GUI only things from now on // ---------------------------------------------------------------------------- diff --git a/include/wx/wave.h b/include/wx/wave.h index f0756b1cdc..c5b7d0ef30 100644 --- a/include/wx/wave.h +++ b/include/wx/wave.h @@ -9,6 +9,8 @@ #include "wx/qt/wave.h" #elif defined(__WXPM__) #include "wx/os2/wave.h" +#elif defined(__WXMAC__) +#include "wx/mac/wave.h" #endif #endif diff --git a/samples/minimal/makemac.mcp b/samples/minimal/makemac.mcp index 988af88ba81cfb6d515df994d492994e7df8f786..eb0caeb8a592c2747bd2f84b5bfacce5572f3b35 100644 GIT binary patch delta 768 zcmXw%O=uHA7=~wNn`E=u%1SMo(xioAtF{$;GU5+S>5n!siAxnkBGe!y)FvecOAr)n ziP()+8OVAOD^%?*m4R*#RRjZ~2%b~~1@TmbwBS)A@te(b;hSgXnRj6Ko877?TNP#H zD8chAK+^cQfe>0mNKPQ6!W0=Omr5Y1DV$DBp1wSl&g6#E8SoMm57=B?e&1ZHeVt_+ z5+%Jp&}{?;s2IRr^Bj~8*uk9x1}L2tc8<}iGh;sbjHes;30m+R#yV?}eHiOB;4Wc_ zZny_};B@EksqheFLY%OU2u1~Cf@kPCrOOL}Rv~NY0~ zP(iAx-*J#_s^y4NJ`2)dFP>mbLvwDk|1Oa&ZITRPbHR^qvHKUxGJSnRVV5RCvKkq` zmYf*RCex{K((H?qW0v+1{~!-yd3xchS6*E%uRzl_S>MOM*gVlmnz>r5)z;c=MHgml z1EJ`Lx_O@4HriV-|1f)b{kP)a_ioT{`ID@gHyRxL+6}7S>7ZYXy>xwkAFCQ3QrAqq zhh;~wo|tQ=O0j!3Uc4PIVk=%Gl}0>fhL*?-;LQ^G4Or{J>I?q}qWOgsg% osYDJsT|Z$jV2zZ>FUfEJzuHuGIth~ZPCV)>m>jaAj4Vq30gk=J+W-In delta 776 zcmX|<%WD%+6vpp8dCX)IZG1&j^Qe#7*v7cfP^nf^`-nA7(m=JkP!ziH6+=@HaZyl- zn6%n*ZLS-!i`Io8DGbdBz7YElRMe#rU04dW=uRz+XVQxozVo~1n~yWhy|cWeEH5cD z2SGgom+5$~xiwD+nIuF$L5KslBu_He2_!?wzP5pZp7YruLf(haH=&F`m9x*Ejp=&j zuDW1iu*ZY8AF!a3h-z=-P$|S3l-GgRxGH9S}S`gjk5!`5(TzkI~v4yZtv>u=|si^lY$9@#w5|l*-53r zjX{qvyn$ewlA#Z}R9D?7%9c0d?=a&k~!M2;2%6?}Up~3m0M2T6&7drr;Xl-4uM3 z=%+_`3>p4-8oi9R`3d}yK}z!tB?wvVBlv8;7A?V|$tNq=IIj$4E+CB`M=Zx{+yu3x H3X`UPzU#dmPaperWidth = m_paperSize.x * 10; devMode->dmPaperLength = m_paperSize.y * 10; devMode->dmFields |= DM_PAPERWIDTH; @@ -609,6 +617,7 @@ void wxPrintData::ConvertFromNative() } else if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH)) { + // DEVMODE is in tenths of a milimeter m_paperSize.x = devMode->dmPaperWidth / 10; m_paperSize.y = devMode->dmPaperLength / 10; m_paperId = wxPAPER_NONE; @@ -709,20 +718,29 @@ void wxPrintData::ConvertFromNative() #ifdef __WXMAC__ void wxPrintData::ConvertToNative() { +#ifdef TARGET_CARBON +#else (**m_macPrintInfo).prJob.iCopies = m_printNoCopies ; +#endif } void wxPrintData::ConvertFromNative() { +#ifdef TARGET_CARBON +#else m_printNoCopies = (**m_macPrintInfo).prJob.iCopies ; +#endif } #endif void wxPrintData::operator=(const wxPrintData& data) { #ifdef __WXMAC__ +#ifdef TARGET_CARBON +#else m_macPrintInfo = data.m_macPrintInfo ; HandToHand( (Handle*) &m_macPrintInfo ) ; +#endif #endif m_printNoCopies = data.m_printNoCopies; m_printCollate = data.m_printCollate; @@ -1019,16 +1037,22 @@ void wxPrintDialogData::SetOwnerWindow(wxWindow* win) #ifdef __WXMAC__ void wxPrintDialogData::ConvertToNative() { +#ifdef TARGET_CARBON +#else (**m_printData.m_macPrintInfo).prJob.iFstPage = m_printFromPage ; (**m_printData.m_macPrintInfo).prJob.iLstPage = m_printToPage ; m_printData.ConvertToNative() ; +#endif } void wxPrintDialogData::ConvertFromNative() { +#ifdef TARGET_CARBON +#else m_printData.ConvertFromNative() ; m_printFromPage = (**m_printData.m_macPrintInfo).prJob.iFstPage ; m_printToPage = (**m_printData.m_macPrintInfo).prJob.iLstPage ; +#endif } #endif @@ -1228,7 +1252,7 @@ void wxPageSetupDialogData::ConvertToNative() pd->hwndOwner=(HWND)NULL; // pd->hDevNames=(HWND)NULL; pd->hInstance=(HINSTANCE)NULL; - + // PAGESETUPDLG is in hundreds of a mm pd->ptPaperSize.x = m_paperSize.x * 100; pd->ptPaperSize.y = m_paperSize.y * 100; @@ -1305,6 +1329,7 @@ void wxPageSetupDialogData::ConvertFromNative() m_getDefaultInfo = ((pd->Flags & PSD_RETURNDEFAULT) == PSD_RETURNDEFAULT); m_enableHelp = ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP); + // PAGESETUPDLG is in hundreds of a mm m_paperSize.x = pd->ptPaperSize.x / 100; m_paperSize.y = pd->ptPaperSize.y / 100; @@ -1337,6 +1362,8 @@ void wxPageSetupDialogData::ConvertToNative() { m_printData.ConvertToNative() ; // on mac the paper rect has a negative top left corner, because the page rect (printable area) is at 0,0 +#ifdef TARGET_CARBON +#else (**m_printData.m_macPrintInfo).rPaper.left = int( ((double) m_minMarginTopLeft.x)*mm2pt ) ; (**m_printData.m_macPrintInfo).rPaper.top = int( ((double) m_minMarginTopLeft.y)*mm2pt ) ; @@ -1347,12 +1374,15 @@ void wxPageSetupDialogData::ConvertToNative() (**m_printData.m_macPrintInfo).prInfo.rPage.top = 0 ; (**m_printData.m_macPrintInfo).prInfo.rPage.right = int( ((double) m_paperSize.x - m_minMarginTopLeft.x - m_minMarginBottomRight.x)*mm2pt ) ; (**m_printData.m_macPrintInfo).prInfo.rPage.bottom = int( ((double) m_paperSize.y - m_minMarginTopLeft.y - m_minMarginBottomRight.y)*mm2pt ) ; +#endif } void wxPageSetupDialogData::ConvertFromNative() { m_printData.ConvertFromNative () ; +#ifdef TARGET_CARBON +#else m_paperSize.x = ((double) (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ) * pt2mm ; m_paperSize.y = ((double) (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ) * pt2mm ; @@ -1361,7 +1391,7 @@ void wxPageSetupDialogData::ConvertFromNative() m_minMarginBottomRight.x = ((double) (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).prInfo.rPage.right ) * pt2mm ; m_minMarginBottomRight.y = ((double)(**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).prInfo.rPage.bottom ) * pt2mm ; - +#endif // adjust minimal values //TODO add custom fields in dialog for margins diff --git a/src/common/cwlex_yy.c b/src/common/cwlex_yy.c index 96e91c1ca9..3f67562896 100644 --- a/src/common/cwlex_yy.c +++ b/src/common/cwlex_yy.c @@ -69,7 +69,7 @@ char *malloc(); int free(); */ -int read(); +//int read(); #endif diff --git a/src/common/cwy_tab.c b/src/common/cwy_tab.c index 1ad5970dd7..bfbe337922 100644 --- a/src/common/cwy_tab.c +++ b/src/common/cwy_tab.c @@ -22,10 +22,19 @@ int yylex(void); int yylook(void); int yywrap(void); int yyback(int *, int); -#ifdef __WXMAC__ +#if __MSL__ < 0x6000 int read( int , char * , int ) ; +#else +int _read( int , void * , size_t ) ; +#define read _read +#endif +#ifdef __WXMSW__ +int fileno( FILE* ) ; +#else +#if __MSL__ < 0x6000 int fileno( void* ) ; #endif +#endif /* You may need to put /DLEX_SCANNER in your makefile * if you're using LEX! diff --git a/src/common/file.cpp b/src/common/file.cpp index cd4f7c7a01..5fac43328c 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -68,12 +68,16 @@ // Have to ifdef this for different environments #include #elif (defined(__WXMAC__)) +#if __MSL__ < 0x6000 int access( const char *path, int mode ) { return 0 ; } +#else + int _access( const char *path, int mode ) { return 0 ; } +#endif char* mktemp( char * path ) { return path ;} - #include - #include + #include #define W_OK 2 #define R_OK 4 + #include #else #error "Please specify the header with file functions declarations." #endif //Win/UNIX @@ -189,7 +193,9 @@ bool wxFile::Create(const wxChar *szFileName, bool bOverwrite, int accessMode) // if bOverwrite we create a new file or truncate the existing one, // otherwise we only create the new file and fail if it already exists #ifdef __WXMAC__ - int fd = open(wxUnix2MacFilename( szFileName ), O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL), access); + // Dominic Mazzoni [dmazzoni+@cs.cmu.edu] reports that open is still broken on the mac, so we replace + // int fd = open(wxUnix2MacFilename( szFileName ), O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL), access); + int fd = creat(wxUnix2MacFilename( szFileName ), accessMode); #else int fd = wxOpen(wxFNCONV(szFileName), O_BINARY | O_WRONLY | O_CREAT | @@ -293,7 +299,11 @@ size_t wxFile::Write(const void *pBuf, size_t nCount) wxCHECK( (pBuf != NULL) && IsOpened(), 0 ); #ifdef __MWERKS__ +#if __MSL__ >= 0x6000 + int iRc = ::write(m_fd, (void*) pBuf, nCount); +#else int iRc = ::write(m_fd, (const char*) pBuf, nCount); +#endif #else int iRc = ::write(m_fd, pBuf, nCount); #endif diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 0d5b0a4ae3..bf8103304c 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -199,19 +199,7 @@ wxString wxFileConfig::GetGlobalDir() #elif defined(__WXSTUBS__) wxASSERT_MSG( FALSE, wxT("TODO") ) ; #elif defined(__WXMAC__) - { - short vRefNum ; - long dirID ; - - if ( FindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &vRefNum, &dirID) == noErr) - { - FSSpec file ; - if ( FSMakeFSSpec( vRefNum , dirID , "\p" , &file ) == noErr ) - { - strDir = wxMacFSSpec2UnixFilename( &file ) + "/" ; - } - } - } + strDir = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder ) ; #else // Windows wxChar szWinDir[MAX_PATH]; ::GetWindowsDirectory(szWinDir, MAX_PATH); diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 721448750d..6d2afb1a79 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -57,6 +57,7 @@ #else #include #include + #include #endif #ifdef __UNIX__ @@ -1682,16 +1683,40 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #ifdef _MSC_VER if (_getcwd(buf, sz) == NULL) { #elif defined( __WXMAC__) - enum - { - SFSaveDisk = 0x214, CurDirStore = 0x398 - }; - FSSpec cwdSpec ; - - FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; - wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; - strcpy( buf , res ) ; - if (0) { + FSSpec cwdSpec ; + FCBPBRec pb; + OSErr error; + Str255 fileName ; + pb.ioNamePtr = (StringPtr) &fileName; + pb.ioVRefNum = 0; + pb.ioRefNum = LMGetCurApRefNum(); + pb.ioFCBIndx = 0; + error = PBGetFCBInfoSync(&pb); + if ( error == noErr ) + { + cwdSpec.vRefNum = pb.ioFCBVRefNum; + cwdSpec.parID = pb.ioFCBParID; + cwdSpec.name[0] = 0 ; + wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; + + strcpy( buf , res ) ; + buf[res.length()-1]=0 ; + } + else + buf[0] = 0 ; + /* + this version will not always give back the application directory on mac + enum + { + SFSaveDisk = 0x214, CurDirStore = 0x398 + }; + FSSpec cwdSpec ; + + FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; + wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; + strcpy( buf , res ) ; + */ + if (0) { #elif(__VISAGECPP__) APIRET rc; rc = ::DosQueryCurrentDir( 0 // current drive diff --git a/src/mac/aga.cpp b/src/mac/aga.cpp index d356a5ac1d..5808402832 100644 --- a/src/mac/aga.cpp +++ b/src/mac/aga.cpp @@ -2615,6 +2615,7 @@ AGAPortHelper::~AGAPortHelper() TextSize( size ); TextFace( style ); TextMode( mode ); + SetOrigin( 0 , 0 ) ; SetPort( port ) ; } } diff --git a/src/mac/app.cpp b/src/mac/app.cpp index a11ff6db93..d904e133cb 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -89,28 +89,28 @@ wxString wxApp::s_macHelpMenuTitleName = "&Help" ; pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEODoc( event , reply) ; + return wxTheApp->MacHandleAEODoc( (AppleEvent*) event , reply) ; } pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEOApp( event , reply ) ; + return wxTheApp->MacHandleAEOApp( (AppleEvent*) event , reply ) ; } pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEPDoc( event , reply ) ; + return wxTheApp->MacHandleAEPDoc( (AppleEvent*) event , reply ) ; } pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEQuit( event , reply) ; + return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ; } -OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply) { ProcessSerialNumber PSN ; PSN.highLongOfPSN = 0 ; @@ -119,17 +119,17 @@ OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) return noErr ; } -OSErr wxApp::MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEPDoc(const AppleEvent *event , AppleEvent *reply) { return noErr ; } -OSErr wxApp::MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEOApp(const AppleEvent *event , AppleEvent *reply) { return noErr ; } -OSErr wxApp::MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply) { wxWindow* win = GetTopWindow() ; if ( win ) @@ -510,6 +510,7 @@ void wxApp::CleanUp() delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG + UMACleanupToolbox() ; if (s_macCursorRgn) ::DisposeRgn(s_macCursorRgn); @@ -1044,14 +1045,16 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev ) int newHeight = HiWord(growResult); int oldWidth, oldHeight; - win->GetSize(&oldWidth, &oldHeight); - if (newWidth == 0) - newWidth = oldWidth; - if (newHeight == 0) - newHeight = oldHeight; if (win) + { + win->GetSize(&oldWidth, &oldHeight); + if (newWidth == 0) + newWidth = oldWidth; + if (newHeight == 0) + newHeight = oldHeight; win->SetSize( -1, -1, newWidth, newHeight, wxSIZE_USE_EXISTING); + } } s_lastMouseDown = 0; break; @@ -1253,7 +1256,10 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev ) UInt32 menuresult = UMAMenuEvent(ev) ; if ( HiWord( menuresult ) ) + { + if ( !s_macIsInModalLoop ) MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ; + } else { short keycode ; @@ -1373,6 +1379,14 @@ void wxApp::MacHandleUpdateEvent( EventRecord *ev ) { win->MacUpdate( ev ) ; } + else + { + // since there is no way of telling this foreign window to update itself + // we have to invalidate the update region otherwise we keep getting the same + // event over and over again + BeginUpdate( window ) ; + EndUpdate( window ) ; + } } void wxApp::MacHandleDiskEvent( EventRecord *ev ) @@ -1490,9 +1504,12 @@ void wxApp::MacHandleOSEvent( EventRecord *ev ) switch (windowPart) { + // fixes for setting the cursor back from dominic mazzoni case inMenuBar : + UMAShowArrowCursor(); break ; case inSysWindow : + UMAShowArrowCursor(); break ; default: { @@ -1502,6 +1519,9 @@ void wxApp::MacHandleOSEvent( EventRecord *ev ) wxWindow* win = wxFindWinFromMacWindow( window ) ; if ( win ) win->MacMouseMoved( ev , windowPart ) ; + else + UMAShowArrowCursor(); + } break; } diff --git a/src/mac/carbon/aga.cpp b/src/mac/carbon/aga.cpp index d356a5ac1d..5808402832 100644 --- a/src/mac/carbon/aga.cpp +++ b/src/mac/carbon/aga.cpp @@ -2615,6 +2615,7 @@ AGAPortHelper::~AGAPortHelper() TextSize( size ); TextFace( style ); TextMode( mode ); + SetOrigin( 0 , 0 ) ; SetPort( port ) ; } } diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index a11ff6db93..d904e133cb 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -89,28 +89,28 @@ wxString wxApp::s_macHelpMenuTitleName = "&Help" ; pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEODoc( event , reply) ; + return wxTheApp->MacHandleAEODoc( (AppleEvent*) event , reply) ; } pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEOApp( event , reply ) ; + return wxTheApp->MacHandleAEOApp( (AppleEvent*) event , reply ) ; } pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEPDoc( event , reply ) ; + return wxTheApp->MacHandleAEPDoc( (AppleEvent*) event , reply ) ; } pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , unsigned long refcon ) { wxApp* app = (wxApp*) refcon ; - return wxTheApp->MacHandleAEQuit( event , reply) ; + return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ; } -OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply) { ProcessSerialNumber PSN ; PSN.highLongOfPSN = 0 ; @@ -119,17 +119,17 @@ OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) return noErr ; } -OSErr wxApp::MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEPDoc(const AppleEvent *event , AppleEvent *reply) { return noErr ; } -OSErr wxApp::MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEOApp(const AppleEvent *event , AppleEvent *reply) { return noErr ; } -OSErr wxApp::MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) +OSErr wxApp::MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply) { wxWindow* win = GetTopWindow() ; if ( win ) @@ -510,6 +510,7 @@ void wxApp::CleanUp() delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG + UMACleanupToolbox() ; if (s_macCursorRgn) ::DisposeRgn(s_macCursorRgn); @@ -1044,14 +1045,16 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev ) int newHeight = HiWord(growResult); int oldWidth, oldHeight; - win->GetSize(&oldWidth, &oldHeight); - if (newWidth == 0) - newWidth = oldWidth; - if (newHeight == 0) - newHeight = oldHeight; if (win) + { + win->GetSize(&oldWidth, &oldHeight); + if (newWidth == 0) + newWidth = oldWidth; + if (newHeight == 0) + newHeight = oldHeight; win->SetSize( -1, -1, newWidth, newHeight, wxSIZE_USE_EXISTING); + } } s_lastMouseDown = 0; break; @@ -1253,7 +1256,10 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev ) UInt32 menuresult = UMAMenuEvent(ev) ; if ( HiWord( menuresult ) ) + { + if ( !s_macIsInModalLoop ) MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ; + } else { short keycode ; @@ -1373,6 +1379,14 @@ void wxApp::MacHandleUpdateEvent( EventRecord *ev ) { win->MacUpdate( ev ) ; } + else + { + // since there is no way of telling this foreign window to update itself + // we have to invalidate the update region otherwise we keep getting the same + // event over and over again + BeginUpdate( window ) ; + EndUpdate( window ) ; + } } void wxApp::MacHandleDiskEvent( EventRecord *ev ) @@ -1490,9 +1504,12 @@ void wxApp::MacHandleOSEvent( EventRecord *ev ) switch (windowPart) { + // fixes for setting the cursor back from dominic mazzoni case inMenuBar : + UMAShowArrowCursor(); break ; case inSysWindow : + UMAShowArrowCursor(); break ; default: { @@ -1502,6 +1519,9 @@ void wxApp::MacHandleOSEvent( EventRecord *ev ) wxWindow* win = wxFindWinFromMacWindow( window ) ; if ( win ) win->MacMouseMoved( ev , windowPart ) ; + else + UMAShowArrowCursor(); + } break; } diff --git a/src/mac/carbon/choice.cpp b/src/mac/carbon/choice.cpp index 1c36eef12d..2b1cf2daae 100644 --- a/src/mac/carbon/choice.cpp +++ b/src/mac/carbon/choice.cpp @@ -21,6 +21,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) #endif +short nextMenuId = 100 ; // wxMenu takes the lower ids + +wxChoice::~wxChoice() +{ + // DeleteMenu( m_macPopUpMenuId ) ; + DisposeMenu( m_macPopUpMenuHandle ) ; +} + bool wxChoice::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -35,6 +43,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ; + m_macPopUpMenuHandle = NewMenu( 1 , "\pPopUp Menu" ) ; m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0 , kControlPopupButtonProc + kControlPopupFixedWidthVariant , (long) this ) ; diff --git a/src/mac/carbon/corersrc.r b/src/mac/carbon/corersrc.r index 528e794811..4f879a59db 100644 --- a/src/mac/carbon/corersrc.r +++ b/src/mac/carbon/corersrc.r @@ -394,11 +394,11 @@ resource 'ldes' ( 128 ) } ; resource 'CURS' (9, "Hand") { - $"01 80 1A 70 26 48 26 4A 12 4D 12 49 68 09 98 01" - $"88 02 40 02 20 02 20 04 10 04 08 08 04 08 04 08", - $"01 80 1B F0 3F F8 3F FA 1F FF 1F FF 7F FF FF FF" - $"FF FE 7F FE 3F FE 3F FC 1F FC 0F F8 07 F8 07 F8", - {9, 8} + $"0380 04C0 04C0 04C0 04C0 04C0 74F8 9CAE" + $"4CAB 240B 2403 1003 0803 0806 0406 0406", + $"0380 07C0 07C0 07C0 07C0 07C0 77F8 FFFE" + $"7FFF 3FFF 3FFF 1FFF 0FFF 0FFE 07FE 07FE", + {0, 7} }; resource 'CURS' (10, "SizeWE") { diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp index 1682209492..fe13b3f6b2 100644 --- a/src/mac/carbon/dc.cpp +++ b/src/mac/carbon/dc.cpp @@ -16,6 +16,10 @@ #include "wx/dc.h" #include "wx/mac/uma.h" +#if __MSL__ >= 0x6000 +#include "math.h" +#endif + #if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) #endif @@ -128,7 +132,7 @@ wxDC::~wxDC(void) void wxDC::MacSetupPort() const { - AGAPortHelper* help = &m_macPortHelper ; + AGAPortHelper* help = (AGAPortHelper*) &m_macPortHelper ; help->Setup( m_macPort ) ; m_macPortId = ++m_macCurrentPortId ; ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v); @@ -427,7 +431,12 @@ void wxDC::ComputeScaleAndOrigin(void) // CMB: if scale has changed call SetPen to recalulate the line width if (m_scaleX != origScaleX || m_scaleY != origScaleY) { - // TODO : set internal flags for recalc + // this is a bit artificial, but we need to force wxDC to think + // the pen has changed + wxPen* pen = & GetPen(); + wxPen tempPen; + m_pen = tempPen; + SetPen(* pen); } }; diff --git a/src/mac/carbon/dcprint.cpp b/src/mac/carbon/dcprint.cpp index 257c74206b..b21fe548a2 100644 --- a/src/mac/carbon/dcprint.cpp +++ b/src/mac/carbon/dcprint.cpp @@ -36,15 +36,13 @@ GrafPtr macPrintFormerPort = NULL ; wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) { -#if !TARGET_CARBON - OSErr err ; + OSStatus err ; wxString message ; m_printData = printdata ; m_printData.ConvertToNative() ; - ::UMAPrOpen() ; - err = PrError() ; + err = UMAPrOpen() ; if ( err ) { message.Printf( "Print Error %d", err ) ; @@ -52,6 +50,7 @@ wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) UMAPrClose() ; } +#if !TARGET_CARBON if ( ::PrValidate( m_printData.m_macPrintInfo ) ) { ::PrStlDialog( m_printData.m_macPrintInfo ) ; @@ -75,23 +74,37 @@ wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) } // sets current port m_macPort = (GrafPtr ) m_macPrintPort ; +#else + m_macPrintPort = kPMNoReference ; + err = PMBeginDocument( + m_printData.m_macPrintSettings, + m_printData.m_macPageFormat, + &m_macPrintPort); + if ( err != noErr || m_macPrintPort == kPMNoReference ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + UMAPrClose() ; + } + // sets current port + ::GetPort( &m_macPort ) ; +#endif m_ok = TRUE ; m_minY = m_minX = 0 ; +#if TARGET_CARBON +#else m_maxX = (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ; m_maxY = (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ; -#else -#pragma warning "TODO:printing support for carbon" #endif } wxPrinterDC::~wxPrinterDC(void) { + OSStatus err ; + wxString message ; #if !TARGET_CARBON if ( m_ok ) { - OSErr err ; - wxString message ; - ::PrCloseDoc( m_macPrintPort ) ; err = PrError() ; @@ -115,7 +128,17 @@ wxPrinterDC::~wxPrinterDC(void) m_macPortHelper.Clear() ; } #else -#pragma warning "TODO:printing support for carbon" + if ( m_ok ) + { + err = PMEndDocument(m_macPrintPort); + if ( !err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + UMAPrClose() ; + } + UMAPrClose() ; + } #endif } @@ -130,7 +153,6 @@ void wxPrinterDC::EndDoc(void) void wxPrinterDC::StartPage(void) { -#if !TARGET_CARBON if ( !m_ok ) return ; @@ -150,11 +172,15 @@ void wxPrinterDC::StartPage(void) m_macPenInstalled = false ; - OSErr err ; + OSStatus err ; wxString message ; +#if !TARGET_CARBON PrOpenPage( m_macPrintPort , NULL ) ; - SetOrigin( - (**m_printData.m_macPrintInfo).rPaper.left , - (**m_printData.m_macPrintInfo).rPaper.top ) ; + m_macLocalOrigin.h = (**m_printData.m_macPrintInfo).rPaper.left ; + m_macLocalOrigin.v = (**m_printData.m_macPrintInfo).rPaper.top ; + + SetOrigin( - m_macLocalOrigin.h , - m_macLocalOrigin.v ) ; Rect clip = { -32000 , -32000 , 32000 , 32000 } ; ::ClipRect( &clip ) ; err = PrError() ; @@ -169,19 +195,29 @@ void wxPrinterDC::StartPage(void) m_ok = FALSE ; } #else -#pragma warning "TODO:printing support for carbon" + err = PMBeginPage(m_macPrintPort, nil); + if ( err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + PMEndPage(m_macPrintPort); + PMEndDocument(m_macPrintPort); + UMAPrClose() ; + ::SetPort( macPrintFormerPort ) ; + m_ok = FALSE ; + } #endif } void wxPrinterDC::EndPage(void) { -#if !TARGET_CARBON if ( !m_ok ) return ; - OSErr err ; + OSStatus err ; wxString message ; +#if !TARGET_CARBON PrClosePage( (TPrPort*) m_macPort ) ; err = PrError() ; if ( err ) @@ -194,7 +230,16 @@ void wxPrinterDC::EndPage(void) m_ok = FALSE ; } #else -#pragma warning "TODO:printing support for carbon" + err = PMEndPage(m_macPrintPort); + if ( err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + PMEndDocument(m_macPrintPort); + UMAPrClose() ; + ::SetPort( macPrintFormerPort ) ; + m_ok = FALSE ; + } #endif } diff --git a/src/mac/carbon/dirdlg.cpp b/src/mac/carbon/dirdlg.cpp index 02bbef6a20..51f4df142e 100644 --- a/src/mac/carbon/dirdlg.cpp +++ b/src/mac/carbon/dirdlg.cpp @@ -20,16 +20,22 @@ #include "wx/cmndata.h" +#include "Navigation.h" + #if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxDirDialog, wxDialog) #endif +bool gUseNavServices = NavServicesAvailable() ; + // 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 +#if !TARGET_CARBON + struct UserDataRec { StandardFileReply *sfrPtr; FSSpec oldSelectionFSSpec; @@ -38,8 +44,6 @@ struct UserDataRec { typedef struct UserDataRec UserDataRec, *UserDataRecPtr; -#if !TARGET_CARBON - enum { kSelectItem = 10, // select button item number kSFGetFolderDlgID = 250, // dialog resource number @@ -307,7 +311,6 @@ static pascal short SFGetFolderDialogHook(short item, DialogPtr theDlgPtr, Ptr d return item; } -#endif void StandardGetFolder( ConstStr255Param message , ConstStr255Param path , FileFilterYDUPP fileFilter, StandardFileReply *theSFR) { @@ -433,6 +436,9 @@ static pascal Boolean OnlyVisibleFoldersCustomFileFilter(CInfoPBPtr myCInfoPBPtr return !(visibleFlag && folderFlag); } +#endif + + wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, const wxString& defaultPath, long style, const wxPoint& pos) @@ -445,6 +451,8 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, int wxDirDialog::ShowModal() { + #if !TARGET_CARBON + if ( !gUseNavServices ) { Str255 prompt ; Str255 path ; @@ -457,16 +465,15 @@ int wxDirDialog::ShowModal() StandardFileReply reply ; FileFilterYDUPP invisiblesExcludedCustomFilterUPP = 0 ; - #if !TARGET_CARBON invisiblesExcludedCustomFilterUPP = NewFileFilterYDProc(OnlyVisibleFoldersCustomFileFilter); - #endif + StandardGetFolder( prompt , path , invisiblesExcludedCustomFilterUPP, &reply); - #if !TARGET_CARBON + DisposeRoutineDescriptor(invisiblesExcludedCustomFilterUPP); - #endif + if ( reply.sfGood == false ) { m_path = "" ; @@ -477,7 +484,105 @@ int wxDirDialog::ShowModal() m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ; return wxID_OK ; } + return wxID_CANCEL; + } + else + #endif + { + 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 = "" ; + 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 = "" ; + 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 = "" ; + return wxID_CANCEL ; + } + // Create cannonical FSSpec + ::FSMakeFSSpec(thePB.dirInfo.ioVRefNum, thePB.dirInfo.ioDrParID, + name, &outFileSpec); + + // outFolderDirID = thePB.dirInfo.ioDrDirID; + m_path = wxMacFSSpec2UnixFilename( &outFileSpec ) ; + return wxID_OK ; + } + return wxID_CANCEL; + } - return wxID_CANCEL; } diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index 7837183e2a..dc4f90e22c 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -19,18 +19,55 @@ #include "wx/filedlg.h" #include "wx/intl.h" +#include "PLStringFuncs.h" + #if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxFileDialog, wxDialog) #endif // begin wxmac +#include "Navigation.h" + #include "morefile.h" #include "moreextr.h" #include "fullpath.h" #include "fspcompa.h" #include "PLStringFuncs.h" +extern bool gUseNavServices ; + +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 */) +{ + if (inSelector == kNavCBEvent) { + // In Universal Headers 3.2, Apple changed the definition of + /* + #if UNIVERSAL_INTERFACES_VERSION >= 0x0320 // Universal Headers 3.2 + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.eventDataParms.event)); + + #else + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.event)); + #endif + */ + + } +} + char * gfilters[] = { "*.TXT" , @@ -189,7 +226,7 @@ static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRec return false; } -#endif +#endif !TARGET_CARBON void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR) { @@ -451,6 +488,9 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, int wxFileDialog::ShowModal() { + #if !TARGET_CARBON + if ( !gUseNavServices ) + { if ( m_dialogStyle & wxSAVE ) { StandardFileReply reply ; @@ -488,7 +528,7 @@ int wxFileDialog::ShowModal() strcpy((char *)prompt, m_message) ; c2pstr((char *)prompt ) ; - strcpy((char *)path, m_path ) ; + strcpy((char *)path, m_dir ) ; c2pstr((char *)path ) ; StandardFileReply reply ; @@ -515,6 +555,137 @@ int wxFileDialog::ShowModal() } return wxID_CANCEL; } + else +#endif + { + NavDialogOptions mNavOptions; + NavObjectFilterUPP mNavFilterUPP = NULL; + NavPreviewUPP mNavPreviewUPP = NULL ; + NavReplyRecord mNavReply; + AEDesc mDefaultLocation ; + 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 + + FSSpec location ; + wxUnixFilename2FSSpec( m_dir , &location ) ; + OSErr err = noErr ; + + mDefaultLocation.descriptorType = typeNull; + mDefaultLocation.dataHandle = nil; + + err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation ); + + if ( mDefaultLocation.dataHandle ) { + + if (mSelectDefault) { + mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; + } else { + mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; + } + } + + strcpy((char *)mNavOptions.message, m_message) ; + c2pstr((char *)mNavOptions.message ) ; + + strcpy((char *)mNavOptions.savedFileName, m_fileName) ; + c2pstr((char *)mNavOptions.savedFileName ) ; + + if ( m_dialogStyle & wxSAVE ) + { + + mNavOptions.dialogOptionFlags |= kNavNoTypePopup ; + mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ; + mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ; + + err = ::NavPutFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + 'TEXT', + 'TEXT', + 0L); // User Data + } + else + { + if ( m_dialogStyle & wxMULTIPLE ) + mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ; + else + mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ; + + err = ::NavGetFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + mNavPreviewUPP, + mNavFilterUPP, + 0L /*inFileTypes.TypeListHandle() */, + 0L); // User Data + } + + if ( mDefaultLocation.dataHandle != nil ) + { + ::AEDisposeDesc(&mDefaultLocation); + } + + if ( (err != noErr) && (err != userCanceledErr) ) { + m_path = "" ; + return wxID_CANCEL ; + } + + if (mNavReply.validRecord) { + + FSSpec outFileSpec ; + AEDesc specDesc ; + + long count ; + ::AECountItems( &mNavReply.selection , &count ) ; + for ( long i = 1 ; i <= count ; ++i ) + { + OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, NULL , &specDesc); + if ( err != noErr ) { + m_path = "" ; + return wxID_CANCEL ; + } + outFileSpec = **(FSSpec**) specDesc.dataHandle; + if (specDesc.dataHandle != nil) { + ::AEDisposeDesc(&specDesc); + } + + + // outFolderDirID = thePB.dirInfo.ioDrDirID; + m_path = wxMacFSSpec2UnixFilename( &outFileSpec ) ; + m_paths.Add( 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); + + return wxID_OK ; + } + return wxID_CANCEL; + } +} // Generic file load/save dialog static wxString diff --git a/src/mac/carbon/font.cpp b/src/mac/carbon/font.cpp index ecffc9fd94..79d93657fb 100644 --- a/src/mac/carbon/font.cpp +++ b/src/mac/carbon/font.cpp @@ -16,6 +16,7 @@ #include "wx/defs.h" #include "wx/string.h" #include "wx/font.h" +#include "wx/fontutil.h" #include "wx/gdicmn.h" #include "wx/fontutil.h" @@ -119,6 +120,12 @@ void wxFont::Init() wxTheFontList->Append(this); } +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; @@ -143,12 +150,6 @@ bool wxFont::Create(int pointSize, return TRUE; } -bool wxFont::Create(const wxNativeFontInfo& info) -{ - return Create(info.pointSize, info.family, info.style, info.weight, - info.underlined, info.faceName, info.encoding); -} - wxFont::~wxFont() { if (wxTheFontList) diff --git a/src/mac/carbon/fontenum.cpp b/src/mac/carbon/fontenum.cpp index 99cd68441a..f06fd5baaa 100644 --- a/src/mac/carbon/fontenum.cpp +++ b/src/mac/carbon/fontenum.cpp @@ -33,6 +33,7 @@ #endif #include "wx/fontenum.h" +#include "wx/fontutil.h" #include "wx/fontmap.h" #include "wx/fontutil.h" diff --git a/src/mac/carbon/frame.cpp b/src/mac/carbon/frame.cpp index b5498fec48..2a4ee0b968 100644 --- a/src/mac/carbon/frame.cpp +++ b/src/mac/carbon/frame.cpp @@ -199,8 +199,9 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, { wxStatusBar *statusBar = NULL; - statusBar = new wxStatusBar(this, id, style, name); - + statusBar = new wxStatusBar(this, id, + style, name); + statusBar->SetSize( 100 , 15 ) ; statusBar->SetFieldsCount(number); return statusBar; } @@ -216,7 +217,7 @@ void wxFrame::PositionStatusBar() // 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, WX_MAC_STATUSBAR_HEIGHT ); + m_frameStatusBar->SetSize(0, h, w, sh); } } @@ -296,8 +297,7 @@ void wxFrame::DoGetClientSize(int *x, int *y) const { int statusX, statusY; GetStatusBar()->GetClientSize(&statusX, &statusY); - // right now this is a constant, this might change someday - *y -= WX_MAC_STATUSBAR_HEIGHT ; + *y -= statusY; } #endif // wxUSE_STATUSBAR diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index 17efb46fab..03ae6e0572 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -180,6 +180,7 @@ int wxListBox::DoAppend(const wxString& item) m_dataArray.Add( NULL ); } m_noItems ++; + DoSetItemClientData( index , NULL ) ; MacAppend( item ) ; return index ; @@ -255,6 +256,16 @@ int wxListBox::FindString(const wxString& st) const if ( EqualString( s1 , s2 , false , false ) ) return i ; } + if ( s.Left(1) = "*" && s.Length() > 1 ) + { + s.MakeLower() ; + for ( int i = 0 ; i < m_noItems ; ++i ) + { + if ( GetString(i).Lower().Matches(s) ) + return i ; + } + } + } else { diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index 9a66f806d2..099f196f34 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -700,8 +700,37 @@ void wxMenuBar::MacInstallMenuBar() } } } - else +#else + if( m_titles[i] == "?" || m_titles[i] == "&?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) + { + wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); + UMASetMenuTitle( menu->GetHMenu() , label ) ; + + for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) + { + UMAInsertMenu( subMenu->GetHMenu() , -1 ) ; + } + else + { + if ( item->GetId() == wxApp::s_macAboutMenuItemId ) + { + Str255 label ; + UInt8 modifiers ; + SInt16 key ; + wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu + UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); + UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); + } + } + } + UMAInsertMenu(m_menus[i]->GetHMenu(), 0); + } #endif + else { wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); UMASetMenuTitle( menu->GetHMenu() , label ) ; diff --git a/src/mac/carbon/notebmac.cpp b/src/mac/carbon/notebmac.cpp index ab97b53540..d2e9660896 100644 --- a/src/mac/carbon/notebmac.cpp +++ b/src/mac/carbon/notebmac.cpp @@ -42,6 +42,9 @@ const short kwxMacTabBottomMargin = 16 ; // ---------------------------------------------------------------------------- #if !USE_SHARED_LIBRARIES +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) diff --git a/src/mac/carbon/printmac.cpp b/src/mac/carbon/printmac.cpp index 08a6bf77ad..50c666ce95 100644 --- a/src/mac/carbon/printmac.cpp +++ b/src/mac/carbon/printmac.cpp @@ -136,7 +136,6 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // Create an abort window wxBeginBusyCursor(); -/* wxWindow *win = CreateAbortWindow(parent, printout); wxYield(); @@ -149,7 +148,6 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) sm_abortWindow = win; sm_abortWindow->Show(TRUE); wxYield(); -*/ printout->OnBeginPrinting(); @@ -178,6 +176,11 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } else { + GrafPtr thePort ; + GetPort( &thePort ) ; + wxYield() ; + SetPort( thePort ) ; + dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index af3919bb7b..dd35860824 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -111,6 +111,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, wxString value ; + { + TEHandle teH ; + long size ; + + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + (*teH)->lineHeight = -1 ; + } + if( wxApp::s_macDefaultEncodingIsPC ) value = wxMacMakeMacStringFromPC( st ) ; else @@ -152,8 +160,7 @@ void wxTextCtrl::SetValue(const wxString& st) else value = st ; UMASetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; - Refresh() ; -// MacInvalidateControl() ; + UMADrawControl( m_macControl ) ; } // Clipboard operations @@ -208,7 +215,7 @@ void wxTextCtrl::Paste() UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; TEFromScrap() ; TEPaste( teH ) ; -// MacInvalidateControl() ; + UMADrawControl( m_macControl ) ; } } diff --git a/src/mac/carbon/thread.cpp b/src/mac/carbon/thread.cpp index 34b7fe57ea..a37865ee7a 100644 --- a/src/mac/carbon/thread.cpp +++ b/src/mac/carbon/thread.cpp @@ -801,9 +801,11 @@ bool wxThreadModule::OnInit() long response; bool hasThreadManager ; hasThreadManager = Gestalt( gestaltThreadMgrAttr, &response) == noErr && response & 1; -#if TARGET_RT_MAC_CFM +#if !TARGET_CARBON +#if GENERATINGCFM // verify presence of shared library hasThreadManager = hasThreadManager && ((Ptr)NewThread != (Ptr)kUnresolvedCFragSymbolAddress); +#endif #endif if ( !hasThreadManager ) { diff --git a/src/mac/carbon/uma.cpp b/src/mac/carbon/uma.cpp index 4dce1ce377..f95b4c52bd 100644 --- a/src/mac/carbon/uma.cpp +++ b/src/mac/carbon/uma.cpp @@ -1,6 +1,9 @@ #include #include + +#include "Navigation.h" + // init static bool sUMAHasAppearance = false ; @@ -14,7 +17,19 @@ static long sUMAWindowManagerAttr = 0 ; bool UMAHasWindowManager() { return sUMAHasWindowManager ; } long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr ; } - +void UMACleanupToolbox() +{ +#if UMA_USE_APPEARANCE + if ( sUMAHasAppearance ) + { + UnregisterAppearanceClient() ; + } +#endif + if ( NavServicesAvailable() ) + { + NavUnload() ; + } +} void UMAInitToolbox( UInt16 inMoreMastersCalls ) { #if !TARGET_CARBON @@ -24,7 +39,6 @@ void UMAInitToolbox( UInt16 inMoreMastersCalls ) ::InitGraf(&qd.thePort); ::InitFonts(); - ::InitWindows(); ::InitMenus(); ::TEInit(); ::InitDialogs(0L); @@ -60,6 +74,16 @@ void UMAInitToolbox( UInt16 inMoreMastersCalls ) } #endif // UMA_USE_WINDOWMGR #endif + + if ( sUMAHasWindowManager ) + InitFloatingWindows() ; + else + InitWindows(); + + if ( NavServicesAvailable() ) + { + NavLoad() ; + } } // process manager @@ -250,7 +274,7 @@ void UMAInsertMenu( MenuRef insertMenu , SInt16 afterId ) int gPrOpenCounter = 0 ; -void UMAPrOpen() +OSStatus UMAPrOpen() { #if !TARGET_CARBON OSErr err = noErr ; @@ -261,12 +285,20 @@ void UMAPrOpen() err = PrError() ; wxASSERT( err == noErr ) ; } + return err ; #else - #pragma warning "TODO Printing for Carbon" + OSStatus err = noErr ; + ++gPrOpenCounter ; + if ( gPrOpenCounter == 1 ) + { + err = PMBegin() ; + wxASSERT( err == noErr ) ; + } + return err ; #endif } -void UMAPrClose() +OSStatus UMAPrClose() { #if !TARGET_CARBON OSErr err = noErr ; @@ -278,8 +310,16 @@ void UMAPrClose() wxASSERT( err == noErr ) ; } --gPrOpenCounter ; + return err ; #else - #pragma warning "TODO Printing for Carbon" + OSStatus err = noErr ; + wxASSERT( gPrOpenCounter >= 1 ) ; + if ( gPrOpenCounter == 1 ) + { + err = PMEnd() ; + } + --gPrOpenCounter ; + return err ; #endif } diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index b312321562..6d4fa1b5da 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -47,6 +47,14 @@ bool wxGetUserId(char *buf, int maxSize) return FALSE; } +const wxChar* wxGetHomeDir(wxString *pstr) +{ + *pstr = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder ) ; + return pstr->c_str() ; +} + + + // Get user name e.g. AUTHOR bool wxGetUserName(char *buf, int maxSize) { diff --git a/src/mac/carbon/wave.cpp b/src/mac/carbon/wave.cpp index 804d07a097..5df346f825 100644 --- a/src/mac/carbon/wave.cpp +++ b/src/mac/carbon/wave.cpp @@ -18,12 +18,12 @@ #include "wx/mac/wave.h" wxWave::wxWave() - : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE) + : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0) { } wxWave::wxWave(const wxString& sFileName, bool isResource) - : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE) + : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0) { Create(sFileName, isResource); } @@ -34,28 +34,196 @@ wxWave::~wxWave() Free(); } + bool wxWave::Create(const wxString& fileName, bool isResource) { - Free(); + 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; + } - // TODO + if (!(SndRefNum = MacOpenSndFile ((char *)lpSnd))) + { + SndDisposeChannel(sndChan, TRUE); + free(sndChan); + sndChan = 0; - return FALSE; + 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 wxWave::Play(bool async, bool looped) const { - if (!IsOk()) - return FALSE; + char lpSnd[32]; + bool ret = false; + + if (m_isResource) + { + strcpy(lpSnd, m_sndname); + c2pstr((char *) lpSnd); + SndListHandle hSnd; + + hSnd = (SndListHandle) GetNamedResource('snd ',(const unsigned char *) lpSnd); - // TODO - return FALSE; + if ((hSnd != NULL) && (SndPlay(m_sndChan, hSnd, async) == noErr)) + ret = true; + } + + return ret; } + bool wxWave::Free() { - // TODO - return FALSE; + 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); +}*/ + + diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index e602f93fab..9d98f35302 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -437,8 +437,8 @@ void wxWindow::DoGetClientSize(int *x, int *y) const *x = m_width ; *y = m_height ; - *x -= 2 * MacGetBorderSize( ) ; - *y -= 2 * MacGetBorderSize( ) ; + *x -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + *y -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) { @@ -627,7 +627,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) wxPoint wxWindow::GetClientAreaOrigin() const { - return wxPoint(MacGetBorderSize( ) , MacGetBorderSize( ) ); + return wxPoint(MacGetLeftBorderSize( ) , MacGetTopBorderSize( ) ); } // Makes an adjustment to the window position (for example, a frame that has @@ -725,7 +725,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, if ( !fontToUse ) fontToUse = &m_font; - wxClientDC dc( this ) ; + wxClientDC dc( (wxWindow*) this ) ; long lx,ly,ld,le ; dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ; if ( externalLeading ) @@ -1417,8 +1417,8 @@ void wxWindow::DoSetClientSize(int width, int height) if ( height != -1 && m_vScrollBar ) height += MAC_SCROLLBAR_SIZE ; - width += 2 * MacGetBorderSize( ) ; - height += 2 * MacGetBorderSize( ) ; + width += MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + height += MacGetTopBorderSize( ) + MacGetBottomBorderSize( ) ; DoSetSize( -1 , -1 , width , height ) ; } @@ -1443,7 +1443,8 @@ bool wxWindow::MacGetWindowFromPointSub( const wxPoint &point , wxWindow** outWi for (wxNode *node = GetChildren().First(); node; node = node->Next()) { wxWindow *child = (wxWindow*)node->Data(); - if ( child->GetMacRootWindow() == window ) + // added the m_isShown test --dmazzoni + if ( child->GetMacRootWindow() == window && child->m_isShown ) { if (child->MacGetWindowFromPointSub(newPoint , outWin )) return TRUE; @@ -1462,9 +1463,12 @@ bool wxWindow::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindow** ou { wxPoint point( screenpoint ) ; wxWindow* win = wxFindWinFromMacWindow( window ) ; + if ( win ) + { win->ScreenToClient( point ) ; return win->MacGetWindowFromPointSub( point , outWin ) ; } + } return FALSE ; } @@ -1907,8 +1911,8 @@ void wxWindow::MacRepositionScrollBars() int width = m_width ; int height = m_height ; - width -= 2 * MacGetBorderSize() ; - height -= 2 * MacGetBorderSize() ; + width -= MacGetLeftBorderSize() + MacGetRightBorderSize(); + height -= MacGetTopBorderSize() + MacGetBottomBorderSize(); wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; @@ -2183,7 +2187,7 @@ void wxWindow::MacGetPortClientParams(Point* localOrigin, Rect* clipRect, Window SectRect(clipRect, &myClip, clipRect); } -long wxWindow::MacGetBorderSize( ) const +long wxWindow::MacGetLeftBorderSize( ) const { if( m_macWindowData ) return 0 ; @@ -2203,6 +2207,66 @@ long wxWindow::MacGetBorderSize( ) const return 0 ; } +long wxWindow::MacGetRightBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 3 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 3 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 3 ; + } + return 0 ; +} + +long wxWindow::MacGetTopBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 2 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 2 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 1 ; + } + return 0 ; +} + +long wxWindow::MacGetBottomBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 3 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 3 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 3 ; + } + return 0 ; +} + long wxWindow::MacRemoveBordersFromStyle( long style ) { return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ; diff --git a/src/mac/choice.cpp b/src/mac/choice.cpp index 1c36eef12d..2b1cf2daae 100644 --- a/src/mac/choice.cpp +++ b/src/mac/choice.cpp @@ -21,6 +21,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) #endif +short nextMenuId = 100 ; // wxMenu takes the lower ids + +wxChoice::~wxChoice() +{ + // DeleteMenu( m_macPopUpMenuId ) ; + DisposeMenu( m_macPopUpMenuHandle ) ; +} + bool wxChoice::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -35,6 +43,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ; + m_macPopUpMenuHandle = NewMenu( 1 , "\pPopUp Menu" ) ; m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0 , kControlPopupButtonProc + kControlPopupFixedWidthVariant , (long) this ) ; diff --git a/src/mac/corersrc.r b/src/mac/corersrc.r index 528e794811..4f879a59db 100644 --- a/src/mac/corersrc.r +++ b/src/mac/corersrc.r @@ -394,11 +394,11 @@ resource 'ldes' ( 128 ) } ; resource 'CURS' (9, "Hand") { - $"01 80 1A 70 26 48 26 4A 12 4D 12 49 68 09 98 01" - $"88 02 40 02 20 02 20 04 10 04 08 08 04 08 04 08", - $"01 80 1B F0 3F F8 3F FA 1F FF 1F FF 7F FF FF FF" - $"FF FE 7F FE 3F FE 3F FC 1F FC 0F F8 07 F8 07 F8", - {9, 8} + $"0380 04C0 04C0 04C0 04C0 04C0 74F8 9CAE" + $"4CAB 240B 2403 1003 0803 0806 0406 0406", + $"0380 07C0 07C0 07C0 07C0 07C0 77F8 FFFE" + $"7FFF 3FFF 3FFF 1FFF 0FFF 0FFE 07FE 07FE", + {0, 7} }; resource 'CURS' (10, "SizeWE") { diff --git a/src/mac/dc.cpp b/src/mac/dc.cpp index 1682209492..fe13b3f6b2 100644 --- a/src/mac/dc.cpp +++ b/src/mac/dc.cpp @@ -16,6 +16,10 @@ #include "wx/dc.h" #include "wx/mac/uma.h" +#if __MSL__ >= 0x6000 +#include "math.h" +#endif + #if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) #endif @@ -128,7 +132,7 @@ wxDC::~wxDC(void) void wxDC::MacSetupPort() const { - AGAPortHelper* help = &m_macPortHelper ; + AGAPortHelper* help = (AGAPortHelper*) &m_macPortHelper ; help->Setup( m_macPort ) ; m_macPortId = ++m_macCurrentPortId ; ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v); @@ -427,7 +431,12 @@ void wxDC::ComputeScaleAndOrigin(void) // CMB: if scale has changed call SetPen to recalulate the line width if (m_scaleX != origScaleX || m_scaleY != origScaleY) { - // TODO : set internal flags for recalc + // this is a bit artificial, but we need to force wxDC to think + // the pen has changed + wxPen* pen = & GetPen(); + wxPen tempPen; + m_pen = tempPen; + SetPen(* pen); } }; diff --git a/src/mac/dcprint.cpp b/src/mac/dcprint.cpp index 257c74206b..b21fe548a2 100644 --- a/src/mac/dcprint.cpp +++ b/src/mac/dcprint.cpp @@ -36,15 +36,13 @@ GrafPtr macPrintFormerPort = NULL ; wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) { -#if !TARGET_CARBON - OSErr err ; + OSStatus err ; wxString message ; m_printData = printdata ; m_printData.ConvertToNative() ; - ::UMAPrOpen() ; - err = PrError() ; + err = UMAPrOpen() ; if ( err ) { message.Printf( "Print Error %d", err ) ; @@ -52,6 +50,7 @@ wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) UMAPrClose() ; } +#if !TARGET_CARBON if ( ::PrValidate( m_printData.m_macPrintInfo ) ) { ::PrStlDialog( m_printData.m_macPrintInfo ) ; @@ -75,23 +74,37 @@ wxPrinterDC::wxPrinterDC(const wxPrintData& printdata) } // sets current port m_macPort = (GrafPtr ) m_macPrintPort ; +#else + m_macPrintPort = kPMNoReference ; + err = PMBeginDocument( + m_printData.m_macPrintSettings, + m_printData.m_macPageFormat, + &m_macPrintPort); + if ( err != noErr || m_macPrintPort == kPMNoReference ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + UMAPrClose() ; + } + // sets current port + ::GetPort( &m_macPort ) ; +#endif m_ok = TRUE ; m_minY = m_minX = 0 ; +#if TARGET_CARBON +#else m_maxX = (**m_printData.m_macPrintInfo).rPaper.right - (**m_printData.m_macPrintInfo).rPaper.left ; m_maxY = (**m_printData.m_macPrintInfo).rPaper.bottom - (**m_printData.m_macPrintInfo).rPaper.top ; -#else -#pragma warning "TODO:printing support for carbon" #endif } wxPrinterDC::~wxPrinterDC(void) { + OSStatus err ; + wxString message ; #if !TARGET_CARBON if ( m_ok ) { - OSErr err ; - wxString message ; - ::PrCloseDoc( m_macPrintPort ) ; err = PrError() ; @@ -115,7 +128,17 @@ wxPrinterDC::~wxPrinterDC(void) m_macPortHelper.Clear() ; } #else -#pragma warning "TODO:printing support for carbon" + if ( m_ok ) + { + err = PMEndDocument(m_macPrintPort); + if ( !err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + UMAPrClose() ; + } + UMAPrClose() ; + } #endif } @@ -130,7 +153,6 @@ void wxPrinterDC::EndDoc(void) void wxPrinterDC::StartPage(void) { -#if !TARGET_CARBON if ( !m_ok ) return ; @@ -150,11 +172,15 @@ void wxPrinterDC::StartPage(void) m_macPenInstalled = false ; - OSErr err ; + OSStatus err ; wxString message ; +#if !TARGET_CARBON PrOpenPage( m_macPrintPort , NULL ) ; - SetOrigin( - (**m_printData.m_macPrintInfo).rPaper.left , - (**m_printData.m_macPrintInfo).rPaper.top ) ; + m_macLocalOrigin.h = (**m_printData.m_macPrintInfo).rPaper.left ; + m_macLocalOrigin.v = (**m_printData.m_macPrintInfo).rPaper.top ; + + SetOrigin( - m_macLocalOrigin.h , - m_macLocalOrigin.v ) ; Rect clip = { -32000 , -32000 , 32000 , 32000 } ; ::ClipRect( &clip ) ; err = PrError() ; @@ -169,19 +195,29 @@ void wxPrinterDC::StartPage(void) m_ok = FALSE ; } #else -#pragma warning "TODO:printing support for carbon" + err = PMBeginPage(m_macPrintPort, nil); + if ( err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + PMEndPage(m_macPrintPort); + PMEndDocument(m_macPrintPort); + UMAPrClose() ; + ::SetPort( macPrintFormerPort ) ; + m_ok = FALSE ; + } #endif } void wxPrinterDC::EndPage(void) { -#if !TARGET_CARBON if ( !m_ok ) return ; - OSErr err ; + OSStatus err ; wxString message ; +#if !TARGET_CARBON PrClosePage( (TPrPort*) m_macPort ) ; err = PrError() ; if ( err ) @@ -194,7 +230,16 @@ void wxPrinterDC::EndPage(void) m_ok = FALSE ; } #else -#pragma warning "TODO:printing support for carbon" + err = PMEndPage(m_macPrintPort); + if ( err ) + { + message.Printf( "Print Error %d", err ) ; + wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ; + PMEndDocument(m_macPrintPort); + UMAPrClose() ; + ::SetPort( macPrintFormerPort ) ; + m_ok = FALSE ; + } #endif } diff --git a/src/mac/dirdlg.cpp b/src/mac/dirdlg.cpp index 02bbef6a20..51f4df142e 100644 --- a/src/mac/dirdlg.cpp +++ b/src/mac/dirdlg.cpp @@ -20,16 +20,22 @@ #include "wx/cmndata.h" +#include "Navigation.h" + #if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxDirDialog, wxDialog) #endif +bool gUseNavServices = NavServicesAvailable() ; + // 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 +#if !TARGET_CARBON + struct UserDataRec { StandardFileReply *sfrPtr; FSSpec oldSelectionFSSpec; @@ -38,8 +44,6 @@ struct UserDataRec { typedef struct UserDataRec UserDataRec, *UserDataRecPtr; -#if !TARGET_CARBON - enum { kSelectItem = 10, // select button item number kSFGetFolderDlgID = 250, // dialog resource number @@ -307,7 +311,6 @@ static pascal short SFGetFolderDialogHook(short item, DialogPtr theDlgPtr, Ptr d return item; } -#endif void StandardGetFolder( ConstStr255Param message , ConstStr255Param path , FileFilterYDUPP fileFilter, StandardFileReply *theSFR) { @@ -433,6 +436,9 @@ static pascal Boolean OnlyVisibleFoldersCustomFileFilter(CInfoPBPtr myCInfoPBPtr return !(visibleFlag && folderFlag); } +#endif + + wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, const wxString& defaultPath, long style, const wxPoint& pos) @@ -445,6 +451,8 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, int wxDirDialog::ShowModal() { + #if !TARGET_CARBON + if ( !gUseNavServices ) { Str255 prompt ; Str255 path ; @@ -457,16 +465,15 @@ int wxDirDialog::ShowModal() StandardFileReply reply ; FileFilterYDUPP invisiblesExcludedCustomFilterUPP = 0 ; - #if !TARGET_CARBON invisiblesExcludedCustomFilterUPP = NewFileFilterYDProc(OnlyVisibleFoldersCustomFileFilter); - #endif + StandardGetFolder( prompt , path , invisiblesExcludedCustomFilterUPP, &reply); - #if !TARGET_CARBON + DisposeRoutineDescriptor(invisiblesExcludedCustomFilterUPP); - #endif + if ( reply.sfGood == false ) { m_path = "" ; @@ -477,7 +484,105 @@ int wxDirDialog::ShowModal() m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ; return wxID_OK ; } + return wxID_CANCEL; + } + else + #endif + { + 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 = "" ; + 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 = "" ; + 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 = "" ; + return wxID_CANCEL ; + } + // Create cannonical FSSpec + ::FSMakeFSSpec(thePB.dirInfo.ioVRefNum, thePB.dirInfo.ioDrParID, + name, &outFileSpec); + + // outFolderDirID = thePB.dirInfo.ioDrDirID; + m_path = wxMacFSSpec2UnixFilename( &outFileSpec ) ; + return wxID_OK ; + } + return wxID_CANCEL; + } - return wxID_CANCEL; } diff --git a/src/mac/filedlg.cpp b/src/mac/filedlg.cpp index 7837183e2a..dc4f90e22c 100644 --- a/src/mac/filedlg.cpp +++ b/src/mac/filedlg.cpp @@ -19,18 +19,55 @@ #include "wx/filedlg.h" #include "wx/intl.h" +#include "PLStringFuncs.h" + #if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxFileDialog, wxDialog) #endif // begin wxmac +#include "Navigation.h" + #include "morefile.h" #include "moreextr.h" #include "fullpath.h" #include "fspcompa.h" #include "PLStringFuncs.h" +extern bool gUseNavServices ; + +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 */) +{ + if (inSelector == kNavCBEvent) { + // In Universal Headers 3.2, Apple changed the definition of + /* + #if UNIVERSAL_INTERFACES_VERSION >= 0x0320 // Universal Headers 3.2 + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.eventDataParms.event)); + + #else + UModalAlerts::ProcessModalEvent(*(ioParams->eventData.event)); + #endif + */ + + } +} + char * gfilters[] = { "*.TXT" , @@ -189,7 +226,7 @@ static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRec return false; } -#endif +#endif !TARGET_CARBON void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR) { @@ -451,6 +488,9 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, int wxFileDialog::ShowModal() { + #if !TARGET_CARBON + if ( !gUseNavServices ) + { if ( m_dialogStyle & wxSAVE ) { StandardFileReply reply ; @@ -488,7 +528,7 @@ int wxFileDialog::ShowModal() strcpy((char *)prompt, m_message) ; c2pstr((char *)prompt ) ; - strcpy((char *)path, m_path ) ; + strcpy((char *)path, m_dir ) ; c2pstr((char *)path ) ; StandardFileReply reply ; @@ -515,6 +555,137 @@ int wxFileDialog::ShowModal() } return wxID_CANCEL; } + else +#endif + { + NavDialogOptions mNavOptions; + NavObjectFilterUPP mNavFilterUPP = NULL; + NavPreviewUPP mNavPreviewUPP = NULL ; + NavReplyRecord mNavReply; + AEDesc mDefaultLocation ; + 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 + + FSSpec location ; + wxUnixFilename2FSSpec( m_dir , &location ) ; + OSErr err = noErr ; + + mDefaultLocation.descriptorType = typeNull; + mDefaultLocation.dataHandle = nil; + + err = ::AECreateDesc(typeFSS, &location, sizeof(FSSpec), &mDefaultLocation ); + + if ( mDefaultLocation.dataHandle ) { + + if (mSelectDefault) { + mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; + } else { + mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; + } + } + + strcpy((char *)mNavOptions.message, m_message) ; + c2pstr((char *)mNavOptions.message ) ; + + strcpy((char *)mNavOptions.savedFileName, m_fileName) ; + c2pstr((char *)mNavOptions.savedFileName ) ; + + if ( m_dialogStyle & wxSAVE ) + { + + mNavOptions.dialogOptionFlags |= kNavNoTypePopup ; + mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ; + mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ; + + err = ::NavPutFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + 'TEXT', + 'TEXT', + 0L); // User Data + } + else + { + if ( m_dialogStyle & wxMULTIPLE ) + mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ; + else + mNavOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles ; + + err = ::NavGetFile( + &mDefaultLocation, + &mNavReply, + &mNavOptions, + sStandardNavEventFilter , + mNavPreviewUPP, + mNavFilterUPP, + 0L /*inFileTypes.TypeListHandle() */, + 0L); // User Data + } + + if ( mDefaultLocation.dataHandle != nil ) + { + ::AEDisposeDesc(&mDefaultLocation); + } + + if ( (err != noErr) && (err != userCanceledErr) ) { + m_path = "" ; + return wxID_CANCEL ; + } + + if (mNavReply.validRecord) { + + FSSpec outFileSpec ; + AEDesc specDesc ; + + long count ; + ::AECountItems( &mNavReply.selection , &count ) ; + for ( long i = 1 ; i <= count ; ++i ) + { + OSErr err = ::AEGetNthDesc( &mNavReply.selection , i , typeFSS, NULL , &specDesc); + if ( err != noErr ) { + m_path = "" ; + return wxID_CANCEL ; + } + outFileSpec = **(FSSpec**) specDesc.dataHandle; + if (specDesc.dataHandle != nil) { + ::AEDisposeDesc(&specDesc); + } + + + // outFolderDirID = thePB.dirInfo.ioDrDirID; + m_path = wxMacFSSpec2UnixFilename( &outFileSpec ) ; + m_paths.Add( 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); + + return wxID_OK ; + } + return wxID_CANCEL; + } +} // Generic file load/save dialog static wxString diff --git a/src/mac/font.cpp b/src/mac/font.cpp index ecffc9fd94..79d93657fb 100644 --- a/src/mac/font.cpp +++ b/src/mac/font.cpp @@ -16,6 +16,7 @@ #include "wx/defs.h" #include "wx/string.h" #include "wx/font.h" +#include "wx/fontutil.h" #include "wx/gdicmn.h" #include "wx/fontutil.h" @@ -119,6 +120,12 @@ void wxFont::Init() wxTheFontList->Append(this); } +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; @@ -143,12 +150,6 @@ bool wxFont::Create(int pointSize, return TRUE; } -bool wxFont::Create(const wxNativeFontInfo& info) -{ - return Create(info.pointSize, info.family, info.style, info.weight, - info.underlined, info.faceName, info.encoding); -} - wxFont::~wxFont() { if (wxTheFontList) diff --git a/src/mac/fontenum.cpp b/src/mac/fontenum.cpp index 99cd68441a..f06fd5baaa 100644 --- a/src/mac/fontenum.cpp +++ b/src/mac/fontenum.cpp @@ -33,6 +33,7 @@ #endif #include "wx/fontenum.h" +#include "wx/fontutil.h" #include "wx/fontmap.h" #include "wx/fontutil.h" diff --git a/src/mac/frame.cpp b/src/mac/frame.cpp index b5498fec48..2a4ee0b968 100644 --- a/src/mac/frame.cpp +++ b/src/mac/frame.cpp @@ -199,8 +199,9 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, { wxStatusBar *statusBar = NULL; - statusBar = new wxStatusBar(this, id, style, name); - + statusBar = new wxStatusBar(this, id, + style, name); + statusBar->SetSize( 100 , 15 ) ; statusBar->SetFieldsCount(number); return statusBar; } @@ -216,7 +217,7 @@ void wxFrame::PositionStatusBar() // 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, WX_MAC_STATUSBAR_HEIGHT ); + m_frameStatusBar->SetSize(0, h, w, sh); } } @@ -296,8 +297,7 @@ void wxFrame::DoGetClientSize(int *x, int *y) const { int statusX, statusY; GetStatusBar()->GetClientSize(&statusX, &statusY); - // right now this is a constant, this might change someday - *y -= WX_MAC_STATUSBAR_HEIGHT ; + *y -= statusY; } #endif // wxUSE_STATUSBAR diff --git a/src/mac/listbox.cpp b/src/mac/listbox.cpp index 17efb46fab..03ae6e0572 100644 --- a/src/mac/listbox.cpp +++ b/src/mac/listbox.cpp @@ -180,6 +180,7 @@ int wxListBox::DoAppend(const wxString& item) m_dataArray.Add( NULL ); } m_noItems ++; + DoSetItemClientData( index , NULL ) ; MacAppend( item ) ; return index ; @@ -255,6 +256,16 @@ int wxListBox::FindString(const wxString& st) const if ( EqualString( s1 , s2 , false , false ) ) return i ; } + if ( s.Left(1) = "*" && s.Length() > 1 ) + { + s.MakeLower() ; + for ( int i = 0 ; i < m_noItems ; ++i ) + { + if ( GetString(i).Lower().Matches(s) ) + return i ; + } + } + } else { diff --git a/src/mac/menu.cpp b/src/mac/menu.cpp index 9a66f806d2..099f196f34 100644 --- a/src/mac/menu.cpp +++ b/src/mac/menu.cpp @@ -700,8 +700,37 @@ void wxMenuBar::MacInstallMenuBar() } } } - else +#else + if( m_titles[i] == "?" || m_titles[i] == "&?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) + { + wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); + UMASetMenuTitle( menu->GetHMenu() , label ) ; + + for (pos = 0 , node = menu->GetMenuItems().First(); node; node = node->Next(), pos++) + { + item = (wxMenuItem *)node->Data(); + subMenu = item->GetSubMenu() ; + if (subMenu) + { + UMAInsertMenu( subMenu->GetHMenu() , -1 ) ; + } + else + { + if ( item->GetId() == wxApp::s_macAboutMenuItemId ) + { + Str255 label ; + UInt8 modifiers ; + SInt16 key ; + wxMenuItem::MacBuildMenuString( label, &key , &modifiers , item->GetText(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu + UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label ); + UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 ); + } + } + } + UMAInsertMenu(m_menus[i]->GetHMenu(), 0); + } #endif + else { wxMenuItem::MacBuildMenuString( label, NULL , NULL , m_titles[i] , false ); UMASetMenuTitle( menu->GetHMenu() , label ) ; diff --git a/src/mac/notebmac.cpp b/src/mac/notebmac.cpp index ab97b53540..d2e9660896 100644 --- a/src/mac/notebmac.cpp +++ b/src/mac/notebmac.cpp @@ -42,6 +42,9 @@ const short kwxMacTabBottomMargin = 16 ; // ---------------------------------------------------------------------------- #if !USE_SHARED_LIBRARIES +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) diff --git a/src/mac/printmac.cpp b/src/mac/printmac.cpp index 08a6bf77ad..50c666ce95 100644 --- a/src/mac/printmac.cpp +++ b/src/mac/printmac.cpp @@ -136,7 +136,6 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // Create an abort window wxBeginBusyCursor(); -/* wxWindow *win = CreateAbortWindow(parent, printout); wxYield(); @@ -149,7 +148,6 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) sm_abortWindow = win; sm_abortWindow->Show(TRUE); wxYield(); -*/ printout->OnBeginPrinting(); @@ -178,6 +176,11 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) } else { + GrafPtr thePort ; + GetPort( &thePort ) ; + wxYield() ; + SetPort( thePort ) ; + dc->StartPage(); keepGoing = printout->OnPrintPage(pn); dc->EndPage(); diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index af3919bb7b..dd35860824 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -111,6 +111,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, wxString value ; + { + TEHandle teH ; + long size ; + + UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; + (*teH)->lineHeight = -1 ; + } + if( wxApp::s_macDefaultEncodingIsPC ) value = wxMacMakeMacStringFromPC( st ) ; else @@ -152,8 +160,7 @@ void wxTextCtrl::SetValue(const wxString& st) else value = st ; UMASetControlData( m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; - Refresh() ; -// MacInvalidateControl() ; + UMADrawControl( m_macControl ) ; } // Clipboard operations @@ -208,7 +215,7 @@ void wxTextCtrl::Paste() UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ; TEFromScrap() ; TEPaste( teH ) ; -// MacInvalidateControl() ; + UMADrawControl( m_macControl ) ; } } diff --git a/src/mac/thread.cpp b/src/mac/thread.cpp index 34b7fe57ea..a37865ee7a 100644 --- a/src/mac/thread.cpp +++ b/src/mac/thread.cpp @@ -801,9 +801,11 @@ bool wxThreadModule::OnInit() long response; bool hasThreadManager ; hasThreadManager = Gestalt( gestaltThreadMgrAttr, &response) == noErr && response & 1; -#if TARGET_RT_MAC_CFM +#if !TARGET_CARBON +#if GENERATINGCFM // verify presence of shared library hasThreadManager = hasThreadManager && ((Ptr)NewThread != (Ptr)kUnresolvedCFragSymbolAddress); +#endif #endif if ( !hasThreadManager ) { diff --git a/src/mac/uma.cpp b/src/mac/uma.cpp index 4dce1ce377..f95b4c52bd 100644 --- a/src/mac/uma.cpp +++ b/src/mac/uma.cpp @@ -1,6 +1,9 @@ #include #include + +#include "Navigation.h" + // init static bool sUMAHasAppearance = false ; @@ -14,7 +17,19 @@ static long sUMAWindowManagerAttr = 0 ; bool UMAHasWindowManager() { return sUMAHasWindowManager ; } long UMAGetWindowManagerAttr() { return sUMAWindowManagerAttr ; } - +void UMACleanupToolbox() +{ +#if UMA_USE_APPEARANCE + if ( sUMAHasAppearance ) + { + UnregisterAppearanceClient() ; + } +#endif + if ( NavServicesAvailable() ) + { + NavUnload() ; + } +} void UMAInitToolbox( UInt16 inMoreMastersCalls ) { #if !TARGET_CARBON @@ -24,7 +39,6 @@ void UMAInitToolbox( UInt16 inMoreMastersCalls ) ::InitGraf(&qd.thePort); ::InitFonts(); - ::InitWindows(); ::InitMenus(); ::TEInit(); ::InitDialogs(0L); @@ -60,6 +74,16 @@ void UMAInitToolbox( UInt16 inMoreMastersCalls ) } #endif // UMA_USE_WINDOWMGR #endif + + if ( sUMAHasWindowManager ) + InitFloatingWindows() ; + else + InitWindows(); + + if ( NavServicesAvailable() ) + { + NavLoad() ; + } } // process manager @@ -250,7 +274,7 @@ void UMAInsertMenu( MenuRef insertMenu , SInt16 afterId ) int gPrOpenCounter = 0 ; -void UMAPrOpen() +OSStatus UMAPrOpen() { #if !TARGET_CARBON OSErr err = noErr ; @@ -261,12 +285,20 @@ void UMAPrOpen() err = PrError() ; wxASSERT( err == noErr ) ; } + return err ; #else - #pragma warning "TODO Printing for Carbon" + OSStatus err = noErr ; + ++gPrOpenCounter ; + if ( gPrOpenCounter == 1 ) + { + err = PMBegin() ; + wxASSERT( err == noErr ) ; + } + return err ; #endif } -void UMAPrClose() +OSStatus UMAPrClose() { #if !TARGET_CARBON OSErr err = noErr ; @@ -278,8 +310,16 @@ void UMAPrClose() wxASSERT( err == noErr ) ; } --gPrOpenCounter ; + return err ; #else - #pragma warning "TODO Printing for Carbon" + OSStatus err = noErr ; + wxASSERT( gPrOpenCounter >= 1 ) ; + if ( gPrOpenCounter == 1 ) + { + err = PMEnd() ; + } + --gPrOpenCounter ; + return err ; #endif } diff --git a/src/mac/utils.cpp b/src/mac/utils.cpp index b312321562..6d4fa1b5da 100644 --- a/src/mac/utils.cpp +++ b/src/mac/utils.cpp @@ -47,6 +47,14 @@ bool wxGetUserId(char *buf, int maxSize) return FALSE; } +const wxChar* wxGetHomeDir(wxString *pstr) +{ + *pstr = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder ) ; + return pstr->c_str() ; +} + + + // Get user name e.g. AUTHOR bool wxGetUserName(char *buf, int maxSize) { diff --git a/src/mac/wave.cpp b/src/mac/wave.cpp index 804d07a097..5df346f825 100644 --- a/src/mac/wave.cpp +++ b/src/mac/wave.cpp @@ -18,12 +18,12 @@ #include "wx/mac/wave.h" wxWave::wxWave() - : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE) + : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0) { } wxWave::wxWave(const wxString& sFileName, bool isResource) - : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE) + : m_hSnd(NULL), m_waveLength(0), m_isResource(true), m_sndChan(0) { Create(sFileName, isResource); } @@ -34,28 +34,196 @@ wxWave::~wxWave() Free(); } + bool wxWave::Create(const wxString& fileName, bool isResource) { - Free(); + 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; + } - // TODO + if (!(SndRefNum = MacOpenSndFile ((char *)lpSnd))) + { + SndDisposeChannel(sndChan, TRUE); + free(sndChan); + sndChan = 0; - return FALSE; + 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 wxWave::Play(bool async, bool looped) const { - if (!IsOk()) - return FALSE; + char lpSnd[32]; + bool ret = false; + + if (m_isResource) + { + strcpy(lpSnd, m_sndname); + c2pstr((char *) lpSnd); + SndListHandle hSnd; + + hSnd = (SndListHandle) GetNamedResource('snd ',(const unsigned char *) lpSnd); - // TODO - return FALSE; + if ((hSnd != NULL) && (SndPlay(m_sndChan, hSnd, async) == noErr)) + ret = true; + } + + return ret; } + bool wxWave::Free() { - // TODO - return FALSE; + 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); +}*/ + + diff --git a/src/mac/window.cpp b/src/mac/window.cpp index e602f93fab..9d98f35302 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -437,8 +437,8 @@ void wxWindow::DoGetClientSize(int *x, int *y) const *x = m_width ; *y = m_height ; - *x -= 2 * MacGetBorderSize( ) ; - *y -= 2 * MacGetBorderSize( ) ; + *x -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + *y -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) { @@ -627,7 +627,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) wxPoint wxWindow::GetClientAreaOrigin() const { - return wxPoint(MacGetBorderSize( ) , MacGetBorderSize( ) ); + return wxPoint(MacGetLeftBorderSize( ) , MacGetTopBorderSize( ) ); } // Makes an adjustment to the window position (for example, a frame that has @@ -725,7 +725,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, if ( !fontToUse ) fontToUse = &m_font; - wxClientDC dc( this ) ; + wxClientDC dc( (wxWindow*) this ) ; long lx,ly,ld,le ; dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ; if ( externalLeading ) @@ -1417,8 +1417,8 @@ void wxWindow::DoSetClientSize(int width, int height) if ( height != -1 && m_vScrollBar ) height += MAC_SCROLLBAR_SIZE ; - width += 2 * MacGetBorderSize( ) ; - height += 2 * MacGetBorderSize( ) ; + width += MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + height += MacGetTopBorderSize( ) + MacGetBottomBorderSize( ) ; DoSetSize( -1 , -1 , width , height ) ; } @@ -1443,7 +1443,8 @@ bool wxWindow::MacGetWindowFromPointSub( const wxPoint &point , wxWindow** outWi for (wxNode *node = GetChildren().First(); node; node = node->Next()) { wxWindow *child = (wxWindow*)node->Data(); - if ( child->GetMacRootWindow() == window ) + // added the m_isShown test --dmazzoni + if ( child->GetMacRootWindow() == window && child->m_isShown ) { if (child->MacGetWindowFromPointSub(newPoint , outWin )) return TRUE; @@ -1462,9 +1463,12 @@ bool wxWindow::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindow** ou { wxPoint point( screenpoint ) ; wxWindow* win = wxFindWinFromMacWindow( window ) ; + if ( win ) + { win->ScreenToClient( point ) ; return win->MacGetWindowFromPointSub( point , outWin ) ; } + } return FALSE ; } @@ -1907,8 +1911,8 @@ void wxWindow::MacRepositionScrollBars() int width = m_width ; int height = m_height ; - width -= 2 * MacGetBorderSize() ; - height -= 2 * MacGetBorderSize() ; + width -= MacGetLeftBorderSize() + MacGetRightBorderSize(); + height -= MacGetTopBorderSize() + MacGetBottomBorderSize(); wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; @@ -2183,7 +2187,7 @@ void wxWindow::MacGetPortClientParams(Point* localOrigin, Rect* clipRect, Window SectRect(clipRect, &myClip, clipRect); } -long wxWindow::MacGetBorderSize( ) const +long wxWindow::MacGetLeftBorderSize( ) const { if( m_macWindowData ) return 0 ; @@ -2203,6 +2207,66 @@ long wxWindow::MacGetBorderSize( ) const return 0 ; } +long wxWindow::MacGetRightBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 3 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 3 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 3 ; + } + return 0 ; +} + +long wxWindow::MacGetTopBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 2 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 2 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 1 ; + } + return 0 ; +} + +long wxWindow::MacGetBottomBorderSize( ) const +{ + if( m_macWindowData ) + return 0 ; + + if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER ) + { + return 3 ; + } + else if ( m_windowStyle &wxDOUBLE_BORDER) + { + return 3 ; + } + else if (m_windowStyle &wxSIMPLE_BORDER) + { + return 3 ; + } + return 0 ; +} + long wxWindow::MacRemoveBordersFromStyle( long style ) { return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ; diff --git a/src/mac/xpm/data.c b/src/mac/xpm/data.c index 3c374fd391..cba30633ab 100644 --- a/src/mac/xpm/data.c +++ b/src/mac/xpm/data.c @@ -423,7 +423,7 @@ xpmParseHeader(data) if (!l) return (XpmFileInvalid); buf[l] = '\0'; - #if defined(macintosh) ||Êdefined(__APPLE__) + #if defined(macintosh) || defined(__APPLE__) ptr = strrchr(buf, '_'); #else ptr = rindex(buf, '_'); diff --git a/src/makemac.mcp b/src/makemac.mcp index d73c8a78cfaa1c660f2a442dc4897fb6fd2e0a2f..06b11d6021b81b139cf1ffba22e762a468b7e604 100644 GIT binary patch delta 754 zcmYk3O-NKx6vyv9@7{NxAEPstjZJ1#lF67~2uVdk;8!?;fwfUXi?J^?1Ox4pM6pF1 z8}tcT1X0eSNP6hqgtf31AuXa>NP?dm)6p_qG>hrnc@}Nny}$qYpYtyNGd$!S9`cUn zP*<1`jS!M`nUHKeA>4m_M-pX(&@_(B3A9^{bT5d|2R9+5#nxS|A+ABy-8$BFtmB<3 zjz^9s(13RwNz)RL6A0jBn;pmw0&U2#`7UG^fva2WPC-r~&|zhyhBRy0IV+g@y?kTv zOt4lxE0k)%>2$y4+g-=$s@1)(Fn;`&=457WB@J0u3RyN&?=c$_X|?s*oTlb_kLEGc zBXqkpRX5u!LX-2+=#bC)QT3Y!Uo5z7A^a^SSnrl9n61p5wk?hoWmzDkWT$P}AI`@l zCKoZ7V%u`+r?MbeW$i!*RiXDaeOJpfVH=)bC36Z*oI%VmM&=~z_R?dkc#2a%W zE=kZX4gHdL5A;J=(A_~Jz!Z0<{5X)dYziSV3&UZWWa86feTvun@-DHw610VrF zVkv+fJDq_dzu(_X5TmiuOh_<9A{9gm&{}?gY@}Lojt^j43%@9p29=t=p`x#%kJy|s zg0Thzbs?tsB14de0ImMdEyyiEYml$}Z$oYaTEEJT2;>n!kMr1dJrbX?j%(tPuEbOR zGisU;>irzESH`TtlQxtn{L-e>U{9Vr&?H%9mf|Em{Mc66&Rn4+pFdz937cz?qFBr_ zS<6RC##^;w+bh3+>jXCY}r)&{%_rZh-G>;Qa2cgB+RDa z7R<=s`+-Q&ycrn<*#06Q)cjf%DhdKKt&1J!xvqYq;`do{frz$3D#@bh9BI#F8P{nv zpL1Rz-fp)po(_@lcu)3(82Ca?9aQOI+|&^fw})7$*Ws@AOlYi -- 2.45.2