xref: /AOO41X/main/sc/source/ui/drawfunc/fuconrec.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 #include "fuconrec.hxx"
28 #include "tabvwsh.hxx"
29 #include "sc.hrc"
30 #include "drawview.hxx"
31 
32 #include <editeng/outlobj.hxx>
33 // #98185# Create default drawing objects via keyboard
34 #include <svx/svdopath.hxx>
35 #include <svx/svdocapt.hxx>
36 #include <basegfx/polygon/b2dpolygon.hxx>
37 #include <basegfx/point/b2dpoint.hxx>
38 
39 #include "scresid.hxx"
40 
41 //------------------------------------------------------------------------
42 
43 
44 /*************************************************************************
45 |*
46 |* Konstruktor
47 |*
48 \************************************************************************/
49 
FuConstRectangle(ScTabViewShell * pViewSh,Window * pWin,ScDrawView * pViewP,SdrModel * pDoc,SfxRequest & rReq)50 FuConstRectangle::FuConstRectangle(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP,
51                    SdrModel* pDoc, SfxRequest& rReq)
52     : FuConstruct(pViewSh, pWin, pViewP, pDoc, rReq)
53 {
54 }
55 
56 /*************************************************************************
57 |*
58 |* Destruktor
59 |*
60 \************************************************************************/
61 
~FuConstRectangle()62 FuConstRectangle::~FuConstRectangle()
63 {
64 }
65 
66 /*************************************************************************
67 |*
68 |* MouseButtonDown-event
69 |*
70 \************************************************************************/
71 
MouseButtonDown(const MouseEvent & rMEvt)72 sal_Bool __EXPORT FuConstRectangle::MouseButtonDown(const MouseEvent& rMEvt)
73 {
74     // #95491# remember button state for creation of own MouseEvents
75     SetMouseButtonCode(rMEvt.GetButtons());
76 
77     sal_Bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
78 
79     if ( rMEvt.IsLeft() && !pView->IsAction() )
80     {
81         Point aPos( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
82 
83         pWindow->CaptureMouse();
84 
85         if ( pView->GetCurrentObjIdentifier() == OBJ_CAPTION )
86         {
87             Size aCaptionSize ( 2268, 1134 ); // 4x2cm
88 
89             bReturn = pView->BegCreateCaptionObj( aPos, aCaptionSize );
90 
91             // wie stellt man den Font ein, mit dem geschrieben wird
92         }
93         else
94             bReturn = pView->BegCreateObj(aPos);
95     }
96     return bReturn;
97 }
98 
99 /*************************************************************************
100 |*
101 |* MouseMove-event
102 |*
103 \************************************************************************/
104 
MouseMove(const MouseEvent & rMEvt)105 sal_Bool __EXPORT FuConstRectangle::MouseMove(const MouseEvent& rMEvt)
106 {
107     return FuConstruct::MouseMove(rMEvt);
108 }
109 
110 /*************************************************************************
111 |*
112 |* MouseButtonUp-event
113 |*
114 \************************************************************************/
115 
MouseButtonUp(const MouseEvent & rMEvt)116 sal_Bool __EXPORT FuConstRectangle::MouseButtonUp(const MouseEvent& rMEvt)
117 {
118     // #95491# remember button state for creation of own MouseEvents
119     SetMouseButtonCode(rMEvt.GetButtons());
120 
121     sal_Bool bReturn = sal_False;
122 
123     if ( pView->IsCreateObj() && rMEvt.IsLeft() )
124     {
125         Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
126         pView->EndCreateObj(SDRCREATE_FORCEEND);
127 
128         if (aSfxRequest.GetSlot() == SID_DRAW_CAPTION_VERTICAL)
129         {
130             //  set vertical flag for caption object
131 
132             const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
133             if (rMarkList.GetMark(0))
134             {
135                 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
136                 //  create OutlinerParaObject now so it can be set to vertical
137                 if ( pObj->ISA(SdrTextObj) )
138                     ((SdrTextObj*)pObj)->ForceOutlinerParaObject();
139                 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
140                 if( pOPO && !pOPO->IsVertical() )
141                     pOPO->SetVertical( sal_True );
142             }
143         }
144 
145         bReturn = sal_True;
146     }
147     return (FuConstruct::MouseButtonUp(rMEvt) || bReturn);
148 }
149 
150 /*************************************************************************
151 |*
152 |* Tastaturereignisse bearbeiten
153 |*
154 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
155 |* FALSE.
156 |*
157 \************************************************************************/
158 
KeyInput(const KeyEvent & rKEvt)159 sal_Bool __EXPORT FuConstRectangle::KeyInput(const KeyEvent& rKEvt)
160 {
161     sal_Bool bReturn = FuConstruct::KeyInput(rKEvt);
162     return(bReturn);
163 }
164 
165 /*************************************************************************
166 |*
167 |* Function aktivieren
168 |*
169 \************************************************************************/
170 
Activate()171 void FuConstRectangle::Activate()
172 {
173     SdrObjKind aObjKind;
174 
175     switch (aSfxRequest.GetSlot() )
176     {
177         case SID_DRAW_LINE:
178             aNewPointer = Pointer( POINTER_DRAW_LINE );
179             aObjKind = OBJ_LINE;
180             break;
181 
182         case SID_DRAW_RECT:
183             aNewPointer = Pointer( POINTER_DRAW_RECT );
184             aObjKind = OBJ_RECT;
185             break;
186 
187         case SID_DRAW_ELLIPSE:
188             aNewPointer = Pointer( POINTER_DRAW_ELLIPSE );
189             aObjKind = OBJ_CIRC;
190             break;
191 
192         case SID_DRAW_CAPTION:
193         case SID_DRAW_CAPTION_VERTICAL:
194             aNewPointer = Pointer( POINTER_DRAW_CAPTION );
195             aObjKind = OBJ_CAPTION;
196             break;
197 
198         default:
199             aNewPointer = Pointer( POINTER_CROSS );
200             aObjKind = OBJ_RECT;
201             break;
202     }
203 
204     pView->SetCurrentObj(sal::static_int_cast<sal_uInt16>(aObjKind));
205 
206     aOldPointer = pWindow->GetPointer();
207     pViewShell->SetActivePointer( aNewPointer );
208 
209     FuConstruct::Activate();
210 }
211 
212 /*************************************************************************
213 |*
214 |* Function deaktivieren
215 |*
216 \************************************************************************/
217 
Deactivate()218 void FuConstRectangle::Deactivate()
219 {
220     FuConstruct::Deactivate();
221     pViewShell->SetActivePointer( aOldPointer );
222 }
223 
224 // #98185# Create default drawing objects via keyboard
CreateDefaultObject(const sal_uInt16 nID,const Rectangle & rRectangle)225 SdrObject* FuConstRectangle::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
226 {
227     // case SID_DRAW_LINE:
228     // case SID_DRAW_RECT:
229     // case SID_DRAW_ELLIPSE:
230     // case SID_DRAW_CAPTION:
231     // case SID_DRAW_CAPTION_VERTICAL:
232 
233     SdrObject* pObj = SdrObjFactory::MakeNewObject(
234         pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(),
235         0L, pDrDoc);
236 
237     if(pObj)
238     {
239         Rectangle aRect(rRectangle);
240         Point aStart = aRect.TopLeft();
241         Point aEnd = aRect.BottomRight();
242 
243         switch(nID)
244         {
245             case SID_DRAW_LINE:
246             {
247                 if(pObj->ISA(SdrPathObj))
248                 {
249                     sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
250                     basegfx::B2DPolygon aPoly;
251                     aPoly.append(basegfx::B2DPoint(aStart.X(), nYMiddle));
252                     aPoly.append(basegfx::B2DPoint(aEnd.X(), nYMiddle));
253                     ((SdrPathObj*)pObj)->SetPathPoly(basegfx::B2DPolyPolygon(aPoly));
254                 }
255                 else
256                 {
257                     DBG_ERROR("Object is NO line object");
258                 }
259 
260                 break;
261             }
262             case SID_DRAW_CAPTION:
263             case SID_DRAW_CAPTION_VERTICAL:
264             {
265                 if(pObj->ISA(SdrCaptionObj))
266                 {
267                     sal_Bool bIsVertical(SID_DRAW_CAPTION_VERTICAL == nID);
268 
269                     ((SdrTextObj*)pObj)->SetVerticalWriting(bIsVertical);
270 
271                     if(bIsVertical)
272                     {
273                         SfxItemSet aSet(pObj->GetMergedItemSet());
274                         aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
275                         aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
276                         pObj->SetMergedItemSet(aSet);
277                     }
278 
279                     //  #105815# don't set default text, start edit mode instead
280                     //  (Edit mode is started in ScTabViewShell::ExecDraw, because
281                     //  it must be handled by FuText)
282                     // String aText(ScResId(STR_CAPTION_DEFAULT_TEXT));
283                     // ((SdrCaptionObj*)pObj)->SetText(aText);
284 
285                     ((SdrCaptionObj*)pObj)->SetLogicRect(aRect);
286                     ((SdrCaptionObj*)pObj)->SetTailPos(
287                         aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2));
288                 }
289                 else
290                 {
291                     DBG_ERROR("Object is NO caption object");
292                 }
293 
294                 break;
295             }
296 
297             default:
298             {
299                 pObj->SetLogicRect(aRect);
300 
301                 break;
302             }
303         }
304 
305         SfxItemSet aAttr(pDrDoc->GetItemPool());
306         pObj->SetMergedItemSet(aAttr);
307     }
308 
309     return pObj;
310 }
311 
312