    /* -*- 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 <svx/svdpagv.hxx>
    #include <svx/svdview.hxx>
    #include <svx/ruler.hxx>
    #include <idxmrk.hxx>
    #include <view.hxx>
    #include <basesh.hxx>
    #include <wrtsh.hxx>
    #include <swmodule.hxx>
    #include <viewopt.hxx>
    #include <docsh.hxx>
    #include <globdoc.hxx>
    #include <navipi.hxx>
    #include <fldwrap.hxx>
    #include <redlndlg.hxx>
    #include <dpage.hxx>
    #include <edtwin.hxx>
    #include <formatclipboard.hxx>
    #include <cmdid.h>
    #include <sfx2/request.hxx>
    #include <sfx2/viewfrm.hxx>
    #include <wordcountdialog.hxx>

    void SwView::Activate(bool bMDIActivate)
    {
        // fdo#40438 Update the layout to make sure everything is correct before showing the content
        m_pWrtShell->StartAction();
        m_pWrtShell->EndAction( true );

        // Register the current View at the DocShell.
        // The view remains active at the DocShell until it will
        // be destroyed or by Activate a new one will be set.
        SwDocShell* pDocSh = GetDocShell();
        if(pDocSh)
            pDocSh->SetView(this);
        SwModule* pSwMod = SW_MOD();
        pSwMod->SetView(this);

        // Document size has changed.
        if(!bDocSzUpdated)
            DocSzChgd(m_aDocSz);

        // make selection visible
        if(m_bMakeSelectionVisible)
        {
            m_pWrtShell->MakeSelVisible();
            m_bMakeSelectionVisible = false;
        }
        m_pHRuler->SetActive();
        m_pVRuler->SetActive();

        if ( bMDIActivate )
        {
            if ( m_pShell )
            {
                SfxDispatcher &rDispatcher = GetDispatcher();
                SfxShell *pTopShell = rDispatcher.GetShell( 0 );

                // this SwView is the top-most shell on the stack
                if ( pTopShell == this )
                {
                    for ( sal_uInt16 i = 1; true; ++i )
                    {
                        SfxShell *pSfxShell = rDispatcher.GetShell( i );
                        // does the stack contain any shells spawned by this SwView already?
                        if  ( ( dynamic_cast< const SwBaseShell *>( pSfxShell ) !=  nullptr
                             || dynamic_cast< const FmFormShell  *>( pSfxShell ) !=  nullptr )
                             && ( pSfxShell->GetViewShell() == this ) )
                        {
                            // it shouldn't b/c we haven't been activated yet
                            // so assert that 'cause it'll crash during dispose at the latest
                            assert( pSfxShell && "Corrupted shell stack: dependent shell positioned below its view");
                        }
                        else
                            break;
                    }
                }
            }

            m_pWrtShell->ShellGetFocus();     // Selections visible

            if( !m_sSwViewData.isEmpty() )
            {
                ReadUserData(m_sSwViewData);
                m_sSwViewData.clear();
            }

            AttrChangedNotify(m_pWrtShell.get());

            // Initialize Fielddlg newly if necessary (e.g. for TYP_SETVAR)
            sal_uInt16 nId = SwFieldDlgWrapper::GetChildWindowId();
            SfxViewFrame* pVFrame = GetViewFrame();
            SwFieldDlgWrapper *pWrp = static_cast<SwFieldDlgWrapper*>(pVFrame->GetChildWindow(nId));
            if (pWrp)
                pWrp->ReInitDlg(GetDocShell());

            // Initialize RedlineDlg newly if necessary
            nId = SwRedlineAcceptChild::GetChildWindowId();
            SwRedlineAcceptChild *pRed = static_cast<SwRedlineAcceptChild*>(pVFrame->GetChildWindow(nId));
            if (pRed)
                pRed->ReInitDlg(GetDocShell());

            // reinit IdxMarkDlg
            nId = SwInsertIdxMarkWrapper::GetChildWindowId();
            SwInsertIdxMarkWrapper *pIdxMrk = static_cast<SwInsertIdxMarkWrapper*>(pVFrame->GetChildWindow(nId));
            if (pIdxMrk)
                pIdxMrk->ReInitDlg(*m_pWrtShell);

            // reinit AuthMarkDlg
            nId = SwInsertAuthMarkWrapper::GetChildWindowId();
            SwInsertAuthMarkWrapper *pAuthMrk = static_cast<SwInsertAuthMarkWrapper*>(pVFrame->
                                                                    GetChildWindow(nId));
            if (pAuthMrk)
                pAuthMrk->ReInitDlg(*m_pWrtShell);
        }
        else
            // At least call the Notify (as a precaution because of the SlotFilter).
            AttrChangedNotify(m_pWrtShell.get());

        SfxViewShell::Activate(bMDIActivate);
    }

    void SwView::Deactivate(bool bMDIActivate)
    {
        if( g_bFlushCharBuffer ) // Are Characters still in the input buffer?
            GetEditWin().FlushInBuffer();

        if( bMDIActivate )
        {
            m_pWrtShell->ShellLoseFocus();    // Selections invisible

            m_pHRuler->SetActive( false );
            m_pVRuler->SetActive( false );
        }
        SfxViewShell::Deactivate(bMDIActivate);
    }

    void SwView::MarginChanged()
    {
        GetWrtShell().SetBrowseBorder( GetMargin() );
    }

    void SwView::ExecFormatPaintbrush(SfxRequest const & rReq)
    {
        if(!m_pFormatClipboard)
            return;

        if( m_pFormatClipboard->HasContent() )
        {
            m_pFormatClipboard->Erase();

            SwApplyTemplate aTemplate;
            GetEditWin().SetApplyTemplate(aTemplate);
        }
        else
        {
            bool bPersistentCopy = false;
            const SfxItemSet *pArgs = rReq.GetArgs();
            if( pArgs && pArgs->Count() >= 1 )
            {
                bPersistentCopy = pArgs->Get(SID_FORMATPAINTBRUSH).GetValue();
            }

            m_pFormatClipboard->Copy( GetWrtShell(), GetPool(), bPersistentCopy );

            SwApplyTemplate aTemplate;
            aTemplate.m_pFormatClipboard = m_pFormatClipboard.get();
            GetEditWin().SetApplyTemplate(aTemplate);
        }
        GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
    }

    void SwView::StateFormatPaintbrush(SfxItemSet &rSet)
    {
        if(!m_pFormatClipboard)
            return;

        bool bHasContent = m_pFormatClipboard && m_pFormatClipboard->HasContent();
        if( !bHasContent &&
            !SwFormatClipboard::CanCopyThisType( GetWrtShell().GetSelectionType())
          )
        {
            rSet.DisableItem( SID_FORMATPAINTBRUSH );
        }
        else
            rSet.Put(SfxBoolItem(SID_FORMATPAINTBRUSH, bHasContent));
    }

    void SwView::UpdateWordCount(SfxShell* pShell, sal_uInt16 nSlot)
    {
        SfxViewFrame* pVFrame = GetViewFrame();
        if (pVFrame != nullptr)
        {
            pVFrame->ToggleChildWindow(FN_WORDCOUNT_DIALOG);
            pShell->Invalidate(nSlot);

            SwWordCountWrapper *pWrdCnt = static_cast<SwWordCountWrapper*>(pVFrame->GetChildWindow(SwWordCountWrapper::GetChildWindowId()));
            if (pWrdCnt)
                pWrdCnt->UpdateCounts();
        }
    }

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

↑ V560 A part of conditional expression is always true: m_pFormatClipboard.