IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
BEGIN_EVENT_TABLE(wxListBox, wxControl)
- EVT_SIZE( wxListBox::OnSize )
+ EVT_SIZE( wxListBox::OnSize )
+ EVT_CHAR( wxListBox::OnChar )
END_EVENT_TABLE()
#endif
#include "wx/mac/uma.h"
+#if PRAGMA_STRUCT_ALIGN
+ #pragma options align=mac68k
+#elif PRAGMA_STRUCT_PACKPUSH
+ #pragma pack(push, 2)
+#elif PRAGMA_STRUCT_PACK
+ #pragma pack(2)
+#endif
typedef struct {
unsigned short instruction;
void (*function)();
} ldefRec, *ldefPtr, **ldefHandle;
+#if PRAGMA_STRUCT_ALIGN
+ #pragma options align=reset
+#elif PRAGMA_STRUCT_PACKPUSH
+ #pragma pack(pop)
+#elif PRAGMA_STRUCT_PACK
+ #pragma pack()
+#endif
+
extern "C"
{
static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect,
Cell cell, short dataOffset, short dataLength,
ListHandle listHandle )
{
- FontInfo fontInfo;
GrafPtr savePort;
GrafPtr grafPtr;
RgnHandle savedClipRegion;
// appropriate QuickDraw transform mode.
if( isSelected ) {
- savedPenMode = GetPortPenMode( grafPtr );
- SetPortPenMode( grafPtr, hilitetransfermode );
+ savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
+ SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode );
PaintRect( drawRect );
- SetPortPenMode( grafPtr, savedPenMode );
+ SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode );
}
// Restore the saved clip region.
// appropriate QuickDraw transform mode.
GetPort( &grafPtr );
- savedPenMode = GetPortPenMode( grafPtr );
- SetPortPenMode( grafPtr, hilitetransfermode );
+ savedPenMode = GetPortPenMode( (CGrafPtr)grafPtr );
+ SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode );
PaintRect( drawRect );
- SetPortPenMode( grafPtr, savedPenMode );
+ SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode );
break;
default :
break ;
extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
const short kwxMacListWithVerticalScrollbar = 128 ;
+const short kwxMacListItemHeight = 14 ;
// ============================================================================
// list box control implementation
macListDefUPP = NewListDefUPP( wxMacListDefinition );
}
listDef.u.userProc = macListDefUPP ;
+
#if TARGET_CARBON
Size asize;
- CreateListBoxControl( parent->MacGetRootWindow(), &bounds, false, 0, 1, false, true,
- 14, 14, false, &listDef, &m_macControl );
+ CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true,
+ kwxMacListItemHeight, kwxMacListItemHeight, false, &listDef, (ControlRef *)&m_macControl );
- GetControlData(m_macControl, kControlNoPart, kControlListBoxListHandleTag,
+ GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag,
sizeof(ListHandle), (Ptr) &m_macList, &asize);
- SetControlReference(m_macControl, (long) this);
- SetControlVisibility(m_macControl, false, false);
+ SetControlReference( (ControlHandle) m_macControl, (long) this);
+ SetControlVisibility( (ControlHandle) m_macControl, false, false);
#else
- long result ;
- m_macControl = ::NewControl( parent->MacGetRootWindow() , &bounds , title , false ,
+ long result ;
+ wxStAppResource resload ;
+ m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false ,
kwxMacListWithVerticalScrollbar , 0 , 0,
kControlListBoxProc , (long) this ) ;
- ::GetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag ,
+ ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxListHandleTag ,
sizeof( ListHandle ) , (char*) &m_macList , &result ) ;
HLock( (Handle) m_macList ) ;
ldefHandle ldef ;
ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ;
- if ( (**m_macList).listDefProc != NULL )
+ if ( (**(ListHandle)m_macList).listDefProc != NULL )
{
(**ldef).instruction = 0x4EF9; /* JMP instruction */
(**ldef).function = (void(*)()) listDef.u.userProc;
- (**m_macList).listDefProc = (Handle) ldef ;
+ (**(ListHandle)m_macList).listDefProc = (Handle) ldef ;
}
- Point pt = (**m_macList).cellSize ;
- pt.v = 14 ;
- LCellSize( pt , m_macList ) ;
-
- LAddColumn( 1 , 0 , m_macList ) ;
+ Point pt = (**(ListHandle)m_macList).cellSize ;
+ pt.v = kwxMacListItemHeight ;
+ LCellSize( pt , (ListHandle)m_macList ) ;
+ LAddColumn( 1 , 0 , (ListHandle)m_macList ) ;
#endif
OptionBits options = 0;
if ( style & wxLB_MULTIPLE )
{
options = lOnlyOne ;
}
- SetListSelectionFlags(m_macList, options);
+ SetListSelectionFlags((ListHandle)m_macList, options);
MacPostControlCreate() ;
Append( choices[i] ) ;
}
- LSetDrawingMode( true , m_macList ) ;
+ LSetDrawingMode( true , (ListHandle)m_macList ) ;
return TRUE;
}
wxListBox::~wxListBox()
{
- Free() ;
+ FreeData() ;
if ( m_macList )
{
#if !TARGET_CARBON
- DisposeHandle( (**m_macList).listDefProc ) ;
- (**m_macList).listDefProc = NULL ;
+ DisposeHandle( (**(ListHandle)m_macList).listDefProc ) ;
+ (**(ListHandle)m_macList).listDefProc = NULL ;
#endif
m_macList = NULL ;
}
}
-void wxListBox::Free()
+void wxListBox::FreeData()
{
#if wxUSE_OWNER_DRAWN
if ( m_windowStyle & wxLB_OWNERDRAW )
size_t uiCount = m_aItems.Count();
while ( uiCount-- != 0 ) {
delete m_aItems[uiCount];
+ m_aItems[uiCount] = NULL;
}
m_aItems.Clear();
wxControl::DoSetSize( x , y , width , height , sizeFlags ) ;
#if TARGET_CARBON
Rect bounds ;
- GetControlBounds( m_macControl , &bounds ) ;
- ControlRef control = GetListVerticalScrollBar( m_macList ) ;
+ GetControlBounds( (ControlHandle) m_macControl , &bounds ) ;
+ ControlRef control = GetListVerticalScrollBar( (ListHandle)m_macList ) ;
if ( control )
{
Rect scrollbounds ;
delete GetClientObject(N);
}
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
- m_stringArray.Remove( N ) ;
+ m_stringArray.RemoveAt( N ) ;
m_dataArray.RemoveAt( N ) ;
m_noItems --;
size_t ui = m_aItems.Count();
while ( ui-- != 0 ) {
delete m_aItems[ui];
+ m_aItems[ui] = NULL;
}
m_aItems.Empty();
}
if ( s.Left(1) == "*" && s.Length() > 1 )
{
+ s = st ;
s.MakeLower() ;
for ( int i = 0 ; i < m_noItems ; ++i )
{
void wxListBox::Clear()
{
- Free();
+ FreeData();
m_noItems = 0;
m_stringArray.Empty() ;
m_dataArray.Empty() ;
void wxListBox::SetupColours()
{
- SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
SetForegroundColour(GetParent()->GetForegroundColour());
}
void wxListBox::Refresh(bool eraseBack, const wxRect *rect)
{
- // Set up port
- WindowRef rootwindow = MacGetRootWindow() ;
- wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
- wxMacDrawingHelper focus( wxrootwindow );
-
- UMADrawControl(m_macControl);
+ wxControl::Refresh( eraseBack , rect ) ;
+// MacRedrawControl() ;
}
#if wxUSE_OWNER_DRAWN
void wxListBox::MacDelete( int N )
{
- LDelRow( 1 , N , m_macList) ;
+ LDelRow( 1 , N , (ListHandle)m_macList) ;
Refresh();
}
{
Cell cell = { 0 , 0 } ;
cell.v = n ;
- LAddRow( 1 , cell.v , m_macList ) ;
+ LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;
// LSetCell(text, strlen(text), cell, m_macList);
Refresh();
}
void wxListBox::MacAppend( const char * text)
{
Cell cell = { 0 , 0 } ;
- cell.v = (**m_macList).dataBounds.bottom ;
- LAddRow( 1 , cell.v , m_macList ) ;
+ cell.v = (**(ListHandle)m_macList).dataBounds.bottom ;
+ LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;
// LSetCell(text, strlen(text), cell, m_macList);
Refresh();
}
void wxListBox::MacClear()
{
- LDelRow( (**m_macList).dataBounds.bottom , 0 , m_macList ) ;
+ LDelRow( (**(ListHandle)m_macList).dataBounds.bottom , 0 ,(ListHandle) m_macList ) ;
Refresh();
}
Cell cell = { 0 , 0 } ;
if ( ! (m_windowStyle & wxLB_MULTIPLE) )
{
- if ( LGetSelect( true , &cell , m_macList ) )
- {
- LSetSelect( false , cell , m_macList ) ;
- }
+ if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
+ {
+ LSetSelect( false , cell , (ListHandle)m_macList ) ;
+ }
}
cell.v = n ;
- LSetSelect( select , cell , m_macList ) ;
- LAutoScroll( m_macList ) ;
+ LSetSelect( select , cell , (ListHandle)m_macList ) ;
+ LAutoScroll( (ListHandle)m_macList ) ;
Refresh();
}
{
Cell cell = { 0 , 0 } ;
cell.v = n ;
- return LGetSelect( false , &cell , m_macList ) ;
+ return LGetSelect( false , &cell , (ListHandle)m_macList ) ;
}
void wxListBox::MacDestroy()
int wxListBox::MacGetSelection() const
{
Cell cell = { 0 , 0 } ;
- if ( LGetSelect( true , &cell , m_macList ) )
+ if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
return cell.v ;
else
return -1 ;
Cell cell = { 0 , 0 } ;
cell.v = 0 ;
- while ( LGetSelect( true , &cell , m_macList ) )
+ while ( LGetSelect( true , &cell ,(ListHandle) m_macList ) )
{
aSelections.Add( cell.v ) ;
no_sel++ ;
Point pt;
#if TARGET_CARBON
- GetListCellSize(m_macList, &pt);
+ GetListCellSize((ListHandle)m_macList, &pt);
#else
- pt = (**m_macList).cellSize ;
+ pt = (**(ListHandle)m_macList).cellSize ;
#endif
pt.h = m_width - 15 ;
- LCellSize( pt , m_macList ) ;
+ LCellSize( pt , (ListHandle)m_macList ) ;
}
-void wxListBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart )
+void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
{
Boolean wasDoubleClick = false ;
long result ;
- ::GetControlData( m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ;
+ ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ;
if ( !wasDoubleClick )
{
MacDoClick() ;
void wxListBox::MacSetRedraw( bool doDraw )
{
- LSetDrawingMode( doDraw , m_macList ) ;
+ LSetDrawingMode( doDraw , (ListHandle)m_macList ) ;
}
{
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event) ;
+ GetEventHandler()->ProcessEvent(event) ;
}
+
+static long sLastTypeIn = 0 ;
+
+void wxListBox::OnChar(wxKeyEvent& event)
+{
+ EventRecord *ev = (EventRecord*) (wxTheApp->MacGetCurrentEvent() ) ;
+ short keycode ;
+ short keychar ;
+ keychar = short(ev->message & charCodeMask);
+ keycode = short(ev->message & keyCodeMask) >> 8 ;
+ if ( event.KeyCode() == WXK_SPACE )
+ {
+ wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
+ event.SetEventObject( this );
+
+ wxArrayInt aSelections;
+ int n, count = GetSelections(aSelections);
+ if ( count > 0 )
+ {
+ n = aSelections[0];
+ if ( HasClientObjectData() )
+ event.SetClientObject( GetClientObject(n) );
+ else if ( HasClientUntypedData() )
+ event.SetClientData( GetClientData(n) );
+ event.SetString( GetString(n) );
+ }
+ else
+ {
+ n = -1;
+ }
+
+ event.m_commandInt = n;
+
+ GetEventHandler()->ProcessEvent(event);
+ }
+ else if ( event.KeyCode() == WXK_DOWN || event.KeyCode() == WXK_UP )
+ {
+ // default handling
+ event.Skip() ;
+// ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ;
+ }
+ else
+ {
+ if ( ev->when > m_lastTypeIn + 60 )
+ {
+ m_typeIn = "" ;
+ }
+ m_lastTypeIn = ev->when ;
+ m_typeIn += (char) event.KeyCode() ;
+ int line = FindString("*"+m_typeIn+"*") ;
+ if ( line >= 0 )
+ {
+ SetSelection(line) ;
+ }
+ }
+}
+