/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "swabstdlg.hxx" #include #include #include #include #include // Size check #define NAVI_ENTRIES 20 #if NAVI_ENTRIES != NID_COUNT #error SwScrollNaviPopup-CTOR static array wrong size. Are new IDs added? #endif using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::frame; SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxVoidItem ); SwTbxAutoTextCtrl::SwTbxAutoTextCtrl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) : SfxToolBoxControl( nSlotId, nId, rTbx ), pPopup(nullptr) { rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) ); } SwTbxAutoTextCtrl::~SwTbxAutoTextCtrl() { DelPopup(); } VclPtr SwTbxAutoTextCtrl::CreatePopupWindow() { SwView* pView = ::GetActiveView(); if(pView && !pView->GetDocShell()->IsReadOnly() && !pView->GetWrtShell().HasReadonlySel() ) { Link aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl); pPopup = VclPtr::Create(); SwGlossaryList* pGlossaryList = ::GetGlossaryList(); const size_t nGroupCount = pGlossaryList->GetGroupCount(); for(size_t i = 1; i <= nGroupCount; ++i) { OUString sTitle = pGlossaryList->GetGroupTitle(i - 1); const sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1); if(nBlockCount) { sal_uInt16 nIndex = static_cast(100*i); // but insert without extension pPopup->InsertItem( i, sTitle); PopupMenu* pSub = VclPtr::Create(); pSub->SetSelectHdl(aLnk); pPopup->SetPopupMenu(i, pSub); for(sal_uInt16 j = 0; j < nBlockCount; j++) { OUString sLongName(pGlossaryList->GetBlockLongName(i - 1, j)); OUString sShortName(pGlossaryList->GetBlockShortName(i - 1, j)); OUString sEntry = sShortName + " - " + sLongName; pSub->InsertItem(++nIndex, sEntry); } } } ToolBox* pToolBox = &GetToolBox(); sal_uInt16 nId = GetId(); pToolBox->SetItemDown( nId, true ); pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ), (pToolBox->GetAlign() == WindowAlign::Top || pToolBox->GetAlign() == WindowAlign::Bottom) ? PopupMenuFlags::ExecuteDown : PopupMenuFlags::ExecuteRight ); pToolBox->SetItemDown( nId, false ); } GetToolBox().EndSelection(); DelPopup(); return nullptr; } void SwTbxAutoTextCtrl::StateChanged( sal_uInt16, SfxItemState, const SfxPoolItem* pState ) { GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SfxItemState::DISABLED) ); } IMPL_STATIC_LINK(SwTbxAutoTextCtrl, PopupHdl, Menu*, pMenu, bool) { sal_uInt16 nId = pMenu->GetCurItemId(); sal_uInt16 nBlock = nId / 100; SwGlossaryList* pGlossaryList = ::GetGlossaryList(); OUString sGroup = pGlossaryList->GetGroupName(nBlock - 1); OUString sShortName = pGlossaryList->GetBlockShortName(nBlock - 1, nId - (100 * nBlock) - 1); SwGlossaryHdl* pGlosHdl = ::GetActiveView()->GetGlosHdl(); SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "Dialog creation failed!"); ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc(); if ( fnSetActGroup ) (*fnSetActGroup)( sGroup ); pGlosHdl->SetCurGroup(sGroup, true); pGlosHdl->InsertGlossary(sShortName); return false; } void SwTbxAutoTextCtrl::DelPopup() { if(pPopup) { for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ ) { pPopup->DisposePopupMenu(pPopup->GetItemId(i)); } pPopup.disposeAndClear(); } } // Navigation-Popup // determine the order of the toolbox items static sal_uInt16 aNavigationInsertIds[ NAVI_ENTRIES ] = { // -- first line NID_TBL, NID_FRM, NID_GRF, NID_OLE, NID_PGE, NID_OUTL, NID_MARK, NID_DRW, NID_CTRL, NID_PREV, // -- second line NID_REG, NID_BKM, NID_SEL, NID_FTN, NID_POSTIT, NID_SRCH_REP, NID_INDEX_ENTRY, NID_TABLE_FORMULA, NID_TABLE_FORMULA_ERROR, NID_NEXT }; static const char* aNavigationHelpIds[ NAVI_ENTRIES ] = { // -- first line HID_NID_TBL, HID_NID_FRM, HID_NID_GRF, HID_NID_OLE, HID_NID_PGE, HID_NID_OUTL, HID_NID_MARK, HID_NID_DRW, HID_NID_CTRL, HID_NID_PREV, // -- second line HID_NID_REG, HID_NID_BKM, HID_NID_SEL, HID_NID_FTN, HID_NID_POSTIT, HID_NID_SRCH_REP, HID_NID_INDEX_ENTRY, HID_NID_TABLE_FORMULA, HID_NID_TABLE_FORMULA_ERROR, HID_NID_NEXT }; SwScrollNaviPopup::SwScrollNaviPopup(sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window *pParent) : SfxPopupWindow(nId, pParent, "FloatingNavigation", "modules/swriter/ui/floatingnavigation.ui", rFrame), aIList(SW_RES(IL_VALUES)) { m_pToolBox = VclPtr::Create(get("box"), this, 0); get(m_pInfoField, "label"); sal_uInt16 i; m_pToolBox->SetHelpId(HID_NAVI_VS); m_pToolBox->SetLineCount( 2 ); m_pToolBox->SetOutStyle(TOOLBOX_STYLE_FLAT); for( i = 0; i < NID_COUNT; i++) { sal_uInt16 nNaviId = aNavigationInsertIds[i]; OUString sText; ToolBoxItemBits nTbxBits = ToolBoxItemBits::NONE; if((NID_PREV != nNaviId) && (NID_NEXT != nNaviId)) { // -2, there's no string for Next/Prev sal_uInt16 nResStr = ST_TBL - 2 + nNaviId - NID_START; sText = SW_RESSTR(nResStr); nTbxBits = ToolBoxItemBits::CHECKABLE; } else { if (nNaviId == NID_PREV) sText = SW_RESSTR(STR_IMGBTN_PGE_UP); else if (nNaviId == NID_NEXT) sText = SW_RESSTR(STR_IMGBTN_PGE_DOWN); } m_pToolBox->InsertItem(nNaviId, sText, nTbxBits); m_pToolBox->SetHelpId( nNaviId, aNavigationHelpIds[i] ); } ApplyImageList(); m_pToolBox->InsertBreak(NID_COUNT/2); // these are global strings for( i = 0; i < 2 * NID_COUNT; i++) { sQuickHelp[i] = SW_RESSTR(STR_IMGBTN_START + i); } sal_uInt16 nItemId = SwView::GetMoveType(); m_pInfoField->SetText(m_pToolBox->GetItemText(nItemId)); m_pToolBox->CheckItem( nItemId ); m_pToolBox->SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl)); m_pToolBox->StartSelection(); m_pToolBox->Show(); } SwScrollNaviPopup::~SwScrollNaviPopup() { disposeOnce(); } void SwScrollNaviPopup::dispose() { m_pToolBox.disposeAndClear(); m_pInfoField.clear(); SfxPopupWindow::dispose(); } void SwScrollNaviPopup::DataChanged( const DataChangedEvent& rDCEvt ) { if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) ApplyImageList(); Window::DataChanged( rDCEvt ); } void SwScrollNaviPopup::ApplyImageList() { ImageList& rImgLst = aIList; for(sal_uInt16 nNaviId : aNavigationInsertIds) { m_pToolBox->SetItemImage(nNaviId, rImgLst.GetImage(nNaviId)); } } IMPL_LINK(SwScrollNaviPopup, SelectHdl, ToolBox*, pSet, void) { sal_uInt16 nSet = pSet->GetCurItemId(); if( nSet != NID_PREV && nSet != NID_NEXT ) { SwView::SetMoveType(nSet); m_pToolBox->SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]); m_pToolBox->SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]); m_pInfoField->SetText(m_pToolBox->GetItemText(nSet)); // check the current button only for(sal_uInt16 i = 0; i < NID_COUNT; i++) { sal_uInt16 nItemId = m_pToolBox->GetItemId( i ); m_pToolBox->CheckItem( nItemId, nItemId == nSet ); } } else { Sequence< PropertyValue > aArgs; OUString cmd(".uno:ScrollToPrevious"); if (NID_NEXT == nSet) cmd = ".uno:ScrollToNext"; SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ), cmd, aArgs ); } } SwScrollNaviToolBox::~SwScrollNaviToolBox() { disposeOnce(); } void SwScrollNaviToolBox::dispose() { m_pNaviPopup.disposeAndClear(); ToolBox::dispose(); } void SwScrollNaviToolBox::MouseButtonUp( const MouseEvent& rMEvt ) { ToolBox::MouseButtonUp(rMEvt); if (m_pNaviPopup->IsInPopupMode()) m_pNaviPopup->EndPopupMode(FloatWinPopupEndFlags::CloseAll); } void SwScrollNaviToolBox::RequestHelp( const HelpEvent& rHEvt ) { SetItemText(NID_NEXT, SwScrollNaviPopup::GetQuickHelpText(true)); SetItemText(NID_PREV, SwScrollNaviPopup::GetQuickHelpText(false)); ToolBox::RequestHelp( rHEvt ); } OUString SwScrollNaviPopup::GetQuickHelpText(bool bNext) { sal_uInt16 nResId = STR_IMGBTN_START; nResId += SwView::GetMoveType() - NID_START; if(!bNext) nResId += NID_COUNT; return SW_RESSTR(nResId); } class SwZoomBox_Impl : public ComboBox { sal_uInt16 nSlotId; bool bRelease; public: SwZoomBox_Impl( vcl::Window* pParent, sal_uInt16 nSlot ); virtual ~SwZoomBox_Impl() override; protected: virtual void Select() override; virtual bool Notify( NotifyEvent& rNEvt ) override; void ReleaseFocus(); }; SwZoomBox_Impl::SwZoomBox_Impl( vcl::Window* pParent, sal_uInt16 nSlot ): ComboBox( pParent, SW_RES(RID_PVIEW_ZOOM_LB)), nSlotId(nSlot), bRelease(true) { EnableAutocomplete( false ); sal_uInt16 aZoomValues[] = { RID_SVXSTR_ZOOM_25 , RID_SVXSTR_ZOOM_50 , RID_SVXSTR_ZOOM_75 , RID_SVXSTR_ZOOM_100 , RID_SVXSTR_ZOOM_150 , RID_SVXSTR_ZOOM_200 , RID_SVXSTR_ZOOM_WHOLE_PAGE, RID_SVXSTR_ZOOM_PAGE_WIDTH , RID_SVXSTR_ZOOM_OPTIMAL_VIEW }; for(sal_uInt16 aZoomValue : aZoomValues) { OUString sEntry = SVX_RESSTR( aZoomValue ); InsertEntry(sEntry); } } SwZoomBox_Impl::~SwZoomBox_Impl() {} void SwZoomBox_Impl::Select() { if ( !IsTravelSelect() ) { OUString sEntry = GetText().replaceAll("%", ""); SvxZoomItem aZoom(SvxZoomType::PERCENT,100); if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_PAGE_WIDTH ) ) aZoom.SetType(SvxZoomType::PAGEWIDTH); else if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_OPTIMAL_VIEW ) ) aZoom.SetType(SvxZoomType::OPTIMAL); else if(sEntry == SVX_RESSTR( RID_SVXSTR_ZOOM_WHOLE_PAGE) ) aZoom.SetType(SvxZoomType::WHOLEPAGE); else { sal_uInt16 nZoom = (sal_uInt16)sEntry.toInt32(); if(nZoom < MINZOOM) nZoom = MINZOOM; if(nZoom > MAXZOOM) nZoom = MAXZOOM; aZoom.SetValue(nZoom); } if( FN_PREVIEW_ZOOM == nSlotId ) { SfxObjectShell* pCurrentShell = SfxObjectShell::Current(); pCurrentShell->GetDispatcher()->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::ASYNCHRON, { &aZoom }); } ReleaseFocus(); } } bool SwZoomBox_Impl::Notify( NotifyEvent& rNEvt ) { bool bHandled = false; if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) { sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); switch ( nCode ) { case KEY_RETURN: case KEY_TAB: { if ( KEY_TAB == nCode ) bRelease = false; else bHandled = true; Select(); break; } case KEY_ESCAPE: SetText( GetSavedValue() ); ReleaseFocus(); break; } } else if ( MouseNotifyEvent::LOSEFOCUS == rNEvt.GetType() ) { vcl::Window* pFocusWin = Application::GetFocusWindow(); if ( !HasFocus() && GetSubEdit() != pFocusWin ) SetText( GetSavedValue() ); } return bHandled || ComboBox::Notify( rNEvt ); } void SwZoomBox_Impl::ReleaseFocus() { if ( !bRelease ) { bRelease = true; return; } SfxViewShell* pCurSh = SfxViewShell::Current(); if ( pCurSh ) { vcl::Window* pShellWnd = pCurSh->GetWindow(); if ( pShellWnd ) pShellWnd->GrabFocus(); } } SFX_IMPL_TOOLBOX_CONTROL( SwPreviewZoomControl, SfxUInt16Item); SwPreviewZoomControl::SwPreviewZoomControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx) : SfxToolBoxControl( nSlotId, nId, rTbx ) { } SwPreviewZoomControl::~SwPreviewZoomControl() { } void SwPreviewZoomControl::StateChanged( sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState ) { sal_uInt16 nId = GetId(); GetToolBox().EnableItem( nId, (GetItemState(pState) != SfxItemState::DISABLED) ); SwZoomBox_Impl* pBox = static_cast(GetToolBox().GetItemWindow( GetId() )); if(SfxItemState::DEFAULT <= eState) { OUString sZoom(unicode::formatPercent(static_cast(pState)->GetValue(), Application::GetSettings().GetUILanguageTag())); pBox->SetText(sZoom); pBox->SaveValue(); } } VclPtr SwPreviewZoomControl::CreateItemWindow( vcl::Window *pParent ) { VclPtrInstance pRet( pParent, GetSlotId() ); return pRet.get(); } class SwJumpToSpecificBox_Impl : public NumericField { sal_uInt16 nSlotId; public: SwJumpToSpecificBox_Impl( vcl::Window* pParent, sal_uInt16 nSlot ); virtual ~SwJumpToSpecificBox_Impl() override; protected: void Select(); virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE; }; SwJumpToSpecificBox_Impl::SwJumpToSpecificBox_Impl( vcl::Window* pParent, sal_uInt16 nSlot ): NumericField( pParent, SW_RES(RID_JUMP_TO_SPEC_PAGE)), nSlotId(nSlot) {} SwJumpToSpecificBox_Impl::~SwJumpToSpecificBox_Impl() {} void SwJumpToSpecificBox_Impl::Select() { OUString sEntry(GetText()); SfxUInt16Item aPageNum(nSlotId); aPageNum.SetValue((sal_uInt16)sEntry.toInt32()); SfxObjectShell* pCurrentShell = SfxObjectShell::Current(); pCurrentShell->GetDispatcher()->ExecuteList(nSlotId, SfxCallMode::ASYNCHRON, { &aPageNum }); } bool SwJumpToSpecificBox_Impl::Notify( NotifyEvent& rNEvt ) { if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) Select(); return NumericField::Notify( rNEvt ); } SFX_IMPL_TOOLBOX_CONTROL( SwJumpToSpecificPageControl, SfxUInt16Item); SwJumpToSpecificPageControl::SwJumpToSpecificPageControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx) : SfxToolBoxControl( nSlotId, nId, rTbx ) {} SwJumpToSpecificPageControl::~SwJumpToSpecificPageControl() {} VclPtr SwJumpToSpecificPageControl::CreateItemWindow( vcl::Window *pParent ) { VclPtrInstance pRet( pParent, GetSlotId() ); return pRet.get(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */