xref: /AOO41X/main/reportdesign/source/ui/report/SectionView.cxx (revision 9e0e41911c53968aad5ad356e2b2126da667034f)
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_reportdesign.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