1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #include "precompiled_rptui.hxx"
24 #include "SectionView.hxx"
25 #include "DesignView.hxx"
26 #include <RptPage.hxx>
27 #include <RptObject.hxx>
28 #include <RptDef.hxx>
29 #include <svx/svxids.hrc>
30 #include <svx/svddrgmt.hxx>
31 #include <vcl/scrbar.hxx>
32 #include "ReportSection.hxx"
33 #include "ReportWindow.hxx"
34 #include "uistrings.hrc"
35 #include <tools/debug.hxx>
36 #include <tools/diagnose_ex.h>
37
38 namespace rptui
39 {
40 using namespace ::com::sun::star;
41 TYPEINIT1( OSectionView, SdrView );
42
43 //----------------------------------------------------------------------------
DBG_NAME(rpt_OSectionView)44 DBG_NAME( rpt_OSectionView )
45 OSectionView::OSectionView( SdrModel* pModel, OReportSection* _pSectionWindow, OReportWindow* pEditor )
46 :SdrView( pModel, _pSectionWindow )
47 ,m_pReportWindow( pEditor )
48 ,m_pSectionWindow(_pSectionWindow)
49 {
50 DBG_CTOR( rpt_OSectionView,NULL);
51 // SetPagePaintingAllowed(false);
52 SetBufferedOutputAllowed(true);
53 SetBufferedOverlayAllowed(true);
54 SetPageBorderVisible(false);
55 SetBordVisible();
56 SetQuickTextEditMode(sal_False);
57 }
58
59 //----------------------------------------------------------------------------
60
~OSectionView()61 OSectionView::~OSectionView()
62 {
63 DBG_DTOR( rpt_OSectionView,NULL);
64 }
65
66 //----------------------------------------------------------------------------
67
MarkListHasChanged()68 void OSectionView::MarkListHasChanged()
69 {
70 DBG_CHKTHIS( rpt_OSectionView,NULL);
71 SdrView::MarkListHasChanged();
72
73 if ( m_pReportWindow && m_pSectionWindow && !m_pSectionWindow->getPage()->getSpecialMode() )
74 {
75 //m_pReportWindow->unmarkAllObjects(this); // WHY
76 DlgEdHint aHint( RPTUI_HINT_SELECTIONCHANGED );
77 m_pReportWindow->getReportView()->Broadcast( aHint );
78 m_pReportWindow->getReportView()->UpdatePropertyBrowserDelayed(*this);
79 }
80 }
81
82 //----------------------------------------------------------------------------
83
MakeVisible(const Rectangle & rRect,Window & rWin)84 void OSectionView::MakeVisible( const Rectangle& rRect, Window& rWin )
85 {
86 DBG_CHKTHIS( rpt_OSectionView,NULL);
87 // visible area
88 MapMode aMap( rWin.GetMapMode() );
89 const Point aOrg( aMap.GetOrigin() );
90 const Size aVisSize( rWin.GetOutputSize() );
91 const Rectangle aVisRect( Point(-aOrg.X(),-aOrg.Y()), aVisSize );
92
93 // check, if rectangle is inside visible area
94 if ( !aVisRect.IsInside( rRect ) )
95 {
96 // calculate scroll distance; the rectangle must be inside the visible area
97 sal_Int32 nScrollX = 0, nScrollY = 0;
98
99 const sal_Int32 nVisLeft = aVisRect.Left();
100 const sal_Int32 nVisRight = aVisRect.Right();
101 const sal_Int32 nVisTop = aVisRect.Top();
102 const sal_Int32 nVisBottom = aVisRect.Bottom();
103
104 // don't scroll beyond the page size
105 Size aPageSize = m_pSectionWindow->getPage()->GetSize();
106 const sal_Int32 nPageWidth = aPageSize.Width();
107 const sal_Int32 nPageHeight = aPageSize.Height();
108
109 if ( nVisRight + nScrollX > nPageWidth )
110 nScrollX = nPageWidth - nVisRight;
111
112 if ( nVisLeft + nScrollX < 0 )
113 nScrollX = -nVisLeft;
114
115 if ( nVisBottom + nScrollY > nPageHeight )
116 nScrollY = nPageHeight - nVisBottom;
117
118 if ( nVisTop + nScrollY < 0 )
119 nScrollY = -nVisTop;
120
121 // scroll window
122 rWin.Update();
123 rWin.Scroll( -nScrollX, -nScrollY );
124 aMap.SetOrigin( Point( aOrg.X() - nScrollX, aOrg.Y() - nScrollY ) );
125 rWin.SetMapMode( aMap );
126 rWin.Update();
127 rWin.Invalidate();
128
129 if ( m_pReportWindow )
130 {
131 const DlgEdHint aHint( RPTUI_HINT_WINDOWSCROLLED );
132 m_pReportWindow->getReportView()->Broadcast( aHint );
133 }
134 }
135 else
136 {
137 rWin.Invalidate(INVALIDATE_NOERASE);
138 }
139 }
140 //------------------------------------------------------------------------------
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)141 void OSectionView::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
142 {
143 DBG_CHKTHIS( rpt_OSectionView,NULL);
144 SdrView::Notify(rBC,rHint);
145 if ( rHint.ISA(SdrHint) )
146 {
147 const SdrObject* pObj = ((SdrHint&)rHint).GetObject();
148 const SdrHintKind eKind = ((SdrHint&)rHint).GetKind();
149 // check for change of selected object
150 if(HINT_OBJCHG == eKind && pObj && IsObjMarked(const_cast<SdrObject*>(pObj)))
151 AdjustMarkHdl();
152 else if ( eKind == HINT_OBJREMOVED )
153 ObjectRemovedInAliveMode(pObj);
154 }
155 }
156
157 //------------------------------------------------------------------------------
ObjectRemovedInAliveMode(const SdrObject * _pObject)158 void OSectionView::ObjectRemovedInAliveMode( const SdrObject* _pObject )
159 {
160 DBG_CHKTHIS( rpt_OSectionView,NULL);
161 const SdrMarkList& rMarkedList = GetMarkedObjectList();
162 const sal_uLong nMark = rMarkedList.GetMarkCount();
163
164 for( sal_uLong i = 0; i < nMark; i++ )
165 {
166 SdrObject* pSdrObj = rMarkedList.GetMark(i)->GetMarkedSdrObj();
167 if (_pObject == pSdrObj)
168 {
169 SdrPageView* pPgView = GetSdrPageView();
170 BrkAction();
171 MarkObj( pSdrObj, pPgView, sal_True );
172 break;
173 }
174 }
175 }
176
177 // -----------------------------------------------------------------------------
SetMarkedToLayer(SdrLayerID _nLayerNo)178 void OSectionView::SetMarkedToLayer( SdrLayerID _nLayerNo )
179 {
180 if (AreObjectsMarked())
181 {
182 // #i11702# use SdrUndoObjectLayerChange for undo
183 // STR_UNDO_SELATTR is "Attributes" - should use a different text later
184 BegUndo( );
185
186 const SdrMarkList& rMark = GetMarkedObjectList();
187 sal_uLong nCount = rMark.GetMarkCount();
188 for (sal_uLong i=0; i<nCount; i++)
189 {
190 SdrObject* pObj = rMark.GetMark(i)->GetMarkedSdrObj();
191 if ( pObj->ISA(OCustomShape) )
192 {
193 AddUndo( new SdrUndoObjectLayerChange( *pObj, pObj->GetLayer(), _nLayerNo) );
194 pObj->SetLayer( _nLayerNo );
195 OObjectBase* pBaseObj = dynamic_cast<OObjectBase*>(pObj);
196 try
197 {
198 pBaseObj->getReportComponent()->setPropertyValue(PROPERTY_OPAQUE,uno::makeAny(_nLayerNo == RPT_LAYER_FRONT));
199 }
200 catch(const uno::Exception&)
201 {
202 DBG_UNHANDLED_EXCEPTION();
203 }
204 }
205 }
206
207 EndUndo();
208
209 // #84073# check mark list now instead of later in a timer
210 CheckMarked();
211 MarkListHasChanged();
212 }
213 }
214 // -----------------------------------------------------------------------------
OnlyShapesMarked() const215 bool OSectionView::OnlyShapesMarked() const
216 {
217 const SdrMarkList& rMark = GetMarkedObjectList();
218 const sal_uLong nCount = rMark.GetMarkCount();
219 if ( !nCount )
220 return false;
221 sal_uLong i=0;
222 for (; i<nCount; i++)
223 {
224 SdrObject* pObj = rMark.GetMark(i)->GetMarkedSdrObj();
225 if ( !pObj->ISA(OCustomShape) )
226 {
227 break;
228 }
229 } // for (sal_uLong i=0; i<nCount; i++)
230 return i == nCount;
231 }
232
IsDragResize() const233 bool OSectionView::IsDragResize() const
234 {
235 const SdrDragMethod* pDragMethod = GetDragMethod();
236 if (pDragMethod)
237 {
238 bool bMoveOnly = pDragMethod->getMoveOnly();
239 if (bMoveOnly == false)
240 {
241 // current marked components will be resized
242 return true;
243 }
244 }
245 return false;
246 }
247
248 // -----------------------------------------------------------------------------
GetLayerIdOfMarkedObjects() const249 short OSectionView::GetLayerIdOfMarkedObjects() const
250 {
251 short nRet = SHRT_MAX;
252 const SdrMarkList &rMrkList = GetMarkedObjectList();
253 for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
254 {
255 const SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
256 if ( nRet == SHRT_MAX )
257 nRet = pObj->GetLayer();
258 else if ( nRet != pObj->GetLayer() )
259 {
260 nRet = -1;
261 break;
262 }
263 }
264 if ( nRet == SHRT_MAX )
265 nRet = -1;
266 return nRet;
267 }
268
269 //============================================================================
270 } // rptui
271 //============================================================================
272