diff options
Diffstat (limited to 'sc/source/ui/cctrl/dpcontrol.cxx')
-rw-r--r-- | sc/source/ui/cctrl/dpcontrol.cxx | 1424 |
1 files changed, 0 insertions, 1424 deletions
diff --git a/sc/source/ui/cctrl/dpcontrol.cxx b/sc/source/ui/cctrl/dpcontrol.cxx deleted file mode 100644 index 380cdf9cf..000000000 --- a/sc/source/ui/cctrl/dpcontrol.cxx +++ /dev/null @@ -1,1424 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// INCLUDE --------------------------------------------------------------- - -#include "dpcontrol.hxx" -#include "dpcontrol.hrc" - -#include <vcl/outdev.hxx> -#include <vcl/settings.hxx> -#include <tools/wintypes.hxx> -#include <vcl/decoview.hxx> -#include "strload.hxx" -#include "global.hxx" -#include "scitems.hxx" -#include "document.hxx" -#include "docpool.hxx" -#include "patattr.hxx" - -#include "AccessibleFilterMenu.hxx" -#include "AccessibleFilterTopWindow.hxx" - -#include <com/sun/star/accessibility/XAccessible.hpp> -#include <com/sun/star/accessibility/XAccessibleContext.hpp> - -using ::com::sun::star::uno::Reference; -using ::com::sun::star::accessibility::XAccessible; -using ::com::sun::star::accessibility::XAccessibleContext; -using ::rtl::OUString; -using ::rtl::OUStringHash; -using ::std::vector; -using ::boost::unordered_map; -using ::std::auto_ptr; - -ScDPFieldButton::ScDPFieldButton(OutputDevice* pOutDev, const StyleSettings* pStyle, const Fraction* pZoomX, const Fraction* pZoomY, ScDocument* pDoc) : - mpDoc(pDoc), - mpOutDev(pOutDev), - mpStyle(pStyle), - mbBaseButton(true), - mbPopupButton(false), - mbHasHiddenMember(false), - mbPopupPressed(false), - mbPopupLeft(false) -{ - if (pZoomX) - maZoomX = *pZoomX; - else - maZoomX = Fraction(1, 1); - - if (pZoomY) - maZoomY = *pZoomY; - else - maZoomY = Fraction(1, 1); -} - -ScDPFieldButton::~ScDPFieldButton() -{ -} - -void ScDPFieldButton::setText(const OUString& rText) -{ - maText = rText; -} - -void ScDPFieldButton::setBoundingBox(const Point& rPos, const Size& rSize, bool bLayoutRTL) -{ - maPos = rPos; - maSize = rSize; - if (bLayoutRTL) - { - // rPos is the logical-left position, adjust maPos to visual-left (inside the cell border) - maPos.X() -= maSize.Width() - 1; - } -} - -void ScDPFieldButton::setDrawBaseButton(bool b) -{ - mbBaseButton = b; -} - -void ScDPFieldButton::setDrawPopupButton(bool b) -{ - mbPopupButton = b; -} - -void ScDPFieldButton::setHasHiddenMember(bool b) -{ - mbHasHiddenMember = b; -} - -void ScDPFieldButton::setPopupPressed(bool b) -{ - mbPopupPressed = b; -} - -void ScDPFieldButton::setPopupLeft(bool b) -{ - mbPopupLeft = b; -} - -void ScDPFieldButton::draw() -{ - const long nMargin = 2; - bool bOldMapEnablaed = mpOutDev->IsMapModeEnabled(); - mpOutDev->EnableMapMode(false); - - if (mbBaseButton) - { - // Background - Rectangle aRect(maPos, maSize); - mpOutDev->SetLineColor(mpStyle->GetFaceColor()); - mpOutDev->SetFillColor(mpStyle->GetFaceColor()); - mpOutDev->DrawRect(aRect); - - // Border lines - mpOutDev->SetLineColor(mpStyle->GetLightColor()); - mpOutDev->DrawLine(Point(maPos), Point(maPos.X(), maPos.Y()+maSize.Height()-1)); - mpOutDev->DrawLine(Point(maPos), Point(maPos.X()+maSize.Width()-1, maPos.Y())); - - mpOutDev->SetLineColor(mpStyle->GetShadowColor()); - mpOutDev->DrawLine(Point(maPos.X(), maPos.Y()+maSize.Height()-1), - Point(maPos.X()+maSize.Width()-1, maPos.Y()+maSize.Height()-1)); - mpOutDev->DrawLine(Point(maPos.X()+maSize.Width()-1, maPos.Y()), - Point(maPos.X()+maSize.Width()-1, maPos.Y()+maSize.Height()-1)); - - // Field name. - // Get the font and size the same way as in scenario selection (lcl_DrawOneFrame in gridwin4.cxx) - Font aTextFont( mpStyle->GetAppFont() ); - if ( mpDoc ) - { - // use ScPatternAttr::GetFont only for font size - Font aAttrFont; - static_cast<const ScPatternAttr&>(mpDoc->GetPool()->GetDefaultItem(ATTR_PATTERN)). - GetFont( aAttrFont, SC_AUTOCOL_BLACK, mpOutDev, &maZoomY ); - aTextFont.SetSize( aAttrFont.GetSize() ); - } - mpOutDev->SetFont(aTextFont); - mpOutDev->SetTextColor(mpStyle->GetButtonTextColor()); - - Point aTextPos = maPos; - long nTHeight = mpOutDev->GetTextHeight(); - aTextPos.setX(maPos.getX() + nMargin); - aTextPos.setY(maPos.getY() + (maSize.Height()-nTHeight)/2); - - mpOutDev->Push(PUSH_CLIPREGION); - mpOutDev->IntersectClipRegion(aRect); - mpOutDev->DrawText(aTextPos, maText); - mpOutDev->Pop(); - } - - if (mbPopupButton) - drawPopupButton(); - - mpOutDev->EnableMapMode(bOldMapEnablaed); -} - -void ScDPFieldButton::getPopupBoundingBox(Point& rPos, Size& rSize) const -{ - long nW = maSize.getWidth() / 2; - long nH = maSize.getHeight(); - if (nW > 18) - nW = 18; - if (nH > 18) - nH = 18; - - // #i114944# AutoFilter button is left-aligned in RTL. - // DataPilot button is always right-aligned for now, so text output isn't affected. - if (mbPopupLeft) - rPos.setX(maPos.getX()); - else - rPos.setX(maPos.getX() + maSize.getWidth() - nW); - rPos.setY(maPos.getY() + maSize.getHeight() - nH); - rSize.setWidth(nW); - rSize.setHeight(nH); -} - -void ScDPFieldButton::drawPopupButton() -{ - Point aPos; - Size aSize; - getPopupBoundingBox(aPos, aSize); - - // Background & outer black border - mpOutDev->SetLineColor(COL_BLACK); - mpOutDev->SetFillColor(mpStyle->GetFaceColor()); - mpOutDev->DrawRect(Rectangle(aPos, aSize)); - - if (!mbPopupPressed) - { - // border lines - mpOutDev->SetLineColor(mpStyle->GetLightColor()); - mpOutDev->DrawLine(Point(aPos.X()+1, aPos.Y()+1), Point(aPos.X()+1, aPos.Y()+aSize.Height()-2)); - mpOutDev->DrawLine(Point(aPos.X()+1, aPos.Y()+1), Point(aPos.X()+aSize.Width()-2, aPos.Y()+1)); - - mpOutDev->SetLineColor(mpStyle->GetShadowColor()); - mpOutDev->DrawLine(Point(aPos.X()+1, aPos.Y()+aSize.Height()-2), - Point(aPos.X()+aSize.Width()-2, aPos.Y()+aSize.Height()-2)); - mpOutDev->DrawLine(Point(aPos.X()+aSize.Width()-2, aPos.Y()+1), - Point(aPos.X()+aSize.Width()-2, aPos.Y()+aSize.Height()-2)); - } - - // the arrowhead - Color aArrowColor = mbHasHiddenMember ? mpStyle->GetHighlightLinkColor() : mpStyle->GetButtonTextColor(); - mpOutDev->SetLineColor(aArrowColor); - mpOutDev->SetFillColor(aArrowColor); - Point aCenter(aPos.X() + (aSize.Width() >> 1), aPos.Y() + (aSize.Height() >> 1)); - Point aPos1, aPos2; - aPos1.X() = aCenter.X() - 4; - aPos2.X() = aCenter.X() + 4; - aPos1.Y() = aCenter.Y() - 3; - aPos2.Y() = aCenter.Y() - 3; - - if (mbPopupPressed) - { - aPos1.X() += 1; - aPos2.X() += 1; - aPos1.Y() += 1; - aPos2.Y() += 1; - } - - do - { - ++aPos1.X(); - --aPos2.X(); - ++aPos1.Y(); - ++aPos2.Y(); - mpOutDev->DrawLine(aPos1, aPos2); - } - while (aPos1 != aPos2); - - if (mbHasHiddenMember) - { - // tiny little box to display in presence of hidden member(s). - Point aBoxPos(aPos.X() + aSize.Width() - 5, aPos.Y() + aSize.Height() - 5); - if (mbPopupPressed) - { - aBoxPos.X() += 1; - aBoxPos.Y() += 1; - } - Size aBoxSize(3, 3); - mpOutDev->DrawRect(Rectangle(aBoxPos, aBoxSize)); - } -} - -// ============================================================================ - -ScMenuFloatingWindow::MenuItemData::MenuItemData() : - mbEnabled(true), - mpAction(static_cast<ScDPFieldPopupWindow::Action*>(NULL)), - mpSubMenuWin(static_cast<ScMenuFloatingWindow*>(NULL)) -{ -} - -// ---------------------------------------------------------------------------- - -ScMenuFloatingWindow::SubMenuItemData::SubMenuItemData(ScMenuFloatingWindow* pParent) : - mpSubMenu(NULL), - mnMenuPos(MENU_NOT_SELECTED), - mpParent(pParent) -{ - maTimer.SetTimeoutHdl( LINK(this, ScMenuFloatingWindow::SubMenuItemData, TimeoutHdl) ); - maTimer.SetTimeout(mpParent->GetSettings().GetMouseSettings().GetMenuDelay()); -} - -void ScMenuFloatingWindow::SubMenuItemData::reset() -{ - mpSubMenu = NULL; - mnMenuPos = MENU_NOT_SELECTED; - maTimer.Stop(); -} - -IMPL_LINK( ScMenuFloatingWindow::SubMenuItemData, TimeoutHdl, void*, EMPTYARG ) -{ - mpParent->handleMenuTimeout(this); - return 0; -} - -// ---------------------------------------------------------------------------- - -size_t ScMenuFloatingWindow::MENU_NOT_SELECTED = 999; - -ScMenuFloatingWindow::ScMenuFloatingWindow(Window* pParent, ScDocument* pDoc, sal_uInt16 nMenuStackLevel) : - PopupMenuFloatingWindow(pParent), - maOpenTimer(this), - maCloseTimer(this), - maName(RTL_CONSTASCII_USTRINGPARAM("ScMenuFloatingWindow")), - mnSelectedMenu(MENU_NOT_SELECTED), - mnClickedMenu(MENU_NOT_SELECTED), - mpDoc(pDoc), - mpParentMenu(dynamic_cast<ScMenuFloatingWindow*>(pParent)), - mpActiveSubMenu(NULL) -{ - SetMenuStackLevel(nMenuStackLevel); - - // TODO: How do we get the right font to use here ? - const sal_uInt16 nPopupFontHeight = 12; - const StyleSettings& rStyle = GetSettings().GetStyleSettings(); - maLabelFont = rStyle.GetLabelFont(); - maLabelFont.SetHeight(nPopupFontHeight); - SetFont(maLabelFont); - - SetText( OUString(RTL_CONSTASCII_USTRINGPARAM("ScMenuFloatingWindow")) ); - SetPopupModeEndHdl( LINK(this, ScMenuFloatingWindow, PopupEndHdl) ); -} - -ScMenuFloatingWindow::~ScMenuFloatingWindow() -{ - EndPopupMode(); -} - -void ScMenuFloatingWindow::MouseMove(const MouseEvent& rMEvt) -{ - const Point& rPos = rMEvt.GetPosPixel(); - size_t nSelectedMenu = getEnclosingMenuItem(rPos); - setSelectedMenuItem(nSelectedMenu, true, false); - - Window::MouseMove(rMEvt); -} - -void ScMenuFloatingWindow::MouseButtonDown(const MouseEvent& rMEvt) -{ - const Point& rPos = rMEvt.GetPosPixel(); - mnClickedMenu = getEnclosingMenuItem(rPos); - Window::MouseButtonDown(rMEvt); -} - -void ScMenuFloatingWindow::MouseButtonUp(const MouseEvent& rMEvt) -{ - executeMenuItem(mnClickedMenu); - mnClickedMenu = MENU_NOT_SELECTED; - Window::MouseButtonUp(rMEvt); -} - -void ScMenuFloatingWindow::KeyInput(const KeyEvent& rKEvt) -{ - const KeyCode& rKeyCode = rKEvt.GetKeyCode(); - bool bHandled = true; - size_t nSelectedMenu = mnSelectedMenu; - size_t nLastMenuPos = maMenuItems.size() - 1; - switch (rKeyCode.GetCode()) - { - case KEY_UP: - if (nSelectedMenu == MENU_NOT_SELECTED || nSelectedMenu == 0) - nSelectedMenu = nLastMenuPos; - else - --nSelectedMenu; - setSelectedMenuItem(nSelectedMenu, false, false); - break; - case KEY_DOWN: - if (nSelectedMenu == MENU_NOT_SELECTED || nSelectedMenu == nLastMenuPos) - nSelectedMenu = 0; - else - ++nSelectedMenu; - setSelectedMenuItem(nSelectedMenu, false, false); - break; - case KEY_LEFT: - if (mpParentMenu) - mpParentMenu->endSubMenu(this); - break; - case KEY_RIGHT: - { - if (mnSelectedMenu >= maMenuItems.size() || mnSelectedMenu == MENU_NOT_SELECTED) - break; - - const MenuItemData& rMenu = maMenuItems[mnSelectedMenu]; - if (!rMenu.mbEnabled || !rMenu.mpSubMenuWin) - break; - - maOpenTimer.mnMenuPos = mnSelectedMenu; - maOpenTimer.mpSubMenu = rMenu.mpSubMenuWin.get(); - launchSubMenu(true); - } - break; - case KEY_RETURN: - if (nSelectedMenu != MENU_NOT_SELECTED) - executeMenuItem(nSelectedMenu); - break; - default: - bHandled = false; - } - - if (!bHandled) - Window::KeyInput(rKEvt); -} - -void ScMenuFloatingWindow::Paint(const Rectangle& /*rRect*/) -{ - const StyleSettings& rStyle = GetSettings().GetStyleSettings(); - Color aBackColor = rStyle.GetMenuColor(); - Color aBorderColor = rStyle.GetShadowColor(); - - Rectangle aCtrlRect(Point(0, 0), GetOutputSizePixel()); - - // Window background - bool bNativeDrawn = true; - if (IsNativeControlSupported(CTRL_MENU_POPUP, PART_ENTIRE_CONTROL)) - { - SetClipRegion(); - bNativeDrawn = DrawNativeControl( - CTRL_MENU_POPUP, PART_ENTIRE_CONTROL, aCtrlRect, CTRL_STATE_ENABLED, - ImplControlValue(), OUString()); - } - else - bNativeDrawn = false; - - if (!bNativeDrawn) - { - SetFillColor(aBackColor); - SetLineColor(aBorderColor); - DrawRect(aCtrlRect); - } - - // Menu items - SetTextColor(rStyle.GetMenuTextColor()); - drawAllMenuItems(); -} - -Reference<XAccessible> ScMenuFloatingWindow::CreateAccessible() -{ - if (!mxAccessible.is()) - { - Reference<XAccessible> xAccParent = mpParentMenu ? - mpParentMenu->GetAccessible() : GetAccessibleParentWindow()->GetAccessible(); - - mxAccessible.set(new ScAccessibleFilterMenu(xAccParent, this, maName, 999, getDoc())); - ScAccessibleFilterMenu* p = static_cast<ScAccessibleFilterMenu*>( - mxAccessible.get()); - - vector<MenuItemData>::const_iterator itr, itrBeg = maMenuItems.begin(), itrEnd = maMenuItems.end(); - for (itr = itrBeg; itr != itrEnd; ++itr) - { - size_t nPos = ::std::distance(itrBeg, itr); - p->appendMenuItem(itr->maText, itr->mbEnabled, nPos); - } - } - - return mxAccessible; -} - -void ScMenuFloatingWindow::addMenuItem(const OUString& rText, bool bEnabled, Action* pAction) -{ - MenuItemData aItem; - aItem.maText = rText; - aItem.mbEnabled = bEnabled; - aItem.mpAction.reset(pAction); - maMenuItems.push_back(aItem); -} - -ScMenuFloatingWindow* ScMenuFloatingWindow::addSubMenuItem(const OUString& rText, bool bEnabled) -{ - MenuItemData aItem; - aItem.maText = rText; - aItem.mbEnabled = bEnabled; - aItem.mpSubMenuWin.reset(new ScMenuFloatingWindow(this, mpDoc, GetMenuStackLevel()+1)); - aItem.mpSubMenuWin->setName(rText); - maMenuItems.push_back(aItem); - return aItem.mpSubMenuWin.get(); -} - -void ScMenuFloatingWindow::drawMenuItem(size_t nPos) -{ - if (nPos >= maMenuItems.size()) - return; - - Point aPos; - Size aSize; - getMenuItemPosSize(nPos, aPos, aSize); - - DecorationView aDecoView(this); - long nXOffset = 5; - long nYOffset = (aSize.Height() - maLabelFont.GetHeight())/2; - DrawCtrlText(Point(aPos.X()+nXOffset, aPos.Y() + nYOffset), maMenuItems[nPos].maText, 0, STRING_LEN, - maMenuItems[nPos].mbEnabled ? TEXT_DRAW_MNEMONIC : TEXT_DRAW_DISABLE); - - if (maMenuItems[nPos].mpSubMenuWin) - { - long nFontHeight = maLabelFont.GetHeight(); - Point aMarkerPos = aPos; - aMarkerPos.Y() += aSize.Height()/2 - nFontHeight/4 + 1; - aMarkerPos.X() += aSize.Width() - nFontHeight + nFontHeight/4; - Size aMarkerSize(nFontHeight/2, nFontHeight/2); - aDecoView.DrawSymbol(Rectangle(aMarkerPos, aMarkerSize), - SYMBOL_SPIN_RIGHT, GetTextColor(), 0); - } -} - -void ScMenuFloatingWindow::drawAllMenuItems() -{ - size_t n = maMenuItems.size(); - for (size_t i = 0; i < n; ++i) - highlightMenuItem(i, i == mnSelectedMenu); -} - -const Font& ScMenuFloatingWindow::getLabelFont() const -{ - return maLabelFont; -} - -void ScMenuFloatingWindow::executeMenuItem(size_t nPos) -{ - if (nPos >= maMenuItems.size()) - return; - - if (!maMenuItems[nPos].mpAction) - // no action is defined. - return; - - maMenuItems[nPos].mpAction->execute(); - terminateAllPopupMenus(); -} - -void ScMenuFloatingWindow::setSelectedMenuItem(size_t nPos, bool bSubMenuTimer, bool bEnsureSubMenu) -{ - if (mnSelectedMenu == nPos) - // nothing to do. - return; - - if (bEnsureSubMenu) - { - // Dismiss any child popup menu windows. - if (mnSelectedMenu < maMenuItems.size() && - maMenuItems[mnSelectedMenu].mpSubMenuWin && - maMenuItems[mnSelectedMenu].mpSubMenuWin->IsVisible()) - { - maMenuItems[mnSelectedMenu].mpSubMenuWin->ensureSubMenuNotVisible(); - } - - // The popup is not visible, yet a menu item is selected. The request - // most likely comes from the accessible object. Make sure this - // window, as well as all its parent windows are visible. - if (!IsVisible() && mpParentMenu) - mpParentMenu->ensureSubMenuVisible(this); - } - - selectMenuItem(mnSelectedMenu, false, bSubMenuTimer); - selectMenuItem(nPos, true, bSubMenuTimer); - mnSelectedMenu = nPos; - - fireMenuHighlightedEvent(); -} - -size_t ScMenuFloatingWindow::getSelectedMenuItem() const -{ - return mnSelectedMenu; -} - -void ScMenuFloatingWindow::handleMenuTimeout(SubMenuItemData* pTimer) -{ - if (pTimer == &maOpenTimer) - { - // Close any open submenu immediately. - if (maCloseTimer.mpSubMenu) - { - maCloseTimer.mpSubMenu->EndPopupMode(); - maCloseTimer.mpSubMenu = NULL; - maCloseTimer.maTimer.Stop(); - } - - launchSubMenu(false); - } - else if (pTimer == &maCloseTimer) - { - // end submenu. - if (maCloseTimer.mpSubMenu) - { - maOpenTimer.mpSubMenu = NULL; - - maCloseTimer.mpSubMenu->EndPopupMode(); - maCloseTimer.mpSubMenu = NULL; - - highlightMenuItem(maOpenTimer.mnMenuPos, false); - maOpenTimer.mnMenuPos = MENU_NOT_SELECTED; - } - } -} - -void ScMenuFloatingWindow::queueLaunchSubMenu(size_t nPos, ScMenuFloatingWindow* pMenu) -{ - if (!pMenu) - return; - - // Set the submenu on launch queue. - if (maOpenTimer.mpSubMenu) - { - if (maOpenTimer.mpSubMenu == pMenu) - { - if (pMenu == maCloseTimer.mpSubMenu) - maCloseTimer.reset(); - return; - } - - // new submenu is being requested. - queueCloseSubMenu(); - } - - maOpenTimer.mpSubMenu = pMenu; - maOpenTimer.mnMenuPos = nPos; - maOpenTimer.maTimer.Start(); -} - -void ScMenuFloatingWindow::queueCloseSubMenu() -{ - if (!maOpenTimer.mpSubMenu) - // There is no submenu to close. - return; - - // Stop any submenu on queue for opening. - maOpenTimer.maTimer.Stop(); - - maCloseTimer.mpSubMenu = maOpenTimer.mpSubMenu; - maCloseTimer.mnMenuPos = maOpenTimer.mnMenuPos; - maCloseTimer.maTimer.Start(); -} - -void ScMenuFloatingWindow::launchSubMenu(bool bSetMenuPos) -{ - Point aPos; - Size aSize; - getMenuItemPosSize(maOpenTimer.mnMenuPos, aPos, aSize); - ScMenuFloatingWindow* pSubMenu = maOpenTimer.mpSubMenu; - - if (!pSubMenu) - return; - - sal_uInt32 nOldFlags = GetPopupModeFlags(); - SetPopupModeFlags(nOldFlags | FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE); - pSubMenu->resizeToFitMenuItems(); // set the size before launching the popup to get it positioned correctly. - pSubMenu->StartPopupMode( - Rectangle(aPos,aSize), (FLOATWIN_POPUPMODE_RIGHT | FLOATWIN_POPUPMODE_GRABFOCUS)); - pSubMenu->AddPopupModeWindow(this); - if (bSetMenuPos) - pSubMenu->setSelectedMenuItem(0, false, false); // select menu item after the popup becomes fully visible. - SetPopupModeFlags(nOldFlags); -} - -void ScMenuFloatingWindow::endSubMenu(ScMenuFloatingWindow* pSubMenu) -{ - if (!pSubMenu) - return; - - pSubMenu->EndPopupMode(); - maOpenTimer.reset(); - - size_t nMenuPos = getSubMenuPos(pSubMenu); - if (nMenuPos != MENU_NOT_SELECTED) - { - highlightMenuItem(nMenuPos, true); - mnSelectedMenu = nMenuPos; - fireMenuHighlightedEvent(); - } -} - -void ScMenuFloatingWindow::fillMenuItemsToAccessible(ScAccessibleFilterMenu* pAccMenu) const -{ - vector<MenuItemData>::const_iterator itr, itrBeg = maMenuItems.begin(), itrEnd = maMenuItems.end(); - for (itr = itrBeg; itr != itrEnd; ++itr) - { - size_t nPos = ::std::distance(itrBeg, itr); - pAccMenu->appendMenuItem(itr->maText, itr->mbEnabled, nPos); - } -} - -ScDocument* ScMenuFloatingWindow::getDoc() -{ - return mpDoc; -} - -void ScMenuFloatingWindow::resizeToFitMenuItems() -{ - if (maMenuItems.empty()) - return; - - vector<MenuItemData>::const_iterator itr = maMenuItems.begin(), itrEnd = maMenuItems.end(); - long nTextWidth = 0; - for (; itr != itrEnd; ++itr) - nTextWidth = ::std::max(GetTextWidth(itr->maText), nTextWidth); - - size_t nLastPos = maMenuItems.size()-1; - Point aPos; - Size aSize; - getMenuItemPosSize(nLastPos, aPos, aSize); - aPos.X() += nTextWidth + 15; - aPos.Y() += aSize.Height() + 5; - SetOutputSizePixel(Size(aPos.X(), aPos.Y())); -} - -void ScMenuFloatingWindow::selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer) -{ - if (nPos >= maMenuItems.size() || nPos == MENU_NOT_SELECTED) - { - queueCloseSubMenu(); - return; - } - - if (!maMenuItems[nPos].mbEnabled) - { - queueCloseSubMenu(); - return; - } - - highlightMenuItem(nPos, bSelected); - - if (bSelected) - { - if (mpParentMenu) - mpParentMenu->setSubMenuFocused(this); - - if (bSubMenuTimer) - { - if (maMenuItems[nPos].mpSubMenuWin) - { - ScMenuFloatingWindow* pSubMenu = maMenuItems[nPos].mpSubMenuWin.get(); - queueLaunchSubMenu(nPos, pSubMenu); - } - else - queueCloseSubMenu(); - } - } -} - -void ScMenuFloatingWindow::clearSelectedMenuItem() -{ - selectMenuItem(mnSelectedMenu, false, false); - mnSelectedMenu = MENU_NOT_SELECTED; -} - -ScMenuFloatingWindow* ScMenuFloatingWindow::getSubMenuWindow(size_t nPos) const -{ - if (maMenuItems.size() <= nPos) - return NULL; - - return maMenuItems[nPos].mpSubMenuWin.get(); -} - -bool ScMenuFloatingWindow::isMenuItemSelected(size_t nPos) const -{ - return nPos == mnSelectedMenu; -} - -void ScMenuFloatingWindow::setName(const OUString& rName) -{ - maName = rName; -} - -const OUString& ScMenuFloatingWindow::getName() const -{ - return maName; -} - -void ScMenuFloatingWindow::highlightMenuItem(size_t nPos, bool bSelected) -{ - if (nPos == MENU_NOT_SELECTED) - return; - - const StyleSettings& rStyle = GetSettings().GetStyleSettings(); - Color aBackColor = rStyle.GetMenuColor(); - SetFillColor(aBackColor); - SetLineColor(aBackColor); - - Point aPos; - Size aSize; - getMenuItemPosSize(nPos, aPos, aSize); - Rectangle aRegion(aPos,aSize); - - if (IsNativeControlSupported(CTRL_MENU_POPUP, PART_ENTIRE_CONTROL)) - { - Push(PUSH_CLIPREGION); - IntersectClipRegion(Rectangle(aPos, aSize)); - Rectangle aCtrlRect(Point(0,0), GetOutputSizePixel()); - DrawNativeControl( - CTRL_MENU_POPUP, PART_ENTIRE_CONTROL, aCtrlRect, CTRL_STATE_ENABLED, - ImplControlValue(), OUString()); - - Pop(); - } - - bool bNativeDrawn = true; - if (IsNativeControlSupported(CTRL_MENU_POPUP, PART_MENU_ITEM)) - { - ControlState nState = bSelected ? CTRL_STATE_SELECTED : 0; - if (maMenuItems[nPos].mbEnabled) - nState |= CTRL_STATE_ENABLED; - bNativeDrawn = DrawNativeControl( - CTRL_MENU_POPUP, PART_MENU_ITEM, aRegion, nState, ImplControlValue(), OUString()); - } - else - bNativeDrawn = false; - - if (!bNativeDrawn) - { - if (bSelected) - { - aBackColor = rStyle.GetMenuHighlightColor(); - SetFillColor(aBackColor); - SetLineColor(aBackColor); - } - DrawRect(Rectangle(aPos,aSize)); - } - - Color aTextColor = bSelected ? rStyle.GetMenuHighlightTextColor() : rStyle.GetMenuTextColor(); - SetTextColor(aTextColor); - drawMenuItem(nPos); -} - -void ScMenuFloatingWindow::getMenuItemPosSize(size_t nPos, Point& rPos, Size& rSize) const -{ - const sal_uInt16 nLeftMargin = 5; - const sal_uInt16 nTopMargin = 5; - const sal_uInt16 nMenuItemHeight = static_cast< sal_uInt16 >( maLabelFont.GetHeight()*1.8 ); - - Size aWndSize = GetSizePixel(); - - Point aPos1(nLeftMargin, nTopMargin); - Size aSize1(aWndSize.Width() - nLeftMargin*2, nMenuItemHeight); - - rPos = aPos1; - rPos.Y() += aSize1.Height()*nPos; - rSize = aSize1; -} - -ScMenuFloatingWindow* ScMenuFloatingWindow::getParentMenuWindow() const -{ - return mpParentMenu; -} - -size_t ScMenuFloatingWindow::getEnclosingMenuItem(const Point& rPos) const -{ - size_t n = maMenuItems.size(); - for (size_t i = 0; i < n; ++i) - { - Point aPos; - Size aSize; - getMenuItemPosSize(i, aPos, aSize); - Rectangle aRect(aPos, aSize); - if (aRect.IsInside(rPos)) - return i; - } - return MENU_NOT_SELECTED; -} - -size_t ScMenuFloatingWindow::getSubMenuPos(ScMenuFloatingWindow* pSubMenu) -{ - size_t n = maMenuItems.size(); - for (size_t i = 0; i < n; ++i) - { - if (maMenuItems[i].mpSubMenuWin.get() == pSubMenu) - return i; - } - return MENU_NOT_SELECTED; -} - -void ScMenuFloatingWindow::fireMenuHighlightedEvent() -{ - if (mnSelectedMenu == MENU_NOT_SELECTED) - return; - - if (!mxAccessible.is()) - return; - - Reference<XAccessibleContext> xAccCxt = mxAccessible->getAccessibleContext(); - if (!xAccCxt.is()) - return; - - Reference<XAccessible> xAccMenu = xAccCxt->getAccessibleChild(mnSelectedMenu); - if (!xAccMenu.is()) - return; - - VclAccessibleEvent aEvent(VCLEVENT_MENU_HIGHLIGHT, xAccMenu); - FireVclEvent(&aEvent); -} - -void ScMenuFloatingWindow::setSubMenuFocused(ScMenuFloatingWindow* pSubMenu) -{ - maCloseTimer.reset(); - size_t nMenuPos = getSubMenuPos(pSubMenu); - if (mnSelectedMenu != nMenuPos) - { - highlightMenuItem(nMenuPos, true); - mnSelectedMenu = nMenuPos; - } -} - -void ScMenuFloatingWindow::ensureSubMenuVisible(ScMenuFloatingWindow* pSubMenu) -{ - if (mpParentMenu) - mpParentMenu->ensureSubMenuVisible(this); - - if (pSubMenu->IsVisible()) - return; - - // Find the menu position of the submenu. - size_t nMenuPos = getSubMenuPos(pSubMenu); - if (nMenuPos != MENU_NOT_SELECTED) - { - setSelectedMenuItem(nMenuPos, false, false); - - Point aPos; - Size aSize; - getMenuItemPosSize(nMenuPos, aPos, aSize); - - sal_uInt32 nOldFlags = GetPopupModeFlags(); - SetPopupModeFlags(nOldFlags | FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE); - pSubMenu->resizeToFitMenuItems(); // set the size before launching the popup to get it positioned correctly. - pSubMenu->StartPopupMode( - Rectangle(aPos,aSize), (FLOATWIN_POPUPMODE_RIGHT | FLOATWIN_POPUPMODE_GRABFOCUS)); - pSubMenu->AddPopupModeWindow(this); - SetPopupModeFlags(nOldFlags); - } -} - -void ScMenuFloatingWindow::ensureSubMenuNotVisible() -{ - if (mnSelectedMenu <= maMenuItems.size() && - maMenuItems[mnSelectedMenu].mpSubMenuWin && - maMenuItems[mnSelectedMenu].mpSubMenuWin->IsVisible()) - { - maMenuItems[mnSelectedMenu].mpSubMenuWin->ensureSubMenuNotVisible(); - } - - EndPopupMode(); -} - -void ScMenuFloatingWindow::terminateAllPopupMenus() -{ - EndPopupMode(); - if (mpParentMenu) - mpParentMenu->terminateAllPopupMenus(); -} - -IMPL_LINK( ScMenuFloatingWindow, PopupEndHdl, void*, EMPTYARG ) -{ - clearSelectedMenuItem(); - return 0; -} - -// ============================================================================ - -ScDPFieldPopupWindow::Member::Member() : - mbVisible(true) -{ -} - -// ---------------------------------------------------------------------------- - -ScDPFieldPopupWindow::CancelButton::CancelButton(ScDPFieldPopupWindow* pParent) : - ::CancelButton(pParent), mpParent(pParent) {} - -void ScDPFieldPopupWindow::CancelButton::Click() -{ - mpParent->EndPopupMode(); - ::CancelButton::Click(); -} - -// ---------------------------------------------------------------------------- - -ScDPFieldPopupWindow::ScDPFieldPopupWindow(Window* pParent, ScDocument* pDoc) : - ScMenuFloatingWindow(pParent, pDoc), - maChecks(this, 0), - maChkToggleAll(this, 0), - maBtnSelectSingle (this, 0), - maBtnUnselectSingle(this, 0), - maBtnOk(this), - maBtnCancel(this), - mnCurTabStop(0), - mpExtendedData(NULL), - mpOKAction(NULL), - maWndSize(240, 330), - mePrevToggleAllState(STATE_DONTKNOW) -{ - maTabStopCtrls.reserve(7); - maTabStopCtrls.push_back(this); - maTabStopCtrls.push_back(&maChecks); - maTabStopCtrls.push_back(&maChkToggleAll); - maTabStopCtrls.push_back(&maBtnSelectSingle); - maTabStopCtrls.push_back(&maBtnUnselectSingle); - maTabStopCtrls.push_back(&maBtnOk); - maTabStopCtrls.push_back(&maBtnCancel); - - const StyleSettings& rStyle = GetSettings().GetStyleSettings(); - - Point aPos; - Size aSize; - getSectionPosSize(aPos, aSize, WHOLE); - SetOutputSizePixel(aSize); - - getSectionPosSize(aPos, aSize, BTN_OK); - maBtnOk.SetPosSizePixel(aPos, aSize); - maBtnOk.SetFont(getLabelFont()); - maBtnOk.SetClickHdl( LINK(this, ScDPFieldPopupWindow, ButtonHdl) ); - maBtnOk.Show(); - - getSectionPosSize(aPos, aSize, BTN_CANCEL); - maBtnCancel.SetPosSizePixel(aPos, aSize); - maBtnCancel.SetFont(getLabelFont()); - maBtnCancel.Show(); - - getSectionPosSize(aPos, aSize, LISTBOX_AREA_INNER); - maChecks.SetPosSizePixel(aPos, aSize); - maChecks.SetFont(getLabelFont()); - maChecks.SetCheckButtonHdl( LINK(this, ScDPFieldPopupWindow, CheckHdl) ); - maChecks.Show(); - - getSectionPosSize(aPos, aSize, CHECK_TOGGLE_ALL); - maChkToggleAll.SetPosSizePixel(aPos, aSize); - maChkToggleAll.SetFont(getLabelFont()); - maChkToggleAll.SetText(ScRscStrLoader(RID_POPUP_FILTER, STR_BTN_TOGGLE_ALL).GetString()); - maChkToggleAll.SetTextColor(rStyle.GetMenuTextColor()); - maChkToggleAll.SetControlBackground(rStyle.GetMenuColor()); - maChkToggleAll.SetClickHdl( LINK(this, ScDPFieldPopupWindow, TriStateHdl) ); - maChkToggleAll.Show(); - - getSectionPosSize(aPos, aSize, BTN_SINGLE_SELECT); - maBtnSelectSingle.SetPosSizePixel(aPos, aSize); - maBtnSelectSingle.SetQuickHelpText(ScRscStrLoader(RID_POPUP_FILTER, STR_BTN_SELECT_CURRENT).GetString()); - maBtnSelectSingle.SetModeImage(Image(ScResId(RID_IMG_SELECT_CURRENT))); - maBtnSelectSingle.SetClickHdl( LINK(this, ScDPFieldPopupWindow, ButtonHdl) ); - maBtnSelectSingle.Show(); - - getSectionPosSize(aPos, aSize, BTN_SINGLE_UNSELECT); - maBtnUnselectSingle.SetPosSizePixel(aPos, aSize); - maBtnUnselectSingle.SetQuickHelpText(ScRscStrLoader(RID_POPUP_FILTER, STR_BTN_UNSELECT_CURRENT).GetString()); - maBtnUnselectSingle.SetModeImage(Image(ScResId(RID_IMG_UNSELECT_CURRENT))); - maBtnUnselectSingle.SetClickHdl( LINK(this, ScDPFieldPopupWindow, ButtonHdl) ); - maBtnUnselectSingle.Show(); -} - -ScDPFieldPopupWindow::~ScDPFieldPopupWindow() -{ -} - -void ScDPFieldPopupWindow::getSectionPosSize(Point& rPos, Size& rSize, SectionType eType) const -{ - // constant parameters. - const sal_uInt16 nListBoxMargin = 5; // horizontal distance from the side of the dialog to the listbox border. - const sal_uInt16 nListBoxInnerPadding = 5; - const sal_uInt16 nTopMargin = 5; - const sal_uInt16 nMenuHeight = 60; - const sal_uInt16 nSingleItemBtnAreaHeight = 32; // height of the middle area below the list box where the single-action buttons are. - const sal_uInt16 nBottomBtnAreaHeight = 50; // height of the bottom area where the OK and Cancel buttons are. - const sal_uInt16 nBtnWidth = 90; - const sal_uInt16 nLabelHeight = static_cast< sal_uInt16 >( getLabelFont().GetHeight() ); - const sal_uInt16 nBtnHeight = nLabelHeight*2; - const sal_uInt16 nBottomMargin = 10; - const sal_uInt16 nMenuListMargin = 20; - - // parameters calculated from constants. - const sal_uInt16 nListBoxWidth = static_cast< sal_uInt16 >( maWndSize.Width() - nListBoxMargin*2 ); - const sal_uInt16 nListBoxHeight = static_cast< sal_uInt16 >( maWndSize.Height() - nTopMargin - nMenuHeight - - nMenuListMargin - nSingleItemBtnAreaHeight - nBottomBtnAreaHeight ); - - const sal_uInt16 nSingleBtnAreaY = nTopMargin + nMenuHeight + nListBoxHeight + nMenuListMargin - 1; - - switch (eType) - { - case WHOLE: - { - rPos = Point(0, 0); - rSize = maWndSize; - } - break; - case LISTBOX_AREA_OUTER: - { - rPos = Point(nListBoxMargin, nTopMargin + nMenuHeight + nMenuListMargin); - rSize = Size(nListBoxWidth, nListBoxHeight); - } - break; - case LISTBOX_AREA_INNER: - { - rPos = Point(nListBoxMargin, nTopMargin + nMenuHeight + nMenuListMargin); - rPos.X() += nListBoxInnerPadding; - rPos.Y() += nListBoxInnerPadding; - - rSize = Size(nListBoxWidth, nListBoxHeight); - rSize.Width() -= nListBoxInnerPadding*2; - rSize.Height() -= nListBoxInnerPadding*2; - } - break; - case SINGLE_BTN_AREA: - { - rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rSize = Size(nListBoxWidth, nSingleItemBtnAreaHeight); - } - break; - case CHECK_TOGGLE_ALL: - { - long h = nLabelHeight*3/2; // check box height is heuristically 150% of the text height. - rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rPos.X() += 5; - rPos.Y() += (nSingleItemBtnAreaHeight - h)/2; - rSize = Size(70, h); - } - break; - case BTN_SINGLE_SELECT: - { - long h = 26; - rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rPos.X() += 150; - rPos.Y() += (nSingleItemBtnAreaHeight - h)/2; - rSize = Size(h, h); - } - break; - case BTN_SINGLE_UNSELECT: - { - long h = 26; - rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rPos.X() += 150 + h + 10; - rPos.Y() += (nSingleItemBtnAreaHeight - h)/2; - rSize = Size(h, h); - } - break; - case BTN_OK: - { - long x = (maWndSize.Width() - nBtnWidth*2)/3; - long y = maWndSize.Height() - nBottomMargin - nBtnHeight; - rPos = Point(x, y); - rSize = Size(nBtnWidth, nBtnHeight); - } - break; - case BTN_CANCEL: - { - long x = (maWndSize.Width() - nBtnWidth*2)/3*2 + nBtnWidth; - long y = maWndSize.Height() - nBottomMargin - nBtnHeight; - rPos = Point(x, y); - rSize = Size(nBtnWidth, nBtnHeight); - } - break; - default: - ; - } -} - -void ScDPFieldPopupWindow::setAllMemberState(bool bSet) -{ - size_t n = maMembers.size(); - for (size_t i = 0; i < n; ++i) - maChecks.CheckEntryPos(static_cast< sal_uInt16 >( i ), bSet); -} - -void ScDPFieldPopupWindow::selectCurrentMemberOnly(bool bSet) -{ - setAllMemberState(!bSet); - sal_uInt16 nSelected = maChecks.GetSelectEntryPos(); - maChecks.CheckEntryPos(nSelected, bSet); -} - -void ScDPFieldPopupWindow::cycleFocus(bool bReverse) -{ - maTabStopCtrls[mnCurTabStop]->SetFakeFocus(false); - maTabStopCtrls[mnCurTabStop]->LoseFocus(); - if (mnCurTabStop == 0) - clearSelectedMenuItem(); - - if (bReverse) - { - if (mnCurTabStop > 0) - --mnCurTabStop; - else - mnCurTabStop = maTabStopCtrls.size() - 1; - } - else - { - ++mnCurTabStop; - if (mnCurTabStop >= maTabStopCtrls.size()) - mnCurTabStop = 0; - } - maTabStopCtrls[mnCurTabStop]->SetFakeFocus(true); - maTabStopCtrls[mnCurTabStop]->GrabFocus(); -} - -IMPL_LINK( ScDPFieldPopupWindow, ButtonHdl, Button*, pBtn ) -{ - if (pBtn == &maBtnOk) - close(true); - else if (pBtn == &maBtnSelectSingle) - { - selectCurrentMemberOnly(true); - CheckHdl(&maChecks); - } - else if (pBtn == &maBtnUnselectSingle) - { - selectCurrentMemberOnly(false); - CheckHdl(&maChecks); - } - return 0; -} - -IMPL_LINK( ScDPFieldPopupWindow, TriStateHdl, TriStateBox*, EMPTYARG ) -{ - switch (mePrevToggleAllState) - { - case STATE_NOCHECK: - maChkToggleAll.SetState(STATE_CHECK); - setAllMemberState(true); - break; - case STATE_CHECK: - maChkToggleAll.SetState(STATE_NOCHECK); - setAllMemberState(false); - break; - case STATE_DONTKNOW: - default: - maChkToggleAll.SetState(STATE_CHECK); - setAllMemberState(true); - break; - } - - mePrevToggleAllState = maChkToggleAll.GetState(); - return 0; -} - -IMPL_LINK( ScDPFieldPopupWindow, CheckHdl, SvTreeListBox*, pChecks ) -{ - if (pChecks != &maChecks) - return 0; - - size_t nNumChecked = maChecks.GetCheckedEntryCount(); - if (nNumChecked == maMembers.size()) - // all members visible - maChkToggleAll.SetState(STATE_CHECK); - else if (nNumChecked == 0) - // no members visible - maChkToggleAll.SetState(STATE_NOCHECK); - else - maChkToggleAll.SetState(STATE_DONTKNOW); - - mePrevToggleAllState = maChkToggleAll.GetState(); - return 0; -} - -void ScDPFieldPopupWindow::MouseMove(const MouseEvent& rMEvt) -{ - ScMenuFloatingWindow::MouseMove(rMEvt); - - size_t nSelectedMenu = getSelectedMenuItem(); - if (nSelectedMenu == MENU_NOT_SELECTED) - queueCloseSubMenu(); -} - -long ScDPFieldPopupWindow::Notify(NotifyEvent& rNEvt) -{ - switch (rNEvt.GetType()) - { - case EVENT_KEYUP: - { - const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); - const KeyCode& rCode = pKeyEvent->GetKeyCode(); - bool bShift = rCode.IsShift(); - if (rCode.GetCode() == KEY_TAB) - { - cycleFocus(bShift); - return true; - } - } - break; - } - return ScMenuFloatingWindow::Notify(rNEvt); -} - -void ScDPFieldPopupWindow::Paint(const Rectangle& rRect) -{ - ScMenuFloatingWindow::Paint(rRect); - - const StyleSettings& rStyle = GetSettings().GetStyleSettings(); - Color aMemberBackColor = rStyle.GetFieldColor(); - Color aBorderColor = rStyle.GetShadowColor(); - - Point aPos; - Size aSize; - getSectionPosSize(aPos, aSize, LISTBOX_AREA_OUTER); - - // Member list box background - SetFillColor(aMemberBackColor); - SetLineColor(aBorderColor); - DrawRect(Rectangle(aPos,aSize)); - - // Single-action button box - getSectionPosSize(aPos, aSize, SINGLE_BTN_AREA); - SetFillColor(rStyle.GetMenuColor()); - DrawRect(Rectangle(aPos,aSize)); -} - -Window* ScDPFieldPopupWindow::GetPreferredKeyInputWindow() -{ - return maTabStopCtrls[mnCurTabStop]; -} - -Reference<XAccessible> ScDPFieldPopupWindow::CreateAccessible() -{ - if (!mxAccessible.is()) - { - mxAccessible.set(new ScAccessibleFilterTopWindow( - GetAccessibleParentWindow()->GetAccessible(), this, getName(), getDoc())); - ScAccessibleFilterTopWindow* pAccTop = static_cast<ScAccessibleFilterTopWindow*>(mxAccessible.get()); - fillMenuItemsToAccessible(pAccTop); - - pAccTop->setAccessibleChild( - maChecks.CreateAccessible(), ScAccessibleFilterTopWindow::LISTBOX); - pAccTop->setAccessibleChild( - maChkToggleAll.CreateAccessible(), ScAccessibleFilterTopWindow::TOGGLE_ALL); - pAccTop->setAccessibleChild( - maBtnSelectSingle.CreateAccessible(), ScAccessibleFilterTopWindow::SINGLE_ON_BTN); - pAccTop->setAccessibleChild( - maBtnUnselectSingle.CreateAccessible(), ScAccessibleFilterTopWindow::SINGLE_OFF_BTN); - pAccTop->setAccessibleChild( - maBtnOk.CreateAccessible(), ScAccessibleFilterTopWindow::OK_BTN); - pAccTop->setAccessibleChild( - maBtnCancel.CreateAccessible(), ScAccessibleFilterTopWindow::CANCEL_BTN); - } - - return mxAccessible; -} - -void ScDPFieldPopupWindow::setMemberSize(size_t n) -{ - maMembers.reserve(n); -} - -void ScDPFieldPopupWindow::addMember(const OUString& rName, bool bVisible) -{ - Member aMember; - aMember.maName = rName; - aMember.mbVisible = bVisible; - maMembers.push_back(aMember); -} - -void ScDPFieldPopupWindow::initMembers() -{ - size_t n = maMembers.size(); - size_t nVisMemCount = 0; - for (size_t i = 0; i < n; ++i) - { - maChecks.InsertEntry(maMembers[i].maName); - maChecks.CheckEntryPos(static_cast< sal_uInt16 >( i ), maMembers[i].mbVisible); - if (maMembers[i].mbVisible) - ++nVisMemCount; - } - if (nVisMemCount == n) - { - // all members visible - maChkToggleAll.SetState(STATE_CHECK); - mePrevToggleAllState = STATE_CHECK; - } - else if (nVisMemCount == 0) - { - // no members visible - maChkToggleAll.SetState(STATE_NOCHECK); - mePrevToggleAllState = STATE_NOCHECK; - } - else - { - maChkToggleAll.SetState(STATE_DONTKNOW); - mePrevToggleAllState = STATE_DONTKNOW; - } -} - -const Size& ScDPFieldPopupWindow::getWindowSize() const -{ - return maWndSize; -} - -void ScDPFieldPopupWindow::getResult(boost::unordered_map<OUString, bool, OUStringHash>& rResult) -{ - typedef boost::unordered_map<OUString, bool, OUStringHash> ResultMap; - ResultMap aResult; - size_t n = maMembers.size(); - for (size_t i = 0; i < n; ++i) - { - bool bState = maChecks.IsChecked(static_cast< sal_uInt16 >( i )); - aResult.insert(ResultMap::value_type(maMembers[i].maName, bState)); - } - rResult.swap(aResult); -} - -void ScDPFieldPopupWindow::close(bool bOK) -{ - if (bOK && mpOKAction.get()) - mpOKAction->execute(); - - EndPopupMode(); -} - -void ScDPFieldPopupWindow::setExtendedData(ExtendedData* p) -{ - mpExtendedData.reset(p); -} - -ScDPFieldPopupWindow::ExtendedData* ScDPFieldPopupWindow::getExtendedData() -{ - return mpExtendedData.get(); -} - -void ScDPFieldPopupWindow::setOKAction(Action* p) -{ - mpOKAction.reset(p); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |