Adding support for item font/style/color customization, unfortunately, it does not work with wxLC_EDIT_LABELS due to a limitation in the native control. Also fire activate events, and fix some event object/id mismatches when using the generic list ctrl.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42383 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
5dafb071ba
commit
e9a0cc4b72
@ -17,6 +17,8 @@
|
||||
class wxMacDataBrowserListCtrlControl;
|
||||
class wxMacListControl;
|
||||
|
||||
WX_DECLARE_EXPORTED_LIST(wxListItem, wxColumnList);
|
||||
|
||||
class WXDLLEXPORT wxListCtrl: public wxControl
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxListCtrl)
|
||||
@ -314,6 +316,14 @@ class WXDLLEXPORT wxListCtrl: public wxControl
|
||||
virtual bool SetFont(const wxFont& font);
|
||||
virtual bool SetForegroundColour(const wxColour& colour);
|
||||
virtual bool SetBackgroundColour(const wxColour& colour);
|
||||
virtual wxColour GetBackgroundColour();
|
||||
|
||||
// with CG, we need to get the context from an kEventControlDraw event
|
||||
// unfortunately, the DataBrowser callbacks don't provide the context
|
||||
// and we need it, so we need to set/remove it before and after draw
|
||||
// events so we can access it in the callbacks.
|
||||
void MacSetDrawingContext(void* context) { m_cgContext = context; }
|
||||
void* MacGetDrawingContext() { return m_cgContext; }
|
||||
|
||||
protected:
|
||||
// protected overrides needed for pimpl approach
|
||||
@ -326,7 +336,8 @@ protected:
|
||||
|
||||
wxGenericListCtrl* m_genericImpl; // allow use of the generic impl.
|
||||
wxMacDataBrowserListCtrlControl* m_dbImpl;
|
||||
void* /*EventHandlerRef*/ m_macListCtrlEventHandler;
|
||||
void* m_macListCtrlEventHandler;
|
||||
void* m_cgContext;
|
||||
wxListCtrlCompare m_compareFunc;
|
||||
long m_compareFuncData;
|
||||
|
||||
@ -335,6 +346,10 @@ protected:
|
||||
wxImageList * m_imageListSmall; // The image list for small icons
|
||||
wxImageList * m_imageListState; // The image list state icons (not implemented yet)
|
||||
|
||||
wxColumnList m_colsInfo; // for storing info about each column
|
||||
wxColour m_textColor;
|
||||
wxColour m_bgColor;
|
||||
|
||||
// keep track of whether or not we should delete the image list ourselves.
|
||||
bool m_ownsImageListNormal,
|
||||
m_ownsImageListSmall,
|
||||
|
@ -115,11 +115,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent)
|
||||
WX_DECLARE_EXPORTED_LIST(wxListItem, wxListItemList);
|
||||
#include "wx/listimpl.cpp"
|
||||
WX_DEFINE_LIST(wxListItemList)
|
||||
WX_DEFINE_LIST(wxColumnList)
|
||||
|
||||
// so we can check for column clicks
|
||||
static const EventTypeSpec eventList[] =
|
||||
{
|
||||
{ kEventClassControl, kEventControlHit },
|
||||
{ kEventClassControl, kEventControlDraw }
|
||||
};
|
||||
|
||||
static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
||||
@ -151,6 +153,11 @@ static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler ,
|
||||
result = CallNextEventHandler(handler, event);
|
||||
break;
|
||||
}
|
||||
case kEventControlDraw:
|
||||
CGContextRef context = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, typeCGContextRef) ;
|
||||
window->MacSetDrawingContext(context);
|
||||
result = CallNextEventHandler(handler, event);
|
||||
window->MacSetDrawingContext(NULL);
|
||||
default :
|
||||
break ;
|
||||
}
|
||||
@ -185,6 +192,10 @@ protected:
|
||||
wxListItemList m_rowItems;
|
||||
};
|
||||
|
||||
DataBrowserDrawItemUPP gDataBrowserDrawItemUPP = NULL;
|
||||
//DataBrowserEditItemUPP gDataBrowserEditItemUPP = NULL;
|
||||
DataBrowserHitTestUPP gDataBrowserHitTestUPP = NULL;
|
||||
|
||||
// TODO: Make a better name!!
|
||||
class wxMacDataBrowserListCtrlControl : public wxMacDataItemBrowserControl
|
||||
{
|
||||
@ -217,15 +228,73 @@ protected:
|
||||
DataBrowserItemID itemTwoID,
|
||||
DataBrowserPropertyID sortProperty);
|
||||
|
||||
static pascal void DataBrowserDrawItemProc(ControlRef browser,
|
||||
DataBrowserItemID item,
|
||||
DataBrowserPropertyID property,
|
||||
DataBrowserItemState itemState,
|
||||
const Rect *theRect,
|
||||
SInt16 gdDepth,
|
||||
Boolean colorDevice);
|
||||
|
||||
virtual void DrawItem(DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
DataBrowserItemState itemState,
|
||||
const Rect *itemRect,
|
||||
SInt16 gdDepth,
|
||||
Boolean colorDevice);
|
||||
|
||||
static pascal Boolean DataBrowserEditTextProc(ControlRef browser,
|
||||
DataBrowserItemID item,
|
||||
DataBrowserPropertyID property,
|
||||
CFStringRef theString,
|
||||
Rect *maxEditTextRect,
|
||||
Boolean *shrinkToFit);
|
||||
|
||||
static pascal Boolean DataBrowserHitTestProc(ControlRef browser,
|
||||
DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
const Rect *theRect,
|
||||
const Rect *mouseRect) { return true; }
|
||||
|
||||
virtual bool ConfirmEditText(DataBrowserItemID item,
|
||||
DataBrowserPropertyID property,
|
||||
CFStringRef theString,
|
||||
Rect *maxEditTextRect,
|
||||
Boolean *shrinkToFit);
|
||||
|
||||
|
||||
|
||||
wxClientDataType m_clientDataItemsType;
|
||||
bool m_isVirtual;
|
||||
|
||||
};
|
||||
|
||||
// TODO: This gives errors, find out why.
|
||||
//BEGIN_EVENT_TABLE(wxListCtrl, wxControl)
|
||||
// EVT_PAINT(wxListCtrl::OnPaint)
|
||||
//END_EVENT_TABLE()
|
||||
class wxMacListCtrlEventDelegate : public wxEvtHandler
|
||||
{
|
||||
public:
|
||||
wxMacListCtrlEventDelegate( wxListCtrl* list, int id );
|
||||
virtual bool ProcessEvent( wxEvent& event );
|
||||
|
||||
private:
|
||||
wxListCtrl* m_list;
|
||||
int m_id;
|
||||
};
|
||||
|
||||
wxMacListCtrlEventDelegate::wxMacListCtrlEventDelegate( wxListCtrl* list, int id )
|
||||
{
|
||||
m_list = list;
|
||||
m_id = id;
|
||||
}
|
||||
|
||||
bool wxMacListCtrlEventDelegate::ProcessEvent( wxEvent& event )
|
||||
{
|
||||
// even though we use a generic list ctrl underneath, make sure
|
||||
// we present ourselves as wxListCtrl.
|
||||
event.SetEventObject( m_list );
|
||||
event.SetId( m_id );
|
||||
|
||||
return wxEvtHandler::ProcessEvent(event);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
@ -256,6 +325,9 @@ void wxListCtrl::Init()
|
||||
m_dbImpl = NULL;
|
||||
m_compareFunc = NULL;
|
||||
m_compareFuncData = 0;
|
||||
m_colsInfo = wxColumnList();
|
||||
m_textColor = wxNullColour;
|
||||
m_bgColor = wxNullColour;
|
||||
}
|
||||
|
||||
class wxGenericListCtrlHook : public wxGenericListCtrl
|
||||
@ -313,13 +385,14 @@ bool wxListCtrl::Create(wxWindow *parent,
|
||||
// Also, use generic list control in VIRTUAL mode.
|
||||
if ( (wxSystemOptions::HasOption( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL )
|
||||
&& (wxSystemOptions::GetOptionInt( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL ) == 1)) ||
|
||||
(style & wxLC_ICON) || (style & wxLC_SMALL_ICON) || (style & wxLC_LIST) /* || (style & wxLC_VIRTUAL) */ )
|
||||
(style & wxLC_ICON) || (style & wxLC_SMALL_ICON) || (style & wxLC_LIST) || (style & wxLC_EDIT_LABELS) )
|
||||
{
|
||||
m_macIsUserPane = true;
|
||||
|
||||
if ( !wxWindow::Create(parent, id, pos, size, style, name) )
|
||||
return false;
|
||||
m_genericImpl = new wxGenericListCtrlHook(this, id, pos, size, style, validator, name);
|
||||
m_genericImpl->PushEventHandler( new wxMacListCtrlEventDelegate( this, GetId() ) );
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -344,6 +417,11 @@ bool wxListCtrl::Create(wxWindow *parent,
|
||||
|
||||
wxListCtrl::~wxListCtrl()
|
||||
{
|
||||
if (m_genericImpl)
|
||||
{
|
||||
m_genericImpl->PopEventHandler(/* deleteHandler = */ true);
|
||||
}
|
||||
|
||||
if (m_ownsImageListNormal)
|
||||
delete m_imageListNormal;
|
||||
if (m_ownsImageListSmall)
|
||||
@ -406,7 +484,7 @@ void wxListCtrl::DoSetSize( int x, int y, int width, int height, int sizeFlags )
|
||||
|
||||
bool wxListCtrl::SetFont(const wxFont& font)
|
||||
{
|
||||
bool rv;
|
||||
bool rv = true;
|
||||
rv = wxControl::SetFont(font);
|
||||
if (m_genericImpl)
|
||||
rv = m_genericImpl->SetFont(font);
|
||||
@ -415,22 +493,34 @@ bool wxListCtrl::SetFont(const wxFont& font)
|
||||
|
||||
bool wxListCtrl::SetForegroundColour(const wxColour& colour)
|
||||
{
|
||||
bool rv;
|
||||
rv = wxControl::SetForegroundColour(colour);
|
||||
bool rv = true;
|
||||
if (m_genericImpl)
|
||||
rv = m_genericImpl->SetForegroundColour(colour);
|
||||
if (m_dbImpl)
|
||||
SetTextColour(colour);
|
||||
return rv;
|
||||
}
|
||||
|
||||
bool wxListCtrl::SetBackgroundColour(const wxColour& colour)
|
||||
{
|
||||
bool rv;
|
||||
rv = wxControl::SetBackgroundColour(colour);
|
||||
bool rv = true;
|
||||
if (m_genericImpl)
|
||||
rv = m_genericImpl->SetBackgroundColour(colour);
|
||||
if (m_dbImpl)
|
||||
m_bgColor = colour;
|
||||
return rv;
|
||||
}
|
||||
|
||||
wxColour wxListCtrl::GetBackgroundColour()
|
||||
{
|
||||
if (m_genericImpl)
|
||||
return m_genericImpl->GetBackgroundColour();
|
||||
if (m_dbImpl)
|
||||
return m_bgColor;
|
||||
|
||||
return wxNullColour;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// accessors
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -443,23 +533,28 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const
|
||||
|
||||
bool success = true;
|
||||
|
||||
if ( item.m_mask & wxLIST_MASK_TEXT )
|
||||
if (m_dbImpl)
|
||||
{
|
||||
|
||||
wxColumnList::compatibility_iterator node = m_colsInfo.Item( col );
|
||||
wxASSERT_MSG( node, _T("invalid column index in wxMacListCtrlItem") );
|
||||
wxListItem* column = node->GetData();
|
||||
|
||||
long mask = column->GetMask();
|
||||
if (mask & wxLIST_MASK_TEXT)
|
||||
item.SetText(column->GetText());
|
||||
if (mask & wxLIST_MASK_DATA)
|
||||
item.SetData(column->GetData());
|
||||
if (mask & wxLIST_MASK_IMAGE)
|
||||
item.SetImage(column->GetImage());
|
||||
if (mask & wxLIST_MASK_STATE)
|
||||
item.SetState(column->GetState());
|
||||
if (mask & wxLIST_MASK_FORMAT)
|
||||
item.SetAlign(column->GetAlign());
|
||||
if (mask & wxLIST_MASK_WIDTH)
|
||||
item.SetWidth(column->GetWidth());
|
||||
}
|
||||
|
||||
if ( item.m_mask & wxLIST_MASK_FORMAT )
|
||||
{
|
||||
}
|
||||
|
||||
if ( item.m_mask & wxLIST_MASK_IMAGE )
|
||||
{
|
||||
}
|
||||
|
||||
if ( (item.m_mask & wxLIST_MASK_TEXT) )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
@ -469,7 +564,69 @@ bool wxListCtrl::SetColumn(int col, wxListItem& item)
|
||||
if (m_genericImpl)
|
||||
return m_genericImpl->SetColumn(col, item);
|
||||
|
||||
return false;
|
||||
if (m_dbImpl)
|
||||
{
|
||||
if ( col >= (int)m_colsInfo.GetCount() )
|
||||
{
|
||||
wxListItem* listItem = new wxListItem(item);
|
||||
m_colsInfo.Append( listItem );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxListItem listItem;
|
||||
GetColumn( col, listItem );
|
||||
long mask = item.GetMask();
|
||||
if (mask & wxLIST_MASK_TEXT)
|
||||
listItem.SetText(item.GetText());
|
||||
if (mask & wxLIST_MASK_DATA)
|
||||
listItem.SetData(item.GetData());
|
||||
if (mask & wxLIST_MASK_IMAGE)
|
||||
listItem.SetImage(item.GetImage());
|
||||
if (mask & wxLIST_MASK_STATE)
|
||||
listItem.SetState(item.GetState());
|
||||
if (mask & wxLIST_MASK_FORMAT)
|
||||
listItem.SetAlign(item.GetAlign());
|
||||
if (mask & wxLIST_MASK_WIDTH)
|
||||
listItem.SetWidth(item.GetWidth());
|
||||
}
|
||||
|
||||
// change the appearance in the databrowser.
|
||||
DataBrowserListViewHeaderDesc columnDesc;
|
||||
columnDesc.version=kDataBrowserListViewLatestHeaderDesc;
|
||||
verify_noerr( m_dbImpl->GetHeaderDesc( kMinColumnId + col, &columnDesc ) );
|
||||
|
||||
/*
|
||||
if (item.GetMask() & wxLIST_MASK_TEXT)
|
||||
{
|
||||
wxFontEncoding enc;
|
||||
if ( m_font.Ok() )
|
||||
enc = m_font.GetEncoding();
|
||||
else
|
||||
enc = wxLocale::GetSystemEncoding();
|
||||
wxMacCFStringHolder cfTitle;
|
||||
cfTitle.Assign( item.GetText() , enc );
|
||||
if(columnDesc.titleString)
|
||||
CFRelease(columnDesc.titleString);
|
||||
columnDesc.titleString = cfTitle;
|
||||
}
|
||||
*/
|
||||
|
||||
if (item.GetMask() & wxLIST_MASK_IMAGE && item.GetImage() != -1 )
|
||||
{
|
||||
columnDesc.btnContentInfo.contentType = kControlContentIconRef;
|
||||
wxImageList* imageList = GetImageList(wxIMAGE_LIST_SMALL);
|
||||
if (imageList && imageList->GetImageCount() > 0 )
|
||||
{
|
||||
wxBitmap bmp = imageList->GetBitmap( item.GetImage() );
|
||||
IconRef icon = bmp.GetBitmapData()->GetIconRef();
|
||||
columnDesc.btnContentInfo.u.iconRef = icon;
|
||||
}
|
||||
}
|
||||
|
||||
verify_noerr( m_dbImpl->SetHeaderDesc( kMinColumnId + col, &columnDesc ) );
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int wxListCtrl::GetColumnCount() const
|
||||
@ -507,10 +664,6 @@ bool wxListCtrl::SetColumnWidth(int col, int width)
|
||||
if (m_genericImpl)
|
||||
return m_genericImpl->SetColumnWidth(col, width);
|
||||
|
||||
// TODO: This is setting the width of the first column
|
||||
// to the entire window width; investigate why
|
||||
// this is.
|
||||
|
||||
if (m_dbImpl)
|
||||
{
|
||||
int mywidth = width;
|
||||
@ -889,7 +1042,7 @@ wxColour wxListCtrl::GetTextColour() const
|
||||
|
||||
// TODO: we need owner drawn list items to customize text color.
|
||||
if (m_dbImpl)
|
||||
return *wxBLACK;
|
||||
return m_textColor;
|
||||
|
||||
return wxNullColour;
|
||||
}
|
||||
@ -903,8 +1056,8 @@ void wxListCtrl::SetTextColour(const wxColour& col)
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: if we add owner-drawn item support for DataBrowser,
|
||||
// consider supporting this property
|
||||
if (m_dbImpl)
|
||||
m_textColor = col;
|
||||
}
|
||||
|
||||
// Gets the index of the topmost visible item when in
|
||||
@ -1271,16 +1424,17 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
|
||||
|
||||
if (m_dbImpl)
|
||||
{
|
||||
int width = item.GetWidth();
|
||||
if ( !(item.GetMask() & wxLIST_MASK_WIDTH) )
|
||||
item.SetWidth(150);
|
||||
width = 150;
|
||||
|
||||
DataBrowserPropertyType type = kDataBrowserTextType;
|
||||
DataBrowserPropertyType type = kDataBrowserCustomType; //kDataBrowserTextType;
|
||||
wxImageList* imageList = GetImageList(wxIMAGE_LIST_SMALL);
|
||||
if (imageList && imageList->GetImageCount() > 0)
|
||||
{
|
||||
wxBitmap bmp = imageList->GetBitmap(0);
|
||||
if (bmp.Ok())
|
||||
type = kDataBrowserIconAndTextType;
|
||||
//if (bmp.Ok())
|
||||
// type = kDataBrowserIconAndTextType;
|
||||
}
|
||||
|
||||
SInt16 just = teFlushDefault;
|
||||
@ -1293,7 +1447,8 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
|
||||
else if (item.GetAlign() == wxLIST_FORMAT_RIGHT)
|
||||
just = teFlushRight;
|
||||
}
|
||||
m_dbImpl->InsertColumn(col, type, item.GetText(), just, item.GetWidth());
|
||||
m_dbImpl->InsertColumn(col, type, item.GetText(), just, width);
|
||||
SetColumn(col, item);
|
||||
|
||||
// set/remove options based on the wxListCtrl type.
|
||||
DataBrowserTableViewColumnID id;
|
||||
@ -1520,7 +1675,7 @@ void wxMacListCtrlItem::Notification(wxMacDataItemBrowserControl *owner ,
|
||||
break;
|
||||
|
||||
case kDataBrowserItemDoubleClicked:
|
||||
event.SetEventType( wxEVT_LEFT_DCLICK );
|
||||
event.SetEventType( wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
|
||||
trigger = true;
|
||||
break;
|
||||
|
||||
@ -1572,6 +1727,24 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
|
||||
|
||||
err = SetSelectionFlags( options );
|
||||
verify_noerr( err );
|
||||
|
||||
DataBrowserCustomCallbacks callbacks;
|
||||
InitializeDataBrowserCustomCallbacks( &callbacks, kDataBrowserLatestCustomCallbacks );
|
||||
|
||||
if ( gDataBrowserDrawItemUPP == NULL )
|
||||
gDataBrowserDrawItemUPP = NewDataBrowserDrawItemUPP(DataBrowserDrawItemProc);
|
||||
|
||||
// if ( gDataBrowserEditItemUPP == NULL )
|
||||
// gDataBrowserEditItemUPP = NewDataBrowserEditItemUPP(DataBrowserEditTextProc);
|
||||
|
||||
if ( gDataBrowserHitTestUPP == NULL )
|
||||
gDataBrowserHitTestUPP = NewDataBrowserHitTestUPP(DataBrowserHitTestProc);
|
||||
|
||||
callbacks.u.v1.drawItemCallback = gDataBrowserDrawItemUPP;
|
||||
// callbacks.u.v1.editTextCallback = gDataBrowserEditItemUPP;
|
||||
callbacks.u.v1.hitTestCallback = gDataBrowserHitTestUPP;
|
||||
|
||||
SetDataBrowserCustomCallbacks( GetControlRef(), &callbacks );
|
||||
|
||||
if ( style & wxLC_LIST )
|
||||
{
|
||||
@ -1612,6 +1785,291 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
|
||||
err = SetHasScrollBars( (style & wxHSCROLL) != 0 , true );
|
||||
}
|
||||
|
||||
pascal Boolean wxMacDataBrowserListCtrlControl::DataBrowserEditTextProc(
|
||||
ControlRef browser,
|
||||
DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
CFStringRef theString,
|
||||
Rect *maxEditTextRect,
|
||||
Boolean *shrinkToFit)
|
||||
{
|
||||
Boolean result = false;
|
||||
wxMacDataBrowserListCtrlControl* ctl = dynamic_cast<wxMacDataBrowserListCtrlControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
|
||||
if ( ctl != 0 )
|
||||
{
|
||||
result = ctl->ConfirmEditText(itemID, property, theString, maxEditTextRect, shrinkToFit);
|
||||
theString = CFSTR("Hello!");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool wxMacDataBrowserListCtrlControl::ConfirmEditText(
|
||||
DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
CFStringRef theString,
|
||||
Rect *maxEditTextRect,
|
||||
Boolean *shrinkToFit)
|
||||
{
|
||||
//wxListCtrl* list = wxDynamicCast( GetPeer() , wxListCtrl );
|
||||
return false;
|
||||
}
|
||||
|
||||
pascal void wxMacDataBrowserListCtrlControl::DataBrowserDrawItemProc(
|
||||
ControlRef browser,
|
||||
DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
DataBrowserItemState itemState,
|
||||
const Rect *itemRect,
|
||||
SInt16 gdDepth,
|
||||
Boolean colorDevice)
|
||||
{
|
||||
wxMacDataBrowserListCtrlControl* ctl = dynamic_cast<wxMacDataBrowserListCtrlControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
|
||||
if ( ctl != 0 )
|
||||
{
|
||||
ctl->DrawItem(itemID, property, itemState, itemRect, gdDepth, colorDevice);
|
||||
}
|
||||
}
|
||||
|
||||
// routines needed for DrawItem
|
||||
enum
|
||||
{
|
||||
kIconWidth = 16,
|
||||
kIconHeight = 16,
|
||||
kTextBoxHeight = 14,
|
||||
kIconTextSpacingV = 2,
|
||||
kItemPadding = 4,
|
||||
kContentHeight = kIconHeight + kTextBoxHeight + kIconTextSpacingV
|
||||
};
|
||||
|
||||
static void calculateCGDrawingBounds(CGRect inItemRect, CGRect *outIconRect, CGRect *outTextRect, bool hasIcon = false)
|
||||
{
|
||||
float textBottom;
|
||||
float iconH, iconW = 0;
|
||||
float padding = kItemPadding;
|
||||
if (hasIcon)
|
||||
{
|
||||
iconH = kIconHeight;
|
||||
iconW = kIconWidth;
|
||||
padding = padding*2;
|
||||
}
|
||||
|
||||
textBottom = inItemRect.origin.y;
|
||||
|
||||
*outIconRect = CGRectMake(inItemRect.origin.x + kItemPadding,
|
||||
textBottom + kIconTextSpacingV, kIconWidth,
|
||||
kIconHeight);
|
||||
|
||||
*outTextRect = CGRectMake(inItemRect.origin.x + padding + iconW,
|
||||
textBottom + kIconTextSpacingV, inItemRect.size.width - padding - iconW,
|
||||
inItemRect.size.height - kIconTextSpacingV);
|
||||
}
|
||||
|
||||
void wxMacDataBrowserListCtrlControl::DrawItem(
|
||||
DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
DataBrowserItemState itemState,
|
||||
const Rect *itemRect,
|
||||
SInt16 gdDepth,
|
||||
Boolean colorDevice)
|
||||
{
|
||||
wxString text;
|
||||
wxFont font = wxNullFont;
|
||||
int imgIndex = -1;
|
||||
short listColumn = property - kMinColumnId;
|
||||
|
||||
wxListCtrl* list = wxDynamicCast( GetPeer() , wxListCtrl );
|
||||
wxMacListCtrlItem* lcItem;
|
||||
wxColour color = *wxBLACK;
|
||||
wxColour bgColor = wxNullColour;
|
||||
|
||||
if (listColumn >= 0)
|
||||
{
|
||||
if (!m_isVirtual)
|
||||
{
|
||||
lcItem = (wxMacListCtrlItem*) itemID;
|
||||
if (lcItem->HasColumnInfo(listColumn)){
|
||||
wxListItem* item = lcItem->GetColumnInfo(listColumn);
|
||||
|
||||
// we always use the 0 column to get font and text/background colors.
|
||||
if (lcItem->HasColumnInfo(0))
|
||||
{
|
||||
wxListItem* firstItem = lcItem->GetColumnInfo(0);
|
||||
color = firstItem->GetTextColour();
|
||||
bgColor = firstItem->GetBackgroundColour();
|
||||
font = firstItem->GetFont();
|
||||
}
|
||||
|
||||
if (item->GetMask() & wxLIST_MASK_TEXT)
|
||||
text = item->GetText();
|
||||
if (item->GetMask() & wxLIST_MASK_IMAGE)
|
||||
imgIndex = item->GetImage();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
text = list->OnGetItemText( (long)itemID-1, listColumn );
|
||||
imgIndex = list->OnGetItemColumnImage( (long)itemID-1, listColumn );
|
||||
wxListItemAttr* attrs = list->OnGetItemAttr( (long)itemID-1 );
|
||||
if (attrs)
|
||||
{
|
||||
if (attrs->HasBackgroundColour())
|
||||
bgColor = attrs->GetBackgroundColour();
|
||||
if (attrs->HasTextColour())
|
||||
color = attrs->GetTextColour();
|
||||
if (attrs->HasFont())
|
||||
font = attrs->GetFont();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wxColour listBgColor = list->GetBackgroundColour();
|
||||
if (bgColor == wxNullColour)
|
||||
bgColor = listBgColor;
|
||||
|
||||
wxFont listFont = list->GetFont();
|
||||
if (font == wxNullFont)
|
||||
font = listFont;
|
||||
|
||||
wxMacCFStringHolder cfString;
|
||||
cfString.Assign( text, wxLocale::GetSystemEncoding() );
|
||||
|
||||
Rect enclosingRect;
|
||||
CGRect enclosingCGRect, iconCGRect, textCGRect;
|
||||
Boolean active;
|
||||
ThemeDrawingState savedState = NULL;
|
||||
CGContextRef context = (CGContextRef)list->MacGetDrawingContext();
|
||||
RGBColor labelColor;
|
||||
|
||||
GetDataBrowserItemPartBounds(GetControlRef(), itemID, property, kDataBrowserPropertyEnclosingPart,
|
||||
&enclosingRect);
|
||||
|
||||
enclosingCGRect = CGRectMake(enclosingRect.left,
|
||||
enclosingRect.top,
|
||||
enclosingRect.right - enclosingRect.left,
|
||||
enclosingRect.bottom - enclosingRect.top);
|
||||
|
||||
active = IsControlActive(GetControlRef());
|
||||
|
||||
if (itemState == kDataBrowserItemIsSelected)
|
||||
{
|
||||
RGBColor foregroundColor;
|
||||
|
||||
GetThemeDrawingState(&savedState);
|
||||
|
||||
GetThemeBrushAsColor(kThemeBrushAlternatePrimaryHighlightColor, 32, true, &foregroundColor);
|
||||
GetThemeTextColor(kThemeTextColorWhite, gdDepth, colorDevice, &labelColor);
|
||||
|
||||
CGContextSaveGState(context);
|
||||
|
||||
CGContextSetRGBFillColor(context, (float)foregroundColor.red / (float)USHRT_MAX,
|
||||
(float)foregroundColor.green / (float)USHRT_MAX,
|
||||
(float)foregroundColor.blue / (float)USHRT_MAX, 1.0);
|
||||
CGContextFillRect(context, enclosingCGRect);
|
||||
|
||||
CGContextRestoreGState(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (color.Ok())
|
||||
labelColor = MAC_WXCOLORREF( color.GetPixel() );
|
||||
else if (list->GetTextColour().Ok())
|
||||
labelColor = MAC_WXCOLORREF( list->GetTextColour().GetPixel() );
|
||||
else
|
||||
{
|
||||
labelColor.red = 0;
|
||||
labelColor.green = 0;
|
||||
labelColor.blue = 0;
|
||||
}
|
||||
|
||||
if (bgColor.Ok())
|
||||
{
|
||||
RGBColor foregroundColor = MAC_WXCOLORREF( bgColor.GetPixel() );
|
||||
CGContextSaveGState(context);
|
||||
|
||||
CGContextSetRGBFillColor(context, (float)foregroundColor.red / (float)USHRT_MAX,
|
||||
(float)foregroundColor.green / (float)USHRT_MAX,
|
||||
(float)foregroundColor.blue / (float)USHRT_MAX, 1.0);
|
||||
CGContextFillRect(context, enclosingCGRect);
|
||||
|
||||
CGContextRestoreGState(context);
|
||||
}
|
||||
}
|
||||
|
||||
calculateCGDrawingBounds(enclosingCGRect, &iconCGRect, &textCGRect, (imgIndex != -1) );
|
||||
|
||||
if (imgIndex != -1)
|
||||
{
|
||||
wxImageList* imageList = list->GetImageList(wxIMAGE_LIST_SMALL);
|
||||
if (imageList && imageList->GetImageCount() > 0){
|
||||
wxBitmap bmp = imageList->GetBitmap(imgIndex);
|
||||
IconRef icon = bmp.GetBitmapData()->GetIconRef();
|
||||
|
||||
RGBColor iconLabel;
|
||||
iconLabel.red = 0;
|
||||
iconLabel.green = 0;
|
||||
iconLabel.blue = 0;
|
||||
|
||||
PlotIconRefInContext(context, &iconCGRect, kAlignNone,
|
||||
active ? kTransformNone : kTransformDisabled, &iconLabel,
|
||||
kPlotIconRefNormalFlags, icon);
|
||||
}
|
||||
}
|
||||
|
||||
HIThemeTextHorizontalFlush hFlush = kHIThemeTextHorizontalFlushLeft;
|
||||
UInt16 fontID = kThemeViewsFont;
|
||||
|
||||
if (font.Ok())
|
||||
{
|
||||
if (font.GetFamily() != wxFONTFAMILY_DEFAULT)
|
||||
fontID = font.MacGetThemeFontID();
|
||||
|
||||
// FIXME: replace these with CG or ATSUI calls so we can remove this #ifndef.
|
||||
#ifndef __LP64__
|
||||
::TextSize( (short)(font.MacGetFontSize()) ) ;
|
||||
::TextFace( font.MacGetFontStyle() ) ;
|
||||
#endif
|
||||
}
|
||||
|
||||
wxListItem item;
|
||||
list->GetColumn(listColumn, item);
|
||||
if (item.GetMask() & wxLIST_MASK_FORMAT)
|
||||
{
|
||||
if (item.GetAlign() == wxLIST_FORMAT_LEFT)
|
||||
hFlush = kHIThemeTextHorizontalFlushLeft;
|
||||
else if (item.GetAlign() == wxLIST_FORMAT_CENTER)
|
||||
hFlush = kHIThemeTextHorizontalFlushCenter;
|
||||
else if (item.GetAlign() == wxLIST_FORMAT_RIGHT)
|
||||
{
|
||||
hFlush = kHIThemeTextHorizontalFlushRight;
|
||||
textCGRect.origin.x -= kItemPadding; // give a little extra paddding
|
||||
}
|
||||
}
|
||||
|
||||
HIThemeTextInfo info;
|
||||
info.version = kHIThemeTextInfoVersionZero;
|
||||
info.state = active ? kThemeStateActive : kThemeStateInactive;
|
||||
info.fontID = fontID;
|
||||
info.horizontalFlushness = hFlush;
|
||||
info.verticalFlushness = kHIThemeTextVerticalFlushCenter;
|
||||
info.options = kHIThemeTextBoxOptionNone;
|
||||
info.truncationPosition = kHIThemeTextTruncationEnd;
|
||||
info.truncationMaxLines = 1;
|
||||
|
||||
CGContextSaveGState(context);
|
||||
CGContextSetRGBFillColor (context, (float)labelColor.red / (float)USHRT_MAX,
|
||||
(float)labelColor.green / (float)USHRT_MAX,
|
||||
(float)labelColor.blue / (float)USHRT_MAX, 1.0);
|
||||
|
||||
HIThemeDrawTextBox(cfString, &textCGRect, &info, context, kHIThemeOrientationNormal);
|
||||
|
||||
CGContextRestoreGState(context);
|
||||
|
||||
if (savedState != NULL)
|
||||
SetThemeDrawingState(savedState, true);
|
||||
}
|
||||
|
||||
OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemID,
|
||||
DataBrowserPropertyID property,
|
||||
DataBrowserItemDataRef itemData,
|
||||
@ -1758,15 +2216,16 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
|
||||
case kDataBrowserItemDeselected:
|
||||
event.SetEventType(wxEVT_COMMAND_LIST_ITEM_DESELECTED);
|
||||
if ( !isSingle )
|
||||
trigger = IsSelectionSuppressed();
|
||||
trigger = !IsSelectionSuppressed();
|
||||
break;
|
||||
|
||||
case kDataBrowserItemSelected:
|
||||
trigger = IsSelectionSuppressed();
|
||||
trigger = !IsSelectionSuppressed();
|
||||
|
||||
break;
|
||||
|
||||
case kDataBrowserItemDoubleClicked:
|
||||
event.SetEventType( wxEVT_LEFT_DCLICK );
|
||||
event.SetEventType( wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
|
||||
trigger = true;
|
||||
break;
|
||||
|
||||
@ -2002,6 +2461,10 @@ void wxMacListCtrlItem::SetColumnInfo( unsigned int column, wxListItem* item )
|
||||
listItem->SetAlign(item->GetAlign());
|
||||
if (mask & wxLIST_MASK_WIDTH)
|
||||
listItem->SetWidth(item->GetWidth());
|
||||
|
||||
listItem->SetTextColour(item->GetTextColour());
|
||||
listItem->SetBackgroundColour(item->GetBackgroundColour());
|
||||
listItem->SetFont(item->GetFont());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user