diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-04-10 14:12:30 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-04-11 10:20:58 +0200 |
commit | bf6449230ad2b4dfb427a062663e5ff2b9ddf3b6 (patch) | |
tree | 75c9947c10b4685cb9caaaaf1b59ca3f679bcd4e /sw/source/uibase/docvw/SidebarWin.cxx | |
parent | 9fa75f677a7b48a2177fe11cca0d00f5a2deb7da (diff) |
loplugin:mergeclasses merge SwAnnotationWin and SwSidebarWin
Change-Id: Idaf7d7e8e4da37e0ba423dca3e22dc6711ba806a
Reviewed-on: https://gerrit.libreoffice.org/36380
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sw/source/uibase/docvw/SidebarWin.cxx')
-rw-r--r-- | sw/source/uibase/docvw/SidebarWin.cxx | 1638 |
1 files changed, 0 insertions, 1638 deletions
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx deleted file mode 100644 index 7c3d69c7d69e..000000000000 --- a/sw/source/uibase/docvw/SidebarWin.cxx +++ /dev/null @@ -1,1638 +0,0 @@ -/* -*- 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 <sal/config.h> - -#include <cstddef> -#include <cstdlib> - -#include <SidebarWin.hxx> -#include <SidebarWinAcc.hxx> -#include <PostItMgr.hxx> -#include <basegfx/range/b2drange.hxx> -#include <comphelper/string.hxx> -#include <SidebarTxtControl.hxx> -#include <SidebarScrollBar.hxx> -#include <AnchorOverlayObject.hxx> -#include <ShadowOverlayObject.hxx> -#include <OverlayRanges.hxx> - -#include <annotation.hrc> -#include <popup.hrc> -#include <docvw.hrc> -#include <app.hrc> -#include <access.hrc> - -#include <viewopt.hxx> -#include <cmdid.h> - -#include <editeng/fontitem.hxx> -#include <editeng/fhgtitem.hxx> -#include <editeng/langitem.hxx> -#include <editeng/editview.hxx> -#include <editeng/outliner.hxx> -#include <editeng/editeng.hxx> -#include <editeng/eeitem.hxx> - -#include <svl/zforlist.hxx> -#include <svl/undo.hxx> -#include <svl/stritem.hxx> - -#include <sfx2/viewfrm.hxx> -#include <sfx2/bindings.hxx> -#include <sfx2/dispatch.hxx> - -#include <vcl/scrbar.hxx> -#include <vcl/svapp.hxx> -#include <vcl/menubtn.hxx> -#include <vcl/settings.hxx> - -#include <edtwin.hxx> -#include <view.hxx> -#include <docsh.hxx> -#include <wrtsh.hxx> -#include <doc.hxx> -#include <swmodule.hxx> -#include <langhelper.hxx> - -#include <txtannotationfld.hxx> -#include <ndtxt.hxx> - -#include <sw_primitivetypes2d.hxx> -#include <drawinglayer/processor2d/baseprocessor2d.hxx> -#include <drawinglayer/primitive2d/primitivetools2d.hxx> -#include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx> -#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> -#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> -#include <drawinglayer/processor2d/processorfromoutputdevice.hxx> -#include <drawinglayer/primitive2d/shadowprimitive2d.hxx> -#include <memory> -#include <comphelper/lok.hxx> -#include <IDocumentDrawModelAccess.hxx> -#include <drawdoc.hxx> - -namespace -{ - -/// Translate absolute <-> relative twips: LOK wants absolute coordinates as output and gives absolute coordinates as input. -void lcl_translateTwips(vcl::Window& rParent, vcl::Window& rChild, MouseEvent* pMouseEvent) -{ - // Set map mode, so that callback payloads will contain absolute coordinates instead of relative ones. - Point aOffset(rChild.GetOutOffXPixel() - rParent.GetOutOffXPixel(), rChild.GetOutOffYPixel() - rParent.GetOutOffYPixel()); - if (!rChild.IsMapModeEnabled()) - { - MapMode aMapMode(rChild.GetMapMode()); - aMapMode.SetMapUnit(MapUnit::MapTwip); - aMapMode.SetScaleX(rParent.GetMapMode().GetScaleX()); - aMapMode.SetScaleY(rParent.GetMapMode().GetScaleY()); - rChild.SetMapMode(aMapMode); - rChild.EnableMapMode(); - } - aOffset = rChild.PixelToLogic(aOffset); - MapMode aMapMode(rChild.GetMapMode()); - aMapMode.SetOrigin(aOffset); - aMapMode.SetMapUnit(rParent.GetMapMode().GetMapUnit()); - rChild.SetMapMode(aMapMode); - rChild.EnableMapMode(false); - - if (pMouseEvent) - { - // Set event coordinates, so they contain relative coordinates instead of absolute ones. - Point aPos = pMouseEvent->GetPosPixel(); - aPos.Move(-aOffset.getX(), -aOffset.getY()); - MouseEvent aMouseEvent(aPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(), pMouseEvent->GetButtons(), pMouseEvent->GetModifier()); - *pMouseEvent = aMouseEvent; - } -} - -/// Decide which one from the children of rParent should get rMouseEvent. -vcl::Window* lcl_getHitWindow(sw::sidebarwindows::SwSidebarWin& rParent, const MouseEvent& rMouseEvent) -{ - vcl::Window* pRet = nullptr; - - rParent.EditWin().Push(PushFlags::MAPMODE); - rParent.EditWin().EnableMapMode(); - for (sal_Int16 i = rParent.GetChildCount() - 1; i >= 0; --i) - { - vcl::Window* pChild = rParent.GetChild(i); - - Point aPosition(rParent.GetPosPixel()); - aPosition.Move(pChild->GetPosPixel().getX(), pChild->GetPosPixel().getY()); - Size aSize(rParent.GetSizePixel()); - tools::Rectangle aRectangleLogic(rParent.EditWin().PixelToLogic(aPosition), rParent.EditWin().PixelToLogic(aSize)); - if (aRectangleLogic.IsInside(rMouseEvent.GetPosPixel())) - { - pRet = pChild; - break; - } - } - rParent.EditWin().Pop(); - return pRet; -} - -} - -namespace sw { namespace sidebarwindows { - -#define METABUTTON_WIDTH 16 -#define METABUTTON_HEIGHT 18 -#define METABUTTON_AREA_WIDTH 30 -#define POSTIT_META_HEIGHT (sal_Int32) 30 -#define POSTIT_MINIMUMSIZE_WITHOUT_META 50 - -SwSidebarWin::SwSidebarWin(SwEditWin& rEditWin, - WinBits nBits, - SwPostItMgr& aMgr, - SwSidebarItem& rSidebarItem) - : Window(&rEditWin, nBits) - , mrMgr(aMgr) - , mrView(rEditWin.GetView()) - , mnEventId(nullptr) - , mpOutlinerView(nullptr) - , mpOutliner(nullptr) - , mpSidebarTextControl(nullptr) - , mpVScrollbar(nullptr) - , mpMetadataAuthor(nullptr) - , mpMetadataDate(nullptr) - , mpMenuButton(nullptr) - , mpAnchor(nullptr) - , mpShadow(nullptr) - , mpTextRangeOverlay(nullptr) - , mColorAnchor() - , mColorDark() - , mColorLight() - , mChangeColor() - , meSidebarPosition(sw::sidebarwindows::SidebarPosition::NONE) - , mPosSize() - , mAnchorRect() - , mPageBorder(0) - , mbAnchorRectChanged(false) - , mbMouseOver(false) - , mLayoutStatus(SwPostItHelper::INVISIBLE) - , mbReadonly(false) - , mbIsFollow(false) - , mrSidebarItem(rSidebarItem) - , mpAnchorFrame(rSidebarItem.maLayoutInfo.mpAnchorFrame) -{ - mpShadow = ShadowOverlayObject::CreateShadowOverlayObject( mrView ); - if ( mpShadow ) - { - mpShadow->setVisible(false); - } - - mrMgr.ConnectSidebarWinToFrame( *(mrSidebarItem.maLayoutInfo.mpAnchorFrame), - mrSidebarItem.GetFormatField(), - *this ); -} - -SwSidebarWin::~SwSidebarWin() -{ - disposeOnce(); -} - -void SwSidebarWin::dispose() -{ - if (IsDisposed()) - return; - - mrMgr.DisconnectSidebarWinFromFrame( *(mrSidebarItem.maLayoutInfo.mpAnchorFrame), - *this ); - - Disable(); - - if ( mpSidebarTextControl ) - { - if ( mpOutlinerView ) - { - mpOutlinerView->SetWindow( nullptr ); - } - } - mpSidebarTextControl.disposeAndClear(); - - if ( mpOutlinerView ) - { - delete mpOutlinerView; - mpOutlinerView = nullptr; - } - - if (mpOutliner) - { - delete mpOutliner; - mpOutliner = nullptr; - } - - if (mpMetadataAuthor) - { - mpMetadataAuthor->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - } - mpMetadataAuthor.disposeAndClear(); - - if (mpMetadataDate) - { - mpMetadataDate->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - } - mpMetadataDate.disposeAndClear(); - - if (mpVScrollbar) - { - mpVScrollbar->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - } - mpVScrollbar.disposeAndClear(); - - RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - - AnchorOverlayObject::DestroyAnchorOverlayObject( mpAnchor ); - mpAnchor = nullptr; - - ShadowOverlayObject::DestroyShadowOverlayObject( mpShadow ); - mpShadow = nullptr; - - delete mpTextRangeOverlay; - mpTextRangeOverlay = nullptr; - - mpMenuButton.disposeAndClear(); - - if (mnEventId) - Application::RemoveUserEvent( mnEventId ); - - vcl::Window::dispose(); -} - -void SwSidebarWin::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) -{ - Window::Paint(rRenderContext, rRect); - - if (mpMetadataAuthor->IsVisible()) - { - //draw left over space - if (Application::GetSettings().GetStyleSettings().GetHighContrastMode()) - { - rRenderContext.SetFillColor(COL_BLACK); - } - else - { - rRenderContext.SetFillColor(mColorDark); - } - - rRenderContext.SetLineColor(); - tools::Rectangle aRectangle(Point(mpMetadataAuthor->GetPosPixel().X() + mpMetadataAuthor->GetSizePixel().Width(), - mpMetadataAuthor->GetPosPixel().Y()), - Size(GetMetaButtonAreaWidth(), - mpMetadataAuthor->GetSizePixel().Height() + mpMetadataDate->GetSizePixel().Height())); - - if (comphelper::LibreOfficeKit::isActive()) - aRectangle = rRect; - else - aRectangle = PixelToLogic(aRectangle); - rRenderContext.DrawRect(aRectangle); - } -} - -void SwSidebarWin::PaintTile(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) -{ - Paint(rRenderContext, rRect); - - for (sal_uInt16 i = 0; i < GetChildCount(); ++i) - { - vcl::Window* pChild = GetChild(i); - - // No point in showing this button till click on it are not handled. - if (pChild == mpMenuButton.get()) - continue; - - if (!pChild->IsVisible()) - continue; - - rRenderContext.Push(PushFlags::MAPMODE); - Point aOffset(PixelToLogic(pChild->GetPosPixel())); - MapMode aMapMode(rRenderContext.GetMapMode()); - aMapMode.SetOrigin(aMapMode.GetOrigin() + aOffset); - rRenderContext.SetMapMode(aMapMode); - - bool bPopChild = false; - if (pChild->GetMapMode().GetMapUnit() != rRenderContext.GetMapMode().GetMapUnit()) - { - // This is needed for the scrollbar that has its map unit in pixels. - pChild->Push(PushFlags::MAPMODE); - bPopChild = true; - pChild->EnableMapMode(); - aMapMode = pChild->GetMapMode(); - aMapMode.SetMapUnit(rRenderContext.GetMapMode().GetMapUnit()); - aMapMode.SetScaleX(rRenderContext.GetMapMode().GetScaleX()); - aMapMode.SetScaleY(rRenderContext.GetMapMode().GetScaleY()); - pChild->SetMapMode(aMapMode); - } - - pChild->Paint(rRenderContext, rRect); - - if (bPopChild) - pChild->Pop(); - rRenderContext.Pop(); - } - - const drawinglayer::geometry::ViewInformation2D aViewInformation; - std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(rRenderContext, aViewInformation)); - - // drawinglayer sets the map mode to pixels, not needed here. - rRenderContext.Pop(); - // Work in document-global twips. - rRenderContext.Pop(); - if (mpAnchor) - pProcessor->process(mpAnchor->getOverlayObjectPrimitive2DSequence()); - if (mpTextRangeOverlay) - pProcessor->process(mpTextRangeOverlay->getOverlayObjectPrimitive2DSequence()); - - rRenderContext.Push(PushFlags::NONE); - pProcessor.reset(); - rRenderContext.Push(PushFlags::NONE); -} - -bool SwSidebarWin::IsHitWindow(const Point& rPointLogic) -{ - tools::Rectangle aRectangleLogic(EditWin().PixelToLogic(GetPosPixel()), EditWin().PixelToLogic(GetSizePixel())); - return aRectangleLogic.IsInside(rPointLogic); -} - -void SwSidebarWin::SetCursorLogicPosition(const Point& rPosition, bool bPoint, bool bClearMark) -{ - mpSidebarTextControl->Push(PushFlags::MAPMODE); - MouseEvent aMouseEvent(rPosition); - lcl_translateTwips(EditWin(), *mpSidebarTextControl, &aMouseEvent); - Point aPosition(aMouseEvent.GetPosPixel()); - - EditView& rEditView = GetOutlinerView()->GetEditView(); - rEditView.SetCursorLogicPosition(aPosition, bPoint, bClearMark); - - mpSidebarTextControl->Pop(); -} - -void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, DrawFlags nInFlags) -{ - if (mpMetadataAuthor->IsVisible() ) - { - pDev->SetFillColor(mColorDark); - pDev->SetLineColor(); - pDev->DrawRect( tools::Rectangle( rPt, rSz ) ); - } - - if (mpMetadataAuthor->IsVisible()) - { - vcl::Font aOrigFont(mpMetadataAuthor->GetControlFont()); - Size aSize(PixelToLogic(mpMetadataAuthor->GetSizePixel())); - Point aPos(PixelToLogic(mpMetadataAuthor->GetPosPixel())); - aPos += rPt; - vcl::Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() ); - mpMetadataAuthor->SetControlFont( aFont ); - mpMetadataAuthor->Draw(pDev, aPos, aSize, nInFlags); - mpMetadataAuthor->SetControlFont( aOrigFont ); - } - - if (mpMetadataDate->IsVisible()) - { - vcl::Font aOrigFont(mpMetadataDate->GetControlFont()); - Size aSize(PixelToLogic(mpMetadataDate->GetSizePixel())); - Point aPos(PixelToLogic(mpMetadataDate->GetPosPixel())); - aPos += rPt; - vcl::Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); - mpMetadataDate->SetControlFont( aFont ); - mpMetadataDate->Draw(pDev, aPos, aSize, nInFlags); - mpMetadataDate->SetControlFont( aOrigFont ); - } - - mpSidebarTextControl->Draw(pDev, rPt, rSz, nInFlags); - - const drawinglayer::geometry::ViewInformation2D aNewViewInfos; - std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor( - drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice( - *pDev, aNewViewInfos )); - - if (mpAnchor) - pProcessor->process(mpAnchor->getOverlayObjectPrimitive2DSequence()); - if (mpTextRangeOverlay) - pProcessor->process(mpTextRangeOverlay->getOverlayObjectPrimitive2DSequence()); - pProcessor.reset(); - - if (mpVScrollbar->IsVisible()) - { - vcl::Font aOrigFont(mpMetadataDate->GetControlFont()); - Color aOrigBg( mpMetadataDate->GetControlBackground() ); - OUString sOrigText(mpMetadataDate->GetText()); - - Size aSize(PixelToLogic(mpMenuButton->GetSizePixel())); - Point aPos(PixelToLogic(mpMenuButton->GetPosPixel())); - aPos += rPt; - - vcl::Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); - mpMetadataDate->SetControlFont( aFont ); - mpMetadataDate->SetControlBackground( 0xFFFFFF ); - mpMetadataDate->SetText("..."); - mpMetadataDate->Draw(pDev, aPos, aSize, nInFlags); - - mpMetadataDate->SetText(sOrigText); - mpMetadataDate->SetControlFont( aOrigFont ); - mpMetadataDate->SetControlBackground( aOrigBg ); - } -} - -void SwSidebarWin::KeyInput(const KeyEvent& rKeyEvent) -{ - if (mpSidebarTextControl) - { - mpSidebarTextControl->Push(PushFlags::MAPMODE); - lcl_translateTwips(EditWin(), *mpSidebarTextControl, nullptr); - - mpSidebarTextControl->KeyInput(rKeyEvent); - - mpSidebarTextControl->Pop(); - } -} - -void SwSidebarWin::MouseMove(const MouseEvent& rMouseEvent) -{ - if (vcl::Window* pHit = lcl_getHitWindow(*this, rMouseEvent)) - { - pHit->Push(PushFlags::MAPMODE); - MouseEvent aMouseEvent(rMouseEvent); - lcl_translateTwips(EditWin(), *pHit, &aMouseEvent); - - pHit->MouseMove(aMouseEvent); - - pHit->Pop(); - } -} - -void SwSidebarWin::MouseButtonDown(const MouseEvent& rMouseEvent) -{ - if (vcl::Window* pHit = lcl_getHitWindow(*this, rMouseEvent)) - { - pHit->Push(PushFlags::MAPMODE); - MouseEvent aMouseEvent(rMouseEvent); - lcl_translateTwips(EditWin(), *pHit, &aMouseEvent); - - pHit->MouseButtonDown(aMouseEvent); - - pHit->Pop(); - } -} - -void SwSidebarWin::MouseButtonUp(const MouseEvent& rMouseEvent) -{ - if (vcl::Window* pHit = lcl_getHitWindow(*this, rMouseEvent)) - { - pHit->Push(PushFlags::MAPMODE); - MouseEvent aMouseEvent(rMouseEvent); - lcl_translateTwips(EditWin(), *pHit, &aMouseEvent); - - pHit->MouseButtonUp(aMouseEvent); - - pHit->Pop(); - } -} - -void SwSidebarWin::SetPosSizePixelRect(long nX, long nY, long nWidth, long nHeight, - const SwRect& aAnchorRect, const long aPageBorder) -{ - mPosSize = tools::Rectangle(Point(nX,nY),Size(nWidth,nHeight)); - if (!mAnchorRect.IsEmpty() && mAnchorRect != aAnchorRect) - mbAnchorRectChanged = true; - mAnchorRect = aAnchorRect; - mPageBorder = aPageBorder; -} - -void SwSidebarWin::SetSize( const Size& rNewSize ) -{ - mPosSize.SetSize(rNewSize); -} - -void SwSidebarWin::SetVirtualPosSize( const Point& aPoint, const Size& aSize) -{ - mPosSize = tools::Rectangle(aPoint,aSize); -} - -void SwSidebarWin::TranslateTopPosition(const long aAmount) -{ - mPosSize.Move(0,aAmount); -} - -void SwSidebarWin::ShowAnchorOnly(const Point &aPoint) -{ - HideNote(); - SetPosAndSize(); - if (mpAnchor) - { - mpAnchor->SetSixthPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y())); - mpAnchor->SetSeventhPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y())); - mpAnchor->SetAnchorState(AnchorState::All); - mpAnchor->setVisible(true); - } - if (mpShadow) - mpShadow->setVisible(false); -} - -SfxItemSet SwSidebarWin::DefaultItem() -{ - SfxItemSet aItem( mrView.GetDocShell()->GetPool() ); - aItem.Put(SvxFontHeightItem(200,100,EE_CHAR_FONTHEIGHT)); - return aItem; -} - -void SwSidebarWin::InitControls() -{ - AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - - // actual window which holds the user text - mpSidebarTextControl = VclPtr<SidebarTextControl>::Create( *this, - WB_NODIALOGCONTROL, - mrView, mrMgr ); - mpSidebarTextControl->SetPointer(Pointer(PointerStyle::Text)); - - // window controls for author and date - mpMetadataAuthor = VclPtr<Edit>::Create( this, 0 ); - mpMetadataAuthor->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_AUTHOR_NAME ) ); - mpMetadataAuthor->EnableRTL(AllSettings::GetLayoutRTL()); - mpMetadataAuthor->SetReadOnly(); - mpMetadataAuthor->AlwaysDisableInput(true); - mpMetadataAuthor->SetCallHandlersOnInputDisabled(true); - mpMetadataAuthor->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - // we should leave this setting alone, but for this we need a better layout algo - // with variable meta size height - { - AllSettings aSettings = mpMetadataAuthor->GetSettings(); - StyleSettings aStyleSettings = aSettings.GetStyleSettings(); - vcl::Font aFont = aStyleSettings.GetFieldFont(); - aFont.SetFontHeight(8); - aStyleSettings.SetFieldFont(aFont); - aSettings.SetStyleSettings(aStyleSettings); - mpMetadataAuthor->SetSettings(aSettings); - } - - mpMetadataDate = VclPtr<Edit>::Create( this, 0 ); - mpMetadataDate->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_DATE_NAME ) ); - mpMetadataDate->EnableRTL(AllSettings::GetLayoutRTL()); - mpMetadataDate->SetReadOnly(); - mpMetadataDate->AlwaysDisableInput(true); - mpMetadataDate->SetCallHandlersOnInputDisabled(true); - mpMetadataDate->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - // we should leave this setting alone, but for this we need a better layout algo - // with variable meta size height - { - AllSettings aSettings = mpMetadataDate->GetSettings(); - StyleSettings aStyleSettings = aSettings.GetStyleSettings(); - vcl::Font aFont = aStyleSettings.GetFieldFont(); - aFont.SetFontHeight(8); - aStyleSettings.SetFieldFont(aFont); - aSettings.SetStyleSettings(aStyleSettings); - mpMetadataDate->SetSettings(aSettings); - } - - SwDocShell* aShell = mrView.GetDocShell(); - mpOutliner = new Outliner(&aShell->GetPool(),OutlinerMode::TextObject); - aShell->GetDoc()->SetCalcFieldValueHdl( mpOutliner ); - mpOutliner->SetUpdateMode( true ); - Rescale(); - - mpSidebarTextControl->EnableRTL( false ); - mpOutlinerView = new OutlinerView ( mpOutliner, mpSidebarTextControl ); - mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT); - mpOutliner->InsertView(mpOutlinerView ); - mpOutlinerView->SetOutputArea( PixelToLogic( tools::Rectangle(0,0,1,1) ) ); - - mpOutlinerView->SetAttribs(DefaultItem()); - - if (comphelper::LibreOfficeKit::isActive()) - { - // If there is a callback already registered, inform the new outliner view about it. - mpOutlinerView->RegisterViewShell(&mrView); - } - - //create Scrollbars - mpVScrollbar = VclPtr<SidebarScrollBar>::Create(*this, WB_3DLOOK |WB_VSCROLL|WB_DRAG, mrView); - mpVScrollbar->EnableNativeWidget(false); - mpVScrollbar->EnableRTL( false ); - mpVScrollbar->SetScrollHdl(LINK(this, SwSidebarWin, ScrollHdl)); - mpVScrollbar->EnableDrag(); - mpVScrollbar->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); - - const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); - EEControlBits nCntrl = mpOutliner->GetControlWord(); - // TODO: crash when AUTOCOMPLETE enabled - nCntrl |= EEControlBits::MARKFIELDS | EEControlBits::PASTESPECIAL | EEControlBits::AUTOCORRECT | EEControlBits::USECHARATTRIBS; // | EEControlBits::AUTOCOMPLETE; - if (SwViewOption::IsFieldShadings()) - nCntrl |= EEControlBits::MARKFIELDS; - else - nCntrl &= ~EEControlBits::MARKFIELDS; - if (pVOpt->IsOnlineSpell()) - nCntrl |= EEControlBits::ONLINESPELLING; - else - nCntrl &= ~EEControlBits::ONLINESPELLING; - mpOutliner->SetControlWord(nCntrl); - - std::size_t aIndex = SW_MOD()->InsertRedlineAuthor(GetAuthor()); - SetColor( SwPostItMgr::GetColorDark(aIndex), - SwPostItMgr::GetColorLight(aIndex), - SwPostItMgr::GetColorAnchor(aIndex)); - - CheckMetaText(); - - mpMenuButton = CreateMenuButton(); - - SetLanguage(GetLanguage()); - GetOutlinerView()->StartSpeller(); - SetPostItText(); - Engine()->CompleteOnlineSpelling(); - - mpSidebarTextControl->Show(); - mpMetadataAuthor->Show(); - mpMetadataDate->Show(); - mpVScrollbar->Show(); -} - -void SwSidebarWin::CheckMetaText() -{ - const SvtSysLocale aSysLocale; - const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData(); - OUString sMeta = GetAuthor(); - if (sMeta.isEmpty()) - { - sMeta = SW_RESSTR(STR_NOAUTHOR); - } - else if (sMeta.getLength() > 23) - { - sMeta = sMeta.copy(0, 20) + "..."; - } - if ( mpMetadataAuthor->GetText() != sMeta ) - { - mpMetadataAuthor->SetText(sMeta); - } - - Date aDate = GetDate(); - if (aDate.IsValidAndGregorian() ) - { - sMeta = rLocalData.getDate(aDate); - } - else - { - sMeta = SW_RESSTR(STR_NODATE); - } - if (GetTime()!=0) - { - sMeta += " " + rLocalData.getTime( GetTime(),false ); - } - if ( mpMetadataDate->GetText() != sMeta ) - { - mpMetadataDate->SetText(sMeta); - } -} - -void SwSidebarWin::Rescale() -{ - MapMode aMode = GetParent()->GetMapMode(); - aMode.SetOrigin( Point() ); - mpOutliner->SetRefMapMode( aMode ); - SetMapMode( aMode ); - mpSidebarTextControl->SetMapMode( aMode ); - const Fraction& rFraction = mrView.GetWrtShellPtr()->GetOut()->GetMapMode().GetScaleY(); - if ( mpMetadataAuthor ) - { - vcl::Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() ); - sal_Int32 nHeight = aFont.GetFontHeight(); - nHeight = nHeight * rFraction.GetNumerator() / rFraction.GetDenominator(); - aFont.SetFontHeight( nHeight ); - mpMetadataAuthor->SetControlFont( aFont ); - } - if ( mpMetadataDate ) - { - vcl::Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); - sal_Int32 nHeight = aFont.GetFontHeight(); - nHeight = nHeight * rFraction.GetNumerator() / rFraction.GetDenominator(); - aFont.SetFontHeight( nHeight ); - mpMetadataDate->SetControlFont( aFont ); - } -} - -void SwSidebarWin::SetPosAndSize() -{ - bool bChange = false; - - if (GetSizePixel() != mPosSize.GetSize()) - { - bChange = true; - SetSizePixel(mPosSize.GetSize()); - - if (comphelper::LibreOfficeKit::isActive()) - { - // Position is not yet set at VCL level, but the map mode should - // contain the right origin to emit the correct cursor position. - mpSidebarTextControl->Push(PushFlags::MAPMODE); - Point aOffset(mPosSize.Left(), mPosSize.Top()); - aOffset = PixelToLogic(aOffset); - MapMode aMapMode(mpSidebarTextControl->GetMapMode()); - aMapMode.SetOrigin(aOffset); - mpSidebarTextControl->SetMapMode(aMapMode); - mpSidebarTextControl->EnableMapMode(false); - } - - DoResize(); - - if (comphelper::LibreOfficeKit::isActive()) - mpSidebarTextControl->Pop(); - } - - if (GetPosPixel().X() != mPosSize.TopLeft().X() || (std::abs(GetPosPixel().Y() - mPosSize.TopLeft().Y()) > 5) ) - { - bChange = true; - SetPosPixel(mPosSize.TopLeft()); - - Point aLineStart; - Point aLineEnd ; - switch ( meSidebarPosition ) - { - case sw::sidebarwindows::SidebarPosition::LEFT: - { - aLineStart = EditWin().PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) ); - aLineEnd = EditWin().PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) ); - } - break; - case sw::sidebarwindows::SidebarPosition::RIGHT: - { - aLineStart = EditWin().PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) ); - aLineEnd = EditWin().PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) ); - } - break; - default: - OSL_FAIL( "<SwSidebarWin::SetPosAndSize()> - unexpected position of sidebar" ); - break; - } - - // LOK has map mode disabled, and we still want to perform pixel -> - // twips conversion for the size of the line above the note. - if (comphelper::LibreOfficeKit::isActive() && !EditWin().IsMapModeEnabled()) - { - EditWin().EnableMapMode(); - Size aSize(aLineEnd.getX() - aLineStart.getX(), aLineEnd.getY() - aLineStart.getY()); - aSize = EditWin().PixelToLogic(aSize); - aLineEnd = aLineStart; - aLineEnd.Move(aSize.getWidth(), aSize.getHeight()); - EditWin().EnableMapMode(false); - } - - if (mpAnchor) - { - mpAnchor->SetAllPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15), - basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15), - basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15), - basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15), - basegfx::B2DPoint( mPageBorder ,mAnchorRect.Bottom()+2*15), - basegfx::B2DPoint( aLineStart.X(),aLineStart.Y()), - basegfx::B2DPoint( aLineEnd.X(),aLineEnd.Y())); - mpAnchor->SetHeight(mAnchorRect.Height()); - } - else - { - mpAnchor = AnchorOverlayObject::CreateAnchorOverlayObject( mrView, - mAnchorRect, - mPageBorder, - aLineStart, - aLineEnd, - mColorAnchor ); - if ( mpAnchor ) - { - mpAnchor->SetHeight(mAnchorRect.Height()); - mpAnchor->setVisible(true); - mpAnchor->SetAnchorState(AnchorState::Tri); - if (HasChildPathFocus()) - { - mpAnchor->setLineSolid(true); - } - } - } - } - else - { - if ( mpAnchor && - ( mpAnchor->getBasePosition() != basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom()-5*15) ) ) - { - mpAnchor->SetTriPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15), - basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15), - basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15), - basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15), - basegfx::B2DPoint( mPageBorder , mAnchorRect.Bottom()+2*15)); - } - } - - if (bChange) - { - Point aStart = EditWin().PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height())); - Point aEnd = EditWin().PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height())); - mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y())); - } - - if (mrMgr.ShowNotes()) - { - if (IsFollow() && !HasChildPathFocus()) - { - // #i111964# - if ( mpAnchor ) - { - mpAnchor->SetAnchorState(AnchorState::End); - } - } - else - { - // #i111964# - if ( mpAnchor ) - { - mpAnchor->SetAnchorState(AnchorState::All); - } - SwSidebarWin* pWin = GetTopReplyNote(); - // #i111964# - if ( pWin && pWin->Anchor() ) - { - pWin->Anchor()->SetAnchorState(AnchorState::End); - } - } - } - - - // text range overlay - maAnnotationTextRanges.clear(); - if ( mrSidebarItem.maLayoutInfo.mnStartNodeIdx != 0 - && mrSidebarItem.maLayoutInfo.mnStartContent != -1 ) - { - const SwTextAnnotationField* pTextAnnotationField = - dynamic_cast< const SwTextAnnotationField* >( mrSidebarItem.GetFormatField().GetTextField() ); - SwTextNode* pTextNode = pTextAnnotationField ? pTextAnnotationField->GetpTextNode() : nullptr; - SwContentNode* pContentNd = nullptr; - if (pTextNode) - { - SwNodes& rNds = pTextNode->GetDoc()->GetNodes(); - pContentNd = rNds[mrSidebarItem.maLayoutInfo.mnStartNodeIdx]->GetContentNode(); - } - if (pContentNd) - { - SwPosition aStartPos( *pContentNd, mrSidebarItem.maLayoutInfo.mnStartContent ); - SwShellCursor* pTmpCursor = nullptr; - const bool bTableCursorNeeded = pTextNode->FindTableBoxStartNode() != pContentNd->FindTableBoxStartNode(); - if ( bTableCursorNeeded ) - { - SwShellTableCursor* pTableCursor = new SwShellTableCursor( DocView().GetWrtShell(), aStartPos ); - pTableCursor->SetMark(); - pTableCursor->GetMark()->nNode = *pTextNode; - pTableCursor->GetMark()->nContent.Assign( pTextNode, pTextAnnotationField->GetStart()+1 ); - pTableCursor->NewTableSelection(); - pTmpCursor = pTableCursor; - } - else - { - SwShellCursor* pCursor = new SwShellCursor( DocView().GetWrtShell(), aStartPos ); - pCursor->SetMark(); - pCursor->GetMark()->nNode = *pTextNode; - pCursor->GetMark()->nContent.Assign( pTextNode, pTextAnnotationField->GetStart()+1 ); - pTmpCursor = pCursor; - } - std::unique_ptr<SwShellCursor> pTmpCursorForAnnotationTextRange( pTmpCursor ); - - // For annotation text range rectangles to be calculated correctly, - // we need the map mode disabled - bool bDisableMapMode = comphelper::LibreOfficeKit::isActive() && EditWin().IsMapModeEnabled(); - if (bDisableMapMode) - EditWin().EnableMapMode(false); - - pTmpCursorForAnnotationTextRange->FillRects(); - - if (bDisableMapMode) - EditWin().EnableMapMode(); - - SwRects* pRects(pTmpCursorForAnnotationTextRange.get()); - for(SwRect & rNextRect : *pRects) - { - const tools::Rectangle aPntRect(rNextRect.SVRect()); - maAnnotationTextRanges.push_back(basegfx::B2DRange( - aPntRect.Left(), aPntRect.Top(), - aPntRect.Right() + 1, aPntRect.Bottom() + 1)); - } - } - } - - if (mrMgr.ShowNotes() && !maAnnotationTextRanges.empty()) - { - if ( mpTextRangeOverlay != nullptr ) - { - mpTextRangeOverlay->setRanges( maAnnotationTextRanges ); - if ( mpAnchor != nullptr && mpAnchor->getLineSolid() ) - { - mpTextRangeOverlay->ShowSolidBorder(); - } - else - { - mpTextRangeOverlay->HideSolidBorder(); - } - } - else if (!IsFollow()) - { - // This window is not a reply, then draw its range overlay. - mpTextRangeOverlay = - sw::overlay::OverlayRanges::CreateOverlayRange( - DocView(), - mColorAnchor, - maAnnotationTextRanges, - mpAnchor && mpAnchor->getLineSolid() ); - } - } - else - { - delete mpTextRangeOverlay; - mpTextRangeOverlay = nullptr; - } -} - -void SwSidebarWin::DoResize() -{ - long aTextHeight = LogicToPixel( mpOutliner->CalcTextSize()).Height(); - long aHeight = GetSizePixel().Height(); - unsigned long aWidth = GetSizePixel().Width(); - - aHeight -= GetMetaHeight(); - mpMetadataAuthor->Show(); - mpMetadataDate->Show(); - mpSidebarTextControl->SetQuickHelpText(OUString()); - - if (aTextHeight > aHeight) - { // we need vertical scrollbars and have to reduce the width - aWidth -= GetScrollbarWidth(); - mpVScrollbar->Show(); - } - else - { - mpVScrollbar->Hide(); - } - - { - const Size aSizeOfMetadataControls( GetSizePixel().Width() - GetMetaButtonAreaWidth(), - GetMetaHeight()/2 ); - mpMetadataAuthor->setPosSizePixel( 0, - aHeight, - aSizeOfMetadataControls.Width(), - aSizeOfMetadataControls.Height() ); - mpMetadataDate->setPosSizePixel( 0, - aHeight + aSizeOfMetadataControls.Height(), - aSizeOfMetadataControls.Width(), - aSizeOfMetadataControls.Height() ); - } - - mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ; - if (!mpVScrollbar->IsVisible()) - { // if we do not have a scrollbar anymore, we want to see the complete text - mpOutlinerView->SetVisArea( PixelToLogic( tools::Rectangle(0,0,aWidth,aHeight) ) ); - } - mpOutlinerView->SetOutputArea( PixelToLogic( tools::Rectangle(0,0,aWidth,aHeight) ) ); - - if (!AllSettings::GetLayoutRTL()) - { - mpSidebarTextControl->setPosSizePixel(0, 0, aWidth, aHeight); - mpVScrollbar->setPosSizePixel( aWidth, 0, GetScrollbarWidth(), aHeight); - } - else - { - mpSidebarTextControl->setPosSizePixel( ( aTextHeight > aHeight ? GetScrollbarWidth() : 0 ), 0, - aWidth, aHeight); - mpVScrollbar->setPosSizePixel( 0, 0, GetScrollbarWidth(), aHeight); - } - - mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() ); - mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 ); - mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 ); - SetScrollbar(); - mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight())); - - //calculate rects for meta- button - const Fraction& fx( GetMapMode().GetScaleX() ); - const Fraction& fy( GetMapMode().GetScaleY() ); - - const Point aPos( mpMetadataAuthor->GetPosPixel()); - mpMenuButton->setPosSizePixel( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10)*fx.GetNumerator()/fx.GetDenominator(), - aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator(), - METABUTTON_WIDTH*fx.GetNumerator()/fx.GetDenominator(), - METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ); -} - -void SwSidebarWin::SetSizePixel( const Size& rNewSize ) -{ - Window::SetSizePixel(rNewSize); - - if (mpShadow) - { - Point aStart = EditWin().PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height())); - Point aEnd = EditWin().PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height())); - mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y())); - } -} - -void SwSidebarWin::SetScrollbar() -{ - mpVScrollbar->SetThumbPos(mpOutlinerView->GetVisArea().Top()); -} - -void SwSidebarWin::ResizeIfNecessary(long aOldHeight, long aNewHeight) -{ - if (aOldHeight != aNewHeight) - { - //check for lower border or next note - long aBorder = mrMgr.GetNextBorder(); - if (aBorder != -1) - { - if (aNewHeight > GetMinimumSizeWithoutMeta()) - { - long aNewLowerValue = GetPosPixel().Y() + aNewHeight + GetMetaHeight(); - if (aNewLowerValue < aBorder) - SetSizePixel(Size(GetSizePixel().Width(),aNewHeight+GetMetaHeight())); - else - SetSizePixel(Size(GetSizePixel().Width(),aBorder - GetPosPixel().Y())); - DoResize(); - Invalidate(); - } - else - { - if (GetSizePixel().Height() != GetMinimumSizeWithoutMeta() + GetMetaHeight()) - SetSizePixel(Size(GetSizePixel().Width(),GetMinimumSizeWithoutMeta() + GetMetaHeight())); - DoResize(); - Invalidate(); - } - } - else - { - DoResize(); - Invalidate(); - } - } - else - { - SetScrollbar(); - } -} - -void SwSidebarWin::SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor) -{ - mColorDark = aColorDark; - mColorLight = aColorLight; - mColorAnchor = aColorAnchor; - - if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) - { - { - mpMetadataAuthor->SetControlBackground(mColorDark); - AllSettings aSettings = mpMetadataAuthor->GetSettings(); - StyleSettings aStyleSettings = aSettings.GetStyleSettings(); - aStyleSettings.SetFieldTextColor(aColorAnchor); - aSettings.SetStyleSettings(aStyleSettings); - mpMetadataAuthor->SetSettings(aSettings); - } - - { - mpMetadataDate->SetControlBackground(mColorDark); - AllSettings aSettings = mpMetadataDate->GetSettings(); - StyleSettings aStyleSettings = aSettings.GetStyleSettings(); - aStyleSettings.SetFieldTextColor(aColorAnchor); - aSettings.SetStyleSettings(aStyleSettings); - mpMetadataDate->SetSettings(aSettings); - } - - AllSettings aSettings2 = mpVScrollbar->GetSettings(); - StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings(); - aStyleSettings2.SetButtonTextColor(Color(0,0,0)); - aStyleSettings2.SetCheckedColor(mColorLight); // background - aStyleSettings2.SetShadowColor(mColorAnchor); - aStyleSettings2.SetFaceColor(mColorDark); - aSettings2.SetStyleSettings(aStyleSettings2); - mpVScrollbar->SetSettings(aSettings2); - } -} - -void SwSidebarWin::SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition) -{ - meSidebarPosition = eSidebarPosition; -} - -void SwSidebarWin::SetReadonly(bool bSet) -{ - mbReadonly = bSet; - GetOutlinerView()->SetReadOnly(bSet); -} - -void SwSidebarWin::SetLanguage(const SvxLanguageItem& rNewItem) -{ - Link<LinkParamNone*,void> aLink = Engine()->GetModifyHdl(); - Engine()->SetModifyHdl( Link<LinkParamNone*,void>() ); - ESelection aOld = GetOutlinerView()->GetSelection(); - - ESelection aNewSelection( 0, 0, Engine()->GetParagraphCount()-1, EE_TEXTPOS_ALL ); - GetOutlinerView()->SetSelection( aNewSelection ); - SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs()); - aEditAttr.Put(rNewItem); - GetOutlinerView()->SetAttribs( aEditAttr ); - - GetOutlinerView()->SetSelection(aOld); - Engine()->SetModifyHdl( aLink ); - - const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); - EEControlBits nCntrl = Engine()->GetControlWord(); - // turn off - nCntrl &= ~EEControlBits::ONLINESPELLING; - Engine()->SetControlWord(nCntrl); - - //turn back on - if (pVOpt->IsOnlineSpell()) - nCntrl |= EEControlBits::ONLINESPELLING; - else - nCntrl &= ~EEControlBits::ONLINESPELLING; - Engine()->SetControlWord(nCntrl); - - Engine()->CompleteOnlineSpelling(); - Invalidate(); -} - -void SwSidebarWin::GetFocus() -{ - if (mpSidebarTextControl) - mpSidebarTextControl->GrabFocus(); -} - -void SwSidebarWin::LoseFocus() -{ -} - -void SwSidebarWin::ShowNote() -{ - SetPosAndSize(); - if (!IsVisible()) - Window::Show(); - if (mpShadow && !mpShadow->isVisible()) - mpShadow->setVisible(true); - if (mpAnchor && !mpAnchor->isVisible()) - mpAnchor->setVisible(true); - - // Invalidate. - InvalidateControl(); -} - -void SwSidebarWin::HideNote() -{ - if (IsVisible()) - Window::Hide(); - if (mpAnchor) - { - if (mrMgr.IsShowAnchor()) - mpAnchor->SetAnchorState(AnchorState::Tri); - else - mpAnchor->setVisible(false); - } - if (mpShadow && mpShadow->isVisible()) - mpShadow->setVisible(false); -} - -void SwSidebarWin::InvalidateControl() -{ - // Invalidate. - mpSidebarTextControl->Push(PushFlags::MAPMODE); - lcl_translateTwips(EditWin(), *mpSidebarTextControl, nullptr); - mpSidebarTextControl->Invalidate(); - mpSidebarTextControl->Pop(); -} - -void SwSidebarWin::ActivatePostIt() -{ - mrMgr.AssureStdModeAtShell(); - - mpOutliner->ClearModifyFlag(); - mpOutliner->GetUndoManager().Clear(); - - CheckMetaText(); - SetViewState(ViewState::EDIT); - GetOutlinerView()->ShowCursor(); - - mpOutlinerView->GetEditView().SetInsertMode(mrView.GetWrtShellPtr()->IsInsMode()); - - if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) - GetOutlinerView()->SetBackgroundColor(mColorDark); -} - -void SwSidebarWin::DeactivatePostIt() -{ - // remove selection, #i87073# - if (GetOutlinerView()->GetEditView().HasSelection()) - { - ESelection aSelection = GetOutlinerView()->GetEditView().GetSelection(); - aSelection.nEndPara = aSelection.nStartPara; - aSelection.nEndPos = aSelection.nStartPos; - GetOutlinerView()->GetEditView().SetSelection(aSelection); - } - - mpOutliner->CompleteOnlineSpelling(); - - SetViewState(ViewState::NORMAL); - // Make sure this view doesn't emit LOK callbacks during the update, as the - // sidebar window's SidebarTextControl doesn't have a valid twip offset - // (map mode origin) during that operation. - bool bTiledPainting = comphelper::LibreOfficeKit::isTiledPainting(); - comphelper::LibreOfficeKit::setTiledPainting(true); - // write the visible text back into the SwField - UpdateData(); - comphelper::LibreOfficeKit::setTiledPainting(bTiledPainting); - - if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) - GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT); - - if ( !IsProtected() && Engine()->GetEditEngine().GetText().isEmpty() ) - { - mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), nullptr, true ); - } -} - -void SwSidebarWin::ToggleInsMode() -{ - if (!mrView.GetWrtShell().IsRedlineOn()) - { - //change outliner - mpOutlinerView->GetEditView().SetInsertMode(!mpOutlinerView->GetEditView().IsInsertMode()); - //change document - mrView.GetWrtShell().ToggleInsMode(); - //update statusbar - SfxBindings &rBnd = mrView.GetViewFrame()->GetBindings(); - rBnd.Invalidate(SID_ATTR_INSERT); - rBnd.Update(SID_ATTR_INSERT); - } -} - -void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot) -{ - mrMgr.AssureStdModeAtShell(); - - switch (nSlot) - { - case FN_POSTIT: - case FN_REPLY: - { - // if this note is empty, it will be deleted once losing the focus, so no reply, but only a new note - // will be created - if (!Engine()->GetEditEngine().GetText().isEmpty()) - { - OutlinerParaObject* pPara = new OutlinerParaObject(*GetOutlinerView()->GetEditView().CreateTextObject()); - mrMgr.RegisterAnswer(pPara); - } - if (mrMgr.HasActiveSidebarWin()) - mrMgr.SetActiveSidebarWin(nullptr); - SwitchToFieldPos(); - mrView.GetViewFrame()->GetDispatcher()->Execute(FN_POSTIT); - break; - } - case FN_DELETE_COMMENT: - - //Delete(); // do not kill the parent of our open popup menu - mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), nullptr, true ); - break; - case FN_FORMAT_ALL_NOTES: - case FN_DELETE_ALL_NOTES: - case FN_HIDE_ALL_NOTES: - // not possible as slot as this would require that "this" is the active postit - mrView.GetViewFrame()->GetBindings().Execute( nSlot, nullptr, SfxCallMode::ASYNCHRON ); - break; - case FN_DELETE_NOTE_AUTHOR: - case FN_HIDE_NOTE_AUTHOR: - { - // not possible as slot as this would require that "this" is the active postit - SfxStringItem aItem( nSlot, GetAuthor() ); - const SfxPoolItem* aItems[2]; - aItems[0] = &aItem; - aItems[1] = nullptr; - mrView.GetViewFrame()->GetBindings().Execute( nSlot, aItems, SfxCallMode::ASYNCHRON ); - } - break; - default: - mrView.GetViewFrame()->GetBindings().Execute( nSlot ); - break; - } -} - -SwEditWin& SwSidebarWin::EditWin() -{ - return mrView.GetEditWin(); -} - -long SwSidebarWin::GetPostItTextHeight() -{ - return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0; -} - -void SwSidebarWin::SwitchToPostIt(sal_uInt16 aDirection) -{ - SwSidebarWin* pPostIt = mrMgr.GetNextPostIt(aDirection, this); - if (pPostIt) - pPostIt->GrabFocus(); -} - -IMPL_LINK( SwSidebarWin, WindowEventListener, VclWindowEvent&, rEvent, void ) -{ - if ( rEvent.GetId() == VclEventId::WindowMouseMove ) - { - MouseEvent* pMouseEvt = static_cast<MouseEvent*>(rEvent.GetData()); - if ( pMouseEvt->IsEnterWindow() ) - { - mbMouseOver = true; - if ( !HasFocus() ) - { - SetViewState(ViewState::VIEW); - Invalidate(); - } - } - else if ( pMouseEvt->IsLeaveWindow()) - { - mbMouseOver = false; - if ( !HasFocus() ) - { - SetViewState(ViewState::NORMAL); - Invalidate(); - } - } - } - else if ( rEvent.GetId() == VclEventId::WindowActivate && - rEvent.GetWindow() == mpSidebarTextControl ) - { - const bool bLockView = mrView.GetWrtShell().IsViewLocked(); - mrView.GetWrtShell().LockView( true ); - mrMgr.SetActiveSidebarWin( this ); - mrView.GetWrtShell().LockView( bLockView ); - mrMgr.MakeVisible( this ); - } -} - -void SwSidebarWin::Delete() -{ - if ( mrMgr.GetActiveSidebarWin() == this) - { - mrMgr.SetActiveSidebarWin(nullptr); - // if the note is empty, the previous line will send a delete event, but we are already there - if (mnEventId) - { - Application::RemoveUserEvent( mnEventId ); - mnEventId = nullptr; - } - } -} - -IMPL_LINK(SwSidebarWin, ScrollHdl, ScrollBar*, pScroll, void) -{ - long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos(); - GetOutlinerView()->Scroll( 0, nDiff ); -} - -IMPL_LINK_NOARG(SwSidebarWin, ModifyHdl, LinkParamNone*, void) -{ - mrView.GetDocShell()->SetModified(); -} - -IMPL_LINK_NOARG(SwSidebarWin, DeleteHdl, void*, void) -{ - mnEventId = nullptr; - Delete(); -} - -void SwSidebarWin::ResetAttributes() -{ - mpOutlinerView->RemoveAttribsKeepLanguages(true); - mpOutliner->RemoveFields(); - mpOutlinerView->SetAttribs(DefaultItem()); -} - -sal_Int32 SwSidebarWin::GetScrollbarWidth() -{ - return mrView.GetWrtShell().GetViewOptions()->GetZoom() / 10; -} - -sal_Int32 SwSidebarWin::GetMetaButtonAreaWidth() -{ - const Fraction& f( GetMapMode().GetScaleX() ); - return METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator(); -} - -sal_Int32 SwSidebarWin::GetMetaHeight() -{ - const Fraction& f(mrView.GetWrtShellPtr()->GetOut()->GetMapMode().GetScaleY()); - return POSTIT_META_HEIGHT * f.GetNumerator() / f.GetDenominator(); -} - -sal_Int32 SwSidebarWin::GetMinimumSizeWithMeta() -{ - return mrMgr.GetMinimumSizeWithMeta(); -} - -sal_Int32 SwSidebarWin::GetMinimumSizeWithoutMeta() -{ - const Fraction& f(mrView.GetWrtShellPtr()->GetOut()->GetMapMode().GetScaleY()); - return POSTIT_MINIMUMSIZE_WITHOUT_META * f.GetNumerator() / f.GetDenominator(); -} - -void SwSidebarWin::SetSpellChecking() -{ - const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); - EEControlBits nCntrl = mpOutliner->GetControlWord(); - if (pVOpt->IsOnlineSpell()) - nCntrl |= EEControlBits::ONLINESPELLING; - else - nCntrl &= ~EEControlBits::ONLINESPELLING; - mpOutliner->SetControlWord(nCntrl); - - mpOutliner->CompleteOnlineSpelling(); - Invalidate(); -} - -void SwSidebarWin::SetViewState(ViewState bViewState) -{ - switch (bViewState) - { - case ViewState::EDIT: - { - if (mpAnchor) - { - mpAnchor->SetAnchorState(AnchorState::All); - SwSidebarWin* pWin = GetTopReplyNote(); - // #i111964# - if ( pWin && pWin->Anchor() ) - { - pWin->Anchor()->SetAnchorState(AnchorState::End); - } - mpAnchor->setLineSolid(true); - if ( mpTextRangeOverlay != nullptr ) - { - mpTextRangeOverlay->ShowSolidBorder(); - } - } - if (mpShadow) - mpShadow->SetShadowState(SS_EDIT); - break; - } - case ViewState::VIEW: - { - if (mpAnchor) - { - mpAnchor->setLineSolid(true); - if ( mpTextRangeOverlay != nullptr ) - { - mpTextRangeOverlay->ShowSolidBorder(); - } - } - if (mpShadow) - mpShadow->SetShadowState(SS_VIEW); - break; - } - case ViewState::NORMAL: - { - if (mpAnchor) - { - if (IsFollow()) - { - // if there is no visible parent note, we want to see the complete anchor ?? - //if (IsAnyStackParentVisible()) - mpAnchor->SetAnchorState(AnchorState::End); - SwSidebarWin* pTopWinSelf = GetTopReplyNote(); - SwSidebarWin* pTopWinActive = mrMgr.HasActiveSidebarWin() - ? mrMgr.GetActiveSidebarWin()->GetTopReplyNote() - : nullptr; - // #i111964# - if ( pTopWinSelf && ( pTopWinSelf != pTopWinActive ) && - pTopWinSelf->Anchor() ) - { - if ( pTopWinSelf != mrMgr.GetActiveSidebarWin() ) - { - pTopWinSelf->Anchor()->setLineSolid(false); - if ( pTopWinSelf->TextRange() != nullptr ) - { - pTopWinSelf->TextRange()->HideSolidBorder(); - } - } - pTopWinSelf->Anchor()->SetAnchorState(AnchorState::All); - } - } - mpAnchor->setLineSolid(false); - if ( mpTextRangeOverlay != nullptr ) - { - mpTextRangeOverlay->HideSolidBorder(); - } - } - if ( mpShadow ) - { - mpShadow->SetShadowState(SS_NORMAL); - } - break; - } - } -} - -SwSidebarWin* SwSidebarWin::GetTopReplyNote() -{ - SwSidebarWin* pTopNote = nullptr; - SwSidebarWin* pSidebarWin = IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, this) : nullptr; - while (pSidebarWin) - { - pTopNote = pSidebarWin; - pSidebarWin = pSidebarWin->IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, pSidebarWin) : nullptr; - } - return pTopNote; -} - -void SwSidebarWin::SwitchToFieldPos() -{ - if ( mrMgr.GetActiveSidebarWin() == this ) - mrMgr.SetActiveSidebarWin(nullptr); - GotoPos(); - sal_uInt32 aCount = MoveCaret(); - if (aCount) - mrView.GetDocShell()->GetWrtShell()->SwCursorShell::Right(aCount, 0); - GrabFocusToDocument(); -} - -SvxLanguageItem SwSidebarWin::GetLanguage() -{ - return SvxLanguageItem(SwLangHelper::GetLanguage(mrView.GetWrtShell(),RES_CHRATR_LANGUAGE),RES_CHRATR_LANGUAGE); -} - -void SwSidebarWin::SetChangeTracking( const SwPostItHelper::SwLayoutStatus aLayoutStatus, - const Color& aChangeColor ) -{ - if ( (mLayoutStatus != aLayoutStatus) || - (mChangeColor != aChangeColor) ) - { - mLayoutStatus = aLayoutStatus; - mChangeColor = aChangeColor; - Invalidate(); - } -} - -bool SwSidebarWin::HasScrollbar() const -{ - return mpVScrollbar != nullptr; -} - -bool SwSidebarWin::IsScrollbarVisible() const -{ - return HasScrollbar() && mpVScrollbar->IsVisible(); -} - -void SwSidebarWin::ChangeSidebarItem( SwSidebarItem& rSidebarItem ) -{ - const bool bAnchorChanged = mpAnchorFrame != rSidebarItem.maLayoutInfo.mpAnchorFrame; - if ( bAnchorChanged ) - { - mrMgr.DisconnectSidebarWinFromFrame( *(mpAnchorFrame), *this ); - } - - mrSidebarItem = rSidebarItem; - mpAnchorFrame = mrSidebarItem.maLayoutInfo.mpAnchorFrame; - - if ( GetWindowPeer() ) - { - SidebarWinAccessible* pAcc = - static_cast<SidebarWinAccessible*>( GetWindowPeer() ); - OSL_ENSURE( dynamic_cast<SidebarWinAccessible*>( GetWindowPeer() ), - "<SwSidebarWin::ChangeSidebarItem(..)> - unexpected type of window peer -> crash possible!" ); - pAcc->ChangeSidebarItem( mrSidebarItem ); - } - - if ( bAnchorChanged ) - { - mrMgr.ConnectSidebarWinToFrame( *(mrSidebarItem.maLayoutInfo.mpAnchorFrame), - mrSidebarItem.GetFormatField(), - *this ); - } -} - -css::uno::Reference< css::accessibility::XAccessible > SwSidebarWin::CreateAccessible() -{ - SidebarWinAccessible* pAcc( new SidebarWinAccessible( *this, - mrView.GetWrtShell(), - mrSidebarItem ) ); - css::uno::Reference< css::awt::XWindowPeer > xWinPeer( pAcc ); - SetWindowPeer( xWinPeer, pAcc ); - - css::uno::Reference< css::accessibility::XAccessible > xAcc( xWinPeer, css::uno::UNO_QUERY ); - return xAcc; -} - -} } // eof of namespace sw::sidebarwindows - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |