UITabLayout.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "stdafx.h"
  2. #include "UITabLayout.h"
  3. namespace DuiLib
  4. {
  5. CTabLayoutUI::CTabLayoutUI() : m_iCurSel(-1)
  6. {
  7. }
  8. LPCTSTR CTabLayoutUI::GetClass() const
  9. {
  10. return _T("TabLayoutUI");
  11. }
  12. LPVOID CTabLayoutUI::GetInterface(LPCTSTR pstrName)
  13. {
  14. if( _tcscmp(pstrName, DUI_CTR_TABLAYOUT) == 0 ) return static_cast<CTabLayoutUI*>(this);
  15. return CContainerUI::GetInterface(pstrName);
  16. }
  17. bool CTabLayoutUI::Add(CControlUI* pControl)
  18. {
  19. bool ret = CContainerUI::Add(pControl);
  20. if( !ret ) return ret;
  21. if(m_iCurSel == -1 && pControl->IsVisible())
  22. {
  23. m_iCurSel = GetItemIndex(pControl);
  24. }
  25. else
  26. {
  27. pControl->SetVisible(false);
  28. }
  29. return ret;
  30. }
  31. bool CTabLayoutUI::AddAt(CControlUI* pControl, int iIndex)
  32. {
  33. bool ret = CContainerUI::AddAt(pControl, iIndex);
  34. if( !ret ) return ret;
  35. if(m_iCurSel == -1 && pControl->IsVisible())
  36. {
  37. m_iCurSel = GetItemIndex(pControl);
  38. }
  39. else if( m_iCurSel != -1 && iIndex <= m_iCurSel )
  40. {
  41. m_iCurSel += 1;
  42. }
  43. else
  44. {
  45. pControl->SetVisible(false);
  46. }
  47. return ret;
  48. }
  49. bool CTabLayoutUI::Remove(CControlUI* pControl)
  50. {
  51. if( pControl == NULL) return false;
  52. int index = GetItemIndex(pControl);
  53. bool ret = CContainerUI::Remove(pControl);
  54. if( !ret ) return false;
  55. if( m_iCurSel == index)
  56. {
  57. if( GetCount() > 0 )
  58. {
  59. m_iCurSel=0;
  60. GetItemAt(m_iCurSel)->SetVisible(true);
  61. }
  62. else
  63. m_iCurSel=-1;
  64. NeedParentUpdate();
  65. }
  66. else if( m_iCurSel > index )
  67. {
  68. m_iCurSel -= 1;
  69. }
  70. return ret;
  71. }
  72. void CTabLayoutUI::RemoveAll()
  73. {
  74. m_iCurSel = -1;
  75. CContainerUI::RemoveAll();
  76. NeedParentUpdate();
  77. }
  78. int CTabLayoutUI::GetCurSel() const
  79. {
  80. return m_iCurSel;
  81. }
  82. bool CTabLayoutUI::SelectItem(int iIndex, bool bTriggerEvent)
  83. {
  84. if( iIndex < 0 || iIndex >= m_items.GetSize() ) return false;
  85. if( iIndex == m_iCurSel ) return true;
  86. int iOldSel = m_iCurSel;
  87. m_iCurSel = iIndex;
  88. for( int it = 0; it < m_items.GetSize(); it++ )
  89. {
  90. if( it == iIndex ) {
  91. GetItemAt(it)->SetVisible(true);
  92. GetItemAt(it)->SetFocus();
  93. }
  94. else GetItemAt(it)->SetVisible(false);
  95. }
  96. NeedParentUpdate();
  97. if( m_pManager != NULL ) {
  98. m_pManager->SetNextTabControl();
  99. if (bTriggerEvent) m_pManager->SendNotify(this, DUI_MSGTYPE_TABSELECT, m_iCurSel, iOldSel);
  100. }
  101. return true;
  102. }
  103. bool CTabLayoutUI::SelectItem(CControlUI* pControl, bool bTriggerEvent)
  104. {
  105. int iIndex=GetItemIndex(pControl);
  106. if (iIndex==-1)
  107. return false;
  108. else
  109. return SelectItem(iIndex, bTriggerEvent);
  110. }
  111. void CTabLayoutUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
  112. {
  113. if( _tcscmp(pstrName, _T("selectedid")) == 0 ) SelectItem(_ttoi(pstrValue));
  114. return CContainerUI::SetAttribute(pstrName, pstrValue);
  115. }
  116. void CTabLayoutUI::SetPos(RECT rc, bool bNeedInvalidate)
  117. {
  118. CControlUI::SetPos(rc, bNeedInvalidate);
  119. rc = m_rcItem;
  120. // Adjust for inset
  121. rc.left += m_rcInset.left;
  122. rc.top += m_rcInset.top;
  123. rc.right -= m_rcInset.right;
  124. rc.bottom -= m_rcInset.bottom;
  125. for( int it = 0; it < m_items.GetSize(); it++ ) {
  126. CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
  127. if( !pControl->IsVisible() ) continue;
  128. if( pControl->IsFloat() ) {
  129. SetFloatPos(it);
  130. continue;
  131. }
  132. if( it != m_iCurSel ) continue;
  133. RECT rcPadding = pControl->GetPadding();
  134. rc.left += rcPadding.left;
  135. rc.top += rcPadding.top;
  136. rc.right -= rcPadding.right;
  137. rc.bottom -= rcPadding.bottom;
  138. SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
  139. SIZE sz = pControl->EstimateSize(szAvailable);
  140. if( sz.cx == 0 ) {
  141. sz.cx = MAX(0, szAvailable.cx);
  142. }
  143. if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
  144. if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
  145. if(sz.cy == 0) {
  146. sz.cy = MAX(0, szAvailable.cy);
  147. }
  148. if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight();
  149. if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight();
  150. RECT rcCtrl = { rc.left, rc.top, rc.left + sz.cx, rc.top + sz.cy};
  151. pControl->SetPos(rcCtrl, false);
  152. }
  153. }
  154. }