#include "wx/hashmap.h"
-#define wxMAC_ALWAYS_USE_GENERIC_LISTCTRL wxT("mac.listctrl.always_use_generic")
-
#if wxUSE_EXTENDED_RTTI
WX_DEFINE_FLAGS( wxListCtrlStyle )
virtual void MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item );
virtual void MacGetColumnInfo( unsigned int row, unsigned int column, wxListItem& item );
virtual void UpdateState(wxMacDataItem* dataItem, wxListItem* item);
-
+ int GetFlags() { return m_flags; }
+
protected:
// we need to override to provide specialized handling for virtual wxListCtrls
virtual OSStatus GetSetItemData(DataBrowserItemID itemID,
wxClientDataType m_clientDataItemsType;
bool m_isVirtual;
+ int m_flags;
DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacDataBrowserListCtrlControl)
};
#if wxABI_VERSION >= 20801
void wxListCtrl::OnRightDown(wxMouseEvent& event)
{
- FireMouseEvent(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition());
+ if (m_dbImpl)
+ FireMouseEvent(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition());
event.Skip();
}
void wxListCtrl::OnMiddleDown(wxMouseEvent& event)
{
- FireMouseEvent(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, event.GetPosition());
+ if (m_dbImpl)
+ FireMouseEvent(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, event.GetPosition());
event.Skip();
}
if (flags & wxLIST_HITTEST_ONITEM)
{
le.m_itemIndex = item;
- if (!IsVirtual())
- {
-
- le.m_item.m_itemId = item;
- GetItem(le.m_item);
- }
+ le.m_item.m_itemId = item;
+ GetItem(le.m_item);
GetEventHandler()->ProcessEvent(le);
}
}
void wxListCtrl::OnChar(wxKeyEvent& event)
{
- wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetId() );
- le.SetEventObject(this);
- le.m_code = event.GetKeyCode();
- le.m_itemIndex = -1;
-
- if (m_current != -1)
+ if (m_dbImpl)
{
- le.m_itemIndex = m_current;
- if (!IsVirtual())
+ wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetId() );
+ le.SetEventObject(this);
+ le.m_code = event.GetKeyCode();
+ le.m_itemIndex = -1;
+
+ if (m_current != -1)
{
+ le.m_itemIndex = m_current;
le.m_item.m_itemId = m_current;
GetItem(le.m_item);
+ GetEventHandler()->ProcessEvent(le);
}
- GetEventHandler()->ProcessEvent(le);
}
+ event.Skip();
}
#endif
totalWidth += m_dbImpl->GetColumnWidth( column );
}
- Boolean vertScrollBar;
- GetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), NULL, &vertScrollBar );
- if (totalWidth > width)
- SetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), true, vertScrollBar );
- else
- SetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), false, vertScrollBar );
+ if ( !(m_dbImpl->GetFlags() & wxHSCROLL) )
+ {
+ Boolean vertScrollBar;
+ GetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), NULL, &vertScrollBar );
+ if (totalWidth > width)
+ SetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), true, vertScrollBar );
+ else
+ SetDataBrowserHasScrollBars( m_dbImpl->GetControlRef(), false, vertScrollBar );
+ }
}
}
{
wxListItem colInfo;
GetColumn(col, colInfo);
-
+
colInfo.SetWidth(width);
SetColumn(col, colInfo);
m_dbImpl->SetColumnWidth(col, mywidth);
if (m_dbImpl)
{
if (!IsVirtual())
- m_dbImpl->MacGetColumnInfo(info.m_itemId, info.m_col, info);
+ {
+ if (info.m_itemId >= 0 && info.m_itemId < GetItemCount())
+ m_dbImpl->MacGetColumnInfo(info.m_itemId, info.m_col, info);
+ }
else
{
- info.SetText( OnGetItemText(info.m_itemId, info.m_col) );
- info.SetImage( OnGetItemColumnImage(info.m_itemId, info.m_col) );
- if (info.GetMask() & wxLIST_MASK_STATE)
+ if (info.m_itemId >= 0 && info.m_itemId < GetItemCount())
{
- if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), info.m_itemId+1 ))
- info.SetState(info.GetState() | wxLIST_STATE_SELECTED);
- }
+ info.SetText( OnGetItemText(info.m_itemId, info.m_col) );
+ info.SetImage( OnGetItemColumnImage(info.m_itemId, info.m_col) );
+ if (info.GetMask() & wxLIST_MASK_STATE)
+ {
+ if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), info.m_itemId+1 ))
+ info.SetState(info.GetState() | wxLIST_STATE_SELECTED);
+ }
- wxListItemAttr* attrs = OnGetItemAttr( info.m_itemId );
- if (attrs)
- {
- info.SetFont( attrs->GetFont() );
- info.SetBackgroundColour( attrs->GetBackgroundColour() );
- info.SetTextColour( attrs->GetTextColour() );
+ wxListItemAttr* attrs = OnGetItemAttr( info.m_itemId );
+ if (attrs)
+ {
+ info.SetFont( attrs->GetFont() );
+ info.SetBackgroundColour( attrs->GetBackgroundColour() );
+ info.SetTextColour( attrs->GetTextColour() );
+ }
}
}
}
if (m_genericImpl)
return m_genericImpl->GetNextItem(item, geom, state);
- if (m_dbImpl && geom == wxLIST_NEXT_ALL && state == wxLIST_STATE_SELECTED )
+ // TODO: implement all geometry and state options?
+ if ( m_dbImpl )
{
- long count = m_dbImpl->MacGetCount() ;
- for ( long line = item + 1 ; line < count; line++ )
+ if ( geom == wxLIST_NEXT_ALL || geom == wxLIST_NEXT_BELOW )
{
- wxMacDataItem* id = m_dbImpl->GetItemFromLine(line);
- if ( m_dbImpl->IsItemSelected(id ) )
- return line;
+ long count = m_dbImpl->MacGetCount() ;
+ for ( long line = item + 1 ; line < count; line++ )
+ {
+ DataBrowserItemID id = line + 1;
+ if ( !IsVirtual() )
+ id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(line);
+
+ if ( (state == wxLIST_STATE_DONTCARE ) )
+ return line;
+
+ if ( (state & wxLIST_STATE_SELECTED) && IsDataBrowserItemSelected(m_dbImpl->GetControlRef(), id ) )
+ return line;
+ }
+ }
+
+ if ( geom == wxLIST_NEXT_ALL || geom == wxLIST_NEXT_ABOVE )
+ {
+ int item2 = item;
+ if ( item2 == -1 )
+ item2 = m_dbImpl->MacGetCount();
+
+ for ( long line = item2 - 1 ; line >= 0; line-- )
+ {
+ DataBrowserItemID id = line + 1;
+ if ( !IsVirtual() )
+ id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(line);
+
+ if ( (state == wxLIST_STATE_DONTCARE ) )
+ return line;
+
+ if ( (state & wxLIST_STATE_SELECTED) && IsDataBrowserItemSelected(m_dbImpl->GetControlRef(), id ) )
+ return line;
+ }
}
- return -1;
}
- return 0;
+ return -1;
}
info.m_itemId = count;
m_dbImpl->MacInsertItem(info.m_itemId, &info );
- wxMacDataItem* dataItem = m_dbImpl->GetItemFromLine(info.m_itemId);
wxListEvent event( wxEVT_COMMAND_LIST_INSERT_ITEM, GetId() );
event.SetEventObject( this );
event.SetEventObject( list );
event.m_itemIndex = owner->GetLineFromItem( this ) ;
- if ( !list->IsVirtual() )
- {
- lb->MacGetColumnInfo(event.m_itemIndex,0,event.m_item);
- }
+ event.m_item.m_itemId = event.m_itemIndex;
+ list->GetItem(event.m_item);
switch (message)
{
OSStatus err = noErr;
m_clientDataItemsType = wxClientData_None;
m_isVirtual = false;
+ m_flags = 0;
if ( style & wxLC_VIRTUAL )
m_isVirtual = true;
}
verify_noerr( SetHiliteStyle(kDataBrowserTableViewFillHilite ) );
- err = SetHasScrollBars( (style & wxHSCROLL) != 0 , (style & wxVSCROLL) != 0 );
+ verify_noerr( SetHasScrollBars( (style & wxHSCROLL) != 0 , true ) );
}
pascal Boolean wxMacDataBrowserListCtrlControl::DataBrowserEditTextProc(
}
else
{
- text = list->OnGetItemText( (long)itemID-1, listColumn );
- imgIndex = list->OnGetItemColumnImage( (long)itemID-1, listColumn );
- wxListItemAttr* attrs = list->OnGetItemAttr( (long)itemID-1 );
- if (attrs)
+ long itemNum = (long)itemID-1;
+ if (itemNum >= 0 && itemNum < list->GetItemCount())
{
- if (attrs->HasBackgroundColour())
- bgColor = attrs->GetBackgroundColour();
- if (attrs->HasTextColour())
- color = attrs->GetTextColour();
- if (attrs->HasFont())
- font = attrs->GetFont();
+ text = list->OnGetItemText( itemNum, listColumn );
+ imgIndex = list->OnGetItemColumnImage( itemNum, listColumn );
+ wxListItemAttr* attrs = list->OnGetItemAttr( itemNum );
+ if (attrs)
+ {
+ if (attrs->HasBackgroundColour())
+ bgColor = attrs->GetBackgroundColour();
+ if (attrs->HasTextColour())
+ color = attrs->GetTextColour();
+ if (attrs->HasFont())
+ font = attrs->GetFont();
+ }
}
}
}
enclosingRect.right - enclosingRect.left,
enclosingRect.bottom - enclosingRect.top);
+ bool hasFocus = (wxWindow::FindFocus() == list);
active = IsControlActive(GetControlRef());
// don't paint the background over the vertical rule line
{
GetThemeDrawingState(&savedState);
-
- GetThemeBrushAsColor(kThemeBrushAlternatePrimaryHighlightColor, 32, true, &backgroundColor);
- GetThemeTextColor(kThemeTextColorWhite, gdDepth, colorDevice, &labelColor);
-
+
+ if (active && hasFocus)
+ {
+ GetThemeBrushAsColor(kThemeBrushAlternatePrimaryHighlightColor, 32, true, &backgroundColor);
+ GetThemeTextColor(kThemeTextColorWhite, gdDepth, colorDevice, &labelColor);
+ }
+ else
+ {
+ GetThemeBrushAsColor(kThemeBrushSecondaryHighlightColor, 32, true, &backgroundColor);
+ GetThemeTextColor(kThemeTextColorBlack, gdDepth, colorDevice, &labelColor);
+ }
CGContextSaveGState(context);
CGContextSetRGBFillColor(context, (float)backgroundColor.red / (float)USHRT_MAX,
labelColor = MAC_WXCOLORREF( color.GetPixel() );
else if (list->GetTextColour().Ok())
labelColor = MAC_WXCOLORREF( list->GetTextColour().GetPixel() );
-
+
if (bgColor.Ok())
{
backgroundColor = MAC_WXCOLORREF( bgColor.GetPixel() );
}
else
{
- text = list->OnGetItemText( (long)itemID-1, listColumn );
- imgIndex = list->OnGetItemColumnImage( (long)itemID-1, listColumn );
+ long itemNum = (long)itemID-1;
+ if (itemNum >= 0 && itemNum < list->GetItemCount())
+ {
+ text = list->OnGetItemText( itemNum, listColumn );
+ imgIndex = list->OnGetItemColumnImage( itemNum, listColumn );
+ }
}
}
// avoid asserts by getting out now
return ;
}
-
+
wxListCtrl *list = wxDynamicCast( GetPeer() , wxListCtrl );
if ( list )
{
DataBrowserTableViewRowIndex result = 0;
verify_noerr( GetItemRow( itemID, &result ) ) ;
event.m_itemIndex = result;
-
- if (event.m_itemIndex >= 0)
- MacGetColumnInfo(event.m_itemIndex,0,event.m_item);
}
else
{
event.m_itemIndex = (long)itemID-1;
}
+ event.m_item.m_itemId = event.m_itemIndex;
+ list->GetItem(event.m_item);
switch (message)
{
long itemNum = (long)itemOneID;
long otherItemNum = (long)itemTwoID;
- itemText = list->OnGetItemText( itemNum-1, colId );
- otherItemText = list->OnGetItemText( otherItemNum-1, colId );
-
+
// virtual listctrls don't support sorting
return itemNum < otherItemNum;
}
}
#endif // wxUSE_LISTCTRL
+