X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d497dca47560bb375902c2a261d819e7470a92b3..050c9e3c90c58b05d5b3f7384d1556ca9669f13e:/src/mac/listbox.cpp?ds=inline diff --git a/src/mac/listbox.cpp b/src/mac/listbox.cpp index cb3a39dbd9..7dfe8b1f32 100644 --- a/src/mac/listbox.cpp +++ b/src/mac/listbox.cpp @@ -21,7 +21,7 @@ #include "wx/utils.h" #ifndef __DARWIN__ - #include "extldef.h" +// #include "extldef.h" #endif #if !USE_SHARED_LIBRARY @@ -34,6 +34,96 @@ END_EVENT_TABLE() #include "wx/mac/uma.h" + +typedef struct { + unsigned short instruction; + void (*function)(); +} ldefRec, *ldefPtr, **ldefHandle; + +extern "C" +{ +static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, + Cell cell, short dataOffset, short dataLength, + ListHandle listHandle ) ; +} + +static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, + Cell cell, short dataOffset, short dataLength, + ListHandle listHandle ) +{ + FontInfo fontInfo; + GrafPtr savePort; + GrafPtr grafPtr; + RgnHandle savedClipRegion; + SInt32 savedPenMode; + wxListBox* list; + GetPort(&savePort); + SetPort((**listHandle).port); + grafPtr = (**listHandle).port ; + // typecast our refCon + list = (wxListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) ); + + // Calculate the cell rect. + + switch( message ) { + case lInitMsg: + break; + + case lCloseMsg: + break; + + case lDrawMsg: + { + const wxString text = list->m_stringArray[cell.v] ; + + // Save the current clip region, and set the clip region to the area we are about + // to draw. + + savedClipRegion = NewRgn(); + GetClip( savedClipRegion ); + ClipRect( drawRect ); + EraseRect( drawRect ); + + + MoveTo(drawRect->left + 4 , drawRect->top + 10 ); + ::TextFont( kFontIDMonaco ) ; + ::TextSize( 9 ); + ::TextFace( 0 ) ; + + DrawText(text, 0 , text.Length()); + // If the cell is hilited, do the hilite now. Paint the cell contents with the + // appropriate QuickDraw transform mode. + + if( isSelected ) { + savedPenMode = GetPortPenMode( grafPtr ); + SetPortPenMode( grafPtr, hilitetransfermode ); + PaintRect( drawRect ); + SetPortPenMode( grafPtr, savedPenMode ); + } + + // Restore the saved clip region. + + SetClip( savedClipRegion ); + DisposeRgn( savedClipRegion ); + } + break; + case lHiliteMsg: + + // Hilite or unhilite the cell. Paint the cell contents with the + // appropriate QuickDraw transform mode. + + GetPort( &grafPtr ); + savedPenMode = GetPortPenMode( grafPtr ); + SetPortPenMode( grafPtr, hilitetransfermode ); + PaintRect( drawRect ); + SetPortPenMode( grafPtr, savedPenMode ); + break; + default : + break ; + } + SetPort(savePort); +} + extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ; const short kwxMacListWithVerticalScrollbar = 128 ; @@ -49,6 +139,8 @@ wxListBox::wxListBox() m_macList = NULL ; } +static ListDefUPP macListDefUPP = NULL ; + bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -65,12 +157,16 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ; -#if TARGET_CARBON ListDefSpec listDef; - OptionBits options; + listDef.defType = kListDefUserProcType; + if ( macListDefUPP == NULL ) + { + macListDefUPP = NewListDefUPP( wxMacListDefinition ); + } + listDef.u.userProc = macListDefUPP ; +#if TARGET_CARBON Size asize; - listDef.defType = kListDefStandardTextType; CreateListBoxControl( parent->GetMacRootWindow(), &bounds, false, 0, 1, false, true, 14, 14, false, &listDef, &m_macControl ); @@ -81,66 +177,51 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, SetControlReference(m_macControl, (long) this); SetControlVisibility(m_macControl, false, false); - options = 0; - if ( style & wxLB_MULTIPLE ) - { - options += lNoExtend ; - } - else if ( style & wxLB_EXTENDED ) - { - options += lExtendDrag ; - } - else - { - options = lOnlyOne ; - } - SetListSelectionFlags(m_macList, options); - #else long result ; - m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , false , + m_macControl = ::NewControl( parent->GetMacRootWindow() , &bounds , title , false , kwxMacListWithVerticalScrollbar , 0 , 0, kControlListBoxProc , (long) this ) ; - UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , + ::GetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &m_macList , &result ) ; HLock( (Handle) m_macList ) ; - NewExtLDEFInfo( m_macList , MacDrawStringCell , (long) this ) ; + ldefHandle ldef ; + ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ; + if ( (**m_macList).listDefProc != NULL ) + { + (**ldef).instruction = 0x4EF9; /* JMP instruction */ + (**ldef).function = (void(*)()) listDef.u.userProc; + (**m_macList).listDefProc = (Handle) ldef ; + } + + Point pt = (**m_macList).cellSize ; + pt.v = 14 ; + LCellSize( pt , m_macList ) ; - (**m_macList).selFlags = 0 ; + LAddColumn( 1 , 0 , m_macList ) ; +#endif + OptionBits options = 0; if ( style & wxLB_MULTIPLE ) { - (**m_macList).selFlags += lNoExtend ; + options += lNoExtend ; } else if ( style & wxLB_EXTENDED ) { - (**m_macList).selFlags += lExtendDrag ; + options += lExtendDrag ; } else { - (**m_macList).selFlags = lOnlyOne ; + options = lOnlyOne ; } - - Point pt = (**m_macList).cellSize ; - pt.v = 14 ; - LCellSize( pt , m_macList ) ; - - LAddColumn( 1 , 0 , m_macList ) ; - - ControlFontStyleRec controlstyle ; - controlstyle.flags = kControlUseFontMask + kControlUseSizeMask ; - //controlstyle.font = kControlFontSmallSystemFont ; - controlstyle.font = kFontIDMonaco ; - controlstyle.size = 9 ; - //::UMASetControlFontStyle( m_macControl , &controlstyle ) ; -#endif + SetListSelectionFlags(m_macList, options); MacPostControlCreate() ; for ( int i = 0 ; i < n ; i++ ) { - Append( choices[i] ) ; + Append( choices[i] ) ; } LSetDrawingMode( true , m_macList ) ; @@ -154,7 +235,8 @@ wxListBox::~wxListBox() if ( m_macList ) { #if !TARGET_CARBON - DisposeExtLDEFInfo( m_macList ) ; + DisposeHandle( (**m_macList).listDefProc ) ; + (**m_macList).listDefProc = NULL ; #endif m_macList = NULL ; } @@ -358,7 +440,8 @@ void wxListBox::SetSelection(int N, bool select) { wxCHECK_RET( N >= 0 && N < m_noItems, "invalid index in wxListBox::SetSelection" ); - MacSetSelection( N , select ) ; + MacSetSelection( N , select ) ; + GetSelections( m_selectionPreImage ) ; } bool wxListBox::IsSelected(int N) const @@ -366,7 +449,7 @@ bool wxListBox::IsSelected(int N) const wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE, "invalid index in wxListBox::Selected" ); - return MacIsSelected( N ) ; + return MacIsSelected( N ) ; } void *wxListBox::DoGetItemClientData(int N) const @@ -416,23 +499,6 @@ void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData) int wxListBox::GetSelections(wxArrayInt& aSelections) const { return MacGetSelections( aSelections ) ; - -/* TODO - if ((m_windowStyle & wxLB_MULTIMacE) || (m_windowStyle & wxLB_EXTENDED)) - { - int no_sel = ?? - for ( int n = 0; n < no_sel; n++ ) - aSelections.Add(??); - - return no_sel; - } - else // single-selection listbox - { - aSelections.Add(??); - - return 1; - } -*/ } // Get single selection, for single choice list items @@ -559,7 +625,7 @@ void wxListBox::MacInsert( int n , const char * text) Cell cell = { 0 , 0 } ; cell.v = n ; LAddRow( 1 , cell.v , m_macList ) ; - LSetCell(text, strlen(text), cell, m_macList); +// LSetCell(text, strlen(text), cell, m_macList); Refresh(); } @@ -568,7 +634,7 @@ void wxListBox::MacAppend( const char * text) Cell cell = { 0 , 0 } ; cell.v = (**m_macList).dataBounds.bottom ; LAddRow( 1 , cell.v , m_macList ) ; - LSetCell(text, strlen(text), cell, m_macList); + // LSetCell(text, strlen(text), cell, m_macList); Refresh(); } @@ -581,9 +647,12 @@ void wxListBox::MacClear() void wxListBox::MacSetSelection( int n , bool select ) { Cell cell = { 0 , 0 } ; - if ( LGetSelect( true , &cell , m_macList ) ) + if ( ! (m_windowStyle & wxLB_MULTIPLE) ) { - LSetSelect( false , cell , m_macList ) ; + if ( LGetSelect( true , &cell , m_macList ) ) + { + LSetSelect( false , cell , m_macList ) ; + } } cell.v = n ; @@ -637,7 +706,7 @@ void wxListBox::MacSet( int n , const char * text ) // so we just have to redraw Cell cell = { 0 , 0 } ; cell.v = n ; - LSetCell(text, strlen(text), cell, m_macList); +// LSetCell(text, strlen(text), cell, m_macList); Refresh(); } @@ -664,7 +733,7 @@ void wxListBox::MacHandleControlClick( ControlHandle control , SInt16 controlpar Boolean wasDoubleClick = false ; long result ; - UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ; + ::GetControlData( m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ; if ( !wasDoubleClick ) { MacDoClick() ; @@ -683,11 +752,27 @@ void wxListBox::MacSetRedraw( bool doDraw ) void wxListBox::MacDoClick() { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); - event.SetEventObject( this ); - wxArrayInt aSelections; int n, count = GetSelections(aSelections); + + if ( count == m_selectionPreImage.GetCount() ) + { + bool hasChanged = false ; + for ( int i = 0 ; i < count ; ++i ) + { + if ( aSelections[i] != m_selectionPreImage[i] ) + { + hasChanged = true ; + break ; + } + } + if ( !hasChanged ) + return ; + } + + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); + event.SetEventObject( this ); + if ( count > 0 ) { n = aSelections[0];