xref: /trunk/main/sw/source/ui/ribbar/drawbase.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <hintids.hxx>
28cdf0e10cSrcweir #include <tools/list.hxx>
29cdf0e10cSrcweir #include <svx/svdview.hxx>
30cdf0e10cSrcweir #include <svx/svdobj.hxx>
31cdf0e10cSrcweir #include <svl/ptitem.hxx>
32cdf0e10cSrcweir #include <editeng/sizeitem.hxx>
33cdf0e10cSrcweir #include <sfx2/request.hxx>
34cdf0e10cSrcweir #include <sfx2/bindings.hxx>
35cdf0e10cSrcweir #include <fmtclds.hxx>
36cdf0e10cSrcweir #include <frmfmt.hxx>
37cdf0e10cSrcweir #include "cmdid.h"
38cdf0e10cSrcweir #include "basesh.hxx"
39cdf0e10cSrcweir #include "view.hxx"
40cdf0e10cSrcweir #include "wrtsh.hxx"
41cdf0e10cSrcweir #include "drawbase.hxx"
42cdf0e10cSrcweir #include "edtwin.hxx"
43cdf0e10cSrcweir #include "caption.hxx"
44cdf0e10cSrcweir #include "swundo.hxx"
45cdf0e10cSrcweir #include <SwRewriter.hxx>
46cdf0e10cSrcweir #include "comcore.hrc"
47cdf0e10cSrcweir 
48cdf0e10cSrcweir using namespace ::com::sun::star;
49cdf0e10cSrcweir 
50cdf0e10cSrcweir extern sal_Bool bNoInterrupt;       // in mainwn.cxx
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #define MINMOVE ((sal_uInt16)m_pSh->GetOut()->PixelToLogic(Size(m_pSh->GetDrawView()->GetMarkHdlSizePixel()/2,0)).Width())
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir /*************************************************************************
56cdf0e10cSrcweir |*
57cdf0e10cSrcweir |* Konstruktor
58cdf0e10cSrcweir |*
59cdf0e10cSrcweir \************************************************************************/
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 
SwDrawBase(SwWrtShell * pSwWrtShell,SwEditWin * pWindow,SwView * pSwView)62cdf0e10cSrcweir SwDrawBase::SwDrawBase(SwWrtShell* pSwWrtShell, SwEditWin* pWindow, SwView* pSwView) :
63cdf0e10cSrcweir     m_pView(pSwView),
64cdf0e10cSrcweir     m_pSh(pSwWrtShell),
65cdf0e10cSrcweir     m_pWin(pWindow),
66cdf0e10cSrcweir     m_nSlotId(USHRT_MAX),
67cdf0e10cSrcweir     m_bCreateObj(sal_True),
68cdf0e10cSrcweir     m_bInsForm(sal_False)
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     if ( !m_pSh->HasDrawView() )
71cdf0e10cSrcweir         m_pSh->MakeDrawView();
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir /*************************************************************************
75cdf0e10cSrcweir |*
76cdf0e10cSrcweir |* Destruktor
77cdf0e10cSrcweir |*
78cdf0e10cSrcweir \************************************************************************/
79cdf0e10cSrcweir 
~SwDrawBase()80cdf0e10cSrcweir __EXPORT SwDrawBase::~SwDrawBase()
81cdf0e10cSrcweir {
82cdf0e10cSrcweir     if (m_pView->GetWrtShellPtr()) // Im view-Dtor koennte die wrtsh bereits geloescht worden sein...
83cdf0e10cSrcweir         m_pSh->GetDrawView()->SetEditMode(sal_True);
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir /*************************************************************************
87cdf0e10cSrcweir |*
88cdf0e10cSrcweir |* MouseButtonDown-event
89cdf0e10cSrcweir |*
90cdf0e10cSrcweir \************************************************************************/
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)93cdf0e10cSrcweir sal_Bool SwDrawBase::MouseButtonDown(const MouseEvent& rMEvt)
94cdf0e10cSrcweir {
95cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     SdrView *pSdrView = m_pSh->GetDrawView();
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     // #i33136#
100cdf0e10cSrcweir     // pSdrView->SetOrtho(rMEvt.IsShift());
101cdf0e10cSrcweir     pSdrView->SetOrtho(doConstructOrthogonal() ? !rMEvt.IsShift() : rMEvt.IsShift());
102cdf0e10cSrcweir     pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     if (rMEvt.IsMod2())
105cdf0e10cSrcweir     {
106cdf0e10cSrcweir         pSdrView->SetCreate1stPointAsCenter(sal_True);
107cdf0e10cSrcweir         pSdrView->SetResizeAtCenter(sal_True);
108cdf0e10cSrcweir     }
109cdf0e10cSrcweir     else
110cdf0e10cSrcweir     {
111cdf0e10cSrcweir         pSdrView->SetCreate1stPointAsCenter(sal_False);
112cdf0e10cSrcweir         pSdrView->SetResizeAtCenter(sal_False);
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     SdrViewEvent aVEvt;
116cdf0e10cSrcweir     SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     // Nur neues Objekt, wenn nicht im Basismode (bzw reinem Selektionsmode)
119cdf0e10cSrcweir     if (rMEvt.IsLeft() && !m_pWin->IsDrawAction())
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         if (IsCreateObj() && (eHit == SDRHIT_UNMARKEDOBJECT || eHit == SDRHIT_NONE || m_pSh->IsDrawCreate()))
122cdf0e10cSrcweir         {
123cdf0e10cSrcweir             bNoInterrupt = sal_True;
124cdf0e10cSrcweir             m_pWin->CaptureMouse();
125cdf0e10cSrcweir 
126cdf0e10cSrcweir             m_aStartPos = m_pWin->PixelToLogic(rMEvt.GetPosPixel());
127cdf0e10cSrcweir 
128cdf0e10cSrcweir             bReturn = m_pSh->BeginCreate( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()), m_aStartPos);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir             SetDrawPointer();
131cdf0e10cSrcweir 
132cdf0e10cSrcweir             if ( bReturn )
133cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_True);
134cdf0e10cSrcweir         }
135cdf0e10cSrcweir         else if (!pSdrView->IsAction())
136cdf0e10cSrcweir         {
137cdf0e10cSrcweir             /**********************************************************************
138cdf0e10cSrcweir             * BEZIER-EDITOR
139cdf0e10cSrcweir             **********************************************************************/
140cdf0e10cSrcweir             m_pWin->CaptureMouse();
141cdf0e10cSrcweir             m_aStartPos = m_pWin->PixelToLogic(rMEvt.GetPosPixel());
142cdf0e10cSrcweir             sal_uInt16 nEditMode = m_pWin->GetBezierMode();
143cdf0e10cSrcweir 
144cdf0e10cSrcweir             if (eHit == SDRHIT_HANDLE && aVEvt.pHdl->GetKind() == HDL_BWGT)
145cdf0e10cSrcweir             {
146cdf0e10cSrcweir                 /******************************************************************
147cdf0e10cSrcweir                 * Handle draggen
148cdf0e10cSrcweir                 ******************************************************************/
149cdf0e10cSrcweir                 bNoInterrupt = sal_True;
150cdf0e10cSrcweir                 bReturn = pSdrView->BegDragObj(m_aStartPos, (OutputDevice*) NULL, aVEvt.pHdl);
151cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_True);
152cdf0e10cSrcweir             }
153cdf0e10cSrcweir             else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT)
154cdf0e10cSrcweir             {
155cdf0e10cSrcweir                 /******************************************************************
156cdf0e10cSrcweir                 * Klebepunkt einfuegen
157cdf0e10cSrcweir                 ******************************************************************/
158cdf0e10cSrcweir                 bNoInterrupt = sal_True;
159cdf0e10cSrcweir                 bReturn = pSdrView->BegInsObjPoint(m_aStartPos, rMEvt.IsMod1());
160cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_True);
161cdf0e10cSrcweir             }
162cdf0e10cSrcweir             else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1())
163cdf0e10cSrcweir             {
164cdf0e10cSrcweir                 /******************************************************************
165cdf0e10cSrcweir                 * Klebepunkt selektieren
166cdf0e10cSrcweir                 ******************************************************************/
167cdf0e10cSrcweir                 if (!rMEvt.IsShift())
168cdf0e10cSrcweir                     pSdrView->UnmarkAllPoints();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir                 bReturn = pSdrView->BegMarkPoints(m_aStartPos);
171cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_True);
172cdf0e10cSrcweir             }
173cdf0e10cSrcweir             else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
174cdf0e10cSrcweir             {
175cdf0e10cSrcweir                 /******************************************************************
176cdf0e10cSrcweir                 * Objekt verschieben
177cdf0e10cSrcweir                 ******************************************************************/
178cdf0e10cSrcweir                 return sal_False;
179cdf0e10cSrcweir             }
180cdf0e10cSrcweir             else if (eHit == SDRHIT_HANDLE)
181cdf0e10cSrcweir             {
182cdf0e10cSrcweir                 /******************************************************************
183cdf0e10cSrcweir                 * Klebepunkt selektieren
184cdf0e10cSrcweir                 ******************************************************************/
185*5f22f2efStruckman                 if (pSdrView->HasMarkablePoints() && (!pSdrView->IsPointMarked(aVEvt.pHdl) || rMEvt.IsShift()))
186cdf0e10cSrcweir                 {
187cdf0e10cSrcweir                     SdrHdl* pHdl = NULL;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir                     if (!rMEvt.IsShift())
190cdf0e10cSrcweir                     {
191cdf0e10cSrcweir                         pSdrView->UnmarkAllPoints();
192cdf0e10cSrcweir                         pHdl = pSdrView->PickHandle(m_aStartPos);
193cdf0e10cSrcweir                     }
194cdf0e10cSrcweir                     else
195cdf0e10cSrcweir                     {
196*5f22f2efStruckman                         if (pSdrView->IsPointMarked(aVEvt.pHdl))
197cdf0e10cSrcweir                         {
198cdf0e10cSrcweir                             bReturn = pSdrView->UnmarkPoint(*aVEvt.pHdl);
199cdf0e10cSrcweir                             pHdl = NULL;
200cdf0e10cSrcweir                         }
201cdf0e10cSrcweir                         else
202cdf0e10cSrcweir                         {
203cdf0e10cSrcweir                             pHdl = pSdrView->PickHandle(m_aStartPos);
204cdf0e10cSrcweir                         }
205cdf0e10cSrcweir                     }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir                     if (pHdl)
208cdf0e10cSrcweir                     {
209cdf0e10cSrcweir                         bNoInterrupt = sal_True;
210cdf0e10cSrcweir                         pSdrView->MarkPoint(*pHdl);
211cdf0e10cSrcweir //                      bReturn = pSdrView->BegDragObj(m_aStartPos, (OutputDevice*) NULL, pHdl);
212cdf0e10cSrcweir //                      m_pWin->SetDrawAction(sal_True);
213cdf0e10cSrcweir                     }
214cdf0e10cSrcweir                 }
215cdf0e10cSrcweir             }
216cdf0e10cSrcweir             else
217cdf0e10cSrcweir             {
218cdf0e10cSrcweir                 /******************************************************************
219cdf0e10cSrcweir                 * Objekt selektieren oder draggen
220cdf0e10cSrcweir                 ******************************************************************/
221cdf0e10cSrcweir                 if (m_pSh->IsObjSelectable(m_aStartPos) && eHit == SDRHIT_UNMARKEDOBJECT)
222cdf0e10cSrcweir                 {
223cdf0e10cSrcweir                     if (pSdrView->HasMarkablePoints())
224cdf0e10cSrcweir                         pSdrView->UnmarkAllPoints();
225cdf0e10cSrcweir 
226cdf0e10cSrcweir                     bNoInterrupt = sal_False;
227cdf0e10cSrcweir                     // Drag im edtwin verwenden
228cdf0e10cSrcweir                     return sal_False;
229cdf0e10cSrcweir                 }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir                 bNoInterrupt = sal_True;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir                 if (m_pSh->IsObjSelected())
234cdf0e10cSrcweir                 {
235cdf0e10cSrcweir                     if (!rMEvt.IsShift())
236cdf0e10cSrcweir                     {
237cdf0e10cSrcweir                         if (!pSdrView->HasMarkablePoints())
238cdf0e10cSrcweir                         {
239cdf0e10cSrcweir                             //JP 10.10.2001: Bug 89619 - don't scroll the
240cdf0e10cSrcweir                             //              cursor into the visible area
241cdf0e10cSrcweir                             sal_Bool bUnlockView = !m_pSh->IsViewLocked();
242cdf0e10cSrcweir                             m_pSh->LockView( sal_True ); //lock visible section
243cdf0e10cSrcweir                             m_pSh->SelectObj(Point(LONG_MAX, LONG_MAX)); // Alles deselektieren
244cdf0e10cSrcweir                             if( bUnlockView )
245cdf0e10cSrcweir                                 m_pSh->LockView( sal_False );
246cdf0e10cSrcweir                         }
247cdf0e10cSrcweir                         else
248cdf0e10cSrcweir                             pSdrView->UnmarkAllPoints();
249cdf0e10cSrcweir                     }
250cdf0e10cSrcweir                 }
251cdf0e10cSrcweir                 if (!m_pSh->IsSelFrmMode())
252cdf0e10cSrcweir                     m_pSh->EnterSelFrmMode(NULL);
253cdf0e10cSrcweir 
254cdf0e10cSrcweir                 if( 0 != (bReturn = m_pSh->BeginMark(m_aStartPos)) )
255cdf0e10cSrcweir                     m_pWin->SetDrawAction(sal_True);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir                 SetDrawPointer();
258cdf0e10cSrcweir             }
259cdf0e10cSrcweir         }
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir     return bReturn;
262cdf0e10cSrcweir }
263cdf0e10cSrcweir 
264cdf0e10cSrcweir /*************************************************************************
265cdf0e10cSrcweir |*
266cdf0e10cSrcweir |* MouseMove-event
267cdf0e10cSrcweir |*
268cdf0e10cSrcweir \************************************************************************/
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)271cdf0e10cSrcweir sal_Bool SwDrawBase::MouseMove(const MouseEvent& rMEvt)
272cdf0e10cSrcweir {
273cdf0e10cSrcweir     SdrView *pSdrView = m_pSh->GetDrawView();
274cdf0e10cSrcweir     Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
275cdf0e10cSrcweir     sal_Bool bRet = sal_False;
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     if (IsCreateObj() && !m_pWin->IsDrawSelMode() && pSdrView->IsCreateObj())
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir         // #i33136#
280cdf0e10cSrcweir         // pSdrView->SetOrtho(rMEvt.IsShift());
281cdf0e10cSrcweir         pSdrView->SetOrtho(doConstructOrthogonal() ? !rMEvt.IsShift() : rMEvt.IsShift());
282cdf0e10cSrcweir         pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());
283cdf0e10cSrcweir 
284cdf0e10cSrcweir         m_pSh->MoveCreate(aPnt);
285cdf0e10cSrcweir         bRet = sal_True;
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir     else if (pSdrView->IsAction() || pSdrView->IsInsObjPoint() || pSdrView->IsMarkPoints())
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         m_pSh->MoveMark(aPnt);
290cdf0e10cSrcweir         bRet = sal_True;
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     return (bRet);
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir /*************************************************************************
297cdf0e10cSrcweir |*
298cdf0e10cSrcweir |* MouseButtonUp-event
299cdf0e10cSrcweir |*
300cdf0e10cSrcweir \************************************************************************/
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)303cdf0e10cSrcweir sal_Bool SwDrawBase::MouseButtonUp(const MouseEvent& rMEvt)
304cdf0e10cSrcweir {
305cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
306cdf0e10cSrcweir     sal_Bool bCheckShell = sal_False;
307cdf0e10cSrcweir     sal_Bool bAutoCap = sal_False;
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     if (IsCreateObj() && m_pSh->IsDrawCreate() && !m_pWin->IsDrawSelMode())
312cdf0e10cSrcweir     {
313cdf0e10cSrcweir         const SdrObjKind nDrawMode = m_pWin->GetSdrDrawMode();
314cdf0e10cSrcweir         //objects with multiple point may end at the start position
315cdf0e10cSrcweir         sal_Bool bMultiPoint = OBJ_PLIN == nDrawMode ||
316cdf0e10cSrcweir                                 OBJ_PATHLINE == nDrawMode ||
317cdf0e10cSrcweir                                 OBJ_FREELINE == nDrawMode;
318cdf0e10cSrcweir         if(rMEvt.IsRight() || (aPnt == m_aStartPos && !bMultiPoint))
319cdf0e10cSrcweir         {
320cdf0e10cSrcweir             m_pSh->BreakCreate();
321cdf0e10cSrcweir             m_pView->LeaveDrawCreate();
322cdf0e10cSrcweir         }
323cdf0e10cSrcweir         else
324cdf0e10cSrcweir         {
325cdf0e10cSrcweir             if (OBJ_NONE == nDrawMode)
326cdf0e10cSrcweir             {
327cdf0e10cSrcweir                 SwRewriter aRewriter;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir                 aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_FRAME));
330cdf0e10cSrcweir                 m_pSh->StartUndo(UNDO_INSERT, &aRewriter);
331cdf0e10cSrcweir             }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir             m_pSh->EndCreate(SDRCREATE_FORCEEND);
334cdf0e10cSrcweir             if (OBJ_NONE == nDrawMode)   // Textrahmen eingefuegt
335cdf0e10cSrcweir             {
336cdf0e10cSrcweir                uno::Reference< frame::XDispatchRecorder > xRecorder =
337cdf0e10cSrcweir                     m_pSh->GetView().GetViewFrame()->GetBindings().GetRecorder();
338cdf0e10cSrcweir                 if ( xRecorder.is() )
339cdf0e10cSrcweir                 {
340cdf0e10cSrcweir                     SfxRequest aReq(m_pSh->GetView().GetViewFrame(),FN_INSERT_FRAME);
341cdf0e10cSrcweir                         aReq.AppendItem(SfxUInt16Item( FN_INSERT_FRAME,
342cdf0e10cSrcweir                                 static_cast<sal_uInt16>(FLY_AT_PARA) ));
343cdf0e10cSrcweir                         aReq.AppendItem(SfxPointItem( FN_PARAM_1, m_pSh->GetAnchorObjDiff()));
344cdf0e10cSrcweir                         aReq.AppendItem(SvxSizeItem( FN_PARAM_2, m_pSh->GetObjSize()));
345cdf0e10cSrcweir                     aReq.Done();
346cdf0e10cSrcweir                 }
347cdf0e10cSrcweir                 bAutoCap = sal_True;
348cdf0e10cSrcweir                 if(m_pWin->GetFrmColCount() > 1)
349cdf0e10cSrcweir                 {
350cdf0e10cSrcweir                     SfxItemSet aSet(m_pView->GetPool(),RES_COL,RES_COL);
351cdf0e10cSrcweir                     SwFmtCol aCol((const SwFmtCol&)aSet.Get(RES_COL));
352cdf0e10cSrcweir                     aCol.Init(m_pWin->GetFrmColCount(), aCol.GetGutterWidth(), aCol.GetWishWidth());
353cdf0e10cSrcweir                     aSet.Put(aCol);
354cdf0e10cSrcweir                     // Vorlagen-AutoUpdate
355cdf0e10cSrcweir                     SwFrmFmt* pFmt = m_pSh->GetCurFrmFmt();
356cdf0e10cSrcweir                     if(pFmt && pFmt->IsAutoUpdateFmt())
357cdf0e10cSrcweir                         m_pSh->AutoUpdateFrame(pFmt, aSet);
358cdf0e10cSrcweir                     else
359cdf0e10cSrcweir                         m_pSh->SetFlyFrmAttr( aSet );
360cdf0e10cSrcweir                 }
361cdf0e10cSrcweir             }
362cdf0e10cSrcweir             if (m_pWin->GetSdrDrawMode() == OBJ_NONE)
363cdf0e10cSrcweir             {
364cdf0e10cSrcweir                 m_pSh->EndUndo();
365cdf0e10cSrcweir             }
366cdf0e10cSrcweir         }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir         bReturn = sal_True;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         EnterSelectMode(rMEvt);
371cdf0e10cSrcweir     }
372cdf0e10cSrcweir     else
373cdf0e10cSrcweir     {
374cdf0e10cSrcweir         SdrView *pSdrView = m_pSh->GetDrawView();
375cdf0e10cSrcweir 
376cdf0e10cSrcweir         if (!pSdrView->HasMarkablePoints())
377cdf0e10cSrcweir         {
378cdf0e10cSrcweir             /**********************************************************************
379cdf0e10cSrcweir             * KEIN BEZIER_EDITOR
380cdf0e10cSrcweir             **********************************************************************/
381cdf0e10cSrcweir             if ((m_pSh->GetDrawView()->IsMarkObj() || m_pSh->GetDrawView()->IsMarkPoints())
382cdf0e10cSrcweir                  && rMEvt.IsLeft())
383cdf0e10cSrcweir             {
384cdf0e10cSrcweir                 bReturn = m_pSh->EndMark();
385cdf0e10cSrcweir 
386cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_False);
387cdf0e10cSrcweir 
388cdf0e10cSrcweir                 if (aPnt == m_aStartPos && m_pSh->IsObjSelectable(aPnt))
389cdf0e10cSrcweir                 {
390cdf0e10cSrcweir                     m_pSh->SelectObj(aPnt, ( rMEvt.IsShift() &&
391cdf0e10cSrcweir                                    m_pSh->IsSelFrmMode()) ? SW_ADD_SELECT : 0);
392cdf0e10cSrcweir 
393cdf0e10cSrcweir                     if (!m_pSh->IsObjSelected())
394cdf0e10cSrcweir                     {
395cdf0e10cSrcweir                         m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
396cdf0e10cSrcweir 
397cdf0e10cSrcweir                         m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
398cdf0e10cSrcweir 
399cdf0e10cSrcweir                         if (m_pSh->IsSelFrmMode())
400cdf0e10cSrcweir                             m_pSh->LeaveSelFrmMode();
401cdf0e10cSrcweir                     }
402cdf0e10cSrcweir                     m_pView->NoRotate();
403cdf0e10cSrcweir 
404cdf0e10cSrcweir                     bCheckShell = sal_True; // ggf BezierShell anwerfen
405cdf0e10cSrcweir                 }
406cdf0e10cSrcweir                 else if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
407cdf0e10cSrcweir                 {
408cdf0e10cSrcweir                     if (m_pSh->IsObjSelectable(aPnt))
409cdf0e10cSrcweir                         m_pSh->SelectObj(aPnt, ( rMEvt.IsShift() &&
410cdf0e10cSrcweir                             m_pSh->IsSelFrmMode() ) ? SW_ADD_SELECT : 0 );
411cdf0e10cSrcweir                     else
412cdf0e10cSrcweir                     {
413cdf0e10cSrcweir                         m_pView->LeaveDrawCreate();
414cdf0e10cSrcweir                         if (m_pSh->IsSelFrmMode())
415cdf0e10cSrcweir                             m_pSh->LeaveSelFrmMode();
416cdf0e10cSrcweir                     }
417cdf0e10cSrcweir                     m_pView->NoRotate();
418cdf0e10cSrcweir 
419cdf0e10cSrcweir                     bReturn = sal_True;
420cdf0e10cSrcweir                 }
421cdf0e10cSrcweir             }
422cdf0e10cSrcweir         }
423cdf0e10cSrcweir         else
424cdf0e10cSrcweir         {
425cdf0e10cSrcweir             /**********************************************************************
426cdf0e10cSrcweir             * BEZIER_EDITOR
427cdf0e10cSrcweir             **********************************************************************/
428cdf0e10cSrcweir             if ( pSdrView->IsAction() )
429cdf0e10cSrcweir             {
430cdf0e10cSrcweir                 if ( pSdrView->IsInsObjPoint() )
431cdf0e10cSrcweir                     bReturn = pSdrView->EndInsObjPoint(SDRCREATE_FORCEEND);
432cdf0e10cSrcweir                 else if (pSdrView->IsMarkPoints() )
433cdf0e10cSrcweir                     bReturn = pSdrView->EndMarkPoints();
434cdf0e10cSrcweir                 else
435cdf0e10cSrcweir                 {
436cdf0e10cSrcweir                     pSdrView->EndAction();
437cdf0e10cSrcweir                     bReturn = sal_True;
438cdf0e10cSrcweir                 }
439cdf0e10cSrcweir                 m_pWin->SetDrawAction(sal_False);
440cdf0e10cSrcweir 
441cdf0e10cSrcweir                 if (aPnt == m_aStartPos)
442cdf0e10cSrcweir                 {
443cdf0e10cSrcweir                     if (!m_pSh->IsObjSelectable(aPnt))
444cdf0e10cSrcweir                         m_pSh->SelectObj(Point(LONG_MAX, LONG_MAX));
445cdf0e10cSrcweir                     else if (!bReturn)
446cdf0e10cSrcweir                     {
447cdf0e10cSrcweir                         if (!rMEvt.IsShift())
448cdf0e10cSrcweir                             pSdrView->UnmarkAllPoints();
449cdf0e10cSrcweir                         m_pSh->SelectObj(aPnt, (rMEvt.IsShift() &&
450cdf0e10cSrcweir                                        m_pSh->IsSelFrmMode()) ? SW_ADD_SELECT :0);
451cdf0e10cSrcweir                     }
452cdf0e10cSrcweir 
453cdf0e10cSrcweir                     if (!m_pSh->IsObjSelected())
454cdf0e10cSrcweir                     {
455cdf0e10cSrcweir                         m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
456cdf0e10cSrcweir 
457cdf0e10cSrcweir                         m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
458cdf0e10cSrcweir 
459cdf0e10cSrcweir                         if (m_pSh->IsSelFrmMode())
460cdf0e10cSrcweir                             m_pSh->LeaveSelFrmMode();
461cdf0e10cSrcweir                     }
462cdf0e10cSrcweir                     m_pView->NoRotate();
463cdf0e10cSrcweir 
464cdf0e10cSrcweir                     bCheckShell = sal_True; // ggf BezierShell anwerfen
465cdf0e10cSrcweir                 }
466cdf0e10cSrcweir             }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir             SetDrawPointer();
469cdf0e10cSrcweir 
470cdf0e10cSrcweir             if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
471cdf0e10cSrcweir             {
472cdf0e10cSrcweir                 m_pView->LeaveDrawCreate();
473cdf0e10cSrcweir                 if (m_pSh->IsSelFrmMode())
474cdf0e10cSrcweir                     m_pSh->LeaveSelFrmMode();
475cdf0e10cSrcweir 
476cdf0e10cSrcweir                 m_pView->NoRotate();
477cdf0e10cSrcweir                 bReturn = sal_True;
478cdf0e10cSrcweir             }
479cdf0e10cSrcweir         }
480cdf0e10cSrcweir     }
481cdf0e10cSrcweir 
482cdf0e10cSrcweir     if (bCheckShell)
483cdf0e10cSrcweir         m_pView->AttrChangedNotify( m_pSh ); // ggf BezierShell anwerfen
484cdf0e10cSrcweir 
485cdf0e10cSrcweir     //!!!!!!!!!! Achtung Suizid !!!!!!!!!!! Sollte alles mal erneuert werden
486cdf0e10cSrcweir     if ( bAutoCap )
487cdf0e10cSrcweir         m_pView->AutoCaption(FRAME_CAP);   //Kann derzeit nur FRAME sein, sonst auf
488cdf0e10cSrcweir                                         //enums umstellen
489cdf0e10cSrcweir     return (bReturn);
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir /*************************************************************************
493cdf0e10cSrcweir |*
494cdf0e10cSrcweir |* Function aktivieren
495cdf0e10cSrcweir |*
496cdf0e10cSrcweir \************************************************************************/
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
Activate(const sal_uInt16 nSlot)499cdf0e10cSrcweir void SwDrawBase::Activate(const sal_uInt16 nSlot)
500cdf0e10cSrcweir {
501cdf0e10cSrcweir     SetSlotId(nSlot);
502cdf0e10cSrcweir     SdrView *pSdrView = m_pSh->GetDrawView();
503cdf0e10cSrcweir 
504cdf0e10cSrcweir     pSdrView->SetCurrentObj( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()) );
505cdf0e10cSrcweir     pSdrView->SetEditMode(sal_False);
506cdf0e10cSrcweir 
507cdf0e10cSrcweir     SetDrawPointer();
508cdf0e10cSrcweir     m_pSh->NoEdit();
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
511cdf0e10cSrcweir /*************************************************************************
512cdf0e10cSrcweir |*
513cdf0e10cSrcweir |* Function deaktivieren
514cdf0e10cSrcweir |*
515cdf0e10cSrcweir \************************************************************************/
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 
Deactivate()518cdf0e10cSrcweir void __EXPORT SwDrawBase::Deactivate()
519cdf0e10cSrcweir {
520cdf0e10cSrcweir     SdrView *pSdrView = m_pSh->GetDrawView();
521cdf0e10cSrcweir     pSdrView->SetOrtho(sal_False);
522cdf0e10cSrcweir     pSdrView->SetAngleSnapEnabled(sal_False);
523cdf0e10cSrcweir 
524cdf0e10cSrcweir     if (m_pWin->IsDrawAction() && m_pSh->IsDrawCreate())
525cdf0e10cSrcweir         m_pSh->BreakCreate();
526cdf0e10cSrcweir 
527cdf0e10cSrcweir     m_pWin->SetDrawAction(sal_False);
528cdf0e10cSrcweir 
529cdf0e10cSrcweir     m_pWin->ReleaseMouse();
530cdf0e10cSrcweir     bNoInterrupt = sal_False;
531cdf0e10cSrcweir 
532cdf0e10cSrcweir //  if(!m_pSh->IsObjSelected())
533cdf0e10cSrcweir //      m_pSh->Edit();
534cdf0e10cSrcweir 
535cdf0e10cSrcweir     if(m_pWin->GetApplyTemplate())
536cdf0e10cSrcweir         m_pWin->SetApplyTemplate(SwApplyTemplate());
537cdf0e10cSrcweir     m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
538cdf0e10cSrcweir }
539cdf0e10cSrcweir 
540cdf0e10cSrcweir /*************************************************************************
541cdf0e10cSrcweir |*
542cdf0e10cSrcweir |* Tastaturereignisse bearbeiten
543cdf0e10cSrcweir |*
544cdf0e10cSrcweir |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
545cdf0e10cSrcweir |* sal_False.
546cdf0e10cSrcweir |*
547cdf0e10cSrcweir \************************************************************************/
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 
KeyInput(const KeyEvent & rKEvt)550cdf0e10cSrcweir sal_Bool SwDrawBase::KeyInput(const KeyEvent& rKEvt)
551cdf0e10cSrcweir {
552cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
553cdf0e10cSrcweir     sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
554cdf0e10cSrcweir 
555cdf0e10cSrcweir     switch (nCode)
556cdf0e10cSrcweir     {
557cdf0e10cSrcweir         case KEY_ESCAPE:
558cdf0e10cSrcweir         {
559cdf0e10cSrcweir             if (m_pWin->IsDrawAction())
560cdf0e10cSrcweir             {
561cdf0e10cSrcweir                 BreakCreate();
562cdf0e10cSrcweir                 m_pView->LeaveDrawCreate();
563cdf0e10cSrcweir             }
564cdf0e10cSrcweir 
565cdf0e10cSrcweir             bReturn = sal_True;
566cdf0e10cSrcweir         }
567cdf0e10cSrcweir         break;
568cdf0e10cSrcweir 
569cdf0e10cSrcweir         case KEY_DELETE:
570cdf0e10cSrcweir         {
571cdf0e10cSrcweir             m_pSh->DelSelectedObj();
572cdf0e10cSrcweir             bReturn = sal_True;
573cdf0e10cSrcweir         }
574cdf0e10cSrcweir         break;
575cdf0e10cSrcweir 
576cdf0e10cSrcweir         case KEY_UP:
577cdf0e10cSrcweir         case KEY_DOWN:
578cdf0e10cSrcweir         case KEY_LEFT:
579cdf0e10cSrcweir         case KEY_RIGHT:
580cdf0e10cSrcweir         {
581cdf0e10cSrcweir             SdrView *pSdrView = m_pSh->GetDrawView();
582cdf0e10cSrcweir 
583cdf0e10cSrcweir             if (!pSdrView->IsTextEdit())
584cdf0e10cSrcweir             {
585cdf0e10cSrcweir                 long nX = 0;
586cdf0e10cSrcweir                 long nY = 0;
587cdf0e10cSrcweir 
588cdf0e10cSrcweir                 if (nCode == KEY_UP)
589cdf0e10cSrcweir                 {
590cdf0e10cSrcweir                     // Scroll nach oben
591cdf0e10cSrcweir                     nX = 0;
592cdf0e10cSrcweir                     nY =-1;
593cdf0e10cSrcweir                 }
594cdf0e10cSrcweir                 else if (nCode == KEY_DOWN)
595cdf0e10cSrcweir                 {
596cdf0e10cSrcweir                     // Scroll nach unten
597cdf0e10cSrcweir                     nX = 0;
598cdf0e10cSrcweir                     nY = 1;
599cdf0e10cSrcweir                 }
600cdf0e10cSrcweir                 else if (nCode == KEY_LEFT)
601cdf0e10cSrcweir                 {
602cdf0e10cSrcweir                     // Scroll nach links
603cdf0e10cSrcweir                     nX =-1;
604cdf0e10cSrcweir                     nY = 0;
605cdf0e10cSrcweir                 }
606cdf0e10cSrcweir                 else if (nCode == KEY_RIGHT)
607cdf0e10cSrcweir                 {
608cdf0e10cSrcweir                     // Scroll nach rechts
609cdf0e10cSrcweir                     nX = 1;
610cdf0e10cSrcweir                     nY = 0;
611cdf0e10cSrcweir                 }
612cdf0e10cSrcweir 
613cdf0e10cSrcweir                 if (pSdrView->AreObjectsMarked() && rKEvt.GetKeyCode().IsMod2())
614cdf0e10cSrcweir                 {
615cdf0e10cSrcweir                     // Objekte verschieben
616cdf0e10cSrcweir                     nX *= 100;
617cdf0e10cSrcweir                     nY *= 100;
618cdf0e10cSrcweir                     pSdrView->MoveAllMarked(Size(nX, nY));
619cdf0e10cSrcweir                 }
620cdf0e10cSrcweir 
621cdf0e10cSrcweir                 bReturn = sal_True;
622cdf0e10cSrcweir             }
623cdf0e10cSrcweir         }
624cdf0e10cSrcweir         break;
625cdf0e10cSrcweir     }
626cdf0e10cSrcweir 
627cdf0e10cSrcweir     return (bReturn);
628cdf0e10cSrcweir }
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 
631cdf0e10cSrcweir /*************************************************************************
632cdf0e10cSrcweir |*
633cdf0e10cSrcweir |* Tastaturereignisse bearbeiten
634cdf0e10cSrcweir |*
635cdf0e10cSrcweir |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
636cdf0e10cSrcweir |* sal_False.
637cdf0e10cSrcweir |*
638cdf0e10cSrcweir \************************************************************************/
639cdf0e10cSrcweir 
640cdf0e10cSrcweir 
BreakCreate()641cdf0e10cSrcweir void SwDrawBase::BreakCreate()
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     m_pSh->BreakCreate();
644cdf0e10cSrcweir     m_pWin->SetDrawAction(sal_False);
645cdf0e10cSrcweir     m_pWin->ReleaseMouse();
646cdf0e10cSrcweir 
647cdf0e10cSrcweir     Deactivate();
648cdf0e10cSrcweir //  m_pView->LeaveDrawCreate();
649cdf0e10cSrcweir }
650cdf0e10cSrcweir 
651cdf0e10cSrcweir /*************************************************************************
652cdf0e10cSrcweir |*
653cdf0e10cSrcweir |* Mauspointer umschalten
654cdf0e10cSrcweir |*
655cdf0e10cSrcweir \************************************************************************/
656cdf0e10cSrcweir 
657cdf0e10cSrcweir 
SetDrawPointer()658cdf0e10cSrcweir void SwDrawBase::SetDrawPointer()
659cdf0e10cSrcweir {
660cdf0e10cSrcweir     SdrView *pSdrView = m_pSh->GetDrawView();
661cdf0e10cSrcweir         Point aPnt(m_pWin->OutputToScreenPixel(m_pWin->GetPointerPosPixel()));
662cdf0e10cSrcweir     aPnt = m_pWin->PixelToLogic(m_pWin->ScreenToOutputPixel(aPnt));
663cdf0e10cSrcweir     const Pointer aPointTyp = pSdrView->GetPreferedPointer(aPnt, m_pSh->GetOut());
664cdf0e10cSrcweir     const Pointer aDrawPt(aPointTyp);
665cdf0e10cSrcweir     m_pWin->SetPointer(aDrawPt);
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir /*************************************************************************
669cdf0e10cSrcweir |*
670cdf0e10cSrcweir |* Ggf in Selektionsmode wechseln
671cdf0e10cSrcweir |*
672cdf0e10cSrcweir \************************************************************************/
673cdf0e10cSrcweir 
EnterSelectMode(const MouseEvent & rMEvt)674cdf0e10cSrcweir void SwDrawBase::EnterSelectMode(const MouseEvent& rMEvt)
675cdf0e10cSrcweir {
676cdf0e10cSrcweir     m_pWin->SetDrawAction(sal_False);
677cdf0e10cSrcweir 
678cdf0e10cSrcweir     if (!m_pSh->IsObjSelected() && !m_pWin->IsDrawAction())
679cdf0e10cSrcweir     {
680cdf0e10cSrcweir         Point aPnt(m_pWin->PixelToLogic(rMEvt.GetPosPixel()));
681cdf0e10cSrcweir 
682cdf0e10cSrcweir         if (m_pSh->IsObjSelectable(aPnt))
683cdf0e10cSrcweir         {
684cdf0e10cSrcweir             m_pSh->SelectObj(aPnt);
685cdf0e10cSrcweir             if (rMEvt.GetModifier() == KEY_SHIFT || !m_pSh->IsObjSelected())
686cdf0e10cSrcweir             {
687cdf0e10cSrcweir                 m_pView->LeaveDrawCreate();    // In Selektionsmode wechseln
688cdf0e10cSrcweir 
689cdf0e10cSrcweir                 m_pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
690cdf0e10cSrcweir             }
691cdf0e10cSrcweir         }
692cdf0e10cSrcweir         else
693cdf0e10cSrcweir         {
694cdf0e10cSrcweir             m_pView->LeaveDrawCreate();
695cdf0e10cSrcweir             if (m_pSh->IsSelFrmMode())
696cdf0e10cSrcweir                 m_pSh->LeaveSelFrmMode();
697cdf0e10cSrcweir         }
698cdf0e10cSrcweir         m_pView->NoRotate();
699cdf0e10cSrcweir     }
700cdf0e10cSrcweir }
701cdf0e10cSrcweir /* -----------------------------03.04.2002 10:52------------------------------
702cdf0e10cSrcweir 
703cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
CreateDefaultObject()704cdf0e10cSrcweir void SwDrawBase::CreateDefaultObject()
705cdf0e10cSrcweir {
706cdf0e10cSrcweir     Point aStartPos = GetDefaultCenterPos();
707cdf0e10cSrcweir     Point aEndPos(aStartPos);
708cdf0e10cSrcweir     aStartPos.X() -= 8 * MM50;
709cdf0e10cSrcweir     aStartPos.Y() -= 4 * MM50;
710cdf0e10cSrcweir     aEndPos.X() += 8 * MM50;
711cdf0e10cSrcweir     aEndPos.Y() += 4 * MM50;
712cdf0e10cSrcweir     Rectangle aRect(aStartPos, aEndPos);
713cdf0e10cSrcweir     m_pSh->CreateDefaultShape( static_cast< sal_uInt16 >(m_pWin->GetSdrDrawMode()), aRect, m_nSlotId);
714cdf0e10cSrcweir }
715cdf0e10cSrcweir /* -----------------25.10.2002 14:14-----------------
716cdf0e10cSrcweir  *
717cdf0e10cSrcweir  * --------------------------------------------------*/
GetDefaultCenterPos()718cdf0e10cSrcweir Point  SwDrawBase::GetDefaultCenterPos()
719cdf0e10cSrcweir {
720cdf0e10cSrcweir     Size aDocSz(m_pSh->GetDocSize());
721cdf0e10cSrcweir     const SwRect& rVisArea = m_pSh->VisArea();
722cdf0e10cSrcweir     Point aStartPos = rVisArea.Center();
723cdf0e10cSrcweir     if(rVisArea.Width() > aDocSz.Width())
724cdf0e10cSrcweir         aStartPos.X() = aDocSz.Width() / 2 + rVisArea.Left();
725cdf0e10cSrcweir     if(rVisArea.Height() > aDocSz.Height())
726cdf0e10cSrcweir         aStartPos.Y() = aDocSz.Height() / 2 + rVisArea.Top();
727cdf0e10cSrcweir     return aStartPos;
728cdf0e10cSrcweir }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir // #i33136#
doConstructOrthogonal() const731cdf0e10cSrcweir bool SwDrawBase::doConstructOrthogonal() const
732cdf0e10cSrcweir {
733cdf0e10cSrcweir     return false;
734cdf0e10cSrcweir }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir // eof
737