2#include "control/SListView.h"
3#include "helper/SListViewItemLocator.h"
7class SListViewDataSetObserver :
public TObjRefImpl<ILvDataSetObserver> {
9 SListViewDataSetObserver(SListView *pView)
13 STDMETHOD_(
void, onChanged)(THIS) OVERRIDE;
15 STDMETHOD_(
void, onInvalidated)(THIS) OVERRIDE;
17 STDMETHOD_(
void, OnItemChanged)(THIS_
int iItem) OVERRIDE;
24void SListViewDataSetObserver::onChanged()
26 m_pOwner->onDataSetChanged();
29void SListViewDataSetObserver::onInvalidated()
31 m_pOwner->onDataSetInvalidated();
34void SListViewDataSetObserver::OnItemChanged(
int iItem)
36 m_pOwner->onItemDataChanged(iItem);
45 , m_pSkinDivider(NULL)
47 , m_bDataSetInvalidated(FALSE)
48 , m_bPendingUpdate(false)
49 , m_iPendingUpdateItem(-2)
50 , m_iPendingViewItem(-1)
55 m_observer.Attach(
new SListViewDataSetObserver(
this));
56 m_dwUpdateInterval = 40;
57 m_evtSet.addEvent(EVENTID(EventLVSelChanging));
58 m_evtSet.addEvent(EVENTID(EventLVSelChanged));
61SListView::~SListView()
64 m_lvItemLocator = NULL;
67BOOL SListView::SetAdapter(ILvAdapter *adapter)
71 SASSERT_MSGA(FALSE,
"error: A item locator is in need before setting adapter!!!");
74 if (m_adapter == adapter)
76 SSLOGW() <<
"the new adapter is same to previous set adapter, same as notifyDatasetChanged";
86 m_adapter->unregisterDataSetObserver(m_observer);
90 for (
size_t i = 0; i < m_itemRecycle.GetCount(); i++)
92 SList<SItemPanel *> *lstItemPanels = m_itemRecycle.GetAt(i);
93 SPOSITION pos = lstItemPanels->GetHeadPosition();
96 SItemPanel *pItemPanel = lstItemPanels->GetNext(pos);
101 m_itemRecycle.RemoveAll();
104 SPOSITION pos = m_lstItems.GetHeadPosition();
107 ItemInfo ii = m_lstItems.GetNext(pos);
110 m_lstItems.RemoveAll();
112 m_itemCapture = NULL;
114 m_iFirstVisible = -1;
119 m_lvItemLocator->SetAdapter(adapter);
122 SXmlNode xmlNode = m_xmlTemplate.root().first_child();
123 m_adapter->InitByTemplate(&xmlNode);
124 m_adapter->registerDataSetObserver(m_observer);
125 for (
int i = 0; i < m_adapter->getViewTypeCount(); i++)
127 m_itemRecycle.Add(
new SList<SItemPanel *>());
134void SListView::UpdateScrollBar()
137 CSize size = rcClient.Size();
141 szView.cx = rcClient.Width();
142 szView.cy = m_lvItemLocator ? m_lvItemLocator->GetTotalHeight() : 0;
145 m_wBarVisible = SSB_NULL;
147 if (size.cy < szView.cy)
150 m_wBarVisible |= SSB_VERT;
152 m_siVer.nMax = szView.cy - 1;
153 m_siVer.nPage = size.cy;
154 m_siVer.nPos = smin(m_siVer.nPos, m_siVer.nMax - (
int)m_siVer.nPage);
159 m_siVer.nPage = size.cy;
161 m_siVer.nMax = size.cy - 1;
169 szView.cy = rcClient.Height();
170 szView.cx = m_lvItemLocator ? m_lvItemLocator->GetTotalHeight() : 0;
173 m_wBarVisible = SSB_NULL;
175 if (size.cx < szView.cx)
178 m_wBarVisible |= SSB_HORZ;
180 m_siHoz.nMax = szView.cx - 1;
181 m_siHoz.nPage = size.cx;
182 m_siHoz.nPos = smin(m_siHoz.nPos, m_siHoz.nMax - (
int)m_siHoz.nPage);
187 m_siHoz.nPage = size.cx;
189 m_siHoz.nMax = size.cx - 1;
202void SListView::onDataSetChanged()
208 m_bPendingUpdate =
true;
209 m_iPendingUpdateItem = -1;
213 m_lvItemLocator->OnDataSetChanged();
214 if (m_iSelItem != -1 && m_iSelItem >= m_adapter->getCount())
217 UpdateVisibleItems();
220void SListView::onDataSetInvalidated()
222 m_bDataSetInvalidated = TRUE;
226void SListView::onItemDataChanged(
int iItem)
232 m_bPendingUpdate =
true;
233 m_iPendingUpdateItem = m_iPendingUpdateItem == -2 ? iItem : -1;
237 if (iItem < m_iFirstVisible)
239 if (iItem >= m_iFirstVisible + (
int)m_lstItems.GetCount())
241 if (m_lvItemLocator->IsFixHeight())
242 UpdateVisibleItem(iItem);
244 UpdateVisibleItems();
249 if (m_bDataSetInvalidated)
251 UpdateVisibleItems();
252 m_bDataSetInvalidated = FALSE;
258 int iFirst = m_iFirstVisible;
266 SAutoRefPtr<IRegionS> rgnClip;
274 SCROLLINFO &si = m_bVertical ? m_siVer : m_siHoz;
275 int nOffset = m_lvItemLocator->Item2Position(iFirst) - si.nPos;
277 CRect rcItem(rcClient);
279 rcItem.bottom = rcItem.top + nOffset;
281 rcItem.right = rcItem.left + nOffset;
283 SPOSITION pos = m_lstItems.GetHeadPosition();
287 ItemInfo ii = m_lstItems.GetNext(pos);
290 rcItem.top = rcItem.bottom;
291 rcItem.bottom = rcItem.top + m_lvItemLocator->GetItemHeight(iFirst + i);
295 rcItem.left = rcItem.right;
296 rcItem.right = rcItem.left + m_lvItemLocator->GetItemHeight(iFirst + i);
298 if (SItemPanel::IsItemInClip(mtx, rcClip, rgnClip, rcItem))
300 ii.pItem->Draw(pRT, rcItem);
305 rcItem.top = rcItem.bottom;
306 rcItem.bottom += m_lvItemLocator->GetDividerSize();
310 rcItem.left = rcItem.right;
311 rcItem.right += m_lvItemLocator->GetDividerSize();
313 if (m_pSkinDivider && !rcItem.IsRectEmpty() && rgnClip->RectInRegion(&rcItem))
315 m_pSkinDivider->DrawByIndex(pRT, rcItem, 0);
324BOOL SListView::OnScroll(BOOL bVertical, UINT uCode,
int nPos)
326 SCROLLINFO &si = bVertical ? m_siVer : m_siHoz;
327 int nOldPos = si.nPos;
329 int nNewPos = si.nPos;
330 if (nOldPos != nNewPos)
332 UpdateVisibleItems();
335 if (uCode == SB_THUMBTRACK)
343void SListView::UpdateVisibleItems()
347 SAutoEnableHostPrivUiDef enableUiDef(
this);
348 int iOldFirstVisible = m_iFirstVisible;
349 int iOldLastVisible = m_iFirstVisible + (int)m_lstItems.GetCount();
350 int nOldTotalHeight = m_lvItemLocator->GetTotalHeight();
352 SCROLLINFO &si = m_bVertical ? m_siVer : m_siHoz;
354 int iNewFirstVisible = m_lvItemLocator->Position2Item(si.nPos);
355 int iNewLastVisible = iNewFirstVisible;
356 int pos = m_lvItemLocator->Item2Position(iNewFirstVisible);
357 int iHoverItem = m_pHoverItem ? (int)m_pHoverItem->GetItemIndex() : -1;
360 ItemInfo *pItemInfos =
new ItemInfo[m_lstItems.GetCount()];
361 SPOSITION spos = m_lstItems.GetHeadPosition();
365 pItemInfos[i++] = m_lstItems.GetNext(spos);
368 m_lstItems.RemoveAll();
370 if (iNewFirstVisible != -1)
372 while (pos < si.nPos + (
int)si.nPage && iNewLastVisible < m_adapter->getCount())
375 if (iHoverItem == iNewLastVisible)
377 if (m_iSelItem == iNewLastVisible)
380 ItemInfo ii = { NULL, -1 };
381 ii.nType = m_adapter->getItemViewType(iNewLastVisible, dwState);
382 if (iNewLastVisible >= iOldFirstVisible && iNewLastVisible < iOldLastVisible)
384 int iItem = iNewLastVisible - iOldFirstVisible;
386 SASSERT(iItem >= 0 && iItem <= (iOldLastVisible - iOldFirstVisible));
387 if (ii.nType == pItemInfos[iItem].nType)
389 ii = pItemInfos[iItem];
390 pItemInfos[iItem].pItem = NULL;
393 BOOL bNewItem = FALSE;
396 SList<SItemPanel *> *lstRecycle = m_itemRecycle.GetAt(ii.nType);
397 if (lstRecycle->IsEmpty())
400 ii.pItem = SItemPanel::Create(
this, SXmlNode(),
this);
401 ii.pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID, Subscriber(&SListView::OnItemClick,
this));
405 ii.pItem = lstRecycle->RemoveHead();
407 ii.pItem->SetItemIndex(iNewLastVisible);
409 ii.pItem->SetVisible(TRUE);
411 rcItem.MoveToXY(0, 0);
412 if (m_lvItemLocator->IsFixHeight())
415 rcItem.bottom = m_lvItemLocator->GetItemHeight(iNewLastVisible);
417 rcItem.right = m_lvItemLocator->GetItemHeight(iNewLastVisible);
418 ii.pItem->Move(rcItem);
422 ii.pItem->GetEventSet()->setMutedState(
true);
423 ii.pItem->ModifyItemState(dwState, 0);
424 ii.pItem->GetEventSet()->setMutedState(
false);
426 m_pHoverItem = ii.pItem;
429 ii.pItem->LockUpdate();
430 m_adapter->getView(iNewLastVisible, ii.pItem, &xmlNode);
431 ii.pItem->UnlockUpdate();
434 ii.pItem->SDispatchMessage(UM_SETSCALE,
GetScale(), 0);
435 ii.pItem->SDispatchMessage(UM_SETLANGUAGE, 0, 0);
438 if (!m_lvItemLocator->IsFixHeight())
444 m_adapter->getViewDesiredSize(&szItem, iNewLastVisible, ii.pItem, rcItem.Width(), rcItem.Height());
445 rcItem.bottom = rcItem.top + szItem.cy;
446 ii.pItem->Move(rcItem);
447 m_lvItemLocator->SetItemHeight(iNewLastVisible, szItem.cy);
453 m_adapter->getViewDesiredSize(&szItem, iNewLastVisible, ii.pItem, rcItem.Width(), rcItem.Height());
454 rcItem.right = rcItem.left + szItem.cx;
455 ii.pItem->Move(rcItem);
456 m_lvItemLocator->SetItemHeight(iNewLastVisible, szItem.cx);
459 ii.pItem->UpdateLayout();
461 m_lstItems.AddTail(ii);
462 pos += (m_bVertical ? rcItem.bottom : rcItem.right) + m_lvItemLocator->GetDividerSize();
469 for (
int i = 0; i < (iOldLastVisible - iOldFirstVisible); i++)
471 ItemInfo ii = pItemInfos[i];
476 ii.pItem->DoFrameEvent(WM_MOUSELEAVE, 0, 0);
478 ii.pItem->GetEventSet()->setMutedState(
true);
482 ii.pItem->GetFocusManager()->ClearFocus();
484 ii.pItem->SetVisible(FALSE);
485 ii.pItem->GetEventSet()->setMutedState(
false);
486 m_itemRecycle[ii.nType]->AddTail(ii.pItem);
490 m_iFirstVisible = iNewFirstVisible;
492 if (!m_lvItemLocator->IsFixHeight() && m_lvItemLocator->GetTotalHeight() != nOldTotalHeight)
495 UpdateVisibleItems();
503void SListView::UpdateVisibleItem(
int iItem)
505 SAutoEnableHostPrivUiDef enableUiDef(
this);
506 SASSERT(m_lvItemLocator->IsFixHeight());
507 SItemPanel *pItem = GetItemPanel(iItem);
510 m_adapter->getView(iItem, pItem, &xmlNode);
514void SListView::OnSize(UINT nType, CSize size)
516 __baseCls::OnSize(nType, size);
521 SPOSITION pos = m_lstItems.GetHeadPosition();
524 ItemInfo ii = m_lstItems.GetNext(pos);
525 int idx = (int)ii.pItem->GetItemIndex();
526 int nHei = m_lvItemLocator->GetItemHeight(idx);
529 rcItem.right = rcClient.Width(), rcItem.bottom = nHei;
531 rcItem.right = nHei, rcItem.bottom = rcClient.Height();
532 ii.pItem->Move(rcItem);
535 UpdateVisibleItems();
538void SListView::OnDestroy()
542 m_adapter->unregisterDataSetObserver(m_observer);
546 SPOSITION pos = m_lstItems.GetHeadPosition();
549 ItemInfo ii = m_lstItems.GetNext(pos);
552 m_lstItems.RemoveAll();
554 for (
int i = 0; i < (int)m_itemRecycle.GetCount(); i++)
556 SList<SItemPanel *> *pLstTypeItems = m_itemRecycle[i];
557 SPOSITION pos = pLstTypeItems->GetHeadPosition();
560 SItemPanel *pItem = pLstTypeItems->GetNext(pos);
563 delete pLstTypeItems;
565 m_itemRecycle.RemoveAll();
566 __baseCls::OnDestroy();
570BOOL SListView::IsItemRedrawDelay()
const
575BOOL SListView::OnItemGetRect(
const SOsrPanel *pItem, CRect &rcItem)
const
577 int iPosition = (int)pItem->GetItemIndex();
578 if (iPosition < 0 || iPosition >= m_adapter->getCount())
582 int nOffset = m_lvItemLocator->Item2Position(iPosition) - m_siVer.nPos;
584 rcItem.top += nOffset;
585 rcItem.bottom = rcItem.top + m_lvItemLocator->GetItemHeight(iPosition);
589 int nOffset = m_lvItemLocator->Item2Position(iPosition) - m_siHoz.nPos;
591 rcItem.left += nOffset;
592 rcItem.right = rcItem.left + m_lvItemLocator->GetItemHeight(iPosition);
597void SListView::OnItemSetCapture(SOsrPanel *pItem, BOOL bCapture)
602 m_itemCapture = pItem;
607 m_itemCapture = NULL;
611void SListView::RedrawItem(SOsrPanel *pItem)
616SItemPanel *SListView::HitTest(CPoint &pt)
const
618 SPOSITION pos = m_lstItems.GetHeadPosition();
621 ItemInfo ii = m_lstItems.GetNext(pos);
622 CRect rcItem = ii.pItem->GetItemRect();
623 if (rcItem.PtInRect(pt))
625 pt -= rcItem.TopLeft();
632LRESULT SListView::OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam)
641 CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
645 CRect rcItem = m_itemCapture->GetItemRect();
646 pt -= rcItem.TopLeft();
647 lRet = m_itemCapture->DoFrameEvent(uMsg, wParam, MAKELPARAM(pt.x, pt.y));
651 if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MBUTTONDOWN)
653 __baseCls::ProcessSwndMessage(uMsg, wParam, lParam, lRet);
656 SItemPanel *pHover = HitTest(pt);
657 if (pHover != m_pHoverItem)
659 SOsrPanel *nOldHover = m_pHoverItem;
660 m_pHoverItem = pHover;
663 nOldHover->DoFrameEvent(WM_MOUSELEAVE, 0, 0);
664 RedrawItem(nOldHover);
668 m_pHoverItem->DoFrameEvent(WM_MOUSEHOVER, wParam, MAKELPARAM(pt.x, pt.y));
669 RedrawItem(m_pHoverItem);
674 m_pHoverItem->DoFrameEvent(uMsg, wParam, MAKELPARAM(pt.x, pt.y));
678 if (uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP || uMsg == WM_MBUTTONUP)
680 __baseCls::ProcessSwndMessage(uMsg, wParam, lParam, lRet);
686LRESULT SListView::OnKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam)
689 SItemPanel *pItem = GetItemPanel(m_iSelItem);
692 lRet = pItem->DoFrameEvent(uMsg, wParam, lParam);
702void SListView::OnMouseLeave()
704 __baseCls::OnMouseLeave();
707 m_pHoverItem->DoFrameEvent(WM_MOUSELEAVE, 0, 0);
712void SListView::OnKeyDown(TCHAR nChar, UINT nRepCnt, UINT nFlags)
720 if (m_iSelItem != -1 && m_bWantTab)
722 SItemPanel *pItem = GetItemPanel(m_iSelItem);
725 pItem->DoFrameEvent(WM_KEYDOWN, nChar, MAKELONG(nFlags, nRepCnt));
731 int nNewSelItem = -1;
733 if (pOwner && (nChar == VK_ESCAPE || nChar == VK_RETURN))
735 pOwner->
SSendMessage(WM_KEYDOWN, nChar, MAKELONG(nFlags, nRepCnt));
739 if (nChar == VK_DOWN && m_iSelItem < m_adapter->getCount() - 1)
740 nNewSelItem = m_iSelItem + 1;
741 else if (nChar == VK_UP && m_iSelItem > 0)
742 nNewSelItem = m_iSelItem - 1;
748 OnScroll(TRUE, SB_PAGEUP, 0);
751 OnScroll(TRUE, SB_PAGEDOWN, 0);
754 OnScroll(TRUE, SB_TOP, 0);
757 OnScroll(TRUE, SB_BOTTOM, 0);
760 if (nChar == VK_PRIOR || nChar == VK_HOME)
762 if (!m_lstItems.IsEmpty())
764 nNewSelItem = (int)m_lstItems.GetHead().pItem->GetItemIndex();
767 else if (nChar == VK_NEXT || nChar == VK_END)
769 if (!m_lstItems.IsEmpty())
771 nNewSelItem = (int)m_lstItems.GetTail().pItem->GetItemIndex();
776 if (nNewSelItem != -1)
778 EnsureVisible(nNewSelItem);
779 SetSel(nNewSelItem, TRUE);
787void SListView::EnsureVisible(
int iItem)
789 if (iItem < 0 || iItem >= m_adapter->getCount())
793 m_iPendingViewItem = iItem;
797 int iFirstVisible = m_iFirstVisible;
798 int iLastVisible = m_iFirstVisible + (int)m_lstItems.GetCount();
799 int nPageSize = m_bVertical ? m_siVer.nPage : m_siHoz.nPage;
800 if (iItem >= iFirstVisible && iItem < iLastVisible)
802 if (iItem == iFirstVisible)
804 int pos = m_lvItemLocator->Item2Position(iItem);
805 OnScroll(m_bVertical, SB_THUMBPOSITION, pos);
807 else if (iItem == iLastVisible - 1)
809 if (iItem == m_adapter->getCount() - 1)
810 OnScroll(m_bVertical, SB_BOTTOM, 0);
813 int pos = m_lvItemLocator->Item2Position(iItem + 1) - nPageSize;
814 OnScroll(m_bVertical, SB_THUMBPOSITION, pos);
821 if (iItem < iFirstVisible)
823 int pos = m_lvItemLocator->Item2Position(iItem);
824 OnScroll(m_bVertical, SB_THUMBPOSITION, pos);
828 if (iItem == m_adapter->getCount() - 1)
830 OnScroll(m_bVertical, SB_BOTTOM, 0);
834 int pos = m_lvItemLocator->Item2Position(iItem + 1) - nPageSize;
835 OnScroll(m_bVertical, SB_THUMBPOSITION, pos);
838 if (!m_lvItemLocator->IsFixHeight())
840 int pos = m_lvItemLocator->Item2Position(iItem);
841 OnScroll(m_bVertical, SB_THUMBPOSITION, pos);
845BOOL SListView::OnMouseWheel(UINT nFlags,
short zDelta, CPoint pt)
847 SItemPanel *pSelItem = GetItemPanel(m_iSelItem);
850 CRect rcItem = pSelItem->GetItemRect();
851 CPoint pt2 = pt - rcItem.TopLeft();
852 if (pSelItem->DoFrameEvent(WM_MOUSEWHEEL, MAKEWPARAM(nFlags, zDelta), MAKELPARAM(pt2.x, pt2.y)))
855 return __baseCls::OnMouseWheel(nFlags, zDelta, pt);
858int SListView::GetScrollLineSize(BOOL bVertical)
860 return m_lvItemLocator->GetScrollLineSize();
863SItemPanel *SListView::GetItemPanel(
int iItem)
865 if (!m_adapter || iItem < 0 || iItem >= m_adapter->getCount())
867 SPOSITION pos = m_lstItems.GetHeadPosition();
870 ItemInfo ii = m_lstItems.GetNext(pos);
871 if ((
int)ii.pItem->GetItemIndex() == iItem)
877BOOL SListView::CreateChildren(
SXmlNode xmlNode)
879 SXmlNode xmlTemplate = xmlNode.
child(L
"template");
882 m_xmlTemplate.root().append_copy(xmlTemplate);
883 LPCWSTR kItemSize = m_bVertical ? L
"itemHeight" : L
"itemWidth";
884 SLayoutSize nItemHei = GETLAYOUTSIZE(xmlTemplate.
attribute(kItemSize).
value());
885 if (nItemHei.fSize > 0.0f)
887 IListViewItemLocator *pItemLocator =
new SListViewItemLocatorFix(nItemHei, m_nDividerSize);
888 SetItemLocator(pItemLocator);
889 pItemLocator->Release();
893 LPCWSTR kDefSize = m_bVertical ? L
"defHeight" : L
"defWidth";
894 IListViewItemLocator *pItemLocator =
new SListViewItemLocatorFlex(GETLAYOUTSIZE(xmlTemplate.
attribute(kDefSize).
as_string(L
"30dp")), m_nDividerSize);
895 SetItemLocator(pItemLocator);
896 pItemLocator->Release();
902void SListView::SetItemLocator(IListViewItemLocator *pItemLocator)
904 m_lvItemLocator = pItemLocator;
907 m_lvItemLocator->SetAdapter(GetAdapter());
908 m_lvItemLocator->SetScale(
GetScale());
916 return __baseCls::UpdateToolTip(pt, tipInfo);
917 return m_pHoverItem->UpdateToolTip(pt, tipInfo);
920void SListView::SetSel(
int iItem, BOOL bNotify)
925 if (iItem >= m_adapter->getCount())
931 int nOldSel = m_iSelItem;
934 m_iSelItem = nNewSel;
937 EventLVSelChanging evt(
this);
939 evt.iOldSel = nOldSel;
940 evt.iNewSel = nNewSel;
944 m_iSelItem = nOldSel;
949 if (nOldSel == nNewSel)
952 m_iSelItem = nOldSel;
953 SItemPanel *pItem = GetItemPanel(nOldSel);
960 m_iSelItem = nNewSel;
961 pItem = GetItemPanel(nNewSel);
970 EventLVSelChanged evt(
this);
971 evt.iOldSel = nOldSel;
972 evt.iNewSel = nNewSel;
977UINT SListView::OnGetDlgCode()
const
980 return SC_WANTALLKEYS;
982 return SC_WANTARROWS | SC_WANTSYSKEY;
985void SListView::OnKillFocus(SWND wndFocus)
987 __baseCls::OnKillFocus(wndFocus);
989 if (m_iSelItem == -1)
992 SItemPanel *pSelPanel = GetItemPanel(m_iSelItem);
997void SListView::OnSetFocus(SWND wndOld)
999 __baseCls::OnSetFocus(wndOld);
1000 if (m_iSelItem == -1)
1003 SItemPanel *pSelPanel = GetItemPanel(m_iSelItem);
1008BOOL SListView::OnSetCursor(
const CPoint &pt)
1013 CRect rcItem = m_itemCapture->GetItemRect();
1014 bRet = m_itemCapture->DoFrameEvent(WM_SETCURSOR, 0, MAKELPARAM(pt.x - rcItem.left, pt.y - rcItem.top)) != 0;
1016 else if (m_pHoverItem)
1018 CRect rcItem = m_pHoverItem->GetItemRect();
1019 bRet = m_pHoverItem->DoFrameEvent(WM_SETCURSOR, 0, MAKELPARAM(pt.x - rcItem.left, pt.y - rcItem.top)) != 0;
1023 bRet = __baseCls::OnSetCursor(pt);
1028BOOL SListView::OnItemClick(IEvtArgs *pEvt)
1030 SItemPanel *pItemPanel = sobj_cast<SItemPanel>(pEvt->Sender());
1031 SASSERT(pItemPanel);
1032 int iItem = (int)pItemPanel->GetItemIndex();
1033 if (iItem != m_iSelItem)
1035 SetSel(iItem, TRUE);
1040void SListView::OnColorize(COLORREF cr)
1042 __baseCls::OnColorize(cr);
1043 DispatchMessage2Items(UM_SETCOLORIZE, cr, 0);
1046void SListView::OnScaleChanged(
int nScale)
1048 __baseCls::OnScaleChanged(nScale);
1049 if (m_lvItemLocator)
1050 m_lvItemLocator->SetScale(nScale);
1051 DispatchMessage2Items(UM_SETSCALE, nScale, 0);
1052 UpdateVisibleItems();
1055HRESULT SListView::OnLanguageChanged()
1057 HRESULT hret = __baseCls::OnLanguageChanged();
1058 DispatchMessage2Items(UM_SETLANGUAGE, 0, 0);
1062void SListView::DispatchMessage2Items(UINT uMsg, WPARAM wParam, LPARAM lParam)
1064 SPOSITION pos = m_lstItems.GetHeadPosition();
1067 ItemInfo ii = m_lstItems.GetNext(pos);
1068 ii.pItem->SDispatchMessage(uMsg, wParam, lParam);
1070 for (UINT i = 0; i < m_itemRecycle.GetCount(); i++)
1072 SList<SItemPanel *> *pLstTypeItems = m_itemRecycle[i];
1073 SPOSITION pos = pLstTypeItems->GetHeadPosition();
1076 SItemPanel *pItem = pLstTypeItems->GetNext(pos);
1082void SListView::OnShowWindow(BOOL bShow, UINT nStatus)
1084 __baseCls::OnShowWindow(bShow, nStatus);
1087 if (m_bPendingUpdate)
1089 if (m_iPendingUpdateItem == -1)
1092 onItemDataChanged(m_iPendingUpdateItem);
1093 m_bPendingUpdate =
false;
1094 m_iPendingUpdateItem = -2;
1096 if (m_iPendingViewItem != -1)
1098 EnsureVisible(m_iPendingViewItem);
1099 m_iPendingViewItem = -1;
1104void SListView::OnRebuildFont()
1106 __baseCls::OnRebuildFont();
1107 DispatchMessage2Items(UM_UPDATEFONT, 0, 0);
1110ILvAdapter *SListView::GetAdapter()
const
1115IListViewItemLocator *SListView::GetItemLocator()
const
1117 return m_lvItemLocator;
1120int SListView::GetSel()
const
1125IItemPanel *SListView::HitTest(
const POINT *pt)
const
1131 return HitTest(pt2);
1134void SListView::GetDesiredSize(THIS_ SIZE *psz,
int nParentWid,
int nParentHei)
1136 __baseCls::GetDesiredSize(psz, nParentWid, nParentHei);
1138 if (pLayoutParam->IsWrapContent(Vert) && m_lvItemLocator && m_lvItemLocator->IsFixHeight())
1141 psz->cy = m_lvItemLocator->GetTotalHeight() + rcPadding.top + rcPadding.bottom;
1142 if (nParentHei > 0 && psz->cy > nParentHei)
1143 psz->cy = nParentHei;
void RestoreFocusedView()
Restores the focused view.
void ClearFocus()
Clears the focused window.
void StoreFocusedView()
Stores the focused view.
virtual CRect GetClientRect() const
Gets the client rectangle.
virtual BOOL OnScroll(BOOL bVertical, UINT uCode, int nPos)
Handles scroll events.
BOOL SetScrollPos(BOOL bVertical, int nNewPos, BOOL bRedraw) OVERRIDE
Sets the scroll position for a scrollbar.
void ScrollUpdate()
Updates the scrollbar.
BOOL FireEvent(IEvtArgs *evt) OVERRIDE
Fires an event.
SWindow * GetOwner() const
Retrieves the current owner of the window.
BOOL Destroy() OVERRIDE
Destroys the window.
void SDispatchMessage(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0) OVERRIDE
Dispatches a message to the window.
int GetScale() SCONST OVERRIDE
Retrieves the scale factor of the window.
BOOL IsMsgHandled() const
Checks if the message is handled.
COLORREF GetColorizeColor() SCONST OVERRIDE
Retrieves the colorization color of the window.
BOOL IsVisible(BOOL bCheckParent=FALSE) SCONST OVERRIDE
Checks if the window is visible.
ISwndContainer * GetContainer() OVERRIDE
Retrieves the container associated with this window.
virtual CRect GetClientRect() const
Retrieves the client rectangle of the window.
LRESULT SSendMessage(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0, BOOL *pbMsgHandled=NULL) OVERRIDE
Sends a message to the window.
virtual void BeforePaint(IRenderTarget *pRT, SPainter &painter)
Prepare rendering environment.
void InvalidateRect(LPCRECT lprect) OVERRIDE
Invalidates a specific rectangle area of the window.
virtual void AfterPaint(IRenderTarget *pRT, SPainter &painter)
Restore rendering environment.
ILayoutParam * GetLayoutParam() SCONST OVERRIDE
Retrieves the layout parameter object associated with the window.
void Invalidate() OVERRIDE
Invalidates the entire window.
void SetMsgHandled(BOOL bHandled)
Sets the message handled flag.
const SwndStyle & GetStyle() const
Retrieves the style of the window.
SWND m_swnd
Member variables representing various properties of the window.
const wchar_t * as_string(const wchar_t *def=L"") const
Gets the attribute value as a string.
const wchar_t * value() const
Gets the attribute value.
Class representing an XML node.
SXmlNode first_child() const
Gets the first child node of the node.
SXmlAttr attribute(const wchar_t *name, bool bCaseSensitive=false) const
Gets the attribute with the specified name.
SXmlNode root() const
Gets the root node of the DOM tree this node belongs to.
SXmlNode child(const wchar_t *name, bool bCaseSensitive=false) const
Gets the child node, attribute, or next/previous sibling with the specified name.
SFocusManager * GetFocusManager()
Retrieves the focus manager.
CRect GetPadding() const
Retrieves the padding rectangle.
Template class implementing the IObjRef interface.
Interface for rendering target objects.
HRESULT GetTransform(float matrix[9]) SCONST PURE
Retrieves the current coordinate transformation matrix.
HRESULT PushClipRect(LPCRECT pRect, UINT mode=RGN_AND) PURE
Push a rectangular clip region.
HRESULT PopClip() PURE
Pop the last clip region from the stack.
HRESULT GetClipBox(LPRECT prc) PURE
Get the bounding box of the current clip region.
HRESULT GetClipRegion(IRegionS **ppRegion) PURE
Get the current clip region.
BOOL OnReleaseSwndCapture() PURE
Releases the mouse capture from the Swnd object.
SWND OnSetSwndCapture(SWND swnd) PURE
Sets the Swnd object to capture the mouse.