Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "DrawViewShell.hxx"
22 :
23 : #include "ViewShellHint.hxx"
24 :
25 : #include <toolkit/unohlp.hxx>
26 : #include <sfx2/dispatch.hxx>
27 : #include <svx/svxids.hrc>
28 : #include <vcl/msgbox.hxx>
29 : #include <svx/svddef.hxx>
30 : #include <sfx2/bindings.hxx>
31 : #include <sfx2/request.hxx>
32 : #include <sfx2/viewfrm.hxx>
33 : #include <svx/svdograf.hxx>
34 : #include <svx/svdpagv.hxx>
35 :
36 : #include "app.hrc"
37 : #include "strings.hrc"
38 :
39 : #include "fuzoom.hxx"
40 : #include "fudspord.hxx"
41 : #include "futransf.hxx"
42 : #include "fuline.hxx"
43 : #include "fuarea.hxx"
44 : #include "fuchar.hxx"
45 : #include "fuparagr.hxx"
46 : #include "fubullet.hxx"
47 : #include "futempl.hxx"
48 : #include "fuinsert.hxx"
49 : #include "fuprlout.hxx"
50 : #include "fupage.hxx"
51 : #include "fuoaprms.hxx"
52 : #include "fucopy.hxx"
53 : #include "fulinend.hxx"
54 : #include "fusnapln.hxx"
55 : #include "fuolbull.hxx"
56 : #include "fuinsfil.hxx"
57 : #include "fulink.hxx"
58 : #include "futhes.hxx"
59 : #include "futxtatt.hxx"
60 : #include "fumeasur.hxx"
61 : #include "fuconnct.hxx"
62 : #include "fumorph.hxx"
63 : #include "fuvect.hxx"
64 : #include "sdresid.hxx"
65 : #include "Window.hxx"
66 : #include "drawview.hxx"
67 : #include "zoomlist.hxx"
68 : #include <osl/mutex.hxx>
69 : #include <tools/helpers.hxx>
70 : #include <vcl/svapp.hxx>
71 :
72 : namespace sd {
73 :
74 : /*************************************************************************
75 : |*
76 : |* SfxRequests fuer temporaere Funktionen
77 : |*
78 : \************************************************************************/
79 :
80 0 : void DrawViewShell::FuTemp01(SfxRequest& rReq)
81 : {
82 0 : switch(rReq.GetSlot())
83 : {
84 : case SID_ATTRIBUTES_LINE: // BASIC
85 : {
86 0 : SetCurrentFunction( FuLine::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
87 0 : Cancel();
88 : }
89 0 : break;
90 :
91 : case SID_ATTRIBUTES_AREA: // BASIC
92 : {
93 0 : SetCurrentFunction( FuArea::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
94 0 : Cancel();
95 : }
96 0 : break;
97 :
98 : case SID_ATTR_TRANSFORM:
99 : {
100 0 : SetCurrentFunction( FuTransform::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
101 0 : Invalidate(SID_RULER_OBJECT);
102 0 : Cancel();
103 : }
104 0 : break;
105 :
106 : case SID_CHAR_DLG: // BASIC
107 : {
108 0 : SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
109 0 : Cancel();
110 : }
111 0 : break;
112 :
113 : case SID_PARA_DLG:
114 : {
115 0 : SetCurrentFunction( FuParagraph::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
116 0 : Cancel();
117 : }
118 0 : break;
119 :
120 : case SID_OUTLINE_BULLET:
121 : {
122 0 : SetCurrentFunction( FuOutlineBullet::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
123 0 : Cancel();
124 : }
125 0 : break;
126 :
127 : case FN_INSERT_SOFT_HYPHEN:
128 : case FN_INSERT_HARDHYPHEN:
129 : case FN_INSERT_HARD_SPACE:
130 : case SID_INSERT_RLM :
131 : case SID_INSERT_LRM :
132 : case SID_INSERT_ZWNBSP :
133 : case SID_INSERT_ZWSP:
134 : case SID_CHARMAP:
135 : {
136 0 : SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
137 0 : Cancel();
138 : }
139 0 : break;
140 :
141 : case SID_PRESENTATION_LAYOUT:
142 : {
143 0 : SetCurrentFunction( FuPresentationLayout::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
144 0 : Cancel();
145 : }
146 0 : break;
147 :
148 : case SID_PASTE_SPECIAL:
149 : {
150 0 : SetCurrentFunction( FuInsertClipboard::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
151 0 : Cancel();
152 0 : rReq.Ignore ();
153 : }
154 0 : break;
155 :
156 : case SID_CHANGE_PICTURE:
157 : case SID_INSERT_GRAPHIC:
158 : {
159 0 : SetCurrentFunction( FuInsertGraphic::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
160 0 : Cancel();
161 0 : rReq.Ignore ();
162 0 : Invalidate(SID_DRAWTBX_INSERT);
163 : }
164 0 : break;
165 :
166 : case SID_INSERT_AVMEDIA:
167 : {
168 0 : SetCurrentFunction( FuInsertAVMedia::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
169 :
170 0 : Cancel();
171 0 : rReq.Ignore ();
172 :
173 0 : Invalidate(SID_DRAWTBX_INSERT);
174 : }
175 0 : break;
176 :
177 : case SID_INSERT_OBJECT:
178 : case SID_INSERT_PLUGIN:
179 : case SID_INSERT_SOUND:
180 : case SID_INSERT_VIDEO:
181 : case SID_INSERT_FLOATINGFRAME:
182 : case SID_INSERT_MATH:
183 : case SID_INSERT_DIAGRAM:
184 : case SID_ATTR_TABLE:
185 : {
186 0 : SetCurrentFunction( FuInsertOLE::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
187 :
188 0 : Cancel();
189 0 : rReq.Ignore ();
190 :
191 0 : Invalidate(SID_DRAWTBX_INSERT);
192 : }
193 0 : break;
194 :
195 : case SID_COPYOBJECTS:
196 : {
197 0 : if ( mpDrawView->IsPresObjSelected(sal_False, sal_True) )
198 : {
199 0 : ::sd::Window* pWindow = GetActiveWindow();
200 0 : InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
201 : }
202 : else
203 : {
204 0 : if ( mpDrawView->IsTextEdit() )
205 : {
206 0 : mpDrawView->SdrEndTextEdit();
207 : }
208 :
209 0 : SetCurrentFunction( FuCopy::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
210 : }
211 0 : Cancel();
212 0 : rReq.Ignore ();
213 : }
214 0 : break;
215 :
216 : case SID_INSERTFILE: // BASIC
217 : {
218 0 : Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START));
219 0 : SetCurrentFunction( FuInsertFile::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
220 0 : Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END));
221 0 : Cancel();
222 0 : rReq.Done ();
223 :
224 0 : Invalidate(SID_DRAWTBX_INSERT);
225 : }
226 0 : break;
227 :
228 : case SID_SELECT_BACKGROUND:
229 : case SID_PAGESETUP: // BASIC ??
230 : {
231 0 : SetCurrentFunction( FuPage::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
232 0 : Cancel();
233 0 : rReq.Ignore (); // es werden eigenstaendige macros generiert !!
234 : }
235 0 : break;
236 :
237 : case SID_ZOOM_OUT:
238 : case SID_ZOOM_PANNING:
239 : {
240 0 : mbZoomOnPage = sal_False;
241 0 : SetCurrentFunction( FuZoom::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
242 : // Beendet sich selbst, kein Cancel() notwendig!
243 0 : Invalidate( SID_ZOOM_TOOLBOX );
244 0 : rReq.Ignore ();
245 : }
246 0 : break;
247 :
248 : case SID_BEFORE_OBJ:
249 : case SID_BEHIND_OBJ:
250 : {
251 0 : SetCurrentFunction( FuDisplayOrder::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
252 0 : Invalidate( SID_POSITION );
253 0 : rReq.Ignore ();
254 : // Beendet sich selbst, kein Cancel() notwendig!
255 : }
256 0 : break;
257 :
258 : case SID_REVERSE_ORDER: // BASIC
259 : {
260 0 : mpDrawView->ReverseOrderOfMarked();
261 0 : Invalidate( SID_POSITION );
262 0 : Cancel();
263 0 : rReq.Done ();
264 : }
265 0 : break;
266 :
267 : case SID_ANIMATION_EFFECTS:
268 : {
269 0 : SetCurrentFunction( FuObjectAnimationParameters::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
270 0 : Cancel();
271 : }
272 0 : break;
273 :
274 : case SID_LINEEND_POLYGON:
275 : {
276 0 : SetCurrentFunction( FuLineEnd::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
277 0 : Cancel();
278 : }
279 0 : break;
280 :
281 : case SID_CAPTUREPOINT:
282 : // negative Werte um Aufruf aus Menue zu signalisieren
283 0 : maMousePos = Point(-1,-1);
284 : case SID_SET_SNAPITEM:
285 : {
286 0 : SetCurrentFunction( FuSnapLine::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
287 0 : Cancel();
288 : }
289 0 : break;
290 :
291 : case SID_MANAGE_LINKS:
292 : {
293 0 : SetCurrentFunction( FuLink::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
294 0 : Cancel();
295 0 : rReq.Ignore ();
296 : }
297 0 : break;
298 :
299 : case SID_THESAURUS:
300 : {
301 0 : SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
302 0 : Cancel();
303 0 : rReq.Ignore ();
304 : }
305 0 : break;
306 :
307 : case SID_TEXTATTR_DLG:
308 : {
309 0 : SetCurrentFunction( FuTextAttrDlg::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
310 0 : Cancel();
311 0 : rReq.Ignore ();
312 : }
313 0 : break;
314 :
315 : case SID_MEASURE_DLG:
316 : {
317 0 : SetCurrentFunction( FuMeasureDlg::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
318 0 : Cancel();
319 0 : rReq.Ignore ();
320 : }
321 0 : break;
322 :
323 : case SID_CONNECTION_DLG:
324 : {
325 0 : SetCurrentFunction( FuConnectionDlg::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
326 0 : Cancel();
327 0 : rReq.Done();
328 : }
329 0 : break;
330 :
331 : case SID_CONNECTION_NEW_ROUTING:
332 : {
333 0 : SfxItemSet aDefAttr( GetPool(), SDRATTR_EDGELINE1DELTA, SDRATTR_EDGELINE3DELTA );
334 0 : GetView()->SetAttributes( aDefAttr, sal_True ); // (ReplaceAll)
335 :
336 0 : Cancel();
337 0 : rReq.Done();
338 : }
339 0 : break;
340 :
341 : case SID_TWAIN_SELECT:
342 : {
343 0 : if( mxScannerManager.is() )
344 : {
345 : try
346 : {
347 : const ::com::sun::star::uno::Sequence< ::com::sun::star::scanner::ScannerContext >
348 0 : aContexts( mxScannerManager->getAvailableScanners() );
349 :
350 0 : if( aContexts.getLength() )
351 : {
352 0 : ::com::sun::star::scanner::ScannerContext aContext( aContexts.getConstArray()[ 0 ] );
353 0 : mxScannerManager->configureScannerAndScan( aContext, mxScannerListener );
354 0 : }
355 : }
356 0 : catch(...)
357 : {
358 : }
359 : }
360 :
361 0 : Cancel();
362 0 : rReq.Done();
363 : }
364 0 : break;
365 :
366 : case SID_TWAIN_TRANSFER:
367 : {
368 0 : sal_Bool bDone = sal_False;
369 :
370 0 : if( mxScannerManager.is() )
371 : {
372 : try
373 : {
374 0 : const ::com::sun::star::uno::Sequence< ::com::sun::star::scanner::ScannerContext > aContexts( mxScannerManager->getAvailableScanners() );
375 :
376 0 : if( aContexts.getLength() )
377 : {
378 0 : mxScannerManager->startScan( aContexts.getConstArray()[ 0 ], mxScannerListener );
379 0 : bDone = sal_True;
380 0 : }
381 : }
382 0 : catch( ... )
383 : {
384 : }
385 : }
386 :
387 0 : if( !bDone )
388 : {
389 : #ifndef UNX
390 : const sal_uInt16 nId = STR_TWAIN_NO_SOURCE;
391 : #else
392 0 : const sal_uInt16 nId = STR_TWAIN_NO_SOURCE_UNX;
393 : #endif
394 :
395 0 : ::sd::Window* pWindow = GetActiveWindow();
396 0 : InfoBox(pWindow, String( SdResId( nId ) ) ).Execute();
397 : }
398 : else
399 : {
400 0 : SfxBindings& rBindings = GetViewFrame()->GetBindings();
401 0 : rBindings.Invalidate( SID_TWAIN_SELECT );
402 0 : rBindings.Invalidate( SID_TWAIN_TRANSFER );
403 : }
404 :
405 0 : Cancel();
406 0 : rReq.Done();
407 : }
408 0 : break;
409 :
410 : case SID_POLYGON_MORPHING:
411 : {
412 0 : SetCurrentFunction( FuMorph::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
413 0 : Cancel();
414 : }
415 0 : break;
416 :
417 : case SID_VECTORIZE:
418 : {
419 0 : SetCurrentFunction( FuVectorize::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
420 0 : Cancel();
421 : }
422 0 : break;
423 :
424 : default:
425 : {
426 : // switch Anweisung wegen CLOOKS aufgeteilt. Alle case-Anweisungen die
427 : // eine Fu???? -Funktion aufrufen, sind in die Methode FuTemp01 (drviews8),
428 : // FuTemp02 (drviewsb) gewandert.
429 0 : FuTemp02(rReq);
430 : }
431 0 : break;
432 : }
433 0 : }
434 :
435 : /*************************************************************************
436 : |*
437 : |* Scanner-Event
438 : |*
439 : \************************************************************************/
440 :
441 0 : void DrawViewShell::ScannerEvent( const ::com::sun::star::lang::EventObject& )
442 : {
443 0 : if( mxScannerManager.is() )
444 : {
445 0 : const ::com::sun::star::scanner::ScannerContext aContext( mxScannerManager->getAvailableScanners().getConstArray()[ 0 ] );
446 0 : const ::com::sun::star::scanner::ScanError eError = mxScannerManager->getError( aContext );
447 :
448 0 : if( ::com::sun::star::scanner::ScanError_ScanErrorNone == eError )
449 : {
450 0 : const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBitmap( mxScannerManager->getBitmap( aContext ) );
451 :
452 0 : if( xBitmap.is() )
453 : {
454 0 : const BitmapEx aScanBmp( VCLUnoHelper::GetBitmap( xBitmap ) );
455 :
456 0 : if( !!aScanBmp )
457 : {
458 0 : const SolarMutexGuard aGuard;
459 0 : SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage();
460 0 : Size aBmpSize( aScanBmp.GetPrefSize() ), aPageSize( pPage->GetSize() );
461 0 : const MapMode aMap100( MAP_100TH_MM );
462 :
463 0 : if( !aBmpSize.Width() || !aBmpSize.Height() )
464 0 : aBmpSize = aScanBmp.GetSizePixel();
465 :
466 0 : if( aScanBmp.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
467 0 : aBmpSize = GetActiveWindow()->PixelToLogic( aBmpSize, aMap100 );
468 : else
469 0 : aBmpSize = OutputDevice::LogicToLogic( aBmpSize, aScanBmp.GetPrefMapMode(), aMap100 );
470 :
471 0 : aPageSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder();
472 0 : aPageSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
473 :
474 0 : if( ( ( aBmpSize.Height() > aPageSize.Height() ) || ( aBmpSize.Width() > aPageSize.Width() ) ) && aBmpSize.Height() && aPageSize.Height() )
475 : {
476 0 : double fGrfWH = (double) aBmpSize.Width() / aBmpSize.Height();
477 0 : double fWinWH = (double) aPageSize.Width() / aPageSize.Height();
478 :
479 0 : if( fGrfWH < fWinWH )
480 : {
481 0 : aBmpSize.Width() = FRound( aPageSize.Height() * fGrfWH );
482 0 : aBmpSize.Height()= aPageSize.Height();
483 : }
484 0 : else if( fGrfWH > 0.F )
485 : {
486 0 : aBmpSize.Width() = aPageSize.Width();
487 0 : aBmpSize.Height()= FRound( aPageSize.Width() / fGrfWH );
488 : }
489 : }
490 :
491 0 : Point aPnt ( ( aPageSize.Width() - aBmpSize.Width() ) >> 1, ( aPageSize.Height() - aBmpSize.Height() ) >> 1 );
492 0 : aPnt += Point( pPage->GetLftBorder(), pPage->GetUppBorder() );
493 0 : Rectangle aRect( aPnt, aBmpSize );
494 0 : SdrGrafObj* pGrafObj = NULL;
495 0 : sal_Bool bInsertNewObject = sal_True;
496 :
497 0 : if( GetView()->AreObjectsMarked() )
498 : {
499 0 : const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
500 :
501 0 : if( rMarkList.GetMarkCount() == 1 )
502 : {
503 0 : SdrMark* pMark = rMarkList.GetMark(0);
504 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
505 :
506 0 : if( pObj->ISA( SdrGrafObj ) )
507 : {
508 0 : pGrafObj = static_cast< SdrGrafObj* >( pObj );
509 :
510 0 : if( pGrafObj->IsEmptyPresObj() )
511 : {
512 0 : bInsertNewObject = sal_False;
513 0 : pGrafObj->SetEmptyPresObj(sal_False);
514 0 : pGrafObj->SetOutlinerParaObject(NULL);
515 0 : pGrafObj->SetGraphic( Graphic( aScanBmp ) );
516 : }
517 : }
518 : }
519 : }
520 :
521 0 : if( bInsertNewObject )
522 : {
523 0 : pGrafObj = new SdrGrafObj( Graphic( aScanBmp ), aRect );
524 0 : SdrPageView* pPV = GetView()->GetSdrPageView();
525 0 : GetView()->InsertObjectAtView( pGrafObj, *pPV, SDRINSERT_SETDEFLAYER );
526 0 : }
527 0 : }
528 0 : }
529 0 : }
530 : }
531 :
532 0 : SfxBindings& rBindings = GetViewFrame()->GetBindings();
533 0 : rBindings.Invalidate( SID_TWAIN_SELECT );
534 0 : rBindings.Invalidate( SID_TWAIN_TRANSFER );
535 0 : }
536 :
537 : } // end of namespace sd
538 :
539 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|