1. fixes for DrawRotatedText(), drawing sample extended to show it

2. implemented colour/font support for wxTreeCtrl items
3. corrected a bug in wxListCtrl colour/font support code, the items should
   now be deleted ok
4. SetProcessAffinityMask() correction, wxThread::SetConcurrency() kind of
   works (difficult to test on a UP machine)
5. wxMimeType::EnumAllFileTypes() added, works (somewhat) under MSW
6. made default fonts under MSW 10 points and not 12 - this is the standard
   size


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4849 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-12-07 00:09:40 +00:00
parent c8ce6bccc3
commit 696e1ea0b7
11 changed files with 348 additions and 79 deletions

View File

@@ -183,6 +183,7 @@ private:
// wxTreeItemIndirectData. So we have to maintain a list of all items which
// have indirect data inside the listctrl itself.
// ----------------------------------------------------------------------------
class wxTreeItemIndirectData
{
public:
@@ -288,6 +289,7 @@ void wxTreeCtrl::Init()
m_imageListNormal = NULL;
m_imageListState = NULL;
m_textCtrl = NULL;
m_hasAnyAttr = FALSE;
}
bool wxTreeCtrl::Create(wxWindow *parent,
@@ -389,6 +391,18 @@ bool wxTreeCtrl::Create(wxWindow *parent,
wxTreeCtrl::~wxTreeCtrl()
{
// delete any attributes
if ( m_hasAnyAttr )
{
for ( wxNode *node = m_attrs.Next(); node; node = m_attrs.Next() )
{
delete (wxTreeItemAttr *)node->Data();
}
// prevent TVN_DELETEITEM handler from deleting the attributes again!
m_hasAnyAttr = FALSE;
}
DeleteTextCtrl();
// delete user data to prevent memory leaks
@@ -715,6 +729,53 @@ void wxTreeCtrl::SetItemDropHighlight(const wxTreeItemId& item, bool highlight)
DoSetItem(&tvItem);
}
void wxTreeCtrl::SetItemTextColour(const wxTreeItemId& item,
const wxColour& col)
{
m_hasAnyAttr = TRUE;
long id = (long)(WXHTREEITEM)item;
wxTreeItemAttr *attr = (wxTreeItemAttr *)m_attrs.Get(id);
if ( !attr )
{
attr = new wxTreeItemAttr;
m_attrs.Put(id, (wxObject *)attr);
}
attr->SetTextColour(col);
}
void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item,
const wxColour& col)
{
m_hasAnyAttr = TRUE;
long id = (long)(WXHTREEITEM)item;
wxTreeItemAttr *attr = (wxTreeItemAttr *)m_attrs.Get(id);
if ( !attr )
{
attr = new wxTreeItemAttr;
m_attrs.Put(id, (wxObject *)attr);
}
attr->SetBackgroundColour(col);
}
void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font)
{
m_hasAnyAttr = TRUE;
long id = (long)(WXHTREEITEM)item;
wxTreeItemAttr *attr = (wxTreeItemAttr *)m_attrs.Get(id);
if ( !attr )
{
attr = new wxTreeItemAttr;
m_attrs.Put(id, (wxObject *)attr);
}
attr->SetFont(font);
}
// ----------------------------------------------------------------------------
// Item status
// ----------------------------------------------------------------------------
@@ -1354,23 +1415,23 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
switch ( hdr->code )
{
case NM_RCLICK:
{
if ( wxControl::MSWOnNotify(idCtrl, lParam, result) )
return TRUE;
TV_HITTESTINFO tvhti;
::GetCursorPos(&(tvhti.pt));
::ScreenToClient(GetHwnd(),&(tvhti.pt));
if ( TreeView_HitTest(GetHwnd(),&tvhti) )
{
if( tvhti.flags & TVHT_ONITEM )
if ( wxControl::MSWOnNotify(idCtrl, lParam, result) )
return TRUE;
TV_HITTESTINFO tvhti;
::GetCursorPos(&(tvhti.pt));
::ScreenToClient(GetHwnd(),&(tvhti.pt));
if ( TreeView_HitTest(GetHwnd(),&tvhti) )
{
event.m_item = (WXHTREEITEM) tvhti.hItem;
eventType=wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK;
if( tvhti.flags & TVHT_ONITEM )
{
event.m_item = (WXHTREEITEM) tvhti.hItem;
eventType = wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK;
}
}
}
break;
}
case TVN_BEGINDRAG:
eventType = wxEVT_COMMAND_TREE_BEGIN_DRAG;
@@ -1386,8 +1447,8 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.m_item = (WXHTREEITEM) tv->itemNew.hItem;
event.m_pointDrag = wxPoint(tv->ptDrag.x, tv->ptDrag.y);
break;
}
break;
case TVN_BEGINLABELEDIT:
{
@@ -1396,17 +1457,23 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.m_item = (WXHTREEITEM) info->item.hItem;
event.m_label = info->item.pszText;
break;
}
break;
case TVN_DELETEITEM:
{
eventType = wxEVT_COMMAND_TREE_DELETE_ITEM;
NM_TREEVIEW *tv = (NM_TREEVIEW *)lParam;
event.m_item = (WXHTREEITEM) tv->itemOld.hItem;
break;
event.m_item = (WXHTREEITEM)tv->itemOld.hItem;
if ( m_hasAnyAttr )
{
delete (wxTreeItemAttr *)m_attrs.
Delete((long)tv->itemOld.hItem);
}
}
break;
case TVN_ENDLABELEDIT:
{
@@ -1464,8 +1531,8 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
eventType = g_events[expand][ing];
event.m_item = (WXHTREEITEM) tv->itemNew.hItem;
break;
}
break;
case TVN_KEYDOWN:
{
@@ -1483,8 +1550,8 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
GetEventHandler()->ProcessEvent(event2);
}
break;
}
break;
case TVN_SELCHANGED:
eventType = wxEVT_COMMAND_TREE_SEL_CHANGED;
@@ -1500,8 +1567,105 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.m_item = (WXHTREEITEM) tv->itemNew.hItem;
event.m_itemOld = (WXHTREEITEM) tv->itemOld.hItem;
break;
}
break;
#ifdef NM_CUSTOMDRAW
case NM_CUSTOMDRAW:
{
LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)lParam;
NMCUSTOMDRAW& nmcd = lptvcd->nmcd;
switch( nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
// if we've got any items with non standard attributes,
// notify us before painting each item
*result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW
: CDRF_DODEFAULT;
return TRUE;
case CDDS_ITEMPREPAINT:
{
wxTreeItemAttr *attr =
(wxTreeItemAttr *)m_attrs.Get(nmcd.dwItemSpec);
if ( !attr )
{
// nothing to do for this item
return CDRF_DODEFAULT;
}
HFONT hFont;
wxColour colText, colBack;
if ( attr->HasFont() )
{
wxFont font = attr->GetFont();
hFont = (HFONT)font.GetResourceHandle();
}
else
{
hFont = 0;
}
if ( attr->HasTextColour() )
{
colText = attr->GetTextColour();
}
else
{
colText = GetForegroundColour();
}
// selection colours should override ours
if ( nmcd.uItemState & CDIS_SELECTED )
{
DWORD clrBk = ::GetSysColor(COLOR_HIGHLIGHT);
lptvcd->clrTextBk = clrBk;
// try to make the text visible
lptvcd->clrText = wxColourToRGB(colText);
lptvcd->clrText |= ~clrBk;
lptvcd->clrText &= 0x00ffffff;
}
else
{
if ( attr->HasBackgroundColour() )
{
colBack = attr->GetBackgroundColour();
}
else
{
colBack = GetBackgroundColour();
}
lptvcd->clrText = wxColourToRGB(colText);
lptvcd->clrTextBk = wxColourToRGB(colBack);
}
// note that if we wanted to set colours for
// individual columns (subitems), we would have
// returned CDRF_NOTIFYSUBITEMREDRAW from here
if ( hFont )
{
::SelectObject(nmcd.hdc, hFont);
*result = CDRF_NEWFONT;
}
else
{
*result = CDRF_DODEFAULT;
}
return TRUE;
}
default:
*result = CDRF_DODEFAULT;
return TRUE;
}
}
break;
#endif // NM_CUSTOMDRAW
default:
return wxControl::MSWOnNotify(idCtrl, lParam, result);