summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Kłos <eszkadev@gmail.com>2016-08-04 16:58:48 +0200
committerSzymon Kłos <eszkadev@gmail.com>2016-08-04 20:28:55 +0000
commitd3c3dcb4d581544d9fabc3b4b9160cbc9443543d (patch)
tree4663280bce770d546ae5d27d36ae37310e5ffc0b
parent55a4fd60b1df233ad0b35ed302f4dd0e308d3551 (diff)
GSoC: notebookbar, position of popup menu
Change-Id: Ia4491a8659c8e6532681f7fca83b432e311d79d6 Reviewed-on: https://gerrit.libreoffice.org/27881 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Szymon Kłos <eszkadev@gmail.com>
-rw-r--r--include/vcl/tabctrl.hxx5
-rw-r--r--sfx2/source/notebookbar/NotebookBarPopupMenu.cxx5
-rw-r--r--vcl/source/control/tabctrl.cxx74
3 files changed, 82 insertions, 2 deletions
diff --git a/include/vcl/tabctrl.hxx b/include/vcl/tabctrl.hxx
index e162b19f6681..4c57793bdd90 100644
--- a/include/vcl/tabctrl.hxx
+++ b/include/vcl/tabctrl.hxx
@@ -179,7 +179,7 @@ public:
virtual void SetSizePixel(const Size& rNewSize) override;
virtual void SetPosSizePixel(const Point& rNewPos, const Size& rNewSize) override;
- Size calculateRequisition() const;
+ virtual Size calculateRequisition() const;
void setAllocation(const Size &rAllocation);
void markLayoutDirty()
@@ -207,6 +207,8 @@ public:
virtual sal_uInt16 GetPageId( const Point& rPos ) const override;
virtual void SelectTabPage( sal_uInt16 nPageId ) override;
virtual void SetCurPageId( sal_uInt16 nPageId ) override;
+ virtual Size calculateRequisition() const override;
+ static sal_uInt16 GetHeaderHeight();
protected:
virtual bool ImplPlaceTabs( long nWidth ) override;
@@ -216,6 +218,7 @@ private:
bool bLastContextWasSupported;
vcl::EnumContext::Context eLastContext;
Link<NotebookBar*,void> m_aIconClickHdl;
+ static sal_uInt16 m_nHeaderHeight;
};
#endif // INCLUDED_VCL_TABCTRL_HXX
diff --git a/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx b/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx
index a78b15cec914..72c4145133e2 100644
--- a/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx
+++ b/sfx2/source/notebookbar/NotebookBarPopupMenu.cxx
@@ -54,7 +54,10 @@ void NotebookBarPopupMenu::Execute(NotebookBar* pNotebookbar,
{
if (pNotebookbar)
{
- sal_uInt16 nSelected = PopupMenu::Execute(pNotebookbar, Point(0, 40));
+ sal_uInt16 nTop = NotebookbarTabControl::GetHeaderHeight();
+ sal_uInt16 nSelected = PopupMenu::Execute(pNotebookbar,
+ Rectangle(0, nTop, 0, nTop),
+ PopupMenuFlags::ExecuteDown|PopupMenuFlags::NoMouseUpClose);
if (nSelected)
{
diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx
index d165f21467f2..7b2c3f38e954 100644
--- a/vcl/source/control/tabctrl.cxx
+++ b/vcl/source/control/tabctrl.cxx
@@ -2203,6 +2203,8 @@ FactoryFunction TabControl::GetUITestFactory() const
VCL_BUILDER_FACTORY(NotebookbarTabControl);
+sal_uInt16 NotebookbarTabControl::m_nHeaderHeight = 0;
+
NotebookbarTabControl::NotebookbarTabControl(vcl::Window* pParent, WinBits nStyle)
: TabControl(pParent, nStyle)
, bLastContextWasSupported(true)
@@ -2285,6 +2287,11 @@ void NotebookbarTabControl::SetCurPageId( sal_uInt16 nPageId )
TabControl::SetCurPageId( nPageId );
}
+sal_uInt16 NotebookbarTabControl::GetHeaderHeight()
+{
+ return m_nHeaderHeight;
+}
+
bool NotebookbarTabControl::ImplPlaceTabs( long nWidth )
{
if ( nWidth <= 0 )
@@ -2653,4 +2660,71 @@ void NotebookbarTabControl::ImplPaint(vcl::RenderContext& rRenderContext, const
mbSmallInvalidate = true;
}
+Size NotebookbarTabControl::calculateRequisition() const
+{
+ Size aOptimalPageSize(0, 0);
+
+ sal_uInt16 nOrigPageId = GetCurPageId();
+ for( std::vector< ImplTabItem >::const_iterator it = mpTabCtrlData->maItemList.begin();
+ it != mpTabCtrlData->maItemList.end(); ++it )
+ {
+ const TabPage *pPage = it->mpTabPage;
+ //it's a real nuisance if the page is not inserted yet :-(
+ //We need to force all tabs to exist to get overall optimal size for dialog
+ if (!pPage)
+ {
+ NotebookbarTabControl *pThis = const_cast<NotebookbarTabControl*>(this);
+ pThis->SetCurPageId(it->mnId);
+ pThis->ActivatePage();
+ pPage = it->mpTabPage;
+ }
+
+ if (!pPage)
+ continue;
+
+ Size aPageSize(VclContainer::getLayoutRequisition(*pPage));
+
+ if (aPageSize.Width() > aOptimalPageSize.Width())
+ aOptimalPageSize.Width() = aPageSize.Width();
+ if (aPageSize.Height() > aOptimalPageSize.Height())
+ aOptimalPageSize.Height() = aPageSize.Height();
+ }
+
+ //fdo#61940 If we were forced to activate pages in order to on-demand
+ //create them to get their optimal size, then switch back to the original
+ //page and re-activate it
+ if (nOrigPageId != GetCurPageId())
+ {
+ NotebookbarTabControl *pThis = const_cast<NotebookbarTabControl*>(this);
+ pThis->SetCurPageId(nOrigPageId);
+ pThis->ActivatePage();
+ }
+
+ long nTabLabelsBottom = 0, nTabLabelsRight = 0;
+ for( std::vector< ImplTabItem >::const_iterator it = mpTabCtrlData->maItemList.begin();
+ it != mpTabCtrlData->maItemList.end(); ++it )
+ {
+ NotebookbarTabControl* pThis = const_cast<NotebookbarTabControl*>(this);
+
+ sal_uInt16 nPos = it - mpTabCtrlData->maItemList.begin();
+ Rectangle aTabRect = pThis->ImplGetTabRect(nPos, aOptimalPageSize.Width(), LONG_MAX);
+ if (aTabRect.Bottom() > nTabLabelsBottom)
+ {
+ nTabLabelsBottom = aTabRect.Bottom();
+ m_nHeaderHeight = aTabRect.Bottom();
+ }
+ if (aTabRect.Right() > nTabLabelsRight)
+ nTabLabelsRight = aTabRect.Right();
+ }
+
+ Size aOptimalSize(aOptimalPageSize);
+ aOptimalSize.Height() += nTabLabelsBottom;
+ aOptimalSize.Width() = std::max(nTabLabelsRight, aOptimalSize.Width());
+
+ aOptimalSize.Width() += TAB_OFFSET * 2;
+ aOptimalSize.Height() += TAB_OFFSET * 2;
+
+ return aOptimalSize;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */