Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <edtwin.hxx>
11 : #include <FrameControlsManager.hxx>
12 : #include <HeaderFooterWin.hxx>
13 : #include <PageBreakWin.hxx>
14 : #include <pagefrm.hxx>
15 : #include <viewopt.hxx>
16 : #include <view.hxx>
17 : #include <wrtsh.hxx>
18 :
19 : using namespace std;
20 :
21 2761 : SwFrameControlsManager::SwFrameControlsManager( SwEditWin* pEditWin ) :
22 : m_pEditWin( pEditWin ),
23 2761 : m_aControls( )
24 : {
25 2761 : }
26 :
27 0 : SwFrameControlsManager::~SwFrameControlsManager()
28 : {
29 0 : }
30 :
31 0 : SwFrameControlsManager::SwFrameControlsManager( const SwFrameControlsManager& rCopy ) :
32 : m_pEditWin( rCopy.m_pEditWin ),
33 0 : m_aControls( rCopy.m_aControls )
34 : {
35 0 : }
36 :
37 2757 : void SwFrameControlsManager::dispose()
38 : {
39 2757 : m_aControls.clear();
40 2757 : }
41 :
42 0 : const SwFrameControlsManager& SwFrameControlsManager::operator=( const SwFrameControlsManager& rCopy )
43 : {
44 0 : m_pEditWin = rCopy.m_pEditWin;
45 0 : m_aControls = rCopy.m_aControls;
46 0 : return *this;
47 : }
48 :
49 2060 : SwFrameControlPtr SwFrameControlsManager::GetControl( FrameControlType eType, const SwFrm* pFrm )
50 : {
51 2060 : SwFrameControlPtrMap& rControls = m_aControls[eType];
52 :
53 2060 : SwFrameControlPtrMap::iterator aIt = rControls.find(pFrm);
54 :
55 2060 : if (aIt != rControls.end())
56 2 : return aIt->second;
57 :
58 2058 : return SwFrameControlPtr();
59 : }
60 :
61 252 : void SwFrameControlsManager::RemoveControls( const SwFrm* pFrm )
62 : {
63 252 : map< FrameControlType, SwFrameControlPtrMap >::iterator pIt = m_aControls.begin();
64 :
65 537 : while ( pIt != m_aControls.end() )
66 : {
67 33 : SwFrameControlPtrMap& rMap = pIt->second;
68 33 : rMap.erase(pFrm);
69 33 : ++pIt;
70 : }
71 252 : }
72 :
73 10499 : void SwFrameControlsManager::RemoveControlsByType( FrameControlType eType, const SwFrm* pFrm )
74 : {
75 10499 : SwFrameControlPtrMap& rMap = m_aControls[eType];
76 10499 : rMap.erase(pFrm);
77 10499 : }
78 :
79 4 : void SwFrameControlsManager::HideControls( FrameControlType eType )
80 : {
81 4 : SwFrameControlPtrMap::iterator pIt = m_aControls[eType].begin();
82 8 : while ( pIt != m_aControls[eType].end() )
83 : {
84 0 : pIt->second->ShowAll( false );
85 0 : ++pIt;
86 : }
87 4 : }
88 :
89 0 : void SwFrameControlsManager::SetReadonlyControls( bool bReadonly )
90 : {
91 0 : map< FrameControlType, SwFrameControlPtrMap >::iterator pIt = m_aControls.begin();
92 :
93 0 : while ( pIt != m_aControls.end() )
94 : {
95 0 : SwFrameControlPtrMap::iterator aCtrlIt = pIt->second.begin();
96 0 : while ( aCtrlIt != pIt->second.end() )
97 : {
98 0 : aCtrlIt->second->SetReadonly( bReadonly );
99 0 : ++aCtrlIt;
100 : }
101 0 : ++pIt;
102 : }
103 0 : }
104 :
105 0 : void SwFrameControlsManager::SetHeaderFooterControl( const SwPageFrm* pPageFrm, FrameControlType eType, Point aOffset )
106 : {
107 : OSL_ASSERT( eType == Header || eType == Footer );
108 :
109 : // Check if we already have the control
110 0 : SwFrameControlPtr pControl;
111 0 : const bool bHeader = ( eType == Header );
112 :
113 0 : SwFrameControlPtrMap& rControls = m_aControls[eType];
114 :
115 0 : SwFrameControlPtrMap::iterator lb = rControls.lower_bound(pPageFrm);
116 0 : if (lb != rControls.end() && !(rControls.key_comp()(pPageFrm, lb->first)))
117 0 : pControl = lb->second;
118 : else
119 : {
120 0 : SwFrameControlPtr pNewControl( new SwHeaderFooterWin( m_pEditWin, pPageFrm, bHeader ) );
121 0 : const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
122 0 : pNewControl->SetReadonly( pViewOpt->IsReadonly() );
123 0 : rControls.insert(lb, make_pair(pPageFrm, pNewControl));
124 0 : pControl.swap( pNewControl );
125 : }
126 :
127 0 : Rectangle aPageRect = m_pEditWin->LogicToPixel( pPageFrm->Frm().SVRect() );
128 :
129 0 : SwHeaderFooterWin& rHFWin = dynamic_cast<SwHeaderFooterWin&>(*pControl.get());
130 : assert(rHFWin.IsHeader() == bHeader);
131 0 : rHFWin.SetOffset( aOffset, aPageRect.Left(), aPageRect.Right() );
132 :
133 0 : if (!rHFWin.IsVisible())
134 0 : pControl->ShowAll( true );
135 0 : }
136 :
137 392 : void SwFrameControlsManager::SetPageBreakControl( const SwPageFrm* pPageFrm )
138 : {
139 : // Check if we already have the control
140 392 : SwFrameControlPtr pControl;
141 :
142 392 : SwFrameControlPtrMap& rControls = m_aControls[PageBreak];
143 :
144 392 : SwFrameControlPtrMap::iterator lb = rControls.lower_bound(pPageFrm);
145 392 : if (lb != rControls.end() && !(rControls.key_comp()(pPageFrm, lb->first)))
146 125 : pControl = lb->second;
147 : else
148 : {
149 267 : SwFrameControlPtr pNewControl( new SwPageBreakWin( m_pEditWin, pPageFrm ) );
150 267 : const SwViewOption* pViewOpt = m_pEditWin->GetView().GetWrtShell().GetViewOptions();
151 267 : pNewControl->SetReadonly( pViewOpt->IsReadonly() );
152 :
153 267 : rControls.insert(lb, make_pair(pPageFrm, pNewControl));
154 :
155 267 : pControl.swap( pNewControl );
156 : }
157 :
158 392 : SwPageBreakWin& rWin = dynamic_cast<SwPageBreakWin&>(*pControl.get());
159 392 : rWin.UpdatePosition();
160 392 : if (!rWin.IsVisible())
161 392 : pControl->ShowAll( true );
162 569 : }
163 :
164 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|