| Index: xfa/fwl/core/ifwl_scrollbar.cpp
|
| diff --git a/xfa/fwl/core/ifwl_scrollbar.cpp b/xfa/fwl/core/ifwl_scrollbar.cpp
|
| index c651abecb19894ecc3ccf41a7f4af615930017c7..db2164be23b78d5ad984f6da99c67c6ce26c828c 100644
|
| --- a/xfa/fwl/core/ifwl_scrollbar.cpp
|
| +++ b/xfa/fwl/core/ifwl_scrollbar.cpp
|
| @@ -59,30 +59,29 @@ FWL_Type IFWL_ScrollBar::GetClassID() const {
|
| }
|
|
|
| void IFWL_ScrollBar::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
|
| - if (bAutoSize) {
|
| - rect.Set(0, 0, 0, 0);
|
| - FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
|
| - GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
|
| - if (!pfMinWidth)
|
| - return;
|
| - if (IsVertical()) {
|
| - rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
|
| - } else {
|
| - rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
|
| - }
|
| - IFWL_Widget::GetWidgetRect(rect, true);
|
| - } else {
|
| + if (!bAutoSize) {
|
| rect = m_pProperties->m_rtWidget;
|
| + return;
|
| }
|
| +
|
| + rect.Set(0, 0, 0, 0);
|
| + FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
|
| + GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
|
| + if (!pfMinWidth)
|
| + return;
|
| + if (IsVertical())
|
| + rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
|
| + else
|
| + rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
|
| + IFWL_Widget::GetWidgetRect(rect, true);
|
| }
|
|
|
| void IFWL_ScrollBar::Update() {
|
| - if (IsLocked()) {
|
| + if (IsLocked())
|
| return;
|
| - }
|
| - if (!m_pProperties->m_pThemeProvider) {
|
| + if (!m_pProperties->m_pThemeProvider)
|
| m_pProperties->m_pThemeProvider = GetAvailableTheme();
|
| - }
|
| +
|
| Layout();
|
| }
|
|
|
| @@ -92,13 +91,12 @@ void IFWL_ScrollBar::DrawWidget(CFX_Graphics* pGraphics,
|
| return;
|
| if (!m_pProperties->m_pThemeProvider)
|
| return;
|
| +
|
| IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
|
| - if (HasBorder()) {
|
| + if (HasBorder())
|
| DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
|
| - }
|
| - if (HasEdge()) {
|
| + if (HasEdge())
|
| DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
|
| - }
|
| DrawTrack(pGraphics, pTheme, true, pMatrix);
|
| DrawTrack(pGraphics, pTheme, false, pMatrix);
|
| DrawArrowBtn(pGraphics, pTheme, true, pMatrix);
|
| @@ -148,9 +146,8 @@ void IFWL_ScrollBar::DrawArrowBtn(CFX_Graphics* pGraphics,
|
| param.m_pGraphics = pGraphics;
|
| param.m_matrix.Concat(*pMatrix);
|
| param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn;
|
| - if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) {
|
| + if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0)
|
| pTheme->DrawBackground(¶m);
|
| - }
|
| }
|
|
|
| void IFWL_ScrollBar::DrawThumb(CFX_Graphics* pGraphics,
|
| @@ -225,54 +222,45 @@ void IFWL_ScrollBar::CalcThumbButtonRect(CFX_RectF& rect) {
|
| m_rtThumb.Empty();
|
| return;
|
| }
|
| +
|
| FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
|
| memset(&rect, 0, sizeof(CFX_Rect));
|
| if (fRange < 0) {
|
| - if (IsVertical()) {
|
| + if (IsVertical())
|
| rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0);
|
| - } else {
|
| + else
|
| rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height);
|
| - }
|
| return;
|
| }
|
| +
|
| CFX_RectF rtClient = m_rtClient;
|
| FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width;
|
| FX_FLOAT fSize = m_fButtonLen;
|
| if (m_bCustomLayout) {
|
| if (IsVertical()) {
|
| fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height;
|
| - if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) {
|
| + if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height)
|
| fLength = 0.0f;
|
| - }
|
| } else {
|
| fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width;
|
| - if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) {
|
| + if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width)
|
| fLength = 0.0f;
|
| - }
|
| }
|
| } else {
|
| fLength -= fSize * 2.0f;
|
| - if (fLength < fSize) {
|
| + if (fLength < fSize)
|
| fLength = 0.0f;
|
| - }
|
| }
|
| +
|
| FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength);
|
| - if (fThumbSize < m_fMinThumb) {
|
| - fThumbSize = m_fMinThumb;
|
| - }
|
| - FX_FLOAT fDiff = fLength - fThumbSize;
|
| - if (fDiff < 0.0f) {
|
| - fDiff = 0.0f;
|
| - }
|
| - FX_FLOAT fTrackPos = m_fTrackPos;
|
| - if (fTrackPos > m_fRangeMax) {
|
| - fTrackPos = m_fRangeMax;
|
| - }
|
| - if (fTrackPos < m_fRangeMin) {
|
| - fTrackPos = m_fRangeMin;
|
| - }
|
| + fThumbSize = std::max(fThumbSize, m_fMinThumb);
|
| +
|
| + FX_FLOAT fDiff = std::max(fLength - fThumbSize, 0.0f);
|
| + FX_FLOAT fTrackPos =
|
| + std::max(std::min(m_fTrackPos, m_fRangeMax), m_fRangeMin);
|
| if (!fRange)
|
| return;
|
| +
|
| if (m_bCustomLayout) {
|
| FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange;
|
| rect.left = rtClient.left;
|
| @@ -300,13 +288,13 @@ void IFWL_ScrollBar::CalcThumbButtonRect(CFX_RectF& rect) {
|
| } else {
|
| FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
|
| rect.left = rtClient.left;
|
| - if (!IsVertical()) {
|
| + if (!IsVertical())
|
| rect.left += iPos;
|
| - }
|
| +
|
| rect.top = rtClient.top;
|
| - if (IsVertical()) {
|
| + if (IsVertical())
|
| rect.top += iPos;
|
| - }
|
| +
|
| rect.width = IsVertical() ? rtClient.width : fThumbSize;
|
| rect.height = IsVertical() ? fThumbSize : rtClient.height;
|
| }
|
| @@ -317,6 +305,7 @@ void IFWL_ScrollBar::CalcMinTrackRect(CFX_RectF& rect) {
|
| rect.Empty();
|
| return;
|
| }
|
| +
|
| FX_FLOAT fBottom = m_rtThumb.bottom();
|
| FX_FLOAT fRight = m_rtThumb.right();
|
| FX_FLOAT ix = (m_rtThumb.left + fRight) / 2;
|
| @@ -326,22 +315,21 @@ void IFWL_ScrollBar::CalcMinTrackRect(CFX_RectF& rect) {
|
| bool bVertical = IsVertical();
|
| rect.width = bVertical ? m_rtClient.width : ix;
|
| rect.height = bVertical ? iy : m_rtClient.height;
|
| - if (m_bCustomLayout) {
|
| - if (bVertical) {
|
| - if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
|
| - rect.top = m_rtClient.top;
|
| - } else if (m_rtMinBtn.top < m_rtThumb.top) {
|
| - rect.top = m_rtMinBtn.bottom();
|
| - rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
|
| - }
|
| - } else {
|
| - if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
|
| - rect.left = m_rtClient.left;
|
| - } else if (m_rtMinBtn.left < m_rtThumb.left) {
|
| - rect.left = m_rtMinBtn.right();
|
| - rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
|
| - }
|
| + if (!m_bCustomLayout)
|
| + return;
|
| +
|
| + if (bVertical) {
|
| + if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) {
|
| + rect.top = m_rtClient.top;
|
| + } else if (m_rtMinBtn.top < m_rtThumb.top) {
|
| + rect.top = m_rtMinBtn.bottom();
|
| + rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
|
| }
|
| + } else if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) {
|
| + rect.left = m_rtClient.left;
|
| + } else if (m_rtMinBtn.left < m_rtThumb.left) {
|
| + rect.left = m_rtMinBtn.right();
|
| + rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
|
| }
|
| }
|
|
|
| @@ -350,6 +338,7 @@ void IFWL_ScrollBar::CalcMaxTrackRect(CFX_RectF& rect) {
|
| rect.Empty();
|
| return;
|
| }
|
| +
|
| FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2;
|
| FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
|
| bool bVertical = IsVertical();
|
| @@ -357,22 +346,21 @@ void IFWL_ScrollBar::CalcMaxTrackRect(CFX_RectF& rect) {
|
| rect.top = bVertical ? iy : m_rtClient.top;
|
| rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix;
|
| rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height;
|
| - if (m_bCustomLayout) {
|
| - if (bVertical) {
|
| - if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
|
| - m_rtMaxBtn.height > 0) {
|
| - rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
|
| - } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
|
| - rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
|
| - }
|
| - } else {
|
| - if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
|
| - m_rtMaxBtn.width > 0) {
|
| - rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
|
| - } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
|
| - rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
|
| - }
|
| + if (!m_bCustomLayout)
|
| + return;
|
| +
|
| + if (bVertical) {
|
| + if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
|
| + m_rtMaxBtn.height > 0) {
|
| + rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
|
| + } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
|
| + rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
|
| }
|
| + } else if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
|
| + m_rtMaxBtn.width > 0) {
|
| + rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
|
| + } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
|
| + rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
|
| }
|
| }
|
|
|
| @@ -383,7 +371,7 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) {
|
| FX_FLOAT fPos;
|
| if (m_bCustomLayout) {
|
| if (IsVertical()) {
|
| - if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
|
| + if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) {
|
| fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height);
|
| } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) {
|
| fPos = fRange * fDiffY /
|
| @@ -393,7 +381,7 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) {
|
| (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
|
| }
|
| } else {
|
| - if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
|
| + if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) {
|
| fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width);
|
| } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) {
|
| fPos = fRange * fDiffX /
|
| @@ -413,51 +401,47 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) {
|
| }
|
| }
|
| fPos += m_fLastTrackPos;
|
| - if (fPos < m_fRangeMin) {
|
| - fPos = m_fRangeMin;
|
| - }
|
| - if (fPos > m_fRangeMax) {
|
| - fPos = m_fRangeMax;
|
| - }
|
| - return fPos;
|
| + return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax);
|
| }
|
|
|
| void IFWL_ScrollBar::GetTrackRect(CFX_RectF& rect, bool bLower) {
|
| bool bDisabled = !!(m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled);
|
| if (bDisabled || m_bCustomLayout) {
|
| rect = bLower ? m_rtMinTrack : m_rtMaxTrack;
|
| - } else {
|
| - FX_FLOAT fW = m_rtThumb.width / 2;
|
| - FX_FLOAT fH = m_rtThumb.height / 2;
|
| - bool bVert = IsVertical();
|
| - if (bLower) {
|
| - if (bVert) {
|
| - FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
|
| - fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
|
| - rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
|
| - m_rtMinTrack.width, fMinTrackHeight);
|
| - } else {
|
| - FX_FLOAT fMinTrackWidth =
|
| - m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
|
| - fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
|
| - rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
|
| - fMinTrackWidth, m_rtMinTrack.height);
|
| - }
|
| - } else {
|
| - if (bVert) {
|
| - FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
|
| - fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
|
| - rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
|
| - fMaxTrackHeight);
|
| - } else {
|
| - FX_FLOAT fMaxTrackWidth =
|
| - m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
|
| - fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
|
| - rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
|
| - m_rtMaxTrack.height);
|
| - }
|
| + return;
|
| + }
|
| +
|
| + FX_FLOAT fW = m_rtThumb.width / 2;
|
| + FX_FLOAT fH = m_rtThumb.height / 2;
|
| + bool bVert = IsVertical();
|
| + if (bLower) {
|
| + if (bVert) {
|
| + FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
|
| + fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
|
| + rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
|
| + m_rtMinTrack.width, fMinTrackHeight);
|
| + return;
|
| }
|
| +
|
| + FX_FLOAT fMinTrackWidth = m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
|
| + fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
|
| + rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
|
| + fMinTrackWidth, m_rtMinTrack.height);
|
| + return;
|
| + }
|
| +
|
| + if (bVert) {
|
| + FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
|
| + fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
|
| + rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
|
| + fMaxTrackHeight);
|
| + return;
|
| }
|
| +
|
| + FX_FLOAT fMaxTrackWidth = m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
|
| + fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
|
| + rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
|
| + m_rtMaxTrack.height);
|
| }
|
|
|
| bool IFWL_ScrollBar::SendEvent() {
|
| @@ -601,6 +585,7 @@ void IFWL_ScrollBar::DoMouseDown(int32_t iItem,
|
| return;
|
| if (iState == CFWL_PartState_Pressed)
|
| return;
|
| +
|
| iState = CFWL_PartState_Pressed;
|
| Repaint(&rtItem);
|
| }
|
|
|