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:
@@ -17,6 +17,8 @@
|
|||||||
class wxMacDataBrowserListCtrlControl;
|
class wxMacDataBrowserListCtrlControl;
|
||||||
class wxMacListControl;
|
class wxMacListControl;
|
||||||
|
|
||||||
|
WX_DECLARE_EXPORTED_LIST(wxListItem, wxColumnList);
|
||||||
|
|
||||||
class WXDLLEXPORT wxListCtrl: public wxControl
|
class WXDLLEXPORT wxListCtrl: public wxControl
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxListCtrl)
|
DECLARE_DYNAMIC_CLASS(wxListCtrl)
|
||||||
@@ -314,6 +316,14 @@ class WXDLLEXPORT wxListCtrl: public wxControl
|
|||||||
virtual bool SetFont(const wxFont& font);
|
virtual bool SetFont(const wxFont& font);
|
||||||
virtual bool SetForegroundColour(const wxColour& colour);
|
virtual bool SetForegroundColour(const wxColour& colour);
|
||||||
virtual bool SetBackgroundColour(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:
|
||||||
// protected overrides needed for pimpl approach
|
// protected overrides needed for pimpl approach
|
||||||
@@ -326,7 +336,8 @@ protected:
|
|||||||
|
|
||||||
wxGenericListCtrl* m_genericImpl; // allow use of the generic impl.
|
wxGenericListCtrl* m_genericImpl; // allow use of the generic impl.
|
||||||
wxMacDataBrowserListCtrlControl* m_dbImpl;
|
wxMacDataBrowserListCtrlControl* m_dbImpl;
|
||||||
void* /*EventHandlerRef*/ m_macListCtrlEventHandler;
|
void* m_macListCtrlEventHandler;
|
||||||
|
void* m_cgContext;
|
||||||
wxListCtrlCompare m_compareFunc;
|
wxListCtrlCompare m_compareFunc;
|
||||||
long m_compareFuncData;
|
long m_compareFuncData;
|
||||||
|
|
||||||
@@ -335,6 +346,10 @@ protected:
|
|||||||
wxImageList * m_imageListSmall; // The image list for small icons
|
wxImageList * m_imageListSmall; // The image list for small icons
|
||||||
wxImageList * m_imageListState; // The image list state icons (not implemented yet)
|
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.
|
// keep track of whether or not we should delete the image list ourselves.
|
||||||
bool m_ownsImageListNormal,
|
bool m_ownsImageListNormal,
|
||||||
m_ownsImageListSmall,
|
m_ownsImageListSmall,
|
||||||
|
@@ -115,11 +115,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent)
|
|||||||
WX_DECLARE_EXPORTED_LIST(wxListItem, wxListItemList);
|
WX_DECLARE_EXPORTED_LIST(wxListItem, wxListItemList);
|
||||||
#include "wx/listimpl.cpp"
|
#include "wx/listimpl.cpp"
|
||||||
WX_DEFINE_LIST(wxListItemList)
|
WX_DEFINE_LIST(wxListItemList)
|
||||||
|
WX_DEFINE_LIST(wxColumnList)
|
||||||
|
|
||||||
// so we can check for column clicks
|
// so we can check for column clicks
|
||||||
static const EventTypeSpec eventList[] =
|
static const EventTypeSpec eventList[] =
|
||||||
{
|
{
|
||||||
{ kEventClassControl, kEventControlHit },
|
{ kEventClassControl, kEventControlHit },
|
||||||
|
{ kEventClassControl, kEventControlDraw }
|
||||||
};
|
};
|
||||||
|
|
||||||
static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
||||||
@@ -151,6 +153,11 @@ static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler ,
|
|||||||
result = CallNextEventHandler(handler, event);
|
result = CallNextEventHandler(handler, event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case kEventControlDraw:
|
||||||
|
CGContextRef context = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, typeCGContextRef) ;
|
||||||
|
window->MacSetDrawingContext(context);
|
||||||
|
result = CallNextEventHandler(handler, event);
|
||||||
|
window->MacSetDrawingContext(NULL);
|
||||||
default :
|
default :
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
@@ -185,6 +192,10 @@ protected:
|
|||||||
wxListItemList m_rowItems;
|
wxListItemList m_rowItems;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DataBrowserDrawItemUPP gDataBrowserDrawItemUPP = NULL;
|
||||||
|
//DataBrowserEditItemUPP gDataBrowserEditItemUPP = NULL;
|
||||||
|
DataBrowserHitTestUPP gDataBrowserHitTestUPP = NULL;
|
||||||
|
|
||||||
// TODO: Make a better name!!
|
// TODO: Make a better name!!
|
||||||
class wxMacDataBrowserListCtrlControl : public wxMacDataItemBrowserControl
|
class wxMacDataBrowserListCtrlControl : public wxMacDataItemBrowserControl
|
||||||
{
|
{
|
||||||
@@ -217,15 +228,73 @@ protected:
|
|||||||
DataBrowserItemID itemTwoID,
|
DataBrowserItemID itemTwoID,
|
||||||
DataBrowserPropertyID sortProperty);
|
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;
|
wxClientDataType m_clientDataItemsType;
|
||||||
bool m_isVirtual;
|
bool m_isVirtual;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: This gives errors, find out why.
|
class wxMacListCtrlEventDelegate : public wxEvtHandler
|
||||||
//BEGIN_EVENT_TABLE(wxListCtrl, wxControl)
|
{
|
||||||
// EVT_PAINT(wxListCtrl::OnPaint)
|
public:
|
||||||
//END_EVENT_TABLE()
|
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
|
// implementation
|
||||||
@@ -256,6 +325,9 @@ void wxListCtrl::Init()
|
|||||||
m_dbImpl = NULL;
|
m_dbImpl = NULL;
|
||||||
m_compareFunc = NULL;
|
m_compareFunc = NULL;
|
||||||
m_compareFuncData = 0;
|
m_compareFuncData = 0;
|
||||||
|
m_colsInfo = wxColumnList();
|
||||||
|
m_textColor = wxNullColour;
|
||||||
|
m_bgColor = wxNullColour;
|
||||||
}
|
}
|
||||||
|
|
||||||
class wxGenericListCtrlHook : public wxGenericListCtrl
|
class wxGenericListCtrlHook : public wxGenericListCtrl
|
||||||
@@ -313,13 +385,14 @@ bool wxListCtrl::Create(wxWindow *parent,
|
|||||||
// Also, use generic list control in VIRTUAL mode.
|
// Also, use generic list control in VIRTUAL mode.
|
||||||
if ( (wxSystemOptions::HasOption( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL )
|
if ( (wxSystemOptions::HasOption( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL )
|
||||||
&& (wxSystemOptions::GetOptionInt( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL ) == 1)) ||
|
&& (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;
|
m_macIsUserPane = true;
|
||||||
|
|
||||||
if ( !wxWindow::Create(parent, id, pos, size, style, name) )
|
if ( !wxWindow::Create(parent, id, pos, size, style, name) )
|
||||||
return false;
|
return false;
|
||||||
m_genericImpl = new wxGenericListCtrlHook(this, id, pos, size, style, validator, name);
|
m_genericImpl = new wxGenericListCtrlHook(this, id, pos, size, style, validator, name);
|
||||||
|
m_genericImpl->PushEventHandler( new wxMacListCtrlEventDelegate( this, GetId() ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,6 +417,11 @@ bool wxListCtrl::Create(wxWindow *parent,
|
|||||||
|
|
||||||
wxListCtrl::~wxListCtrl()
|
wxListCtrl::~wxListCtrl()
|
||||||
{
|
{
|
||||||
|
if (m_genericImpl)
|
||||||
|
{
|
||||||
|
m_genericImpl->PopEventHandler(/* deleteHandler = */ true);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_ownsImageListNormal)
|
if (m_ownsImageListNormal)
|
||||||
delete m_imageListNormal;
|
delete m_imageListNormal;
|
||||||
if (m_ownsImageListSmall)
|
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 wxListCtrl::SetFont(const wxFont& font)
|
||||||
{
|
{
|
||||||
bool rv;
|
bool rv = true;
|
||||||
rv = wxControl::SetFont(font);
|
rv = wxControl::SetFont(font);
|
||||||
if (m_genericImpl)
|
if (m_genericImpl)
|
||||||
rv = m_genericImpl->SetFont(font);
|
rv = m_genericImpl->SetFont(font);
|
||||||
@@ -415,22 +493,34 @@ bool wxListCtrl::SetFont(const wxFont& font)
|
|||||||
|
|
||||||
bool wxListCtrl::SetForegroundColour(const wxColour& colour)
|
bool wxListCtrl::SetForegroundColour(const wxColour& colour)
|
||||||
{
|
{
|
||||||
bool rv;
|
bool rv = true;
|
||||||
rv = wxControl::SetForegroundColour(colour);
|
|
||||||
if (m_genericImpl)
|
if (m_genericImpl)
|
||||||
rv = m_genericImpl->SetForegroundColour(colour);
|
rv = m_genericImpl->SetForegroundColour(colour);
|
||||||
|
if (m_dbImpl)
|
||||||
|
SetTextColour(colour);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxListCtrl::SetBackgroundColour(const wxColour& colour)
|
bool wxListCtrl::SetBackgroundColour(const wxColour& colour)
|
||||||
{
|
{
|
||||||
bool rv;
|
bool rv = true;
|
||||||
rv = wxControl::SetBackgroundColour(colour);
|
|
||||||
if (m_genericImpl)
|
if (m_genericImpl)
|
||||||
rv = m_genericImpl->SetBackgroundColour(colour);
|
rv = m_genericImpl->SetBackgroundColour(colour);
|
||||||
|
if (m_dbImpl)
|
||||||
|
m_bgColor = colour;
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxColour wxListCtrl::GetBackgroundColour()
|
||||||
|
{
|
||||||
|
if (m_genericImpl)
|
||||||
|
return m_genericImpl->GetBackgroundColour();
|
||||||
|
if (m_dbImpl)
|
||||||
|
return m_bgColor;
|
||||||
|
|
||||||
|
return wxNullColour;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// accessors
|
// accessors
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -443,23 +533,28 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const
|
|||||||
|
|
||||||
bool success = true;
|
bool success = true;
|
||||||
|
|
||||||
if ( item.m_mask & wxLIST_MASK_TEXT )
|
if (m_dbImpl)
|
||||||
{
|
{
|
||||||
}
|
|
||||||
|
|
||||||
if ( item.m_mask & wxLIST_MASK_FORMAT )
|
wxColumnList::compatibility_iterator node = m_colsInfo.Item( col );
|
||||||
{
|
wxASSERT_MSG( node, _T("invalid column index in wxMacListCtrlItem") );
|
||||||
}
|
wxListItem* column = node->GetData();
|
||||||
|
|
||||||
if ( item.m_mask & wxLIST_MASK_IMAGE )
|
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_TEXT) )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,7 +564,69 @@ bool wxListCtrl::SetColumn(int col, wxListItem& item)
|
|||||||
if (m_genericImpl)
|
if (m_genericImpl)
|
||||||
return m_genericImpl->SetColumn(col, item);
|
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
|
int wxListCtrl::GetColumnCount() const
|
||||||
@@ -507,10 +664,6 @@ bool wxListCtrl::SetColumnWidth(int col, int width)
|
|||||||
if (m_genericImpl)
|
if (m_genericImpl)
|
||||||
return m_genericImpl->SetColumnWidth(col, width);
|
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)
|
if (m_dbImpl)
|
||||||
{
|
{
|
||||||
int mywidth = width;
|
int mywidth = width;
|
||||||
@@ -889,7 +1042,7 @@ wxColour wxListCtrl::GetTextColour() const
|
|||||||
|
|
||||||
// TODO: we need owner drawn list items to customize text color.
|
// TODO: we need owner drawn list items to customize text color.
|
||||||
if (m_dbImpl)
|
if (m_dbImpl)
|
||||||
return *wxBLACK;
|
return m_textColor;
|
||||||
|
|
||||||
return wxNullColour;
|
return wxNullColour;
|
||||||
}
|
}
|
||||||
@@ -903,8 +1056,8 @@ void wxListCtrl::SetTextColour(const wxColour& col)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: if we add owner-drawn item support for DataBrowser,
|
if (m_dbImpl)
|
||||||
// consider supporting this property
|
m_textColor = col;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the index of the topmost visible item when in
|
// Gets the index of the topmost visible item when in
|
||||||
@@ -1271,16 +1424,17 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
|
|||||||
|
|
||||||
if (m_dbImpl)
|
if (m_dbImpl)
|
||||||
{
|
{
|
||||||
|
int width = item.GetWidth();
|
||||||
if ( !(item.GetMask() & wxLIST_MASK_WIDTH) )
|
if ( !(item.GetMask() & wxLIST_MASK_WIDTH) )
|
||||||
item.SetWidth(150);
|
width = 150;
|
||||||
|
|
||||||
DataBrowserPropertyType type = kDataBrowserTextType;
|
DataBrowserPropertyType type = kDataBrowserCustomType; //kDataBrowserTextType;
|
||||||
wxImageList* imageList = GetImageList(wxIMAGE_LIST_SMALL);
|
wxImageList* imageList = GetImageList(wxIMAGE_LIST_SMALL);
|
||||||
if (imageList && imageList->GetImageCount() > 0)
|
if (imageList && imageList->GetImageCount() > 0)
|
||||||
{
|
{
|
||||||
wxBitmap bmp = imageList->GetBitmap(0);
|
wxBitmap bmp = imageList->GetBitmap(0);
|
||||||
if (bmp.Ok())
|
//if (bmp.Ok())
|
||||||
type = kDataBrowserIconAndTextType;
|
// type = kDataBrowserIconAndTextType;
|
||||||
}
|
}
|
||||||
|
|
||||||
SInt16 just = teFlushDefault;
|
SInt16 just = teFlushDefault;
|
||||||
@@ -1293,7 +1447,8 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
|
|||||||
else if (item.GetAlign() == wxLIST_FORMAT_RIGHT)
|
else if (item.GetAlign() == wxLIST_FORMAT_RIGHT)
|
||||||
just = teFlushRight;
|
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.
|
// set/remove options based on the wxListCtrl type.
|
||||||
DataBrowserTableViewColumnID id;
|
DataBrowserTableViewColumnID id;
|
||||||
@@ -1520,7 +1675,7 @@ void wxMacListCtrlItem::Notification(wxMacDataItemBrowserControl *owner ,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case kDataBrowserItemDoubleClicked:
|
case kDataBrowserItemDoubleClicked:
|
||||||
event.SetEventType( wxEVT_LEFT_DCLICK );
|
event.SetEventType( wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
|
||||||
trigger = true;
|
trigger = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1573,6 +1728,24 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
|
|||||||
err = SetSelectionFlags( options );
|
err = SetSelectionFlags( options );
|
||||||
verify_noerr( err );
|
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 )
|
if ( style & wxLC_LIST )
|
||||||
{
|
{
|
||||||
InsertColumn(0, kDataBrowserIconAndTextType, wxEmptyString, -1, -1);
|
InsertColumn(0, kDataBrowserIconAndTextType, wxEmptyString, -1, -1);
|
||||||
@@ -1612,6 +1785,291 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
|
|||||||
err = SetHasScrollBars( (style & wxHSCROLL) != 0 , true );
|
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,
|
OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemID,
|
||||||
DataBrowserPropertyID property,
|
DataBrowserPropertyID property,
|
||||||
DataBrowserItemDataRef itemData,
|
DataBrowserItemDataRef itemData,
|
||||||
@@ -1758,15 +2216,16 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
|
|||||||
case kDataBrowserItemDeselected:
|
case kDataBrowserItemDeselected:
|
||||||
event.SetEventType(wxEVT_COMMAND_LIST_ITEM_DESELECTED);
|
event.SetEventType(wxEVT_COMMAND_LIST_ITEM_DESELECTED);
|
||||||
if ( !isSingle )
|
if ( !isSingle )
|
||||||
trigger = IsSelectionSuppressed();
|
trigger = !IsSelectionSuppressed();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kDataBrowserItemSelected:
|
case kDataBrowserItemSelected:
|
||||||
trigger = IsSelectionSuppressed();
|
trigger = !IsSelectionSuppressed();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kDataBrowserItemDoubleClicked:
|
case kDataBrowserItemDoubleClicked:
|
||||||
event.SetEventType( wxEVT_LEFT_DCLICK );
|
event.SetEventType( wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
|
||||||
trigger = true;
|
trigger = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2002,6 +2461,10 @@ void wxMacListCtrlItem::SetColumnInfo( unsigned int column, wxListItem* item )
|
|||||||
listItem->SetAlign(item->GetAlign());
|
listItem->SetAlign(item->GetAlign());
|
||||||
if (mask & wxLIST_MASK_WIDTH)
|
if (mask & wxLIST_MASK_WIDTH)
|
||||||
listItem->SetWidth(item->GetWidth());
|
listItem->SetWidth(item->GetWidth());
|
||||||
|
|
||||||
|
listItem->SetTextColour(item->GetTextColour());
|
||||||
|
listItem->SetBackgroundColour(item->GetBackgroundColour());
|
||||||
|
listItem->SetFont(item->GetFont());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user