1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5f6e50924SAndrew Rist * distributed with this work for additional information
6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10f6e50924SAndrew Rist *
11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12f6e50924SAndrew Rist *
13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist * software distributed under the License is distributed on an
15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17f6e50924SAndrew Rist * specific language governing permissions and limitations
18f6e50924SAndrew Rist * under the License.
19f6e50924SAndrew Rist *
20f6e50924SAndrew Rist *************************************************************/
21f6e50924SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_svx.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir #include <com/sun/star/i18n/WordType.hpp>
26cdf0e10cSrcweir #include <svtools/accessibilityoptions.hxx>
27cdf0e10cSrcweir #include <svx/svdedxv.hxx>
28cdf0e10cSrcweir #include <svl/solar.hrc>
29cdf0e10cSrcweir #include <svl/itemiter.hxx>
30cdf0e10cSrcweir #include <vcl/msgbox.hxx>
31cdf0e10cSrcweir #include <vcl/hatch.hxx>
32cdf0e10cSrcweir #include <svl/whiter.hxx>
33cdf0e10cSrcweir #include <svl/style.hxx>
34cdf0e10cSrcweir #include <editeng/editstat.hxx>
35cdf0e10cSrcweir #include <tools/config.hxx>
36cdf0e10cSrcweir #include <vcl/cursor.hxx>
37cdf0e10cSrcweir #include <editeng/unotext.hxx>
38cdf0e10cSrcweir #include <editeng/editeng.hxx>
39cdf0e10cSrcweir #include <editeng/editobj.hxx>
40cdf0e10cSrcweir #include <editeng/outlobj.hxx>
41cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx>
42cdf0e10cSrcweir #include "svx/svditext.hxx"
43cdf0e10cSrcweir #include <svx/svdoutl.hxx>
44cdf0e10cSrcweir #include <svx/sdtfchim.hxx>
45cdf0e10cSrcweir #include <svx/svdotext.hxx>
46cdf0e10cSrcweir #include <svx/svdundo.hxx>
47cdf0e10cSrcweir #include "svx/svditer.hxx"
48cdf0e10cSrcweir #include "svx/svdpagv.hxx"
49cdf0e10cSrcweir #include "svx/svdpage.hxx"
501cd65da9SArmin Le Grand #include "svx/svdetc.hxx"
51cdf0e10cSrcweir #include "svx/svdotable.hxx"
52cdf0e10cSrcweir #include <svx/selectioncontroller.hxx>
53cdf0e10cSrcweir #ifdef DBG_UTIL
54cdf0e10cSrcweir #include <svdibrow.hxx>
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir #include <svx/svdoutl.hxx>
571cd65da9SArmin Le Grand #include <svx/svddrgv.hxx>
581cd65da9SArmin Le Grand #include "svx/svdstr.hrc"
591cd65da9SArmin Le Grand #include "svx/svdglob.hxx"
60cdf0e10cSrcweir #include "svx/globl3d.hxx"
61cdf0e10cSrcweir #include <editeng/outliner.hxx>
62cdf0e10cSrcweir #include <editeng/adjitem.hxx>
63cdf0e10cSrcweir #include <svtools/colorcfg.hxx>
641cd65da9SArmin Le Grand #include <vcl/svapp.hxx>
65cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
6669ffbee1SArmin Le Grand #include <svx/sdrundomanager.hxx>
671cd65da9SArmin Le Grand #include <svx/sdr/overlay/overlaytools.hxx>
68a7185797SArmin Le Grand #include <drawinglayer/processor2d/processor2dtools.hxx>
69cdf0e10cSrcweir
70cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
71cdf0e10cSrcweir
ImpClearVars()72cdf0e10cSrcweir void SdrObjEditView::ImpClearVars()
73cdf0e10cSrcweir {
74cdf0e10cSrcweir bQuickTextEditMode=sal_True;
75cdf0e10cSrcweir bMacroMode=sal_True;
76cdf0e10cSrcweir pTextEditOutliner=NULL;
77cdf0e10cSrcweir pTextEditOutlinerView=NULL;
78cdf0e10cSrcweir pTextEditPV=NULL;
79cdf0e10cSrcweir pTextEditWin=NULL;
80cdf0e10cSrcweir pTextEditCursorMerker=NULL;
81cdf0e10cSrcweir pEditPara=NULL;
82cdf0e10cSrcweir bTextEditNewObj=sal_False;
83cdf0e10cSrcweir bMacroDown=sal_False;
84cdf0e10cSrcweir pMacroObj=NULL;
85cdf0e10cSrcweir pMacroPV=NULL;
86cdf0e10cSrcweir pMacroWin=NULL;
87cdf0e10cSrcweir nMacroTol=0;
88cdf0e10cSrcweir bTextEditDontDelete=sal_False;
89cdf0e10cSrcweir bTextEditOnlyOneView=sal_False;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
SdrObjEditView(SdrModel * pModel1,OutputDevice * pOut)92cdf0e10cSrcweir SdrObjEditView::SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut):
9369ffbee1SArmin Le Grand SdrGlueEditView(pModel1,pOut),
9469ffbee1SArmin Le Grand mpOldTextEditUndoManager(0)
95cdf0e10cSrcweir {
96cdf0e10cSrcweir ImpClearVars();
97cdf0e10cSrcweir }
98cdf0e10cSrcweir
~SdrObjEditView()99cdf0e10cSrcweir SdrObjEditView::~SdrObjEditView()
100cdf0e10cSrcweir {
101cdf0e10cSrcweir pTextEditWin = NULL; // Damit es in SdrEndTextEdit kein ShowCursor gibt
102cdf0e10cSrcweir if (IsTextEdit()) SdrEndTextEdit();
103cdf0e10cSrcweir if (pTextEditOutliner!=NULL) {
104cdf0e10cSrcweir delete pTextEditOutliner;
105cdf0e10cSrcweir }
10669ffbee1SArmin Le Grand
10769ffbee1SArmin Le Grand if(mpOldTextEditUndoManager)
10869ffbee1SArmin Le Grand {
10969ffbee1SArmin Le Grand delete mpOldTextEditUndoManager;
11069ffbee1SArmin Le Grand }
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
114cdf0e10cSrcweir
IsAction() const115cdf0e10cSrcweir sal_Bool SdrObjEditView::IsAction() const
116cdf0e10cSrcweir {
117cdf0e10cSrcweir return IsMacroObj() || SdrGlueEditView::IsAction();
118cdf0e10cSrcweir }
119cdf0e10cSrcweir
MovAction(const Point & rPnt)120cdf0e10cSrcweir void SdrObjEditView::MovAction(const Point& rPnt)
121cdf0e10cSrcweir {
122cdf0e10cSrcweir if (IsMacroObj()) MovMacroObj(rPnt);
123cdf0e10cSrcweir SdrGlueEditView::MovAction(rPnt);
124cdf0e10cSrcweir }
125cdf0e10cSrcweir
EndAction()126cdf0e10cSrcweir void SdrObjEditView::EndAction()
127cdf0e10cSrcweir {
128cdf0e10cSrcweir if (IsMacroObj()) EndMacroObj();
129cdf0e10cSrcweir SdrGlueEditView::EndAction();
130cdf0e10cSrcweir }
131cdf0e10cSrcweir
BckAction()132cdf0e10cSrcweir void SdrObjEditView::BckAction()
133cdf0e10cSrcweir {
134cdf0e10cSrcweir BrkMacroObj();
135cdf0e10cSrcweir SdrGlueEditView::BckAction();
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
BrkAction()138cdf0e10cSrcweir void SdrObjEditView::BrkAction()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir BrkMacroObj();
141cdf0e10cSrcweir SdrGlueEditView::BrkAction();
142cdf0e10cSrcweir }
143cdf0e10cSrcweir
TakeActionRect(Rectangle & rRect) const144cdf0e10cSrcweir void SdrObjEditView::TakeActionRect(Rectangle& rRect) const
145cdf0e10cSrcweir {
146cdf0e10cSrcweir if (IsMacroObj()) {
147cdf0e10cSrcweir rRect=pMacroObj->GetCurrentBoundRect();
148cdf0e10cSrcweir } else {
149cdf0e10cSrcweir SdrGlueEditView::TakeActionRect(rRect);
150cdf0e10cSrcweir }
151cdf0e10cSrcweir }
152cdf0e10cSrcweir
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)153cdf0e10cSrcweir void __EXPORT SdrObjEditView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir SdrGlueEditView::Notify(rBC,rHint);
156cdf0e10cSrcweir // Printerwechsel waerend des Editierens
157cdf0e10cSrcweir SdrHint* pSdrHint=PTR_CAST(SdrHint,&rHint);
158cdf0e10cSrcweir if (pSdrHint!=NULL && pTextEditOutliner!=NULL) {
159cdf0e10cSrcweir SdrHintKind eKind=pSdrHint->GetKind();
160cdf0e10cSrcweir if (eKind==HINT_REFDEVICECHG) {
161cdf0e10cSrcweir pTextEditOutliner->SetRefDevice(pMod->GetRefDevice());
162cdf0e10cSrcweir }
163cdf0e10cSrcweir if (eKind==HINT_DEFAULTTABCHG) {
164cdf0e10cSrcweir pTextEditOutliner->SetDefTab(pMod->GetDefaultTabulator());
165cdf0e10cSrcweir }
166cdf0e10cSrcweir if (eKind==HINT_DEFFONTHGTCHG) {
167cdf0e10cSrcweir // ...
168cdf0e10cSrcweir }
169cdf0e10cSrcweir if (eKind==HINT_MODELSAVED) { // #43095#
170cdf0e10cSrcweir pTextEditOutliner->ClearModifyFlag();
171cdf0e10cSrcweir }
172cdf0e10cSrcweir }
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
ModelHasChanged()175cdf0e10cSrcweir void SdrObjEditView::ModelHasChanged()
176cdf0e10cSrcweir {
177cdf0e10cSrcweir SdrGlueEditView::ModelHasChanged();
178cdf0e10cSrcweir if (mxTextEditObj.is() && !mxTextEditObj->IsInserted()) SdrEndTextEdit(); // Objekt geloescht
179cdf0e10cSrcweir // TextEditObj geaendert?
180cdf0e10cSrcweir if (IsTextEdit()) {
181cdf0e10cSrcweir SdrTextObj* pTextObj=dynamic_cast<SdrTextObj*>( mxTextEditObj.get() );
182cdf0e10cSrcweir if (pTextObj!=NULL) {
183cdf0e10cSrcweir sal_uIntPtr nOutlViewAnz=pTextEditOutliner->GetViewCount();
184cdf0e10cSrcweir sal_Bool bAreaChg=sal_False;
185cdf0e10cSrcweir sal_Bool bAnchorChg=sal_False;
186cdf0e10cSrcweir sal_Bool bColorChg=sal_False;
187cdf0e10cSrcweir bool bContourFrame=pTextObj->IsContourTextFrame();
188cdf0e10cSrcweir EVAnchorMode eNewAnchor(ANCHOR_VCENTER_HCENTER);
189cdf0e10cSrcweir Rectangle aOldArea(aMinTextEditArea);
190cdf0e10cSrcweir aOldArea.Union(aTextEditArea);
191cdf0e10cSrcweir Color aNewColor;
192cdf0e10cSrcweir { // Area Checken
193cdf0e10cSrcweir Size aPaperMin1;
194cdf0e10cSrcweir Size aPaperMax1;
195cdf0e10cSrcweir Rectangle aEditArea1;
196cdf0e10cSrcweir Rectangle aMinArea1;
197cdf0e10cSrcweir pTextObj->TakeTextEditArea(&aPaperMin1,&aPaperMax1,&aEditArea1,&aMinArea1);
198cdf0e10cSrcweir
199cdf0e10cSrcweir // #108784#
200cdf0e10cSrcweir Point aPvOfs(pTextObj->GetTextEditOffset());
201cdf0e10cSrcweir
202cdf0e10cSrcweir aEditArea1.Move(aPvOfs.X(),aPvOfs.Y());
203cdf0e10cSrcweir aMinArea1.Move(aPvOfs.X(),aPvOfs.Y());
204cdf0e10cSrcweir Rectangle aNewArea(aMinArea1);
205cdf0e10cSrcweir aNewArea.Union(aEditArea1);
2065df46f50SArmin Le Grand
207cdf0e10cSrcweir if (aNewArea!=aOldArea || aEditArea1!=aTextEditArea || aMinArea1!=aMinTextEditArea ||
208cdf0e10cSrcweir pTextEditOutliner->GetMinAutoPaperSize()!=aPaperMin1 || pTextEditOutliner->GetMaxAutoPaperSize()!=aPaperMax1) {
209cdf0e10cSrcweir aTextEditArea=aEditArea1;
210cdf0e10cSrcweir aMinTextEditArea=aMinArea1;
211cdf0e10cSrcweir pTextEditOutliner->SetUpdateMode(sal_False);
212cdf0e10cSrcweir pTextEditOutliner->SetMinAutoPaperSize(aPaperMin1);
213cdf0e10cSrcweir pTextEditOutliner->SetMaxAutoPaperSize(aPaperMax1);
214cdf0e10cSrcweir pTextEditOutliner->SetPaperSize(Size(0,0)); // Damit der Outliner neu formatiert
215cdf0e10cSrcweir if (!bContourFrame) {
216cdf0e10cSrcweir pTextEditOutliner->ClearPolygon();
217cdf0e10cSrcweir sal_uIntPtr nStat=pTextEditOutliner->GetControlWord();
218cdf0e10cSrcweir nStat|=EE_CNTRL_AUTOPAGESIZE;
219cdf0e10cSrcweir pTextEditOutliner->SetControlWord(nStat);
220cdf0e10cSrcweir } else {
221cdf0e10cSrcweir sal_uIntPtr nStat=pTextEditOutliner->GetControlWord();
222cdf0e10cSrcweir nStat&=~EE_CNTRL_AUTOPAGESIZE;
223cdf0e10cSrcweir pTextEditOutliner->SetControlWord(nStat);
224cdf0e10cSrcweir Rectangle aAnchorRect;
225cdf0e10cSrcweir pTextObj->TakeTextAnchorRect(aAnchorRect);
226cdf0e10cSrcweir pTextObj->ImpSetContourPolygon(*pTextEditOutliner,aAnchorRect, sal_True);
227cdf0e10cSrcweir }
228cdf0e10cSrcweir for (sal_uIntPtr nOV=0; nOV<nOutlViewAnz; nOV++) {
229cdf0e10cSrcweir OutlinerView* pOLV=pTextEditOutliner->GetView(nOV);
230cdf0e10cSrcweir sal_uIntPtr nStat0=pOLV->GetControlWord();
231cdf0e10cSrcweir sal_uIntPtr nStat=nStat0;
232cdf0e10cSrcweir // AutoViewSize nur wenn nicht KontourFrame.
233cdf0e10cSrcweir if (!bContourFrame) nStat|=EV_CNTRL_AUTOSIZE;
234cdf0e10cSrcweir else nStat&=~EV_CNTRL_AUTOSIZE;
235cdf0e10cSrcweir if (nStat!=nStat0) pOLV->SetControlWord(nStat);
236cdf0e10cSrcweir }
237cdf0e10cSrcweir pTextEditOutliner->SetUpdateMode(sal_True);
238cdf0e10cSrcweir bAreaChg=sal_True;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir }
241cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL) { // Fuellfarbe und Anker checken
242cdf0e10cSrcweir EVAnchorMode eOldAnchor=pTextEditOutlinerView->GetAnchorMode();
243cdf0e10cSrcweir eNewAnchor=(EVAnchorMode)pTextObj->GetOutlinerViewAnchorMode();
244cdf0e10cSrcweir bAnchorChg=eOldAnchor!=eNewAnchor;
245cdf0e10cSrcweir Color aOldColor(pTextEditOutlinerView->GetBackgroundColor());
246cdf0e10cSrcweir aNewColor = GetTextEditBackgroundColor(*this);
247cdf0e10cSrcweir bColorChg=aOldColor!=aNewColor;
248cdf0e10cSrcweir }
249cdf0e10cSrcweir // #104082# refresh always when it's a contour frame. That
250cdf0e10cSrcweir // refresh is necessary since it triggers the repaint
251cdf0e10cSrcweir // which makes the Handles visible. Changes at TakeTextRect()
252cdf0e10cSrcweir // seem to have resulted in a case where no refresh is executed.
253cdf0e10cSrcweir // Before that, a refresh must have been always executed
254cdf0e10cSrcweir // (else this error would have happend earlier), thus i
255cdf0e10cSrcweir // even think here a refresh should be done always.
256cdf0e10cSrcweir // Since follow-up problems cannot even be guessed I only
257cdf0e10cSrcweir // add this one more case to the if below.
258cdf0e10cSrcweir // BTW: It's VERY bad style that here, inside ModelHasChanged()
259cdf0e10cSrcweir // the outliner is again massively changed for the text object
260cdf0e10cSrcweir // in text edit mode. Normally, all necessary data should be
261cdf0e10cSrcweir // set at SdrBeginTextEdit(). Some changes and value assigns in
262cdf0e10cSrcweir // SdrBeginTextEdit() are completely useless since they are set here
263cdf0e10cSrcweir // again on ModelHasChanged().
264cdf0e10cSrcweir if (bContourFrame || bAreaChg || bAnchorChg || bColorChg)
265cdf0e10cSrcweir {
266cdf0e10cSrcweir for (sal_uIntPtr nOV=0; nOV<nOutlViewAnz; nOV++)
267cdf0e10cSrcweir {
268cdf0e10cSrcweir OutlinerView* pOLV=pTextEditOutliner->GetView(nOV);
269cdf0e10cSrcweir { // Alten OutlinerView-Bereich invalidieren
270cdf0e10cSrcweir Window* pWin=pOLV->GetWindow();
271cdf0e10cSrcweir Rectangle aTmpRect(aOldArea);
272cdf0e10cSrcweir sal_uInt16 nPixSiz=pOLV->GetInvalidateMore()+1;
273cdf0e10cSrcweir Size aMore(pWin->PixelToLogic(Size(nPixSiz,nPixSiz)));
274cdf0e10cSrcweir aTmpRect.Left()-=aMore.Width();
275cdf0e10cSrcweir aTmpRect.Right()+=aMore.Width();
276cdf0e10cSrcweir aTmpRect.Top()-=aMore.Height();
277cdf0e10cSrcweir aTmpRect.Bottom()+=aMore.Height();
278cdf0e10cSrcweir InvalidateOneWin(*pWin,aTmpRect);
279cdf0e10cSrcweir }
280cdf0e10cSrcweir if (bAnchorChg)
281cdf0e10cSrcweir pOLV->SetAnchorMode(eNewAnchor);
282cdf0e10cSrcweir if (bColorChg)
283cdf0e10cSrcweir pOLV->SetBackgroundColor( aNewColor );
284cdf0e10cSrcweir
285cdf0e10cSrcweir pOLV->SetOutputArea(aTextEditArea); // weil sonst scheinbar nicht richtig umgeankert wird
286cdf0e10cSrcweir ImpInvalidateOutlinerView(*pOLV);
287cdf0e10cSrcweir }
288cdf0e10cSrcweir pTextEditOutlinerView->ShowCursor();
289cdf0e10cSrcweir }
290cdf0e10cSrcweir }
291cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
292cdf0e10cSrcweir }
293cdf0e10cSrcweir }
294cdf0e10cSrcweir
295cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
296cdf0e10cSrcweir //
297cdf0e10cSrcweir // @@@@@@ @@@@@ @@ @@ @@@@@@ @@@@@ @@@@@ @@ @@@@@@
298cdf0e10cSrcweir // @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@
299cdf0e10cSrcweir // @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
300cdf0e10cSrcweir // @@ @@@@ @@@ @@ @@@@ @@ @@ @@ @@
301cdf0e10cSrcweir // @@ @@ @@@@@ @@ @@ @@ @@ @@ @@
302cdf0e10cSrcweir // @@ @@ @@@ @@@ @@ @@ @@ @@ @@ @@
303cdf0e10cSrcweir // @@ @@@@@ @@ @@ @@ @@@@@ @@@@@ @@ @@
304cdf0e10cSrcweir //
305cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
306cdf0e10cSrcweir
TextEditDrawing(SdrPaintWindow & rPaintWindow) const307a56bd57bSArmin Le Grand void SdrObjEditView::TextEditDrawing(SdrPaintWindow& rPaintWindow) const
308cdf0e10cSrcweir {
309a56bd57bSArmin Le Grand // draw old text edit stuff
310a56bd57bSArmin Le Grand if(IsTextEdit())
311cdf0e10cSrcweir {
312a56bd57bSArmin Le Grand const SdrOutliner* pActiveOutliner = GetTextEditOutliner();
313cdf0e10cSrcweir
314a56bd57bSArmin Le Grand if(pActiveOutliner)
315cdf0e10cSrcweir {
316a56bd57bSArmin Le Grand const sal_uInt32 nViewAnz(pActiveOutliner->GetViewCount());
317cdf0e10cSrcweir
318a56bd57bSArmin Le Grand if(nViewAnz)
319a56bd57bSArmin Le Grand {
320a56bd57bSArmin Le Grand const Region& rRedrawRegion = rPaintWindow.GetRedrawRegion();
321a56bd57bSArmin Le Grand const Rectangle aCheckRect(rRedrawRegion.GetBoundRect());
322a56bd57bSArmin Le Grand
323a56bd57bSArmin Le Grand for(sal_uInt32 i(0); i < nViewAnz; i++)
324a56bd57bSArmin Le Grand {
325a56bd57bSArmin Le Grand OutlinerView* pOLV = pActiveOutliner->GetView(i);
326a56bd57bSArmin Le Grand
327a56bd57bSArmin Le Grand if(pOLV->GetWindow() == &rPaintWindow.GetOutputDevice())
328a56bd57bSArmin Le Grand {
329a56bd57bSArmin Le Grand ImpPaintOutlinerView(*pOLV, aCheckRect, rPaintWindow.GetTargetOutputDevice());
330a56bd57bSArmin Le Grand return;
331a56bd57bSArmin Le Grand }
332a56bd57bSArmin Le Grand }
333cdf0e10cSrcweir }
334a56bd57bSArmin Le Grand }
335a56bd57bSArmin Le Grand }
336a56bd57bSArmin Le Grand }
337cdf0e10cSrcweir
ImpPaintOutlinerView(OutlinerView & rOutlView,const Rectangle & rRect,OutputDevice & rTargetDevice) const338a56bd57bSArmin Le Grand void SdrObjEditView::ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const
339a56bd57bSArmin Le Grand {
340a56bd57bSArmin Le Grand const SdrTextObj* pText = PTR_CAST(SdrTextObj,GetTextEditObject());
341a56bd57bSArmin Le Grand bool bTextFrame(pText && pText->IsTextFrame());
342a56bd57bSArmin Le Grand bool bFitToSize(0 != (pTextEditOutliner->GetControlWord() & EE_CNTRL_STRETCHING));
343a56bd57bSArmin Le Grand bool bModifyMerk(pTextEditOutliner->IsModified()); // #43095#
344a56bd57bSArmin Le Grand Rectangle aBlankRect(rOutlView.GetOutputArea());
345a56bd57bSArmin Le Grand aBlankRect.Union(aMinTextEditArea);
346a56bd57bSArmin Le Grand Rectangle aPixRect(rTargetDevice.LogicToPixel(aBlankRect));
347a56bd57bSArmin Le Grand aBlankRect.Intersection(rRect);
348a56bd57bSArmin Le Grand rOutlView.GetOutliner()->SetUpdateMode(sal_True); // Bugfix #22596#
349a56bd57bSArmin Le Grand rOutlView.Paint(aBlankRect, &rTargetDevice);
350a56bd57bSArmin Le Grand
351a56bd57bSArmin Le Grand if(!bModifyMerk)
352a56bd57bSArmin Le Grand {
353a56bd57bSArmin Le Grand // #43095#
354a56bd57bSArmin Le Grand pTextEditOutliner->ClearModifyFlag();
355a56bd57bSArmin Le Grand }
356cdf0e10cSrcweir
357a56bd57bSArmin Le Grand if(bTextFrame && !bFitToSize)
358a56bd57bSArmin Le Grand {
3591cd65da9SArmin Le Grand // completely reworked to use primitives; this ensures same look and functionality
3601cd65da9SArmin Le Grand const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
361a7185797SArmin Le Grand drawinglayer::processor2d::BaseProcessor2D* pProcessor = drawinglayer::processor2d::createProcessor2DFromOutputDevice(
3621cd65da9SArmin Le Grand rTargetDevice,
3631cd65da9SArmin Le Grand aViewInformation2D);
3641cd65da9SArmin Le Grand
3651cd65da9SArmin Le Grand if(pProcessor)
3661cd65da9SArmin Le Grand {
3671cd65da9SArmin Le Grand const bool bMerk(rTargetDevice.IsMapModeEnabled());
3681cd65da9SArmin Le Grand const basegfx::B2DRange aRange(aPixRect.Left(), aPixRect.Top(), aPixRect.Right(), aPixRect.Bottom());
3691cd65da9SArmin Le Grand const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer;
3701cd65da9SArmin Le Grand const Color aHilightColor(aSvtOptionsDrawinglayer.getHilightColor());
3711cd65da9SArmin Le Grand const double fTransparence(aSvtOptionsDrawinglayer.GetTransparentSelectionPercent() * 0.01);
3721cd65da9SArmin Le Grand const sal_uInt16 nPixSiz(rOutlView.GetInvalidateMore() - 1);
3731cd65da9SArmin Le Grand const drawinglayer::primitive2d::Primitive2DReference xReference(
3741cd65da9SArmin Le Grand new drawinglayer::primitive2d::OverlayRectanglePrimitive(
3751cd65da9SArmin Le Grand aRange,
3761cd65da9SArmin Le Grand aHilightColor.getBColor(),
3771cd65da9SArmin Le Grand fTransparence,
3781cd65da9SArmin Le Grand std::max(6, nPixSiz - 2), // grow
3791cd65da9SArmin Le Grand 0.0, // shrink
3801cd65da9SArmin Le Grand 0.0));
3811cd65da9SArmin Le Grand const drawinglayer::primitive2d::Primitive2DSequence aSequence(&xReference, 1);
3821cd65da9SArmin Le Grand
3831cd65da9SArmin Le Grand rTargetDevice.EnableMapMode(false);
3841cd65da9SArmin Le Grand pProcessor->process(aSequence);
3851cd65da9SArmin Le Grand rTargetDevice.EnableMapMode(bMerk);
3861cd65da9SArmin Le Grand delete pProcessor;
3871cd65da9SArmin Le Grand }
388cdf0e10cSrcweir }
389a56bd57bSArmin Le Grand
390a56bd57bSArmin Le Grand rOutlView.ShowCursor();
391cdf0e10cSrcweir }
392cdf0e10cSrcweir
ImpInvalidateOutlinerView(OutlinerView & rOutlView) const393cdf0e10cSrcweir void SdrObjEditView::ImpInvalidateOutlinerView(OutlinerView& rOutlView) const
394cdf0e10cSrcweir {
395cdf0e10cSrcweir Window* pWin = rOutlView.GetWindow();
396cdf0e10cSrcweir
397cdf0e10cSrcweir if(pWin)
398cdf0e10cSrcweir {
399cdf0e10cSrcweir const SdrTextObj* pText = PTR_CAST(SdrTextObj,GetTextEditObject());
400cdf0e10cSrcweir bool bTextFrame(pText && pText->IsTextFrame());
401cdf0e10cSrcweir bool bFitToSize(0 != (pTextEditOutliner->GetControlWord() & EE_CNTRL_STRETCHING));
402cdf0e10cSrcweir
403cdf0e10cSrcweir if(bTextFrame && !bFitToSize)
404cdf0e10cSrcweir {
405cdf0e10cSrcweir Rectangle aBlankRect(rOutlView.GetOutputArea());
406cdf0e10cSrcweir aBlankRect.Union(aMinTextEditArea);
407cdf0e10cSrcweir Rectangle aPixRect(pWin->LogicToPixel(aBlankRect));
408cdf0e10cSrcweir sal_uInt16 nPixSiz(rOutlView.GetInvalidateMore() - 1);
409cdf0e10cSrcweir
410cdf0e10cSrcweir aPixRect.Left()--;
411cdf0e10cSrcweir aPixRect.Top()--;
412cdf0e10cSrcweir aPixRect.Right()++;
413cdf0e10cSrcweir aPixRect.Bottom()++;
414cdf0e10cSrcweir
415cdf0e10cSrcweir {
416cdf0e10cSrcweir // xPixRect Begrenzen, wegen Treiberproblem bei zu weit hinausragenden Pixelkoordinaten
417cdf0e10cSrcweir Size aMaxXY(pWin->GetOutputSizePixel());
418cdf0e10cSrcweir long a(2 * nPixSiz);
419cdf0e10cSrcweir long nMaxX(aMaxXY.Width() + a);
420cdf0e10cSrcweir long nMaxY(aMaxXY.Height() + a);
421cdf0e10cSrcweir
422cdf0e10cSrcweir if (aPixRect.Left ()<-a) aPixRect.Left()=-a;
423cdf0e10cSrcweir if (aPixRect.Top ()<-a) aPixRect.Top ()=-a;
424cdf0e10cSrcweir if (aPixRect.Right ()>nMaxX) aPixRect.Right ()=nMaxX;
425cdf0e10cSrcweir if (aPixRect.Bottom()>nMaxY) aPixRect.Bottom()=nMaxY;
426cdf0e10cSrcweir }
427cdf0e10cSrcweir
428cdf0e10cSrcweir Rectangle aOuterPix(aPixRect);
429cdf0e10cSrcweir aOuterPix.Left()-=nPixSiz;
430cdf0e10cSrcweir aOuterPix.Top()-=nPixSiz;
431cdf0e10cSrcweir aOuterPix.Right()+=nPixSiz;
432cdf0e10cSrcweir aOuterPix.Bottom()+=nPixSiz;
433cdf0e10cSrcweir
434cdf0e10cSrcweir bool bMerk(pWin->IsMapModeEnabled());
435cdf0e10cSrcweir pWin->EnableMapMode(sal_False);
436cdf0e10cSrcweir pWin->Invalidate(aOuterPix);
437cdf0e10cSrcweir pWin->EnableMapMode(bMerk);
438cdf0e10cSrcweir }
439cdf0e10cSrcweir }
440cdf0e10cSrcweir }
441cdf0e10cSrcweir
ImpMakeOutlinerView(Window * pWin,sal_Bool,OutlinerView * pGivenView) const442cdf0e10cSrcweir OutlinerView* SdrObjEditView::ImpMakeOutlinerView(Window* pWin, sal_Bool /*bNoPaint*/, OutlinerView* pGivenView) const
443cdf0e10cSrcweir {
444cdf0e10cSrcweir // Hintergrund
445cdf0e10cSrcweir Color aBackground(GetTextEditBackgroundColor(*this));
446cdf0e10cSrcweir SdrTextObj* pText = dynamic_cast< SdrTextObj * >( mxTextEditObj.get() );
447cdf0e10cSrcweir sal_Bool bTextFrame=pText!=NULL && pText->IsTextFrame();
448cdf0e10cSrcweir sal_Bool bContourFrame=pText!=NULL && pText->IsContourTextFrame();
449cdf0e10cSrcweir // OutlinerView erzeugen
450cdf0e10cSrcweir OutlinerView* pOutlView=pGivenView;
451cdf0e10cSrcweir pTextEditOutliner->SetUpdateMode(sal_False);
452cdf0e10cSrcweir if (pOutlView==NULL) pOutlView=new OutlinerView(pTextEditOutliner,pWin);
453cdf0e10cSrcweir else pOutlView->SetWindow(pWin);
454cdf0e10cSrcweir // Scrollen verbieten
455cdf0e10cSrcweir sal_uIntPtr nStat=pOutlView->GetControlWord();
456cdf0e10cSrcweir nStat&=~EV_CNTRL_AUTOSCROLL;
457cdf0e10cSrcweir // AutoViewSize nur wenn nicht KontourFrame.
458cdf0e10cSrcweir if (!bContourFrame) nStat|=EV_CNTRL_AUTOSIZE;
459cdf0e10cSrcweir if (bTextFrame) {
460cdf0e10cSrcweir sal_uInt16 nPixSiz=aHdl.GetHdlSize()*2+1;
461cdf0e10cSrcweir nStat|=EV_CNTRL_INVONEMORE;
462cdf0e10cSrcweir pOutlView->SetInvalidateMore(nPixSiz);
463cdf0e10cSrcweir }
464cdf0e10cSrcweir pOutlView->SetControlWord(nStat);
465cdf0e10cSrcweir pOutlView->SetBackgroundColor( aBackground );
466cdf0e10cSrcweir if (pText!=NULL)
467cdf0e10cSrcweir {
468cdf0e10cSrcweir pOutlView->SetAnchorMode((EVAnchorMode)(pText->GetOutlinerViewAnchorMode()));
469cdf0e10cSrcweir pTextEditOutliner->SetFixedCellHeight(((const SdrTextFixedCellHeightItem&)pText->GetMergedItem(SDRATTR_TEXT_USEFIXEDCELLHEIGHT)).GetValue());
470cdf0e10cSrcweir }
471cdf0e10cSrcweir pOutlView->SetOutputArea(aTextEditArea);
472cdf0e10cSrcweir pTextEditOutliner->SetUpdateMode(sal_True);
473cdf0e10cSrcweir ImpInvalidateOutlinerView(*pOutlView);
474cdf0e10cSrcweir return pOutlView;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir
IsTextEditFrame() const477cdf0e10cSrcweir sal_Bool SdrObjEditView::IsTextEditFrame() const
478cdf0e10cSrcweir {
479cdf0e10cSrcweir SdrTextObj* pText = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
480cdf0e10cSrcweir return pText!=NULL && pText->IsTextFrame();
481cdf0e10cSrcweir }
482cdf0e10cSrcweir
IMPL_LINK(SdrObjEditView,ImpOutlinerStatusEventHdl,EditStatus *,pEditStat)483cdf0e10cSrcweir IMPL_LINK(SdrObjEditView,ImpOutlinerStatusEventHdl,EditStatus*,pEditStat)
484cdf0e10cSrcweir {
485cdf0e10cSrcweir if(pTextEditOutliner )
486cdf0e10cSrcweir {
487cdf0e10cSrcweir SdrTextObj* pTextObj = dynamic_cast< SdrTextObj * >( mxTextEditObj.get() );
488cdf0e10cSrcweir if( pTextObj )
489cdf0e10cSrcweir {
490cdf0e10cSrcweir pTextObj->onEditOutlinerStatusEvent( pEditStat );
491cdf0e10cSrcweir }
492cdf0e10cSrcweir }
493cdf0e10cSrcweir return 0;
494cdf0e10cSrcweir }
495cdf0e10cSrcweir
IMPL_LINK(SdrObjEditView,ImpOutlinerCalcFieldValueHdl,EditFieldInfo *,pFI)496cdf0e10cSrcweir IMPL_LINK(SdrObjEditView,ImpOutlinerCalcFieldValueHdl,EditFieldInfo*,pFI)
497cdf0e10cSrcweir {
498cdf0e10cSrcweir bool bOk=false;
499cdf0e10cSrcweir String& rStr=pFI->GetRepresentation();
500cdf0e10cSrcweir rStr.Erase();
501cdf0e10cSrcweir SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
502cdf0e10cSrcweir if (pTextObj!=NULL) {
503cdf0e10cSrcweir Color* pTxtCol=NULL;
504cdf0e10cSrcweir Color* pFldCol=NULL;
505cdf0e10cSrcweir bOk=pTextObj->CalcFieldValue(pFI->GetField(),pFI->GetPara(),pFI->GetPos(),sal_True,pTxtCol,pFldCol,rStr);
506cdf0e10cSrcweir if (bOk) {
507cdf0e10cSrcweir if (pTxtCol!=NULL) {
508cdf0e10cSrcweir pFI->SetTxtColor(*pTxtCol);
509cdf0e10cSrcweir delete pTxtCol;
510cdf0e10cSrcweir }
511cdf0e10cSrcweir if (pFldCol!=NULL) {
512cdf0e10cSrcweir pFI->SetFldColor(*pFldCol);
513cdf0e10cSrcweir delete pFldCol;
514cdf0e10cSrcweir } else {
515cdf0e10cSrcweir pFI->SetFldColor(Color(COL_LIGHTGRAY)); // kann spaeter (357) raus
516cdf0e10cSrcweir }
517cdf0e10cSrcweir }
518cdf0e10cSrcweir }
519cdf0e10cSrcweir Outliner& rDrawOutl=pMod->GetDrawOutliner(pTextObj);
520cdf0e10cSrcweir Link aDrawOutlLink=rDrawOutl.GetCalcFieldValueHdl();
521cdf0e10cSrcweir if (!bOk && aDrawOutlLink.IsSet()) {
522cdf0e10cSrcweir aDrawOutlLink.Call(pFI);
523cdf0e10cSrcweir bOk = (sal_Bool)rStr.Len();
524cdf0e10cSrcweir }
525cdf0e10cSrcweir if (!bOk && aOldCalcFieldValueLink.IsSet()) {
526cdf0e10cSrcweir return aOldCalcFieldValueLink.Call(pFI);
527cdf0e10cSrcweir }
528cdf0e10cSrcweir return 0;
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
53169ffbee1SArmin Le Grand IMPL_LINK(SdrObjEditView, EndTextEditHdl, SdrUndoManager*, /*pUndoManager*/)
53269ffbee1SArmin Le Grand {
53369ffbee1SArmin Le Grand SdrEndTextEdit();
53469ffbee1SArmin Le Grand return 0;
53569ffbee1SArmin Le Grand }
53669ffbee1SArmin Le Grand
getSdrUndoManagerForEnhancedTextEdit() const5373d9b0034SArmin Le Grand SdrUndoManager* SdrObjEditView::getSdrUndoManagerForEnhancedTextEdit() const
5383d9b0034SArmin Le Grand {
5393d9b0034SArmin Le Grand // default returns registered UndoManager
5403d9b0034SArmin Le Grand return GetModel() ? dynamic_cast< SdrUndoManager* >(GetModel()->GetSdrUndoManager()) : 0;
5413d9b0034SArmin Le Grand }
5423d9b0034SArmin Le Grand
SdrBeginTextEdit(SdrObject * pObj,SdrPageView * pPV,Window * pWin,sal_Bool bIsNewObj,SdrOutliner * pGivenOutliner,OutlinerView * pGivenOutlinerView,sal_Bool bDontDeleteOutliner,sal_Bool bOnlyOneView,sal_Bool bGrabFocus)543cdf0e10cSrcweir sal_Bool SdrObjEditView::SdrBeginTextEdit(
544cdf0e10cSrcweir SdrObject* pObj, SdrPageView* pPV, Window* pWin,
545cdf0e10cSrcweir sal_Bool bIsNewObj, SdrOutliner* pGivenOutliner,
546cdf0e10cSrcweir OutlinerView* pGivenOutlinerView,
547cdf0e10cSrcweir sal_Bool bDontDeleteOutliner, sal_Bool bOnlyOneView,
548cdf0e10cSrcweir sal_Bool bGrabFocus)
549cdf0e10cSrcweir {
550cdf0e10cSrcweir SdrEndTextEdit();
551cdf0e10cSrcweir
552cdf0e10cSrcweir if( dynamic_cast< SdrTextObj* >( pObj ) == 0 )
553cdf0e10cSrcweir return sal_False; // currently only possible with text objects
554cdf0e10cSrcweir
555cdf0e10cSrcweir if(bGrabFocus && pWin)
556cdf0e10cSrcweir {
557cdf0e10cSrcweir // attetion, this call may cause an EndTextEdit() call to this view
558cdf0e10cSrcweir pWin->GrabFocus(); // to force the cursor into the edit view
559cdf0e10cSrcweir }
560cdf0e10cSrcweir
561cdf0e10cSrcweir bTextEditDontDelete=bDontDeleteOutliner && pGivenOutliner!=NULL;
562cdf0e10cSrcweir bTextEditOnlyOneView=bOnlyOneView;
563cdf0e10cSrcweir bTextEditNewObj=bIsNewObj;
564cdf0e10cSrcweir const sal_uInt32 nWinAnz(PaintWindowCount());
565cdf0e10cSrcweir sal_uInt32 i;
566cdf0e10cSrcweir sal_Bool bBrk(sal_False);
567cdf0e10cSrcweir // Abbruch, wenn kein Objekt angegeben.
568cdf0e10cSrcweir
569cdf0e10cSrcweir if(!pObj)
570cdf0e10cSrcweir {
571cdf0e10cSrcweir bBrk = sal_True;
572cdf0e10cSrcweir }
573cdf0e10cSrcweir
574cdf0e10cSrcweir if(!bBrk && !pWin)
575cdf0e10cSrcweir {
576cdf0e10cSrcweir for(i = 0L; i < nWinAnz && !pWin; i++)
577cdf0e10cSrcweir {
578cdf0e10cSrcweir SdrPaintWindow* pPaintWindow = GetPaintWindow(i);
579cdf0e10cSrcweir
580cdf0e10cSrcweir if(OUTDEV_WINDOW == pPaintWindow->GetOutputDevice().GetOutDevType())
581cdf0e10cSrcweir {
582cdf0e10cSrcweir pWin = (Window*)(&pPaintWindow->GetOutputDevice());
583cdf0e10cSrcweir }
584cdf0e10cSrcweir }
585cdf0e10cSrcweir
586cdf0e10cSrcweir // Abbruch, wenn kein Window da.
587cdf0e10cSrcweir if(!pWin)
588cdf0e10cSrcweir {
589cdf0e10cSrcweir bBrk = sal_True;
590cdf0e10cSrcweir }
591cdf0e10cSrcweir }
592cdf0e10cSrcweir
593cdf0e10cSrcweir if(!bBrk && !pPV)
594cdf0e10cSrcweir {
595cdf0e10cSrcweir pPV = GetSdrPageView();
596cdf0e10cSrcweir
597cdf0e10cSrcweir // Abbruch, wenn keine PageView zu dem Objekt vorhanden.
598cdf0e10cSrcweir if(!pPV)
599cdf0e10cSrcweir {
600cdf0e10cSrcweir bBrk = sal_True;
601cdf0e10cSrcweir }
602cdf0e10cSrcweir }
603cdf0e10cSrcweir
604cdf0e10cSrcweir if(pObj && pPV)
605cdf0e10cSrcweir {
606cdf0e10cSrcweir // Kein TextEdit an Objekten im gesperrten Layer
607cdf0e10cSrcweir if(pPV->GetLockedLayers().IsSet(pObj->GetLayer()))
608cdf0e10cSrcweir {
609cdf0e10cSrcweir bBrk = sal_True;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir }
612cdf0e10cSrcweir
613cdf0e10cSrcweir if(pTextEditOutliner)
614cdf0e10cSrcweir {
615cdf0e10cSrcweir DBG_ERROR("SdrObjEditView::SdrBeginTextEdit() da stand noch ein alter Outliner rum");
616cdf0e10cSrcweir delete pTextEditOutliner;
617cdf0e10cSrcweir pTextEditOutliner = 0L;
618cdf0e10cSrcweir }
619cdf0e10cSrcweir
620cdf0e10cSrcweir if(!bBrk)
621cdf0e10cSrcweir {
622cdf0e10cSrcweir pTextEditWin=pWin;
623cdf0e10cSrcweir pTextEditPV=pPV;
624cdf0e10cSrcweir mxTextEditObj.reset( pObj );
625cdf0e10cSrcweir pTextEditOutliner=pGivenOutliner;
626cdf0e10cSrcweir if (pTextEditOutliner==NULL)
627cdf0e10cSrcweir pTextEditOutliner = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, mxTextEditObj->GetModel() );
628cdf0e10cSrcweir
629cdf0e10cSrcweir {
630cdf0e10cSrcweir SvtAccessibilityOptions aOptions;
631cdf0e10cSrcweir pTextEditOutliner->ForceAutoColor( aOptions.GetIsAutomaticFontColor() );
632cdf0e10cSrcweir }
633cdf0e10cSrcweir
634cdf0e10cSrcweir sal_Bool bEmpty = mxTextEditObj->GetOutlinerParaObject()==NULL;
635cdf0e10cSrcweir
636cdf0e10cSrcweir aOldCalcFieldValueLink=pTextEditOutliner->GetCalcFieldValueHdl();
637cdf0e10cSrcweir // Der FieldHdl muss von SdrBeginTextEdit gesetzt sein, da dor ein UpdateFields gerufen wird.
638cdf0e10cSrcweir pTextEditOutliner->SetCalcFieldValueHdl(LINK(this,SdrObjEditView,ImpOutlinerCalcFieldValueHdl));
639cdf0e10cSrcweir pTextEditOutliner->SetBeginPasteOrDropHdl(LINK(this,SdrObjEditView,BeginPasteOrDropHdl));
640cdf0e10cSrcweir pTextEditOutliner->SetEndPasteOrDropHdl(LINK(this,SdrObjEditView, EndPasteOrDropHdl));
641cdf0e10cSrcweir
642cdf0e10cSrcweir // It is just necessary to make the visualized page known. Set it.
643cdf0e10cSrcweir pTextEditOutliner->setVisualizedPage(pPV ? pPV->GetPage() : 0);
644cdf0e10cSrcweir
645cdf0e10cSrcweir pTextEditOutliner->SetTextObjNoInit( dynamic_cast< SdrTextObj* >( mxTextEditObj.get() ) );
646cdf0e10cSrcweir
647cdf0e10cSrcweir if(mxTextEditObj->BegTextEdit(*pTextEditOutliner))
648cdf0e10cSrcweir {
649cdf0e10cSrcweir SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
650cdf0e10cSrcweir DBG_ASSERT( pTextObj, "svx::SdrObjEditView::BegTextEdit(), no text object?" );
651cdf0e10cSrcweir if( !pTextObj )
652cdf0e10cSrcweir return sal_False;
653cdf0e10cSrcweir
654cdf0e10cSrcweir // #111096# Switch off evtl. running TextAnimation
655cdf0e10cSrcweir pTextObj->SetTextAnimationAllowed(sal_False);
656cdf0e10cSrcweir
657cdf0e10cSrcweir // alten Cursor merken
658cdf0e10cSrcweir if (pTextEditOutliner->GetViewCount()!=0)
659cdf0e10cSrcweir {
660cdf0e10cSrcweir OutlinerView* pTmpOLV=pTextEditOutliner->RemoveView(sal_uIntPtr(0));
661cdf0e10cSrcweir if(pTmpOLV!=NULL && pTmpOLV!=pGivenOutlinerView)
662cdf0e10cSrcweir delete pTmpOLV;
663cdf0e10cSrcweir }
664cdf0e10cSrcweir
665cdf0e10cSrcweir // EditArea ueberTakeTextEditArea bestimmen
666cdf0e10cSrcweir // Das koennte eigentlich entfallen, da TakeTextRect() die Berechnung der aTextEditArea vornimmt
667cdf0e10cSrcweir // Die aMinTextEditArea muss jedoch wohl auch erfolgen (darum bleibt es voerst drinnen)
668cdf0e10cSrcweir pTextObj->TakeTextEditArea(NULL,NULL,&aTextEditArea,&aMinTextEditArea);
669cdf0e10cSrcweir
670cdf0e10cSrcweir Rectangle aTextRect;
671cdf0e10cSrcweir Rectangle aAnchorRect;
672cdf0e10cSrcweir pTextObj->TakeTextRect(*pTextEditOutliner, aTextRect, sal_True,
673cdf0e10cSrcweir &aAnchorRect /* #97097# Give sal_True here, not sal_False */);
674cdf0e10cSrcweir
675cdf0e10cSrcweir if ( !pTextObj->IsContourTextFrame() )
676cdf0e10cSrcweir {
677cdf0e10cSrcweir // FitToSize erstmal nicht mit ContourFrame
67826734c99SArmin Le Grand SdrFitToSizeType eFit = pTextObj->GetFitToSize();
67926734c99SArmin Le Grand if (eFit==SDRTEXTFIT_PROPORTIONAL || eFit==SDRTEXTFIT_ALLLINES)
680cdf0e10cSrcweir aTextRect = aAnchorRect;
681cdf0e10cSrcweir }
682cdf0e10cSrcweir
683cdf0e10cSrcweir aTextEditArea = aTextRect;
684cdf0e10cSrcweir
685cdf0e10cSrcweir // #108784#
686cdf0e10cSrcweir Point aPvOfs(pTextObj->GetTextEditOffset());
687cdf0e10cSrcweir
688cdf0e10cSrcweir aTextEditArea.Move(aPvOfs.X(),aPvOfs.Y());
689cdf0e10cSrcweir aMinTextEditArea.Move(aPvOfs.X(),aPvOfs.Y());
690cdf0e10cSrcweir pTextEditCursorMerker=pWin->GetCursor();
691cdf0e10cSrcweir
69203e5ec27SOliver-Rainer Wittmann aHdl.SetMoveOutside(sal_True);
693cdf0e10cSrcweir
69403e5ec27SOliver-Rainer Wittmann // #i72757#
69503e5ec27SOliver-Rainer Wittmann // Since IsMarkHdlWhenTextEdit() is ignored, it is necessary
69603e5ec27SOliver-Rainer Wittmann // to call AdjustMarkHdl() always.
69703e5ec27SOliver-Rainer Wittmann AdjustMarkHdl();
698cdf0e10cSrcweir
699cdf0e10cSrcweir pTextEditOutlinerView=ImpMakeOutlinerView(pWin,!bEmpty,pGivenOutlinerView);
700cdf0e10cSrcweir
701cdf0e10cSrcweir // check if this view is already inserted
702cdf0e10cSrcweir sal_uIntPtr i2,nCount = pTextEditOutliner->GetViewCount();
703cdf0e10cSrcweir for( i2 = 0; i2 < nCount; i2++ )
704cdf0e10cSrcweir {
705cdf0e10cSrcweir if( pTextEditOutliner->GetView(i2) == pTextEditOutlinerView )
706cdf0e10cSrcweir break;
707cdf0e10cSrcweir }
708cdf0e10cSrcweir
709cdf0e10cSrcweir if( i2 == nCount )
710cdf0e10cSrcweir pTextEditOutliner->InsertView(pTextEditOutlinerView,0);
711cdf0e10cSrcweir
712cdf0e10cSrcweir aHdl.SetMoveOutside(sal_False);
713cdf0e10cSrcweir aHdl.SetMoveOutside(sal_True);
714cdf0e10cSrcweir //OLMRefreshAllIAOManagers();
715cdf0e10cSrcweir
716cdf0e10cSrcweir // alle Wins als OutlinerView beim Outliner anmelden
717cdf0e10cSrcweir if(!bOnlyOneView)
718cdf0e10cSrcweir {
719cdf0e10cSrcweir for(i = 0L; i < nWinAnz; i++)
720cdf0e10cSrcweir {
721cdf0e10cSrcweir SdrPaintWindow* pPaintWindow = GetPaintWindow(i);
722cdf0e10cSrcweir OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
723cdf0e10cSrcweir
724cdf0e10cSrcweir if(&rOutDev != pWin && OUTDEV_WINDOW == rOutDev.GetOutDevType())
725cdf0e10cSrcweir {
726cdf0e10cSrcweir OutlinerView* pOutlView = ImpMakeOutlinerView((Window*)(&rOutDev), !bEmpty, 0L);
727cdf0e10cSrcweir pTextEditOutliner->InsertView(pOutlView, (sal_uInt16)i);
728cdf0e10cSrcweir }
729cdf0e10cSrcweir }
730cdf0e10cSrcweir }
731cdf0e10cSrcweir
732cdf0e10cSrcweir pTextEditOutlinerView->ShowCursor();
733cdf0e10cSrcweir pTextEditOutliner->SetStatusEventHdl(LINK(this,SdrObjEditView,ImpOutlinerStatusEventHdl));
734cdf0e10cSrcweir #ifdef DBG_UTIL
735cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
736cdf0e10cSrcweir #endif
737cdf0e10cSrcweir pTextEditOutliner->ClearModifyFlag();
738cdf0e10cSrcweir
739cdf0e10cSrcweir // #71519#, #91453#
740cdf0e10cSrcweir if(pWin)
741cdf0e10cSrcweir {
742cdf0e10cSrcweir sal_Bool bExtraInvalidate(sal_False);
743cdf0e10cSrcweir
744cdf0e10cSrcweir // #71519#
745cdf0e10cSrcweir if(!bExtraInvalidate)
746cdf0e10cSrcweir {
74726734c99SArmin Le Grand SdrFitToSizeType eFit = pTextObj->GetFitToSize();
74826734c99SArmin Le Grand if(eFit == SDRTEXTFIT_PROPORTIONAL || eFit == SDRTEXTFIT_ALLLINES)
749cdf0e10cSrcweir bExtraInvalidate = sal_True;
750cdf0e10cSrcweir }
751cdf0e10cSrcweir
752cdf0e10cSrcweir if(bExtraInvalidate)
753cdf0e10cSrcweir {
754cdf0e10cSrcweir pWin->Invalidate(aTextEditArea);
755cdf0e10cSrcweir }
756cdf0e10cSrcweir }
757cdf0e10cSrcweir
758cdf0e10cSrcweir // send HINT_BEGEDIT #99840#
759cdf0e10cSrcweir if( GetModel() )
760cdf0e10cSrcweir {
761cdf0e10cSrcweir SdrHint aHint(*pTextObj);
762cdf0e10cSrcweir aHint.SetKind(HINT_BEGEDIT);
763cdf0e10cSrcweir GetModel()->Broadcast(aHint);
764cdf0e10cSrcweir }
765cdf0e10cSrcweir
766cdf0e10cSrcweir pTextEditOutliner->setVisualizedPage(0);
767cdf0e10cSrcweir
768cdf0e10cSrcweir if( mxSelectionController.is() )
769cdf0e10cSrcweir mxSelectionController->onSelectionHasChanged();
770cdf0e10cSrcweir
771*a840a559SArmin Le Grand if(IsUndoEnabled() && GetModel() && !GetModel()->GetDisableTextEditUsesCommonUndoManager())
77269ffbee1SArmin Le Grand {
7733d9b0034SArmin Le Grand SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
77469ffbee1SArmin Le Grand
77569ffbee1SArmin Le Grand if(pSdrUndoManager)
77669ffbee1SArmin Le Grand {
77769ffbee1SArmin Le Grand // we have an outliner, undo manager and it's an EditUndoManager, exchange
77869ffbee1SArmin Le Grand // the document undo manager and the default one from the outliner and tell
77969ffbee1SArmin Le Grand // it that text edit starts by setting a callback if it needs to end text edit mode.
78069ffbee1SArmin Le Grand if(mpOldTextEditUndoManager)
78169ffbee1SArmin Le Grand {
7823d9b0034SArmin Le Grand // should not happen, delete it since it was probably forgotten somewhere
7833d9b0034SArmin Le Grand OSL_ENSURE(false, "Deleting forgotten old TextEditUndoManager, should be checked (!)");
78469ffbee1SArmin Le Grand delete mpOldTextEditUndoManager;
78569ffbee1SArmin Le Grand mpOldTextEditUndoManager = 0;
78669ffbee1SArmin Le Grand }
78769ffbee1SArmin Le Grand
78869ffbee1SArmin Le Grand mpOldTextEditUndoManager = pTextEditOutliner->SetUndoManager(pSdrUndoManager);
78969ffbee1SArmin Le Grand pSdrUndoManager->SetEndTextEditHdl(LINK(this, SdrObjEditView, EndTextEditHdl));
79069ffbee1SArmin Le Grand }
79169ffbee1SArmin Le Grand else
79269ffbee1SArmin Le Grand {
79369ffbee1SArmin Le Grand OSL_ENSURE(false, "The document undo manager is not derived from SdrUndoManager (!)");
79469ffbee1SArmin Le Grand }
79569ffbee1SArmin Le Grand }
79669ffbee1SArmin Le Grand
797cdf0e10cSrcweir return sal_True; // Gut gelaufen, TextEdit laeuft nun
798cdf0e10cSrcweir }
799cdf0e10cSrcweir else
800cdf0e10cSrcweir {
801cdf0e10cSrcweir bBrk = sal_True;
802cdf0e10cSrcweir pTextEditOutliner->SetCalcFieldValueHdl(aOldCalcFieldValueLink);
803cdf0e10cSrcweir pTextEditOutliner->SetBeginPasteOrDropHdl(Link());
804cdf0e10cSrcweir pTextEditOutliner->SetEndPasteOrDropHdl(Link());
805cdf0e10cSrcweir
806cdf0e10cSrcweir }
807cdf0e10cSrcweir }
808cdf0e10cSrcweir if (pTextEditOutliner != NULL)
809cdf0e10cSrcweir {
810cdf0e10cSrcweir pTextEditOutliner->setVisualizedPage(0);
811cdf0e10cSrcweir }
812cdf0e10cSrcweir
813cdf0e10cSrcweir // wenn hier angekommen, dann ist irgendwas schief gelaufen
814cdf0e10cSrcweir if(!bDontDeleteOutliner)
815cdf0e10cSrcweir {
816cdf0e10cSrcweir if(pGivenOutliner!=NULL)
817cdf0e10cSrcweir {
818cdf0e10cSrcweir delete pGivenOutliner;
819cdf0e10cSrcweir pTextEditOutliner = NULL;
820cdf0e10cSrcweir }
821cdf0e10cSrcweir if(pGivenOutlinerView!=NULL)
822cdf0e10cSrcweir {
823cdf0e10cSrcweir delete pGivenOutlinerView;
824cdf0e10cSrcweir pGivenOutlinerView = NULL;
825cdf0e10cSrcweir }
826cdf0e10cSrcweir }
827cdf0e10cSrcweir if( pTextEditOutliner!=NULL )
828cdf0e10cSrcweir {
829cdf0e10cSrcweir delete pTextEditOutliner;
830cdf0e10cSrcweir }
831cdf0e10cSrcweir
832cdf0e10cSrcweir pTextEditOutliner=NULL;
833cdf0e10cSrcweir pTextEditOutlinerView=NULL;
834cdf0e10cSrcweir mxTextEditObj.reset(0);
835cdf0e10cSrcweir pTextEditPV=NULL;
836cdf0e10cSrcweir pTextEditWin=NULL;
837cdf0e10cSrcweir //HMHif (bMarkHdlWhenTextEdit) {
838cdf0e10cSrcweir //HMH HideMarkHdl();
839cdf0e10cSrcweir //HMH}
840cdf0e10cSrcweir aHdl.SetMoveOutside(sal_False);
841cdf0e10cSrcweir //HMHShowMarkHdl();
842cdf0e10cSrcweir
843cdf0e10cSrcweir return sal_False;
844cdf0e10cSrcweir }
845cdf0e10cSrcweir
SdrEndTextEdit(sal_Bool bDontDeleteReally)846cdf0e10cSrcweir SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(sal_Bool bDontDeleteReally)
847cdf0e10cSrcweir {
848cdf0e10cSrcweir SdrEndTextEditKind eRet=SDRENDTEXTEDIT_UNCHANGED;
849cdf0e10cSrcweir SdrTextObj* pTEObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
850cdf0e10cSrcweir Window* pTEWin =pTextEditWin;
851cdf0e10cSrcweir SdrOutliner* pTEOutliner =pTextEditOutliner;
852cdf0e10cSrcweir OutlinerView* pTEOutlinerView=pTextEditOutlinerView;
853cdf0e10cSrcweir Cursor* pTECursorMerker=pTextEditCursorMerker;
8543d9b0034SArmin Le Grand SdrUndoManager* pUndoEditUndoManager = 0;
8553d9b0034SArmin Le Grand bool bNeedToUndoSavedRedoTextEdit(false);
85669ffbee1SArmin Le Grand
857*a840a559SArmin Le Grand if(IsUndoEnabled() && GetModel() && pTEObj && pTEOutliner && !GetModel()->GetDisableTextEditUsesCommonUndoManager())
85869ffbee1SArmin Le Grand {
85969ffbee1SArmin Le Grand // change back the UndoManager to the remembered original one
86069ffbee1SArmin Le Grand ::svl::IUndoManager* pOriginal = pTEOutliner->SetUndoManager(mpOldTextEditUndoManager);
86169ffbee1SArmin Le Grand mpOldTextEditUndoManager = 0;
86269ffbee1SArmin Le Grand
86369ffbee1SArmin Le Grand if(pOriginal)
86469ffbee1SArmin Le Grand {
86569ffbee1SArmin Le Grand // check if we got back our document undo manager
8663d9b0034SArmin Le Grand SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
86769ffbee1SArmin Le Grand
86869ffbee1SArmin Le Grand if(pSdrUndoManager && dynamic_cast< SdrUndoManager* >(pOriginal) == pSdrUndoManager)
86969ffbee1SArmin Le Grand {
8703d9b0034SArmin Le Grand if(pSdrUndoManager->isEndTextEditTriggeredFromUndo())
87169ffbee1SArmin Le Grand {
8723d9b0034SArmin Le Grand // remember the UndoManager where missing Undos have to be triggered after end
8733d9b0034SArmin Le Grand // text edit. When the undo had triggered the end text edit, the original action
8743d9b0034SArmin Le Grand // which had to be undone originally is not yet undone.
8753d9b0034SArmin Le Grand pUndoEditUndoManager = pSdrUndoManager;
8763d9b0034SArmin Le Grand
8773d9b0034SArmin Le Grand // We are ending text edit; if text edit was triggered from undo, execute all redos
8783d9b0034SArmin Le Grand // to create a complete text change undo action for the redo buffer. Also mark this
8793d9b0034SArmin Le Grand // state when at least one redo was executed; the created extra TextChange needs to
8803d9b0034SArmin Le Grand // be undone in addition to the first real undo outside the text edit changes
8813d9b0034SArmin Le Grand while(pSdrUndoManager->GetRedoActionCount())
8823d9b0034SArmin Le Grand {
8833d9b0034SArmin Le Grand bNeedToUndoSavedRedoTextEdit = true;
8843d9b0034SArmin Le Grand pSdrUndoManager->Redo();
8853d9b0034SArmin Le Grand }
88669ffbee1SArmin Le Grand }
88769ffbee1SArmin Le Grand
88869ffbee1SArmin Le Grand // reset the callback link and let the undo manager cleanup all text edit
88969ffbee1SArmin Le Grand // undo actions to get the stack back to the form before the text edit
89069ffbee1SArmin Le Grand pSdrUndoManager->SetEndTextEditHdl(Link());
89169ffbee1SArmin Le Grand }
89269ffbee1SArmin Le Grand else
89369ffbee1SArmin Le Grand {
89469ffbee1SArmin Le Grand OSL_ENSURE(false, "�Got UndoManager back in SdrEndTextEdit which is NOT the expected document UndoManager (!)");
89569ffbee1SArmin Le Grand delete pOriginal;
89669ffbee1SArmin Le Grand }
89769ffbee1SArmin Le Grand }
89869ffbee1SArmin Le Grand }
899cdf0e10cSrcweir
900cdf0e10cSrcweir // send HINT_ENDEDIT #99840#
901cdf0e10cSrcweir if( GetModel() && mxTextEditObj.is() )
902cdf0e10cSrcweir {
903cdf0e10cSrcweir SdrHint aHint(*mxTextEditObj.get());
904cdf0e10cSrcweir aHint.SetKind(HINT_ENDEDIT);
905cdf0e10cSrcweir GetModel()->Broadcast(aHint);
906cdf0e10cSrcweir }
907cdf0e10cSrcweir
908cdf0e10cSrcweir mxTextEditObj.reset(0);
909cdf0e10cSrcweir pTextEditPV=NULL;
910cdf0e10cSrcweir pTextEditWin=NULL;
911cdf0e10cSrcweir pTextEditOutliner=NULL;
912cdf0e10cSrcweir pTextEditOutlinerView=NULL;
913cdf0e10cSrcweir pTextEditCursorMerker=NULL;
914cdf0e10cSrcweir aTextEditArea=Rectangle();
915cdf0e10cSrcweir
916cdf0e10cSrcweir if (pTEOutliner!=NULL)
917cdf0e10cSrcweir {
918cdf0e10cSrcweir sal_Bool bModified=pTEOutliner->IsModified();
919cdf0e10cSrcweir if (pTEOutlinerView!=NULL)
920cdf0e10cSrcweir {
921cdf0e10cSrcweir pTEOutlinerView->HideCursor();
922cdf0e10cSrcweir }
923cdf0e10cSrcweir if (pTEObj!=NULL)
924cdf0e10cSrcweir {
925cdf0e10cSrcweir pTEOutliner->CompleteOnlineSpelling();
926cdf0e10cSrcweir
927cdf0e10cSrcweir SdrUndoObjSetText* pTxtUndo = 0;
928cdf0e10cSrcweir
929cdf0e10cSrcweir if( bModified )
930cdf0e10cSrcweir {
931cdf0e10cSrcweir sal_Int32 nText;
932cdf0e10cSrcweir for( nText = 0; nText < pTEObj->getTextCount(); ++nText )
933cdf0e10cSrcweir if( pTEObj->getText( nText ) == pTEObj->getActiveText() )
934cdf0e10cSrcweir break;
935cdf0e10cSrcweir
936cdf0e10cSrcweir pTxtUndo = dynamic_cast< SdrUndoObjSetText* >( GetModel()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTEObj, nText ) );
937cdf0e10cSrcweir }
938cdf0e10cSrcweir DBG_ASSERT( !bModified || pTxtUndo, "svx::SdrObjEditView::EndTextEdit(), could not create undo action!" );
939cdf0e10cSrcweir // Den alten CalcFieldValue-Handler wieder setzen
940cdf0e10cSrcweir // Muss vor Obj::EndTextEdit() geschehen, da dort ein UpdateFields() gemacht wird.
941cdf0e10cSrcweir pTEOutliner->SetCalcFieldValueHdl(aOldCalcFieldValueLink);
942cdf0e10cSrcweir pTEOutliner->SetBeginPasteOrDropHdl(Link());
943cdf0e10cSrcweir pTEOutliner->SetEndPasteOrDropHdl(Link());
944cdf0e10cSrcweir
945cdf0e10cSrcweir const bool bUndo = IsUndoEnabled();
946cdf0e10cSrcweir if( bUndo )
947cdf0e10cSrcweir {
948cdf0e10cSrcweir XubString aObjName;
949cdf0e10cSrcweir pTEObj->TakeObjNameSingul(aObjName);
950cdf0e10cSrcweir BegUndo(ImpGetResStr(STR_UndoObjSetText),aObjName);
951cdf0e10cSrcweir }
952cdf0e10cSrcweir
953cdf0e10cSrcweir pTEObj->EndTextEdit(*pTEOutliner);
954cdf0e10cSrcweir
955cdf0e10cSrcweir if( (pTEObj->GetRotateAngle() != 0) || (pTEObj && pTEObj->ISA(SdrTextObj) && ((SdrTextObj*)pTEObj)->IsFontwork()) )
956cdf0e10cSrcweir {
957cdf0e10cSrcweir // obviously a repaint
958cdf0e10cSrcweir pTEObj->ActionChanged();
959cdf0e10cSrcweir }
960cdf0e10cSrcweir
961cdf0e10cSrcweir if (pTxtUndo!=NULL)
962cdf0e10cSrcweir {
963cdf0e10cSrcweir pTxtUndo->AfterSetText();
964cdf0e10cSrcweir if (!pTxtUndo->IsDifferent())
965cdf0e10cSrcweir {
966cdf0e10cSrcweir delete pTxtUndo;
967cdf0e10cSrcweir pTxtUndo=NULL;
968cdf0e10cSrcweir }
969cdf0e10cSrcweir }
970cdf0e10cSrcweir // Loeschung des gesamten TextObj checken
971cdf0e10cSrcweir SdrUndoAction* pDelUndo=NULL;
972cdf0e10cSrcweir sal_Bool bDelObj=sal_False;
973cdf0e10cSrcweir SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pTEObj);
974cdf0e10cSrcweir if (pTextObj!=NULL && bTextEditNewObj)
975cdf0e10cSrcweir {
976cdf0e10cSrcweir bDelObj=pTextObj->IsTextFrame() &&
977cdf0e10cSrcweir !pTextObj->HasText() &&
978cdf0e10cSrcweir !pTextObj->IsEmptyPresObj() &&
979cdf0e10cSrcweir !pTextObj->HasFill() &&
980cdf0e10cSrcweir !pTextObj->HasLine();
981cdf0e10cSrcweir
982cdf0e10cSrcweir if(pTEObj->IsInserted() && bDelObj && pTextObj->GetObjInventor()==SdrInventor && !bDontDeleteReally)
983cdf0e10cSrcweir {
984cdf0e10cSrcweir SdrObjKind eIdent=(SdrObjKind)pTextObj->GetObjIdentifier();
985cdf0e10cSrcweir if(eIdent==OBJ_TEXT || eIdent==OBJ_TEXTEXT)
986cdf0e10cSrcweir {
987cdf0e10cSrcweir pDelUndo= GetModel()->GetSdrUndoFactory().CreateUndoDeleteObject(*pTEObj);
988cdf0e10cSrcweir }
989cdf0e10cSrcweir }
990cdf0e10cSrcweir }
991cdf0e10cSrcweir if (pTxtUndo!=NULL)
992cdf0e10cSrcweir {
993cdf0e10cSrcweir if( bUndo )
994cdf0e10cSrcweir AddUndo(pTxtUndo);
995cdf0e10cSrcweir eRet=SDRENDTEXTEDIT_CHANGED;
996cdf0e10cSrcweir }
997cdf0e10cSrcweir if (pDelUndo!=NULL)
998cdf0e10cSrcweir {
999cdf0e10cSrcweir if( bUndo )
1000cdf0e10cSrcweir {
1001cdf0e10cSrcweir AddUndo(pDelUndo);
1002cdf0e10cSrcweir }
1003cdf0e10cSrcweir else
1004cdf0e10cSrcweir {
1005cdf0e10cSrcweir delete pDelUndo;
1006cdf0e10cSrcweir }
1007cdf0e10cSrcweir eRet=SDRENDTEXTEDIT_DELETED;
1008cdf0e10cSrcweir DBG_ASSERT(pTEObj->GetObjList()!=NULL,"SdrObjEditView::SdrEndTextEdit(): Fatal: Editiertes Objekt hat keine ObjList!");
1009cdf0e10cSrcweir if (pTEObj->GetObjList()!=NULL)
1010cdf0e10cSrcweir {
1011cdf0e10cSrcweir pTEObj->GetObjList()->RemoveObject(pTEObj->GetOrdNum());
1012cdf0e10cSrcweir CheckMarked(); // und gleich die Maekierung entfernen...
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir }
1015cdf0e10cSrcweir else if (bDelObj)
1016cdf0e10cSrcweir { // Fuer den Writer: Loeschen muss die App nachholen.
1017cdf0e10cSrcweir eRet=SDRENDTEXTEDIT_SHOULDBEDELETED;
1018cdf0e10cSrcweir }
1019cdf0e10cSrcweir
1020cdf0e10cSrcweir if( bUndo )
1021cdf0e10cSrcweir EndUndo(); // EndUndo hinter Remove, falls der UndoStack gleich weggehaun' wird
1022cdf0e10cSrcweir
1023cdf0e10cSrcweir // #111096#
1024cdf0e10cSrcweir // Switch on evtl. TextAnimation again after TextEdit
1025cdf0e10cSrcweir if(pTEObj->ISA(SdrTextObj))
1026cdf0e10cSrcweir {
1027cdf0e10cSrcweir ((SdrTextObj*)pTEObj)->SetTextAnimationAllowed(sal_True);
1028cdf0e10cSrcweir }
1029cdf0e10cSrcweir
103003e5ec27SOliver-Rainer Wittmann // #i72757#
103103e5ec27SOliver-Rainer Wittmann // Since IsMarkHdlWhenTextEdit() is ignored, it is necessary
103203e5ec27SOliver-Rainer Wittmann // to call AdjustMarkHdl() always.
103303e5ec27SOliver-Rainer Wittmann AdjustMarkHdl();
1034cdf0e10cSrcweir }
1035cdf0e10cSrcweir // alle OutlinerViews loeschen
1036cdf0e10cSrcweir for (sal_uIntPtr i=pTEOutliner->GetViewCount(); i>0;)
1037cdf0e10cSrcweir {
1038cdf0e10cSrcweir i--;
1039cdf0e10cSrcweir OutlinerView* pOLV=pTEOutliner->GetView(i);
1040cdf0e10cSrcweir sal_uInt16 nMorePix=pOLV->GetInvalidateMore() + 10; // solaris aw033 test #i#
1041cdf0e10cSrcweir Window* pWin=pOLV->GetWindow();
1042cdf0e10cSrcweir Rectangle aRect(pOLV->GetOutputArea());
1043cdf0e10cSrcweir pTEOutliner->RemoveView(i);
1044cdf0e10cSrcweir if (!bTextEditDontDelete || i!=0)
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir // die nullte gehoert mir u.U. nicht.
1047cdf0e10cSrcweir delete pOLV;
1048cdf0e10cSrcweir }
1049cdf0e10cSrcweir aRect.Union(aTextEditArea);
1050cdf0e10cSrcweir aRect.Union(aMinTextEditArea);
1051cdf0e10cSrcweir aRect=pWin->LogicToPixel(aRect);
1052cdf0e10cSrcweir aRect.Left()-=nMorePix;
1053cdf0e10cSrcweir aRect.Top()-=nMorePix;
1054cdf0e10cSrcweir aRect.Right()+=nMorePix;
1055cdf0e10cSrcweir aRect.Bottom()+=nMorePix;
1056cdf0e10cSrcweir aRect=pWin->PixelToLogic(aRect);
1057cdf0e10cSrcweir InvalidateOneWin(*pWin,aRect);
1058cdf0e10cSrcweir // pWin->Invalidate(INVALIDATE_UPDATE);
1059cdf0e10cSrcweir
1060cdf0e10cSrcweir // pWin->Update();
1061cdf0e10cSrcweir // pWin->Flush();
1062cdf0e10cSrcweir pWin->SetFillColor();
1063cdf0e10cSrcweir pWin->SetLineColor(COL_BLACK);
1064cdf0e10cSrcweir pWin->DrawPixel(aRect.TopLeft());
1065cdf0e10cSrcweir pWin->DrawPixel(aRect.TopRight());
1066cdf0e10cSrcweir pWin->DrawPixel(aRect.BottomLeft());
1067cdf0e10cSrcweir pWin->DrawPixel(aRect.BottomRight());
1068cdf0e10cSrcweir //pWin->DrawRect(aRect);
1069cdf0e10cSrcweir }
1070cdf0e10cSrcweir // und auch den Outliner selbst
1071cdf0e10cSrcweir if (!bTextEditDontDelete) delete pTEOutliner;
1072cdf0e10cSrcweir else pTEOutliner->Clear();
1073cdf0e10cSrcweir if (pTEWin!=NULL) {
1074cdf0e10cSrcweir pTEWin->SetCursor(pTECursorMerker);
1075cdf0e10cSrcweir }
1076cdf0e10cSrcweir //HMH if (bMarkHdlWhenTextEdit) {
1077cdf0e10cSrcweir //HMH HideMarkHdl();
1078cdf0e10cSrcweir //HMH }
1079cdf0e10cSrcweir aHdl.SetMoveOutside(sal_False);
1080cdf0e10cSrcweir if (eRet!=SDRENDTEXTEDIT_UNCHANGED)
1081cdf0e10cSrcweir //HMH {
1082cdf0e10cSrcweir //HMH ShowMarkHdl(); // Handles kommen ansonsten via Broadcast
1083cdf0e10cSrcweir //HMH }
1084cdf0e10cSrcweir //HMH else
1085cdf0e10cSrcweir {
1086cdf0e10cSrcweir GetMarkedObjectListWriteAccess().SetNameDirty();
1087cdf0e10cSrcweir }
1088cdf0e10cSrcweir #ifdef DBG_UTIL
1089cdf0e10cSrcweir if (pItemBrowser)
1090cdf0e10cSrcweir {
1091cdf0e10cSrcweir GetMarkedObjectListWriteAccess().SetNameDirty();
1092cdf0e10cSrcweir pItemBrowser->SetDirty();
1093cdf0e10cSrcweir }
1094cdf0e10cSrcweir #endif
1095cdf0e10cSrcweir }
1096cdf0e10cSrcweir
1097cdf0e10cSrcweir // #108784#
1098cdf0e10cSrcweir if( pTEObj &&
1099cdf0e10cSrcweir pTEObj->GetModel() &&
1100cdf0e10cSrcweir !pTEObj->GetModel()->isLocked() &&
1101cdf0e10cSrcweir pTEObj->GetBroadcaster())
1102cdf0e10cSrcweir {
1103cdf0e10cSrcweir SdrHint aHint(HINT_ENDEDIT);
1104cdf0e10cSrcweir aHint.SetObject(pTEObj);
1105cdf0e10cSrcweir ((SfxBroadcaster*)pTEObj->GetBroadcaster())->Broadcast(aHint);
1106cdf0e10cSrcweir }
1107cdf0e10cSrcweir
11083d9b0034SArmin Le Grand if(pUndoEditUndoManager)
110969ffbee1SArmin Le Grand {
11103d9b0034SArmin Le Grand if(bNeedToUndoSavedRedoTextEdit)
11113d9b0034SArmin Le Grand {
11123d9b0034SArmin Le Grand // undo the text edit action since it was created as part of an EndTextEdit
11133d9b0034SArmin Le Grand // callback from undo itself. This needs to be done after the call to
11143d9b0034SArmin Le Grand // FmFormView::SdrEndTextEdit since it gets created there
11153d9b0034SArmin Le Grand pUndoEditUndoManager->Undo();
11163d9b0034SArmin Le Grand }
11173d9b0034SArmin Le Grand
11183d9b0034SArmin Le Grand // trigger the Undo which was not executed, but lead to this
11193d9b0034SArmin Le Grand // end text edit
11203d9b0034SArmin Le Grand pUndoEditUndoManager->Undo();
112169ffbee1SArmin Le Grand }
112269ffbee1SArmin Le Grand
112369ffbee1SArmin Le Grand return eRet;
1124cdf0e10cSrcweir }
1125cdf0e10cSrcweir
1126cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1127cdf0e10cSrcweir // info about TextEdit. Default is sal_False.
IsTextEdit() const1128cdf0e10cSrcweir bool SdrObjEditView::IsTextEdit() const
1129cdf0e10cSrcweir {
1130cdf0e10cSrcweir return mxTextEditObj.is();
1131cdf0e10cSrcweir }
1132cdf0e10cSrcweir
1133cdf0e10cSrcweir // info about TextEditPageView. Default is 0L.
GetTextEditPageView() const1134cdf0e10cSrcweir SdrPageView* SdrObjEditView::GetTextEditPageView() const
1135cdf0e10cSrcweir {
1136cdf0e10cSrcweir return pTextEditPV;
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir
1139cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1140cdf0e10cSrcweir
ImpFindOutlinerView(Window * pWin) const1141cdf0e10cSrcweir OutlinerView* SdrObjEditView::ImpFindOutlinerView(Window* pWin) const
1142cdf0e10cSrcweir {
1143cdf0e10cSrcweir if (pWin==NULL) return NULL;
1144cdf0e10cSrcweir if (pTextEditOutliner==NULL) return NULL;
1145cdf0e10cSrcweir OutlinerView* pNewView=NULL;
1146cdf0e10cSrcweir sal_uIntPtr nWinAnz=pTextEditOutliner->GetViewCount();
1147cdf0e10cSrcweir for (sal_uIntPtr i=0; i<nWinAnz && pNewView==NULL; i++) {
1148cdf0e10cSrcweir OutlinerView* pView=pTextEditOutliner->GetView(i);
1149cdf0e10cSrcweir if (pView->GetWindow()==pWin) pNewView=pView;
1150cdf0e10cSrcweir }
1151cdf0e10cSrcweir return pNewView;
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir
SetTextEditWin(Window * pWin)1154cdf0e10cSrcweir void SdrObjEditView::SetTextEditWin(Window* pWin)
1155cdf0e10cSrcweir {
1156cdf0e10cSrcweir if(mxTextEditObj.is() && pWin!=NULL && pWin!=pTextEditWin)
1157cdf0e10cSrcweir {
1158cdf0e10cSrcweir OutlinerView* pNewView=ImpFindOutlinerView(pWin);
1159cdf0e10cSrcweir if (pNewView!=NULL && pNewView!=pTextEditOutlinerView)
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL)
1162cdf0e10cSrcweir {
1163cdf0e10cSrcweir pTextEditOutlinerView->HideCursor();
1164cdf0e10cSrcweir }
1165cdf0e10cSrcweir pTextEditOutlinerView=pNewView;
1166cdf0e10cSrcweir pTextEditWin=pWin;
1167cdf0e10cSrcweir pWin->GrabFocus(); // Damit der Cursor hier auch blinkt
1168cdf0e10cSrcweir pNewView->ShowCursor();
1169cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir }
1172cdf0e10cSrcweir }
1173cdf0e10cSrcweir
IsTextEditHit(const Point & rHit,short nTol) const1174cdf0e10cSrcweir sal_Bool SdrObjEditView::IsTextEditHit(const Point& rHit, short nTol) const
1175cdf0e10cSrcweir {
1176cdf0e10cSrcweir sal_Bool bOk=sal_False;
1177cdf0e10cSrcweir if(mxTextEditObj.is())
1178cdf0e10cSrcweir {
1179cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL);
1180cdf0e10cSrcweir // nur drittel Toleranz hier, damit die Handles
1181cdf0e10cSrcweir // noch vernuenftig getroffen werden koennen
1182cdf0e10cSrcweir nTol=nTol/3;
1183cdf0e10cSrcweir nTol=0; // Joe am 6.3.1997: Keine Hittoleranz mehr hier
1184cdf0e10cSrcweir if (!bOk)
1185cdf0e10cSrcweir {
1186cdf0e10cSrcweir Rectangle aEditArea;
1187cdf0e10cSrcweir OutlinerView* pOLV=pTextEditOutliner->GetView(0);
1188cdf0e10cSrcweir if (pOLV!=NULL)
1189cdf0e10cSrcweir {
1190cdf0e10cSrcweir aEditArea.Union(pOLV->GetOutputArea());
1191cdf0e10cSrcweir }
1192cdf0e10cSrcweir aEditArea.Left()-=nTol;
1193cdf0e10cSrcweir aEditArea.Top()-=nTol;
1194cdf0e10cSrcweir aEditArea.Right()+=nTol;
1195cdf0e10cSrcweir aEditArea.Bottom()+=nTol;
1196cdf0e10cSrcweir bOk=aEditArea.IsInside(rHit);
1197cdf0e10cSrcweir if (bOk)
1198cdf0e10cSrcweir { // Nun noch checken, ob auch wirklich Buchstaben getroffen wurden
1199cdf0e10cSrcweir Point aPnt(rHit); aPnt-=aEditArea.TopLeft();
1200cdf0e10cSrcweir long nHitTol = 2000;
1201cdf0e10cSrcweir OutputDevice* pRef = pTextEditOutliner->GetRefDevice();
1202cdf0e10cSrcweir if( pRef )
1203cdf0e10cSrcweir nHitTol = pRef->LogicToLogic( nHitTol, MAP_100TH_MM, pRef->GetMapMode().GetMapUnit() );
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir bOk = pTextEditOutliner->IsTextPos( aPnt, (sal_uInt16)nHitTol );
1206cdf0e10cSrcweir }
1207cdf0e10cSrcweir }
1208cdf0e10cSrcweir }
1209cdf0e10cSrcweir return bOk;
1210cdf0e10cSrcweir }
1211cdf0e10cSrcweir
IsTextEditFrameHit(const Point & rHit) const1212cdf0e10cSrcweir sal_Bool SdrObjEditView::IsTextEditFrameHit(const Point& rHit) const
1213cdf0e10cSrcweir {
1214cdf0e10cSrcweir sal_Bool bOk=sal_False;
1215cdf0e10cSrcweir if(mxTextEditObj.is())
1216cdf0e10cSrcweir {
1217cdf0e10cSrcweir SdrTextObj* pText= dynamic_cast<SdrTextObj*>(mxTextEditObj.get());
1218cdf0e10cSrcweir OutlinerView* pOLV=pTextEditOutliner->GetView(0);
1219cdf0e10cSrcweir if( pOLV )
1220cdf0e10cSrcweir {
1221cdf0e10cSrcweir Window* pWin=pOLV->GetWindow();
1222cdf0e10cSrcweir if (pText!=NULL && pText->IsTextFrame() && pOLV!=NULL && pWin!=NULL) {
1223cdf0e10cSrcweir sal_uInt16 nPixSiz=pOLV->GetInvalidateMore();
1224cdf0e10cSrcweir Rectangle aEditArea(aMinTextEditArea);
1225cdf0e10cSrcweir aEditArea.Union(pOLV->GetOutputArea());
1226cdf0e10cSrcweir if (!aEditArea.IsInside(rHit)) {
1227cdf0e10cSrcweir Size aSiz(pWin->PixelToLogic(Size(nPixSiz,nPixSiz)));
1228cdf0e10cSrcweir aEditArea.Left()-=aSiz.Width();
1229cdf0e10cSrcweir aEditArea.Top()-=aSiz.Height();
1230cdf0e10cSrcweir aEditArea.Right()+=aSiz.Width();
1231cdf0e10cSrcweir aEditArea.Bottom()+=aSiz.Height();
1232cdf0e10cSrcweir bOk=aEditArea.IsInside(rHit);
1233cdf0e10cSrcweir }
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir }
1236cdf0e10cSrcweir }
1237cdf0e10cSrcweir return bOk;
1238cdf0e10cSrcweir }
1239cdf0e10cSrcweir
AddTextEditOfs(MouseEvent & rMEvt) const1240cdf0e10cSrcweir void SdrObjEditView::AddTextEditOfs(MouseEvent& rMEvt) const
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir if(mxTextEditObj.is())
1243cdf0e10cSrcweir {
1244cdf0e10cSrcweir Point aPvOfs;
1245cdf0e10cSrcweir SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mxTextEditObj.get() );
1246cdf0e10cSrcweir
1247cdf0e10cSrcweir if( pTextObj )
1248cdf0e10cSrcweir {
1249cdf0e10cSrcweir // #108784#
1250cdf0e10cSrcweir aPvOfs += pTextObj->GetTextEditOffset();
1251cdf0e10cSrcweir }
1252cdf0e10cSrcweir
1253cdf0e10cSrcweir Point aObjOfs(mxTextEditObj->GetLogicRect().TopLeft());
1254cdf0e10cSrcweir (Point&)(rMEvt.GetPosPixel())+=aPvOfs+aObjOfs;
1255cdf0e10cSrcweir }
1256cdf0e10cSrcweir }
1257cdf0e10cSrcweir
1258cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1259cdf0e10cSrcweir
KeyInput(const KeyEvent & rKEvt,Window * pWin)1260cdf0e10cSrcweir sal_Bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, Window* pWin)
1261cdf0e10cSrcweir {
1262cdf0e10cSrcweir if(pTextEditOutlinerView)
1263cdf0e10cSrcweir {
1264cdf0e10cSrcweir #ifdef DBG_UTIL
1265cdf0e10cSrcweir if(rKEvt.GetKeyCode().GetCode() == KEY_RETURN && pTextEditOutliner->GetParagraphCount() == 1)
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir ByteString aLine(
1268cdf0e10cSrcweir pTextEditOutliner->GetText(pTextEditOutliner->GetParagraph( 0 ), 1),
1269cdf0e10cSrcweir gsl_getSystemTextEncoding());
1270cdf0e10cSrcweir aLine = aLine.ToUpperAscii();
1271cdf0e10cSrcweir
1272cdf0e10cSrcweir if(aLine == "HELLO JOE, PLEASE SHOW THE ITEMBROWSER")
1273cdf0e10cSrcweir ShowItemBrowser();
1274cdf0e10cSrcweir }
1275cdf0e10cSrcweir #endif
1276cdf0e10cSrcweir if (pTextEditOutlinerView->PostKeyEvent(rKEvt))
1277cdf0e10cSrcweir {
1278cdf0e10cSrcweir if( pMod /* && !pMod->IsChanged() */ )
1279cdf0e10cSrcweir {
1280cdf0e10cSrcweir if( pTextEditOutliner && pTextEditOutliner->IsModified() )
1281cdf0e10cSrcweir pMod->SetChanged( sal_True );
1282cdf0e10cSrcweir }
1283cdf0e10cSrcweir
1284cdf0e10cSrcweir if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
1285cdf0e10cSrcweir #ifdef DBG_UTIL
1286cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1287cdf0e10cSrcweir #endif
1288cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1289cdf0e10cSrcweir return sal_True;
1290cdf0e10cSrcweir }
1291cdf0e10cSrcweir }
1292cdf0e10cSrcweir return SdrGlueEditView::KeyInput(rKEvt,pWin);
1293cdf0e10cSrcweir }
1294cdf0e10cSrcweir
MouseButtonDown(const MouseEvent & rMEvt,Window * pWin)1295cdf0e10cSrcweir sal_Bool SdrObjEditView::MouseButtonDown(const MouseEvent& rMEvt, Window* pWin)
1296cdf0e10cSrcweir {
1297cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL) {
1298cdf0e10cSrcweir sal_Bool bPostIt=pTextEditOutliner->IsInSelectionMode();
1299cdf0e10cSrcweir if (!bPostIt) {
1300cdf0e10cSrcweir Point aPt(rMEvt.GetPosPixel());
1301cdf0e10cSrcweir if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
1302cdf0e10cSrcweir else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
1303cdf0e10cSrcweir bPostIt=IsTextEditHit(aPt,nHitTolLog);
1304cdf0e10cSrcweir }
1305cdf0e10cSrcweir if (bPostIt) {
1306cdf0e10cSrcweir Point aPixPos(rMEvt.GetPosPixel());
1307cdf0e10cSrcweir Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
1308cdf0e10cSrcweir if (aPixPos.X()<aR.Left ()) aPixPos.X()=aR.Left ();
1309cdf0e10cSrcweir if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
1310cdf0e10cSrcweir if (aPixPos.Y()<aR.Top ()) aPixPos.Y()=aR.Top ();
1311cdf0e10cSrcweir if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
1312cdf0e10cSrcweir MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
1313cdf0e10cSrcweir rMEvt.GetButtons(),rMEvt.GetModifier());
1314cdf0e10cSrcweir if (pTextEditOutlinerView->MouseButtonDown(aMEvt)) {
1315cdf0e10cSrcweir if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
1316cdf0e10cSrcweir #ifdef DBG_UTIL
1317cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1318cdf0e10cSrcweir #endif
1319cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1320cdf0e10cSrcweir return sal_True;
1321cdf0e10cSrcweir }
1322cdf0e10cSrcweir }
1323cdf0e10cSrcweir }
1324cdf0e10cSrcweir return SdrGlueEditView::MouseButtonDown(rMEvt,pWin);
1325cdf0e10cSrcweir }
1326cdf0e10cSrcweir
MouseButtonUp(const MouseEvent & rMEvt,Window * pWin)1327cdf0e10cSrcweir sal_Bool SdrObjEditView::MouseButtonUp(const MouseEvent& rMEvt, Window* pWin)
1328cdf0e10cSrcweir {
1329cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL) {
1330cdf0e10cSrcweir sal_Bool bPostIt=pTextEditOutliner->IsInSelectionMode();
1331cdf0e10cSrcweir if (!bPostIt) {
1332cdf0e10cSrcweir Point aPt(rMEvt.GetPosPixel());
1333cdf0e10cSrcweir if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
1334cdf0e10cSrcweir else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
1335cdf0e10cSrcweir bPostIt=IsTextEditHit(aPt,nHitTolLog);
1336cdf0e10cSrcweir }
1337cdf0e10cSrcweir if (bPostIt) {
1338cdf0e10cSrcweir Point aPixPos(rMEvt.GetPosPixel());
1339cdf0e10cSrcweir Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
1340cdf0e10cSrcweir if (aPixPos.X()<aR.Left ()) aPixPos.X()=aR.Left ();
1341cdf0e10cSrcweir if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
1342cdf0e10cSrcweir if (aPixPos.Y()<aR.Top ()) aPixPos.Y()=aR.Top ();
1343cdf0e10cSrcweir if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
1344cdf0e10cSrcweir MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
1345cdf0e10cSrcweir rMEvt.GetButtons(),rMEvt.GetModifier());
1346cdf0e10cSrcweir if (pTextEditOutlinerView->MouseButtonUp(aMEvt)) {
1347cdf0e10cSrcweir #ifdef DBG_UTIL
1348cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1349cdf0e10cSrcweir #endif
1350cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1351cdf0e10cSrcweir return sal_True;
1352cdf0e10cSrcweir }
1353cdf0e10cSrcweir }
1354cdf0e10cSrcweir }
1355cdf0e10cSrcweir return SdrGlueEditView::MouseButtonUp(rMEvt,pWin);
1356cdf0e10cSrcweir }
1357cdf0e10cSrcweir
MouseMove(const MouseEvent & rMEvt,Window * pWin)1358cdf0e10cSrcweir sal_Bool SdrObjEditView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL) {
1361cdf0e10cSrcweir sal_Bool bSelMode=pTextEditOutliner->IsInSelectionMode();
1362cdf0e10cSrcweir sal_Bool bPostIt=bSelMode;
1363cdf0e10cSrcweir if (!bPostIt) {
1364cdf0e10cSrcweir Point aPt(rMEvt.GetPosPixel());
1365cdf0e10cSrcweir if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
1366cdf0e10cSrcweir else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
1367cdf0e10cSrcweir bPostIt=IsTextEditHit(aPt,nHitTolLog);
1368cdf0e10cSrcweir }
1369cdf0e10cSrcweir if (bPostIt) {
1370cdf0e10cSrcweir Point aPixPos(rMEvt.GetPosPixel());
1371cdf0e10cSrcweir Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
1372cdf0e10cSrcweir if (aPixPos.X()<aR.Left ()) aPixPos.X()=aR.Left ();
1373cdf0e10cSrcweir if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
1374cdf0e10cSrcweir if (aPixPos.Y()<aR.Top ()) aPixPos.Y()=aR.Top ();
1375cdf0e10cSrcweir if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
1376cdf0e10cSrcweir MouseEvent aMEvt(aPixPos,rMEvt.GetClicks(),rMEvt.GetMode(),
1377cdf0e10cSrcweir rMEvt.GetButtons(),rMEvt.GetModifier());
1378cdf0e10cSrcweir if (pTextEditOutlinerView->MouseMove(aMEvt) && bSelMode) {
1379cdf0e10cSrcweir #ifdef DBG_UTIL
1380cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1381cdf0e10cSrcweir #endif
1382cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1383cdf0e10cSrcweir return sal_True;
1384cdf0e10cSrcweir }
1385cdf0e10cSrcweir }
1386cdf0e10cSrcweir }
1387cdf0e10cSrcweir return SdrGlueEditView::MouseMove(rMEvt,pWin);
1388cdf0e10cSrcweir }
1389cdf0e10cSrcweir
Command(const CommandEvent & rCEvt,Window * pWin)1390cdf0e10cSrcweir sal_Bool SdrObjEditView::Command(const CommandEvent& rCEvt, Window* pWin)
1391cdf0e10cSrcweir {
1392cdf0e10cSrcweir // solange bis die OutlinerView einen sal_Bool zurueckliefert
1393cdf0e10cSrcweir // bekommt sie nur COMMAND_STARTDRAG
1394cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL)
1395cdf0e10cSrcweir {
1396cdf0e10cSrcweir if (rCEvt.GetCommand()==COMMAND_STARTDRAG) {
1397cdf0e10cSrcweir sal_Bool bPostIt=pTextEditOutliner->IsInSelectionMode() || !rCEvt.IsMouseEvent();
1398cdf0e10cSrcweir if (!bPostIt && rCEvt.IsMouseEvent()) {
1399cdf0e10cSrcweir Point aPt(rCEvt.GetMousePosPixel());
1400cdf0e10cSrcweir if (pWin!=NULL) aPt=pWin->PixelToLogic(aPt);
1401cdf0e10cSrcweir else if (pTextEditWin!=NULL) aPt=pTextEditWin->PixelToLogic(aPt);
1402cdf0e10cSrcweir bPostIt=IsTextEditHit(aPt,nHitTolLog);
1403cdf0e10cSrcweir }
1404cdf0e10cSrcweir if (bPostIt) {
1405cdf0e10cSrcweir Point aPixPos(rCEvt.GetMousePosPixel());
1406cdf0e10cSrcweir if (rCEvt.IsMouseEvent()) {
1407cdf0e10cSrcweir Rectangle aR(pWin->LogicToPixel(pTextEditOutlinerView->GetOutputArea()));
1408cdf0e10cSrcweir if (aPixPos.X()<aR.Left ()) aPixPos.X()=aR.Left ();
1409cdf0e10cSrcweir if (aPixPos.X()>aR.Right ()) aPixPos.X()=aR.Right ();
1410cdf0e10cSrcweir if (aPixPos.Y()<aR.Top ()) aPixPos.Y()=aR.Top ();
1411cdf0e10cSrcweir if (aPixPos.Y()>aR.Bottom()) aPixPos.Y()=aR.Bottom();
1412cdf0e10cSrcweir }
1413cdf0e10cSrcweir CommandEvent aCEvt(aPixPos,rCEvt.GetCommand(),rCEvt.IsMouseEvent());
1414cdf0e10cSrcweir // Command ist an der OutlinerView leider void
1415cdf0e10cSrcweir pTextEditOutlinerView->Command(aCEvt);
1416cdf0e10cSrcweir if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin);
1417cdf0e10cSrcweir #ifdef DBG_UTIL
1418cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1419cdf0e10cSrcweir #endif
1420cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1421cdf0e10cSrcweir return sal_True;
1422cdf0e10cSrcweir }
1423cdf0e10cSrcweir }
1424cdf0e10cSrcweir else // if (rCEvt.GetCommand() == COMMAND_VOICE )
1425cdf0e10cSrcweir {
1426cdf0e10cSrcweir pTextEditOutlinerView->Command(rCEvt);
1427cdf0e10cSrcweir return sal_True;
1428cdf0e10cSrcweir }
1429cdf0e10cSrcweir }
1430cdf0e10cSrcweir return SdrGlueEditView::Command(rCEvt,pWin);
1431cdf0e10cSrcweir }
1432cdf0e10cSrcweir
Cut(sal_uIntPtr nFormat)1433cdf0e10cSrcweir sal_Bool SdrObjEditView::Cut(sal_uIntPtr nFormat)
1434cdf0e10cSrcweir {
1435cdf0e10cSrcweir if (pTextEditOutliner!=NULL) {
1436cdf0e10cSrcweir pTextEditOutlinerView->Cut();
1437cdf0e10cSrcweir #ifdef DBG_UTIL
1438cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1439cdf0e10cSrcweir #endif
1440cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1441cdf0e10cSrcweir return sal_True;
1442cdf0e10cSrcweir } else {
1443cdf0e10cSrcweir return SdrGlueEditView::Cut(nFormat);
1444cdf0e10cSrcweir }
1445cdf0e10cSrcweir }
1446cdf0e10cSrcweir
Yank(sal_uIntPtr nFormat)1447cdf0e10cSrcweir sal_Bool SdrObjEditView::Yank(sal_uIntPtr nFormat)
1448cdf0e10cSrcweir {
1449cdf0e10cSrcweir if (pTextEditOutliner!=NULL) {
1450cdf0e10cSrcweir pTextEditOutlinerView->Copy();
1451cdf0e10cSrcweir return sal_True;
1452cdf0e10cSrcweir } else {
1453cdf0e10cSrcweir return SdrGlueEditView::Yank(nFormat);
1454cdf0e10cSrcweir }
1455cdf0e10cSrcweir }
1456cdf0e10cSrcweir
Paste(Window * pWin,sal_uIntPtr nFormat)1457cdf0e10cSrcweir sal_Bool SdrObjEditView::Paste(Window* pWin, sal_uIntPtr nFormat)
1458cdf0e10cSrcweir {
1459cdf0e10cSrcweir if (pTextEditOutliner!=NULL) {
1460cdf0e10cSrcweir if (pWin!=NULL) {
1461cdf0e10cSrcweir OutlinerView* pNewView=ImpFindOutlinerView(pWin);
1462cdf0e10cSrcweir if (pNewView!=NULL) {
1463cdf0e10cSrcweir pNewView->Paste();
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir } else {
1466cdf0e10cSrcweir pTextEditOutlinerView->Paste();
1467cdf0e10cSrcweir }
1468cdf0e10cSrcweir #ifdef DBG_UTIL
1469cdf0e10cSrcweir if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
1470cdf0e10cSrcweir #endif
1471cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1472cdf0e10cSrcweir return sal_True;
1473cdf0e10cSrcweir } else {
1474cdf0e10cSrcweir return SdrGlueEditView::Paste(pWin,nFormat);
1475cdf0e10cSrcweir }
1476cdf0e10cSrcweir }
1477cdf0e10cSrcweir
1478cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1479cdf0e10cSrcweir
ImpIsTextEditAllSelected() const1480cdf0e10cSrcweir sal_Bool SdrObjEditView::ImpIsTextEditAllSelected() const
1481cdf0e10cSrcweir {
1482cdf0e10cSrcweir sal_Bool bRet=sal_False;
1483cdf0e10cSrcweir if (pTextEditOutliner!=NULL && pTextEditOutlinerView!=NULL)
1484cdf0e10cSrcweir {
1485cdf0e10cSrcweir if(SdrTextObj::HasTextImpl( pTextEditOutliner ) )
1486cdf0e10cSrcweir {
1487cdf0e10cSrcweir const sal_uInt32 nParaAnz=pTextEditOutliner->GetParagraphCount();
1488cdf0e10cSrcweir Paragraph* pLastPara=pTextEditOutliner->GetParagraph( nParaAnz > 1 ? nParaAnz - 1 : 0 );
1489cdf0e10cSrcweir
1490cdf0e10cSrcweir ESelection aESel(pTextEditOutlinerView->GetSelection());
1491cdf0e10cSrcweir if (aESel.nStartPara==0 && aESel.nStartPos==0 && aESel.nEndPara==sal_uInt16(nParaAnz-1))
1492cdf0e10cSrcweir {
1493cdf0e10cSrcweir XubString aStr(pTextEditOutliner->GetText(pLastPara));
1494cdf0e10cSrcweir
1495cdf0e10cSrcweir if(aStr.Len() == aESel.nEndPos)
1496cdf0e10cSrcweir bRet = sal_True;
1497cdf0e10cSrcweir }
1498cdf0e10cSrcweir // und nun auch noch fuer den Fall, das rueckwaerts selektiert wurde
1499cdf0e10cSrcweir if (!bRet && aESel.nEndPara==0 && aESel.nEndPos==0 && aESel.nStartPara==sal_uInt16(nParaAnz-1))
1500cdf0e10cSrcweir {
1501cdf0e10cSrcweir XubString aStr(pTextEditOutliner->GetText(pLastPara));
1502cdf0e10cSrcweir
1503cdf0e10cSrcweir if(aStr.Len() == aESel.nStartPos)
1504cdf0e10cSrcweir bRet = sal_True;
1505cdf0e10cSrcweir }
1506cdf0e10cSrcweir }
1507cdf0e10cSrcweir else
1508cdf0e10cSrcweir {
1509cdf0e10cSrcweir bRet=sal_True;
1510cdf0e10cSrcweir }
1511cdf0e10cSrcweir }
1512cdf0e10cSrcweir return bRet;
1513cdf0e10cSrcweir }
1514cdf0e10cSrcweir
ImpMakeTextCursorAreaVisible()1515cdf0e10cSrcweir void SdrObjEditView::ImpMakeTextCursorAreaVisible()
1516cdf0e10cSrcweir {
1517cdf0e10cSrcweir if (pTextEditOutlinerView!=NULL && pTextEditWin!=NULL) {
1518cdf0e10cSrcweir Cursor* pCsr=pTextEditWin->GetCursor();
1519cdf0e10cSrcweir if (pCsr!=NULL) {
1520cdf0e10cSrcweir Size aSiz(pCsr->GetSize());
1521cdf0e10cSrcweir if (aSiz.Width()!=0 && aSiz.Height()!=0) { // #38450#
1522cdf0e10cSrcweir MakeVisible(Rectangle(pCsr->GetPos(),aSiz),*pTextEditWin);
1523cdf0e10cSrcweir }
1524cdf0e10cSrcweir }
1525cdf0e10cSrcweir }
1526cdf0e10cSrcweir }
1527cdf0e10cSrcweir
GetScriptType() const1528cdf0e10cSrcweir sal_uInt16 SdrObjEditView::GetScriptType() const
1529cdf0e10cSrcweir {
1530cdf0e10cSrcweir sal_uInt16 nScriptType = 0;
1531cdf0e10cSrcweir
1532cdf0e10cSrcweir if( IsTextEdit() )
1533cdf0e10cSrcweir {
1534cdf0e10cSrcweir if( mxTextEditObj->GetOutlinerParaObject() )
1535cdf0e10cSrcweir nScriptType = mxTextEditObj->GetOutlinerParaObject()->GetTextObject().GetScriptType();
1536cdf0e10cSrcweir
1537cdf0e10cSrcweir if( pTextEditOutlinerView )
1538cdf0e10cSrcweir nScriptType = pTextEditOutlinerView->GetSelectedScriptType();
1539cdf0e10cSrcweir }
1540cdf0e10cSrcweir else
1541cdf0e10cSrcweir {
1542cdf0e10cSrcweir sal_uInt32 nMarkCount( GetMarkedObjectCount() );
1543cdf0e10cSrcweir
1544cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nMarkCount; i++ )
1545cdf0e10cSrcweir {
1546cdf0e10cSrcweir OutlinerParaObject* pParaObj = GetMarkedObjectByIndex( i )->GetOutlinerParaObject();
1547cdf0e10cSrcweir
1548cdf0e10cSrcweir if( pParaObj )
1549cdf0e10cSrcweir {
1550cdf0e10cSrcweir nScriptType |= pParaObj->GetTextObject().GetScriptType();
1551cdf0e10cSrcweir }
1552cdf0e10cSrcweir }
1553cdf0e10cSrcweir }
1554cdf0e10cSrcweir
1555cdf0e10cSrcweir if( nScriptType == 0 )
1556cdf0e10cSrcweir nScriptType = SCRIPTTYPE_LATIN;
1557cdf0e10cSrcweir
1558cdf0e10cSrcweir return nScriptType;
1559cdf0e10cSrcweir }
1560cdf0e10cSrcweir
1561cdf0e10cSrcweir /* new interface src537 */
GetAttributes(SfxItemSet & rTargetSet,sal_Bool bOnlyHardAttr) const1562cdf0e10cSrcweir sal_Bool SdrObjEditView::GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr) const
1563cdf0e10cSrcweir {
1564cdf0e10cSrcweir if( mxSelectionController.is() )
1565cdf0e10cSrcweir if( mxSelectionController->GetAttributes( rTargetSet, bOnlyHardAttr ) )
1566cdf0e10cSrcweir return sal_True;
1567cdf0e10cSrcweir
1568cdf0e10cSrcweir if(IsTextEdit())
1569cdf0e10cSrcweir {
1570cdf0e10cSrcweir DBG_ASSERT(pTextEditOutlinerView!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutlinerView=NULL");
1571cdf0e10cSrcweir DBG_ASSERT(pTextEditOutliner!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutliner=NULL");
1572cdf0e10cSrcweir
1573cdf0e10cSrcweir // #92389# take care of bOnlyHardAttr(!)
1574cdf0e10cSrcweir if(!bOnlyHardAttr && mxTextEditObj->GetStyleSheet())
1575cdf0e10cSrcweir rTargetSet.Put(mxTextEditObj->GetStyleSheet()->GetItemSet());
1576cdf0e10cSrcweir
1577cdf0e10cSrcweir // add object attributes
1578cdf0e10cSrcweir rTargetSet.Put( mxTextEditObj->GetMergedItemSet() );
1579cdf0e10cSrcweir
1580cdf0e10cSrcweir if( mxTextEditObj->GetOutlinerParaObject() )
1581cdf0e10cSrcweir rTargetSet.Put( SvxScriptTypeItem( mxTextEditObj->GetOutlinerParaObject()->GetTextObject().GetScriptType() ) );
1582cdf0e10cSrcweir
1583cdf0e10cSrcweir if(pTextEditOutlinerView)
1584cdf0e10cSrcweir {
1585cdf0e10cSrcweir // FALSE= InvalidItems nicht al Default, sondern als "Loecher" betrachten
1586cdf0e10cSrcweir rTargetSet.Put(pTextEditOutlinerView->GetAttribs(), sal_False);
1587cdf0e10cSrcweir rTargetSet.Put( SvxScriptTypeItem( pTextEditOutlinerView->GetSelectedScriptType() ), sal_False );
1588cdf0e10cSrcweir }
1589cdf0e10cSrcweir
1590cdf0e10cSrcweir if(GetMarkedObjectCount()==1 && GetMarkedObjectByIndex(0)==mxTextEditObj.get())
1591cdf0e10cSrcweir {
1592cdf0e10cSrcweir MergeNotPersistAttrFromMarked(rTargetSet, bOnlyHardAttr);
1593cdf0e10cSrcweir }
1594cdf0e10cSrcweir
1595cdf0e10cSrcweir return sal_True;
1596cdf0e10cSrcweir }
1597cdf0e10cSrcweir else
1598cdf0e10cSrcweir {
1599cdf0e10cSrcweir return SdrGlueEditView::GetAttributes(rTargetSet, bOnlyHardAttr);
1600cdf0e10cSrcweir }
1601cdf0e10cSrcweir }
1602cdf0e10cSrcweir
SetAttributes(const SfxItemSet & rSet,sal_Bool bReplaceAll)1603cdf0e10cSrcweir sal_Bool SdrObjEditView::SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll)
1604cdf0e10cSrcweir {
1605cdf0e10cSrcweir sal_Bool bRet=sal_False;
1606cdf0e10cSrcweir sal_Bool bTextEdit=pTextEditOutlinerView!=NULL && mxTextEditObj.is();
1607cdf0e10cSrcweir sal_Bool bAllTextSelected=ImpIsTextEditAllSelected();
1608cdf0e10cSrcweir SfxItemSet* pModifiedSet=NULL;
1609cdf0e10cSrcweir const SfxItemSet* pSet=&rSet;
1610cdf0e10cSrcweir //const SvxAdjustItem* pParaJust=NULL;
1611cdf0e10cSrcweir
1612cdf0e10cSrcweir if (!bTextEdit)
1613cdf0e10cSrcweir {
1614cdf0e10cSrcweir // Kein TextEdit aktiv -> alle Items ans Zeichenobjekt
1615cdf0e10cSrcweir if( mxSelectionController.is() )
1616cdf0e10cSrcweir bRet=mxSelectionController->SetAttributes(*pSet,bReplaceAll );
1617cdf0e10cSrcweir
1618cdf0e10cSrcweir if( !bRet )
1619cdf0e10cSrcweir {
1620cdf0e10cSrcweir bRet=SdrGlueEditView::SetAttributes(*pSet,bReplaceAll);
1621cdf0e10cSrcweir }
1622cdf0e10cSrcweir }
1623cdf0e10cSrcweir else
1624cdf0e10cSrcweir {
1625cdf0e10cSrcweir #ifdef DBG_UTIL
1626cdf0e10cSrcweir {
1627cdf0e10cSrcweir sal_Bool bHasEEFeatureItems=sal_False;
1628cdf0e10cSrcweir SfxItemIter aIter(rSet);
1629cdf0e10cSrcweir const SfxPoolItem* pItem=aIter.FirstItem();
1630cdf0e10cSrcweir while (!bHasEEFeatureItems && pItem!=NULL)
1631cdf0e10cSrcweir {
1632cdf0e10cSrcweir if (!IsInvalidItem(pItem))
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir sal_uInt16 nW=pItem->Which();
1635cdf0e10cSrcweir if (nW>=EE_FEATURE_START && nW<=EE_FEATURE_END)
1636cdf0e10cSrcweir bHasEEFeatureItems=sal_True;
1637cdf0e10cSrcweir }
1638cdf0e10cSrcweir
1639cdf0e10cSrcweir pItem=aIter.NextItem();
1640cdf0e10cSrcweir }
1641cdf0e10cSrcweir
1642cdf0e10cSrcweir if(bHasEEFeatureItems)
1643cdf0e10cSrcweir {
1644cdf0e10cSrcweir String aMessage;
1645cdf0e10cSrcweir aMessage.AppendAscii("SdrObjEditView::SetAttributes(): Das setzen von EE_FEATURE-Items an der SdrView macht keinen Sinn! Es fuehrt nur zu Overhead und nicht mehr lesbaren Dokumenten.");
1646cdf0e10cSrcweir InfoBox(NULL, aMessage).Execute();
1647cdf0e10cSrcweir }
1648cdf0e10cSrcweir }
1649cdf0e10cSrcweir #endif
1650cdf0e10cSrcweir
1651cdf0e10cSrcweir sal_Bool bOnlyEEItems;
1652cdf0e10cSrcweir sal_Bool bNoEEItems=!SearchOutlinerItems(*pSet,bReplaceAll,&bOnlyEEItems);
1653cdf0e10cSrcweir // alles selektiert? -> Attrs auch an den Rahmen
1654cdf0e10cSrcweir // und falls keine EEItems, dann Attrs nur an den Rahmen
1655cdf0e10cSrcweir if (bAllTextSelected || bNoEEItems)
1656cdf0e10cSrcweir {
1657cdf0e10cSrcweir if( mxSelectionController.is() )
1658cdf0e10cSrcweir bRet=mxSelectionController->SetAttributes(*pSet,bReplaceAll );
1659cdf0e10cSrcweir
1660cdf0e10cSrcweir if( !bRet )
1661cdf0e10cSrcweir {
1662cdf0e10cSrcweir const bool bUndo = IsUndoEnabled();
1663cdf0e10cSrcweir
1664cdf0e10cSrcweir if( bUndo )
1665cdf0e10cSrcweir {
1666cdf0e10cSrcweir String aStr;
1667cdf0e10cSrcweir ImpTakeDescriptionStr(STR_EditSetAttributes,aStr);
1668cdf0e10cSrcweir BegUndo(aStr);
1669cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*mxTextEditObj.get()));
1670cdf0e10cSrcweir
1671cdf0e10cSrcweir // #i43537#
1672cdf0e10cSrcweir // If this is a text object also rescue the OutlinerParaObject since
1673cdf0e10cSrcweir // applying attributes to the object may change text layout when
1674cdf0e10cSrcweir // multiple portions exist with multiple formats. If a OutlinerParaObject
1675cdf0e10cSrcweir // really exists and needs to be rescued is evaluated in the undo
1676cdf0e10cSrcweir // implementation itself.
1677cdf0e10cSrcweir bool bRescueText = dynamic_cast< SdrTextObj* >(mxTextEditObj.get());
1678cdf0e10cSrcweir
1679cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*mxTextEditObj.get(),false,!bNoEEItems || bRescueText));
1680cdf0e10cSrcweir EndUndo();
1681cdf0e10cSrcweir }
1682cdf0e10cSrcweir
1683cdf0e10cSrcweir mxTextEditObj->SetMergedItemSetAndBroadcast(*pSet, bReplaceAll);
1684cdf0e10cSrcweir
1685cdf0e10cSrcweir FlushComeBackTimer(); // Damit ModeHasChanged sofort kommt
1686cdf0e10cSrcweir bRet=sal_True;
1687cdf0e10cSrcweir }
1688cdf0e10cSrcweir }
1689cdf0e10cSrcweir else if (!bOnlyEEItems)
1690cdf0e10cSrcweir {
1691cdf0e10cSrcweir // sonst Set ggf. splitten
1692cdf0e10cSrcweir // Es wird nun ein ItemSet aSet gemacht, in den die EE_Items von
1693cdf0e10cSrcweir // *pSet nicht enhalten ist (ansonsten ist es eine Kopie).
1694cdf0e10cSrcweir sal_uInt16* pNewWhichTable=RemoveWhichRange(pSet->GetRanges(),EE_ITEMS_START,EE_ITEMS_END);
1695cdf0e10cSrcweir SfxItemSet aSet(pMod->GetItemPool(),pNewWhichTable);
1696cdf0e10cSrcweir /*90353*/ delete[] pNewWhichTable;
1697cdf0e10cSrcweir SfxWhichIter aIter(aSet);
1698cdf0e10cSrcweir sal_uInt16 nWhich=aIter.FirstWhich();
1699cdf0e10cSrcweir while (nWhich!=0)
1700cdf0e10cSrcweir {
1701cdf0e10cSrcweir const SfxPoolItem* pItem;
1702cdf0e10cSrcweir SfxItemState eState=pSet->GetItemState(nWhich,sal_False,&pItem);
1703cdf0e10cSrcweir if (eState==SFX_ITEM_SET) aSet.Put(*pItem);
1704cdf0e10cSrcweir nWhich=aIter.NextWhich();
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir
1707cdf0e10cSrcweir
1708cdf0e10cSrcweir if( mxSelectionController.is() )
1709cdf0e10cSrcweir bRet=mxSelectionController->SetAttributes(aSet,bReplaceAll );
1710cdf0e10cSrcweir
1711cdf0e10cSrcweir if( !bRet )
1712cdf0e10cSrcweir {
1713cdf0e10cSrcweir if( IsUndoEnabled() )
1714cdf0e10cSrcweir {
1715cdf0e10cSrcweir String aStr;
1716cdf0e10cSrcweir ImpTakeDescriptionStr(STR_EditSetAttributes,aStr);
1717cdf0e10cSrcweir BegUndo(aStr);
1718cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*mxTextEditObj.get()));
1719cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*mxTextEditObj.get(),false,false));
1720cdf0e10cSrcweir EndUndo();
1721cdf0e10cSrcweir }
1722cdf0e10cSrcweir
1723cdf0e10cSrcweir mxTextEditObj->SetMergedItemSetAndBroadcast(aSet, bReplaceAll);
1724cdf0e10cSrcweir
1725cdf0e10cSrcweir if (GetMarkedObjectCount()==1 && GetMarkedObjectByIndex(0)==mxTextEditObj.get())
1726cdf0e10cSrcweir {
1727cdf0e10cSrcweir SetNotPersistAttrToMarked(aSet,bReplaceAll);
1728cdf0e10cSrcweir }
1729cdf0e10cSrcweir }
1730cdf0e10cSrcweir FlushComeBackTimer();
1731cdf0e10cSrcweir bRet=sal_True;
1732cdf0e10cSrcweir }
1733cdf0e10cSrcweir if(!bNoEEItems)
1734cdf0e10cSrcweir {
1735cdf0e10cSrcweir // und nun die Attribute auch noch an die EditEngine
1736cdf0e10cSrcweir if (bReplaceAll) {
1737cdf0e10cSrcweir // Am Outliner kann man leider nur alle Attribute platthauen
1738cdf0e10cSrcweir pTextEditOutlinerView->RemoveAttribs( sal_True );
1739cdf0e10cSrcweir }
1740cdf0e10cSrcweir pTextEditOutlinerView->SetAttribs(rSet);
1741cdf0e10cSrcweir
1742cdf0e10cSrcweir #ifdef DBG_UTIL
1743cdf0e10cSrcweir if (pItemBrowser!=NULL)
1744cdf0e10cSrcweir pItemBrowser->SetDirty();
1745cdf0e10cSrcweir #endif
1746cdf0e10cSrcweir
1747cdf0e10cSrcweir ImpMakeTextCursorAreaVisible();
1748cdf0e10cSrcweir }
1749cdf0e10cSrcweir bRet=sal_True;
1750cdf0e10cSrcweir }
1751cdf0e10cSrcweir if (pModifiedSet!=NULL)
1752cdf0e10cSrcweir delete pModifiedSet;
1753cdf0e10cSrcweir return bRet;
1754cdf0e10cSrcweir }
1755cdf0e10cSrcweir
GetStyleSheet() const1756cdf0e10cSrcweir SfxStyleSheet* SdrObjEditView::GetStyleSheet() const
1757cdf0e10cSrcweir {
1758cdf0e10cSrcweir SfxStyleSheet* pSheet = 0;
1759cdf0e10cSrcweir
1760cdf0e10cSrcweir if( mxSelectionController.is() )
1761cdf0e10cSrcweir {
1762cdf0e10cSrcweir if( mxSelectionController->GetStyleSheet( pSheet ) )
1763cdf0e10cSrcweir return pSheet;
1764cdf0e10cSrcweir }
1765cdf0e10cSrcweir
1766cdf0e10cSrcweir if ( pTextEditOutlinerView )
1767cdf0e10cSrcweir {
1768cdf0e10cSrcweir pSheet = pTextEditOutlinerView->GetStyleSheet();
1769cdf0e10cSrcweir }
1770cdf0e10cSrcweir else
1771cdf0e10cSrcweir {
1772cdf0e10cSrcweir pSheet = SdrGlueEditView::GetStyleSheet();
1773cdf0e10cSrcweir }
1774cdf0e10cSrcweir return pSheet;
1775cdf0e10cSrcweir }
1776cdf0e10cSrcweir
SetStyleSheet(SfxStyleSheet * pStyleSheet,sal_Bool bDontRemoveHardAttr)1777cdf0e10cSrcweir sal_Bool SdrObjEditView::SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr)
1778cdf0e10cSrcweir {
1779cdf0e10cSrcweir if( mxSelectionController.is() )
1780cdf0e10cSrcweir {
1781cdf0e10cSrcweir if( mxSelectionController->SetStyleSheet( pStyleSheet, bDontRemoveHardAttr ) )
1782cdf0e10cSrcweir return sal_True;
1783cdf0e10cSrcweir }
1784cdf0e10cSrcweir
1785cdf0e10cSrcweir // if we are currently in edit mode we must also set the stylesheet
1786cdf0e10cSrcweir // on all paragraphs in the Outliner for the edit view
1787cdf0e10cSrcweir // #92191#
1788cdf0e10cSrcweir if( NULL != pTextEditOutlinerView )
1789cdf0e10cSrcweir {
1790cdf0e10cSrcweir Outliner* pOutliner = pTextEditOutlinerView->GetOutliner();
1791cdf0e10cSrcweir
1792cdf0e10cSrcweir const sal_uIntPtr nParaCount = pOutliner->GetParagraphCount();
1793cdf0e10cSrcweir sal_uIntPtr nPara;
1794cdf0e10cSrcweir for( nPara = 0; nPara < nParaCount; nPara++ )
1795cdf0e10cSrcweir {
1796cdf0e10cSrcweir pOutliner->SetStyleSheet( nPara, pStyleSheet );
1797cdf0e10cSrcweir }
1798cdf0e10cSrcweir }
1799cdf0e10cSrcweir
1800cdf0e10cSrcweir return SdrGlueEditView::SetStyleSheet(pStyleSheet,bDontRemoveHardAttr);
1801cdf0e10cSrcweir }
1802cdf0e10cSrcweir
1803cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1804cdf0e10cSrcweir
AddWindowToPaintView(OutputDevice * pNewWin)1805cdf0e10cSrcweir void SdrObjEditView::AddWindowToPaintView(OutputDevice* pNewWin)
1806cdf0e10cSrcweir {
1807cdf0e10cSrcweir SdrGlueEditView::AddWindowToPaintView(pNewWin);
1808cdf0e10cSrcweir
1809cdf0e10cSrcweir if(mxTextEditObj.is() && !bTextEditOnlyOneView && pNewWin->GetOutDevType()==OUTDEV_WINDOW)
1810cdf0e10cSrcweir {
1811cdf0e10cSrcweir OutlinerView* pOutlView=ImpMakeOutlinerView((Window*)pNewWin,sal_False,NULL);
1812cdf0e10cSrcweir pTextEditOutliner->InsertView(pOutlView);
1813cdf0e10cSrcweir }
1814cdf0e10cSrcweir }
1815cdf0e10cSrcweir
DeleteWindowFromPaintView(OutputDevice * pOldWin)1816cdf0e10cSrcweir void SdrObjEditView::DeleteWindowFromPaintView(OutputDevice* pOldWin)
1817cdf0e10cSrcweir {
1818cdf0e10cSrcweir SdrGlueEditView::DeleteWindowFromPaintView(pOldWin);
1819cdf0e10cSrcweir
1820cdf0e10cSrcweir if(mxTextEditObj.is() && !bTextEditOnlyOneView && pOldWin->GetOutDevType()==OUTDEV_WINDOW)
1821cdf0e10cSrcweir {
1822cdf0e10cSrcweir for (sal_uIntPtr i=pTextEditOutliner->GetViewCount(); i>0;) {
1823cdf0e10cSrcweir i--;
1824cdf0e10cSrcweir OutlinerView* pOLV=pTextEditOutliner->GetView(i);
1825cdf0e10cSrcweir if (pOLV && pOLV->GetWindow()==(Window*)pOldWin) {
1826cdf0e10cSrcweir delete pTextEditOutliner->RemoveView(i);
1827cdf0e10cSrcweir }
1828cdf0e10cSrcweir }
1829cdf0e10cSrcweir }
1830cdf0e10cSrcweir }
1831cdf0e10cSrcweir
IsTextEditInSelectionMode() const1832cdf0e10cSrcweir sal_Bool SdrObjEditView::IsTextEditInSelectionMode() const
1833cdf0e10cSrcweir {
1834cdf0e10cSrcweir return pTextEditOutliner!=NULL && pTextEditOutliner->IsInSelectionMode();
1835cdf0e10cSrcweir }
1836cdf0e10cSrcweir
1837cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1838cdf0e10cSrcweir //
1839cdf0e10cSrcweir // @@ @@ @@@@ @@@@ @@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@
1840cdf0e10cSrcweir // @@@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@@ @@ @@ @@ @@ @@
1841cdf0e10cSrcweir // @@@@@@@ @@ @@ @@ @@ @@ @@ @@ @@@@@@@ @@ @@ @@ @@ @@
1842cdf0e10cSrcweir // @@@@@@@ @@@@@@ @@ @@@@@ @@ @@ @@@@@@@ @@ @@ @@ @@ @@@@
1843cdf0e10cSrcweir // @@ @ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@ @@ @@ @@ @@ @@
1844cdf0e10cSrcweir // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
1845cdf0e10cSrcweir // @@ @@ @@ @@ @@@@ @@ @@ @@@@ @@ @@ @@@@ @@@@@ @@@@@
1846cdf0e10cSrcweir //
1847cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1848cdf0e10cSrcweir
BegMacroObj(const Point & rPnt,short nTol,SdrObject * pObj,SdrPageView * pPV,Window * pWin)1849cdf0e10cSrcweir sal_Bool SdrObjEditView::BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin)
1850cdf0e10cSrcweir {
1851cdf0e10cSrcweir sal_Bool bRet=sal_False;
1852cdf0e10cSrcweir BrkMacroObj();
1853cdf0e10cSrcweir if (pObj!=NULL && pPV!=NULL && pWin!=NULL && pObj->HasMacro()) {
1854cdf0e10cSrcweir nTol=ImpGetHitTolLogic(nTol,NULL);
1855cdf0e10cSrcweir pMacroObj=pObj;
1856cdf0e10cSrcweir pMacroPV=pPV;
1857cdf0e10cSrcweir pMacroWin=pWin;
1858cdf0e10cSrcweir bMacroDown=sal_False;
1859cdf0e10cSrcweir nMacroTol=sal_uInt16(nTol);
1860cdf0e10cSrcweir aMacroDownPos=rPnt;
1861cdf0e10cSrcweir MovMacroObj(rPnt);
1862cdf0e10cSrcweir }
1863cdf0e10cSrcweir return bRet;
1864cdf0e10cSrcweir }
1865cdf0e10cSrcweir
ImpMacroUp(const Point & rUpPos)1866cdf0e10cSrcweir void SdrObjEditView::ImpMacroUp(const Point& rUpPos)
1867cdf0e10cSrcweir {
1868cdf0e10cSrcweir if (pMacroObj!=NULL && bMacroDown)
1869cdf0e10cSrcweir {
1870cdf0e10cSrcweir SdrObjMacroHitRec aHitRec;
1871cdf0e10cSrcweir aHitRec.aPos=rUpPos;
1872cdf0e10cSrcweir aHitRec.aDownPos=aMacroDownPos;
1873cdf0e10cSrcweir aHitRec.nTol=nMacroTol;
1874cdf0e10cSrcweir aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
1875cdf0e10cSrcweir aHitRec.pPageView=pMacroPV;
1876cdf0e10cSrcweir aHitRec.pOut=pMacroWin;
1877cdf0e10cSrcweir pMacroObj->PaintMacro(*pMacroWin,Rectangle(),aHitRec);
1878cdf0e10cSrcweir bMacroDown=sal_False;
1879cdf0e10cSrcweir }
1880cdf0e10cSrcweir }
1881cdf0e10cSrcweir
ImpMacroDown(const Point & rDownPos)1882cdf0e10cSrcweir void SdrObjEditView::ImpMacroDown(const Point& rDownPos)
1883cdf0e10cSrcweir {
1884cdf0e10cSrcweir if (pMacroObj!=NULL && !bMacroDown)
1885cdf0e10cSrcweir {
1886cdf0e10cSrcweir SdrObjMacroHitRec aHitRec;
1887cdf0e10cSrcweir aHitRec.aPos=rDownPos;
1888cdf0e10cSrcweir aHitRec.aDownPos=aMacroDownPos;
1889cdf0e10cSrcweir aHitRec.nTol=nMacroTol;
1890cdf0e10cSrcweir aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
1891cdf0e10cSrcweir aHitRec.pPageView=pMacroPV;
1892cdf0e10cSrcweir aHitRec.bDown=sal_True;
1893cdf0e10cSrcweir aHitRec.pOut=pMacroWin;
1894cdf0e10cSrcweir pMacroObj->PaintMacro(*pMacroWin,Rectangle(),aHitRec);
1895cdf0e10cSrcweir bMacroDown=sal_True;
1896cdf0e10cSrcweir }
1897cdf0e10cSrcweir }
1898cdf0e10cSrcweir
MovMacroObj(const Point & rPnt)1899cdf0e10cSrcweir void SdrObjEditView::MovMacroObj(const Point& rPnt)
1900cdf0e10cSrcweir {
1901cdf0e10cSrcweir if (pMacroObj!=NULL) {
1902cdf0e10cSrcweir SdrObjMacroHitRec aHitRec;
1903cdf0e10cSrcweir aHitRec.aPos=rPnt;
1904cdf0e10cSrcweir aHitRec.aDownPos=aMacroDownPos;
1905cdf0e10cSrcweir aHitRec.nTol=nMacroTol;
1906cdf0e10cSrcweir aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
1907cdf0e10cSrcweir aHitRec.pPageView=pMacroPV;
1908cdf0e10cSrcweir aHitRec.bDown=bMacroDown;
1909cdf0e10cSrcweir aHitRec.pOut=pMacroWin;
1910cdf0e10cSrcweir sal_Bool bDown=pMacroObj->IsMacroHit(aHitRec);
1911cdf0e10cSrcweir if (bDown) ImpMacroDown(rPnt);
1912cdf0e10cSrcweir else ImpMacroUp(rPnt);
1913cdf0e10cSrcweir }
1914cdf0e10cSrcweir }
1915cdf0e10cSrcweir
BrkMacroObj()1916cdf0e10cSrcweir void SdrObjEditView::BrkMacroObj()
1917cdf0e10cSrcweir {
1918cdf0e10cSrcweir if (pMacroObj!=NULL) {
1919cdf0e10cSrcweir ImpMacroUp(aMacroDownPos);
1920cdf0e10cSrcweir pMacroObj=NULL;
1921cdf0e10cSrcweir pMacroPV=NULL;
1922cdf0e10cSrcweir pMacroWin=NULL;
1923cdf0e10cSrcweir }
1924cdf0e10cSrcweir }
1925cdf0e10cSrcweir
EndMacroObj()1926cdf0e10cSrcweir sal_Bool SdrObjEditView::EndMacroObj()
1927cdf0e10cSrcweir {
1928cdf0e10cSrcweir if (pMacroObj!=NULL && bMacroDown) {
1929cdf0e10cSrcweir ImpMacroUp(aMacroDownPos);
1930cdf0e10cSrcweir SdrObjMacroHitRec aHitRec;
1931cdf0e10cSrcweir aHitRec.aPos=aMacroDownPos;
1932cdf0e10cSrcweir aHitRec.aDownPos=aMacroDownPos;
1933cdf0e10cSrcweir aHitRec.nTol=nMacroTol;
1934cdf0e10cSrcweir aHitRec.pVisiLayer=&pMacroPV->GetVisibleLayers();
1935cdf0e10cSrcweir aHitRec.pPageView=pMacroPV;
1936cdf0e10cSrcweir aHitRec.bDown=sal_True;
1937cdf0e10cSrcweir aHitRec.pOut=pMacroWin;
1938cdf0e10cSrcweir bool bRet=pMacroObj->DoMacro(aHitRec);
1939cdf0e10cSrcweir pMacroObj=NULL;
1940cdf0e10cSrcweir pMacroPV=NULL;
1941cdf0e10cSrcweir pMacroWin=NULL;
1942cdf0e10cSrcweir return bRet;
1943cdf0e10cSrcweir } else {
1944cdf0e10cSrcweir BrkMacroObj();
1945cdf0e10cSrcweir return sal_False;
1946cdf0e10cSrcweir }
1947cdf0e10cSrcweir }
1948cdf0e10cSrcweir
1949cdf0e10cSrcweir /** fills the given any with a XTextCursor for the current text selection.
1950cdf0e10cSrcweir Leaves the any untouched if there currently is no text selected */
getTextSelection(::com::sun::star::uno::Any & rSelection)1951cdf0e10cSrcweir void SdrObjEditView::getTextSelection( ::com::sun::star::uno::Any& rSelection )
1952cdf0e10cSrcweir {
1953cdf0e10cSrcweir if( IsTextEdit() )
1954cdf0e10cSrcweir {
1955cdf0e10cSrcweir OutlinerView* pOutlinerView = GetTextEditOutlinerView();
1956cdf0e10cSrcweir if( pOutlinerView && pOutlinerView->HasSelection() )
1957cdf0e10cSrcweir {
1958cdf0e10cSrcweir SdrObject* pObj = GetTextEditObject();
1959cdf0e10cSrcweir
1960cdf0e10cSrcweir if( pObj )
1961cdf0e10cSrcweir {
1962cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > xText( pObj->getUnoShape(), ::com::sun::star::uno::UNO_QUERY );
1963cdf0e10cSrcweir if( xText.is() )
1964cdf0e10cSrcweir {
1965cdf0e10cSrcweir SvxUnoTextBase* pRange = SvxUnoTextBase::getImplementation( xText );
1966cdf0e10cSrcweir if( pRange )
1967cdf0e10cSrcweir {
1968cdf0e10cSrcweir rSelection <<= pRange->createTextCursorBySelection( pOutlinerView->GetSelection() );
1969cdf0e10cSrcweir }
1970cdf0e10cSrcweir }
1971cdf0e10cSrcweir }
1972cdf0e10cSrcweir }
1973cdf0e10cSrcweir }
1974cdf0e10cSrcweir }
1975cdf0e10cSrcweir
1976cdf0e10cSrcweir namespace sdr { namespace table {
1977cdf0e10cSrcweir extern rtl::Reference< sdr::SelectionController > CreateTableController( SdrObjEditView* pView, const SdrObject* pObj, const rtl::Reference< sdr::SelectionController >& xRefController );
1978cdf0e10cSrcweir } }
1979cdf0e10cSrcweir
1980cdf0e10cSrcweir /* check if we have a single selection and that single object likes
1981cdf0e10cSrcweir to handle the mouse and keyboard events itself
1982cdf0e10cSrcweir
1983cdf0e10cSrcweir @todo: the selection controller should be queried from the
1984cdf0e10cSrcweir object specific view contact. Currently this method only
1985cdf0e10cSrcweir works for tables.
1986cdf0e10cSrcweir */
MarkListHasChanged()1987cdf0e10cSrcweir void SdrObjEditView::MarkListHasChanged()
1988cdf0e10cSrcweir {
1989cdf0e10cSrcweir SdrGlueEditView::MarkListHasChanged();
1990cdf0e10cSrcweir
1991cdf0e10cSrcweir if( mxSelectionController.is() )
1992cdf0e10cSrcweir {
1993cdf0e10cSrcweir mxLastSelectionController = mxSelectionController;
1994cdf0e10cSrcweir mxSelectionController->onSelectionHasChanged();
1995cdf0e10cSrcweir }
1996cdf0e10cSrcweir
1997cdf0e10cSrcweir mxSelectionController.clear();
1998cdf0e10cSrcweir
1999cdf0e10cSrcweir const SdrMarkList& rMarkList=GetMarkedObjectList();
2000cdf0e10cSrcweir if( rMarkList.GetMarkCount() == 1 )
2001cdf0e10cSrcweir {
2002cdf0e10cSrcweir const SdrObject* pObj= rMarkList.GetMark(0)->GetMarkedSdrObj();
2003cdf0e10cSrcweir // check for table
2004cdf0e10cSrcweir if( pObj && (pObj->GetObjInventor() == SdrInventor ) && (pObj->GetObjIdentifier() == OBJ_TABLE) )
2005cdf0e10cSrcweir {
2006cdf0e10cSrcweir mxSelectionController = sdr::table::CreateTableController( this, pObj, mxLastSelectionController );
2007cdf0e10cSrcweir if( mxSelectionController.is() )
2008cdf0e10cSrcweir {
2009cdf0e10cSrcweir mxLastSelectionController.clear();
2010cdf0e10cSrcweir mxSelectionController->onSelectionHasChanged();
2011cdf0e10cSrcweir }
2012cdf0e10cSrcweir }
2013cdf0e10cSrcweir }
2014cdf0e10cSrcweir }
2015cdf0e10cSrcweir
IMPL_LINK(SdrObjEditView,EndPasteOrDropHdl,PasteOrDropInfos *,pInfos)2016cdf0e10cSrcweir IMPL_LINK( SdrObjEditView, EndPasteOrDropHdl, PasteOrDropInfos*, pInfos )
2017cdf0e10cSrcweir {
2018cdf0e10cSrcweir OnEndPasteOrDrop( pInfos );
2019cdf0e10cSrcweir return 0;
2020cdf0e10cSrcweir }
2021cdf0e10cSrcweir
IMPL_LINK(SdrObjEditView,BeginPasteOrDropHdl,PasteOrDropInfos *,pInfos)2022cdf0e10cSrcweir IMPL_LINK( SdrObjEditView, BeginPasteOrDropHdl, PasteOrDropInfos*, pInfos )
2023cdf0e10cSrcweir {
2024cdf0e10cSrcweir OnBeginPasteOrDrop( pInfos );
2025cdf0e10cSrcweir return 0;
2026cdf0e10cSrcweir }
2027cdf0e10cSrcweir
OnBeginPasteOrDrop(PasteOrDropInfos *)2028cdf0e10cSrcweir void SdrObjEditView::OnBeginPasteOrDrop( PasteOrDropInfos* )
2029cdf0e10cSrcweir {
2030cdf0e10cSrcweir // applications can derive from these virtual methods to do something before a drop or paste operation
2031cdf0e10cSrcweir }
2032cdf0e10cSrcweir
OnEndPasteOrDrop(PasteOrDropInfos *)2033cdf0e10cSrcweir void SdrObjEditView::OnEndPasteOrDrop( PasteOrDropInfos* )
2034cdf0e10cSrcweir {
2035cdf0e10cSrcweir // applications can derive from these virtual methods to do something before a drop or paste operation
2036cdf0e10cSrcweir }
2037cdf0e10cSrcweir
GetSelectionLevel() const2038766ce4d0SZheng Fan sal_uInt16 SdrObjEditView::GetSelectionLevel() const
2039766ce4d0SZheng Fan {
2040766ce4d0SZheng Fan sal_uInt16 nLevel = 0xFFFF;
2041766ce4d0SZheng Fan if( IsTextEdit() )
2042766ce4d0SZheng Fan {
2043766ce4d0SZheng Fan DBG_ASSERT(pTextEditOutlinerView!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutlinerView=NULL");
2044766ce4d0SZheng Fan DBG_ASSERT(pTextEditOutliner!=NULL,"SdrObjEditView::GetAttributes(): pTextEditOutliner=NULL");
2045766ce4d0SZheng Fan if( pTextEditOutlinerView )
2046766ce4d0SZheng Fan {
2047766ce4d0SZheng Fan //start and end position
2048766ce4d0SZheng Fan ESelection aSelect = pTextEditOutlinerView->GetSelection();
2049766ce4d0SZheng Fan sal_uInt16 nStartPara = ::std::min( aSelect.nStartPara, aSelect.nEndPara );
2050766ce4d0SZheng Fan sal_uInt16 nEndPara = ::std::max( aSelect.nStartPara, aSelect.nEndPara );
2051766ce4d0SZheng Fan //get level from each paragraph
2052766ce4d0SZheng Fan nLevel = 0;
2053766ce4d0SZheng Fan for( sal_uInt16 nPara = nStartPara; nPara <= nEndPara; nPara++ )
2054766ce4d0SZheng Fan {
2055766ce4d0SZheng Fan sal_uInt16 nParaDepth = 1 << pTextEditOutliner->GetDepth( nPara );
2056766ce4d0SZheng Fan if( !(nLevel & nParaDepth) )
2057766ce4d0SZheng Fan nLevel += nParaDepth;
2058766ce4d0SZheng Fan }
2059766ce4d0SZheng Fan //reduce one level for Outliner Object
2060766ce4d0SZheng Fan //if( nLevel > 0 && GetTextEditObject()->GetObjIdentifier() == OBJ_OUTLINETEXT )
2061766ce4d0SZheng Fan // nLevel = nLevel >> 1;
2062766ce4d0SZheng Fan //no bullet paragraph selected
2063766ce4d0SZheng Fan if( nLevel == 0)
2064766ce4d0SZheng Fan nLevel = 0xFFFF;
2065766ce4d0SZheng Fan }
2066766ce4d0SZheng Fan }
2067766ce4d0SZheng Fan return nLevel;
2068766ce4d0SZheng Fan }
2069766ce4d0SZheng Fan
SupportsFormatPaintbrush(sal_uInt32 nObjectInventor,sal_uInt16 nObjectIdentifier) const2070cdf0e10cSrcweir bool SdrObjEditView::SupportsFormatPaintbrush( sal_uInt32 nObjectInventor, sal_uInt16 nObjectIdentifier ) const
2071cdf0e10cSrcweir {
2072cdf0e10cSrcweir if( nObjectInventor != SdrInventor && nObjectInventor != E3dInventor )
2073cdf0e10cSrcweir return false;
2074cdf0e10cSrcweir switch(nObjectIdentifier)
2075cdf0e10cSrcweir {
2076cdf0e10cSrcweir case OBJ_NONE:
2077cdf0e10cSrcweir case OBJ_GRUP:
2078cdf0e10cSrcweir return false;
2079cdf0e10cSrcweir case OBJ_LINE:
2080cdf0e10cSrcweir case OBJ_RECT:
2081cdf0e10cSrcweir case OBJ_CIRC:
2082cdf0e10cSrcweir case OBJ_SECT:
2083cdf0e10cSrcweir case OBJ_CARC:
2084cdf0e10cSrcweir case OBJ_CCUT:
2085cdf0e10cSrcweir case OBJ_POLY:
2086cdf0e10cSrcweir case OBJ_PLIN:
2087cdf0e10cSrcweir case OBJ_PATHLINE:
2088cdf0e10cSrcweir case OBJ_PATHFILL:
2089cdf0e10cSrcweir case OBJ_FREELINE:
2090cdf0e10cSrcweir case OBJ_FREEFILL:
2091cdf0e10cSrcweir case OBJ_SPLNLINE:
2092cdf0e10cSrcweir case OBJ_SPLNFILL:
2093cdf0e10cSrcweir case OBJ_TEXT:
2094cdf0e10cSrcweir case OBJ_TEXTEXT:
2095cdf0e10cSrcweir case OBJ_TITLETEXT:
2096cdf0e10cSrcweir case OBJ_OUTLINETEXT:
2097cdf0e10cSrcweir case OBJ_GRAF:
2098cdf0e10cSrcweir case OBJ_OLE2:
2099cdf0e10cSrcweir case OBJ_TABLE:
2100cdf0e10cSrcweir return true;
2101cdf0e10cSrcweir case OBJ_EDGE:
2102cdf0e10cSrcweir case OBJ_CAPTION:
2103cdf0e10cSrcweir return false;
2104cdf0e10cSrcweir case OBJ_PATHPOLY:
2105cdf0e10cSrcweir case OBJ_PATHPLIN:
2106cdf0e10cSrcweir return true;
2107cdf0e10cSrcweir case OBJ_PAGE:
2108cdf0e10cSrcweir case OBJ_MEASURE:
2109cdf0e10cSrcweir case OBJ_DUMMY:
2110cdf0e10cSrcweir case OBJ_FRAME:
2111cdf0e10cSrcweir case OBJ_UNO:
2112cdf0e10cSrcweir return false;
2113cdf0e10cSrcweir case OBJ_CUSTOMSHAPE:
2114cdf0e10cSrcweir return true;
2115cdf0e10cSrcweir default:
2116cdf0e10cSrcweir return false;
2117cdf0e10cSrcweir }
2118cdf0e10cSrcweir }
2119cdf0e10cSrcweir
GetFormatRangeImpl(bool bTextOnly)2120cdf0e10cSrcweir static const sal_uInt16* GetFormatRangeImpl( bool bTextOnly )
2121cdf0e10cSrcweir {
2122cdf0e10cSrcweir static const sal_uInt16 gRanges[] = {
2123cdf0e10cSrcweir SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
2124cdf0e10cSrcweir SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST,
2125cdf0e10cSrcweir SDRATTR_TABLE_FIRST, SDRATTR_TABLE_LAST,
2126cdf0e10cSrcweir XATTR_LINE_FIRST, XATTR_LINE_LAST,
2127cdf0e10cSrcweir XATTR_FILL_FIRST, XATTRSET_FILL,
2128cdf0e10cSrcweir EE_PARA_START, EE_PARA_END,
2129cdf0e10cSrcweir EE_CHAR_START, EE_CHAR_END,
2130cdf0e10cSrcweir 0,0
2131cdf0e10cSrcweir };
2132cdf0e10cSrcweir return &gRanges[ bTextOnly ? 10 : 0];
2133cdf0e10cSrcweir }
2134cdf0e10cSrcweir
TakeFormatPaintBrush(boost::shared_ptr<SfxItemSet> & rFormatSet)2135cdf0e10cSrcweir bool SdrObjEditView::TakeFormatPaintBrush( boost::shared_ptr< SfxItemSet >& rFormatSet )
2136cdf0e10cSrcweir {
2137cdf0e10cSrcweir if( mxSelectionController.is() && mxSelectionController->TakeFormatPaintBrush(rFormatSet) )
2138cdf0e10cSrcweir return true;
2139cdf0e10cSrcweir
2140cdf0e10cSrcweir const SdrMarkList& rMarkList = GetMarkedObjectList();
2141cdf0e10cSrcweir if( rMarkList.GetMarkCount() >= 1 )
2142cdf0e10cSrcweir {
2143cdf0e10cSrcweir OutlinerView* pOLV = GetTextEditOutlinerView();
2144cdf0e10cSrcweir
2145cdf0e10cSrcweir rFormatSet.reset( new SfxItemSet( GetModel()->GetItemPool(), GetFormatRangeImpl( pOLV != NULL ) ) );
2146cdf0e10cSrcweir if( pOLV )
2147cdf0e10cSrcweir {
2148cdf0e10cSrcweir rFormatSet->Put( pOLV->GetAttribs() );
2149cdf0e10cSrcweir }
2150cdf0e10cSrcweir else
2151cdf0e10cSrcweir {
2152cdf0e10cSrcweir const sal_Bool bOnlyHardAttr = sal_False;
2153cdf0e10cSrcweir rFormatSet->Put( GetAttrFromMarked(bOnlyHardAttr) );
2154cdf0e10cSrcweir }
2155cdf0e10cSrcweir return true;
2156cdf0e10cSrcweir }
2157cdf0e10cSrcweir
2158cdf0e10cSrcweir return false;
2159cdf0e10cSrcweir }
2160cdf0e10cSrcweir
CreatePaintSet(const sal_uInt16 * pRanges,SfxItemPool & rPool,const SfxItemSet & rSourceSet,const SfxItemSet & rTargetSet,bool bNoCharacterFormats,bool bNoParagraphFormats)2161cdf0e10cSrcweir static SfxItemSet CreatePaintSet( const sal_uInt16 *pRanges, SfxItemPool& rPool, const SfxItemSet& rSourceSet, const SfxItemSet& rTargetSet, bool bNoCharacterFormats, bool bNoParagraphFormats )
2162cdf0e10cSrcweir {
2163cdf0e10cSrcweir SfxItemSet aPaintSet( rPool, pRanges );
2164cdf0e10cSrcweir
2165cdf0e10cSrcweir while( *pRanges )
2166cdf0e10cSrcweir {
2167cdf0e10cSrcweir sal_uInt16 nWhich = *pRanges++;
2168cdf0e10cSrcweir const sal_uInt16 nLastWhich = *pRanges++;
2169cdf0e10cSrcweir
2170cdf0e10cSrcweir if( bNoCharacterFormats && (nWhich == EE_CHAR_START) )
2171cdf0e10cSrcweir continue;
2172cdf0e10cSrcweir
2173cdf0e10cSrcweir if( bNoParagraphFormats && (nWhich == EE_PARA_START ) )
2174cdf0e10cSrcweir continue;
2175cdf0e10cSrcweir
2176cdf0e10cSrcweir for( ; nWhich < nLastWhich; nWhich++ )
2177cdf0e10cSrcweir {
2178cdf0e10cSrcweir const SfxPoolItem* pSourceItem = rSourceSet.GetItem( nWhich );
2179cdf0e10cSrcweir const SfxPoolItem* pTargetItem = rTargetSet.GetItem( nWhich );
2180cdf0e10cSrcweir
2181cdf0e10cSrcweir if( (pSourceItem && !pTargetItem) || (pSourceItem && pTargetItem && !((*pSourceItem) == (*pTargetItem)) ) )
2182cdf0e10cSrcweir {
2183cdf0e10cSrcweir aPaintSet.Put( *pSourceItem );
2184cdf0e10cSrcweir }
2185cdf0e10cSrcweir }
2186cdf0e10cSrcweir }
2187cdf0e10cSrcweir return aPaintSet;
2188cdf0e10cSrcweir }
2189cdf0e10cSrcweir
ApplyFormatPaintBrushToText(SfxItemSet & rFormatSet,SdrTextObj & rTextObj,SdrText * pText,bool bNoCharacterFormats,bool bNoParagraphFormats)2190cdf0e10cSrcweir void SdrObjEditView::ApplyFormatPaintBrushToText( SfxItemSet& rFormatSet, SdrTextObj& rTextObj, SdrText* pText, bool bNoCharacterFormats, bool bNoParagraphFormats )
2191cdf0e10cSrcweir {
2192cdf0e10cSrcweir OutlinerParaObject* pParaObj = pText ? pText->GetOutlinerParaObject() : 0;
2193cdf0e10cSrcweir if(pParaObj)
2194cdf0e10cSrcweir {
2195cdf0e10cSrcweir SdrOutliner& rOutliner = rTextObj.ImpGetDrawOutliner();
2196cdf0e10cSrcweir rOutliner.SetText(*pParaObj);
2197cdf0e10cSrcweir
2198cdf0e10cSrcweir sal_uInt32 nParaCount(rOutliner.GetParagraphCount());
2199cdf0e10cSrcweir
2200cdf0e10cSrcweir if(nParaCount)
2201cdf0e10cSrcweir {
2202cdf0e10cSrcweir for(sal_uInt16 nPara = 0; nPara < nParaCount; nPara++)
2203cdf0e10cSrcweir {
2204cdf0e10cSrcweir if( !bNoCharacterFormats )
2205cdf0e10cSrcweir rOutliner.QuickRemoveCharAttribs( nPara, /* remove all */0 );
2206cdf0e10cSrcweir
2207cdf0e10cSrcweir SfxItemSet aSet(rOutliner.GetParaAttribs(nPara));
2208cdf0e10cSrcweir aSet.Put(CreatePaintSet( GetFormatRangeImpl(true), *aSet.GetPool(), rFormatSet, aSet, bNoCharacterFormats, bNoParagraphFormats ) );
2209cdf0e10cSrcweir rOutliner.SetParaAttribs(nPara, aSet);
2210cdf0e10cSrcweir }
2211cdf0e10cSrcweir
2212cdf0e10cSrcweir OutlinerParaObject* pTemp = rOutliner.CreateParaObject(0, (sal_uInt16)nParaCount);
2213cdf0e10cSrcweir rOutliner.Clear();
2214cdf0e10cSrcweir
2215cdf0e10cSrcweir rTextObj.NbcSetOutlinerParaObjectForText(pTemp,pText);
2216cdf0e10cSrcweir }
2217cdf0e10cSrcweir }
2218cdf0e10cSrcweir }
2219cdf0e10cSrcweir
ApplyFormatPaintBrush(SfxItemSet & rFormatSet,bool bNoCharacterFormats,bool bNoParagraphFormats)2220cdf0e10cSrcweir void SdrObjEditView::ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats )
2221cdf0e10cSrcweir {
2222cdf0e10cSrcweir if( !mxSelectionController.is() || !mxSelectionController->ApplyFormatPaintBrush( rFormatSet, bNoCharacterFormats, bNoParagraphFormats ) )
2223cdf0e10cSrcweir {
2224cdf0e10cSrcweir const SdrMarkList& rMarkList = GetMarkedObjectList();
2225cdf0e10cSrcweir SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
2226cdf0e10cSrcweir OutlinerView* pOLV = GetTextEditOutlinerView();
2227cdf0e10cSrcweir
2228cdf0e10cSrcweir const SfxItemSet& rShapeSet = pObj->GetMergedItemSet();
2229cdf0e10cSrcweir
2230cdf0e10cSrcweir if( !pOLV )
2231cdf0e10cSrcweir {
2232cdf0e10cSrcweir // if not in text edit mode (aka the user selected text or clicked on a word)
2233cdf0e10cSrcweir // apply formating attributes to selected shape
2234cdf0e10cSrcweir // All formating items (see ranges above) that are unequal in selected shape and
2235cdf0e10cSrcweir // the format paintbrush are hard set on the selected shape.
2236cdf0e10cSrcweir
2237cdf0e10cSrcweir const sal_uInt16* pRanges = rFormatSet.GetRanges();
2238cdf0e10cSrcweir bool bTextOnly = true;
2239cdf0e10cSrcweir
2240cdf0e10cSrcweir while( *pRanges )
2241cdf0e10cSrcweir {
2242cdf0e10cSrcweir if( (*pRanges != EE_PARA_START) && (*pRanges != EE_CHAR_START) )
2243cdf0e10cSrcweir {
2244cdf0e10cSrcweir bTextOnly = false;
2245cdf0e10cSrcweir break;
2246cdf0e10cSrcweir }
2247cdf0e10cSrcweir pRanges += 2;
2248cdf0e10cSrcweir }
2249cdf0e10cSrcweir
2250cdf0e10cSrcweir if( !bTextOnly )
2251cdf0e10cSrcweir {
2252cdf0e10cSrcweir SfxItemSet aPaintSet( CreatePaintSet( GetFormatRangeImpl(false), *rShapeSet.GetPool(), rFormatSet, rShapeSet, bNoCharacterFormats, bNoParagraphFormats ) );
2253cdf0e10cSrcweir const sal_Bool bReplaceAll = sal_False;
2254cdf0e10cSrcweir SetAttrToMarked(aPaintSet, bReplaceAll);
2255cdf0e10cSrcweir }
2256cdf0e10cSrcweir
2257cdf0e10cSrcweir // now apply character and paragraph formating to text, if the shape has any
2258cdf0e10cSrcweir SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
2259cdf0e10cSrcweir if( pTextObj )
2260cdf0e10cSrcweir {
2261cdf0e10cSrcweir sal_Int32 nText = pTextObj->getTextCount();
2262cdf0e10cSrcweir
2263cdf0e10cSrcweir while( --nText >= 0 )
2264cdf0e10cSrcweir {
2265cdf0e10cSrcweir SdrText* pText = pTextObj->getText( nText );
2266cdf0e10cSrcweir ApplyFormatPaintBrushToText( rFormatSet, *pTextObj, pText, bNoCharacterFormats, bNoParagraphFormats );
2267cdf0e10cSrcweir }
2268cdf0e10cSrcweir }
2269cdf0e10cSrcweir }
2270cdf0e10cSrcweir else
2271cdf0e10cSrcweir {
2272cdf0e10cSrcweir ::Outliner* pOutliner = pOLV->GetOutliner();
2273cdf0e10cSrcweir if( pOutliner )
2274cdf0e10cSrcweir {
2275cdf0e10cSrcweir const EditEngine& rEditEngine = pOutliner->GetEditEngine();
2276cdf0e10cSrcweir
2277cdf0e10cSrcweir ESelection aSel( pOLV->GetSelection() );
2278cdf0e10cSrcweir if( !aSel.HasRange() )
2279cdf0e10cSrcweir pOLV->SetSelection( rEditEngine.GetWord( aSel, com::sun::star::i18n::WordType::DICTIONARY_WORD ) );
2280cdf0e10cSrcweir
2281cdf0e10cSrcweir const sal_Bool bRemoveParaAttribs = !bNoParagraphFormats;
2282cdf0e10cSrcweir pOLV->RemoveAttribsKeepLanguages( bRemoveParaAttribs );
2283cdf0e10cSrcweir SfxItemSet aSet( pOLV->GetAttribs() );
2284cdf0e10cSrcweir SfxItemSet aPaintSet( CreatePaintSet(GetFormatRangeImpl(true), *aSet.GetPool(), rFormatSet, aSet, bNoCharacterFormats, bNoParagraphFormats ) );
2285cdf0e10cSrcweir pOLV->SetAttribs( aPaintSet );
2286cdf0e10cSrcweir }
2287cdf0e10cSrcweir }
2288cdf0e10cSrcweir }
2289cdf0e10cSrcweir }
2290