xref: /AOO41X/main/sd/source/ui/func/fuoltext.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 
28 #include "fuoltext.hxx"
29 
30 #include <sfx2/viewfrm.hxx>
31 #include <editeng/outliner.hxx>
32 #include <editeng/eeitem.hxx>
33 #include <editeng/flditem.hxx>
34 #include <sfx2/bindings.hxx>
35 #include <sfx2/docfile.hxx>
36 #include <sfx2/dispatch.hxx>
37 
38 #include <svx/svxids.hrc>
39 #include "app.hrc"
40 #include "OutlineView.hxx"
41 #ifndef SD_WINDOW_SHELL_HXX
42 #include "Window.hxx"
43 #endif
44 #include "DrawDocShell.hxx"
45 #include "ViewShell.hxx"
46 #include "OutlineViewShell.hxx"
47 
48 #include <stdio.h>          // Fuer SlotFilter-Listing
49 
50 namespace sd {
51 
52 static sal_uInt16 SidArray[] = {
53                 SID_STYLE_FAMILY2,
54                 SID_STYLE_FAMILY3,
55                 SID_STYLE_FAMILY5,
56                 SID_STYLE_UPDATE_BY_EXAMPLE,
57                 SID_CUT,
58                 SID_COPY,
59                 SID_PASTE,
60                 SID_SELECTALL,
61                 SID_ATTR_CHAR_FONT,
62                 SID_ATTR_CHAR_POSTURE,
63                 SID_ATTR_CHAR_WEIGHT,
64                 SID_ATTR_CHAR_UNDERLINE,
65                 SID_ATTR_CHAR_FONTHEIGHT,
66                 SID_ATTR_CHAR_COLOR,
67                 SID_OUTLINE_UP,
68                 SID_OUTLINE_DOWN,
69                 SID_OUTLINE_LEFT,
70                 SID_OUTLINE_RIGHT,
71                 //SID_OUTLINE_FORMAT,
72                 SID_OUTLINE_COLLAPSE_ALL,
73                 //SID_OUTLINE_BULLET,
74                 SID_OUTLINE_COLLAPSE,
75                 SID_OUTLINE_EXPAND_ALL,
76                 SID_OUTLINE_EXPAND,
77                 SID_SET_SUPER_SCRIPT,
78                 SID_SET_SUB_SCRIPT,
79                 SID_HYPERLINK_GETLINK,
80                 SID_PRESENTATION_TEMPLATES,
81                 SID_STATUS_PAGE,
82                 SID_STATUS_LAYOUT,
83                 SID_EXPAND_PAGE,
84                 SID_SUMMARY_PAGE,
85                 SID_PARASPACE_INCREASE,
86                 SID_PARASPACE_DECREASE,
87                 0 };
88 
89 TYPEINIT1( FuOutlineText, FuOutline );
90 
91 /*************************************************************************
92 |*
93 |* Konstruktor
94 |*
95 \************************************************************************/
96 
97 FuOutlineText::FuOutlineText(ViewShell* pViewShell, ::sd::Window* pWindow,
98                              ::sd::View* pView, SdDrawDocument* pDoc,
99                              SfxRequest& rReq)
100        : FuOutline(pViewShell, pWindow, pView, pDoc, rReq)
101 {
102 }
103 
104 FunctionReference FuOutlineText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
105 {
106     FunctionReference xFunc( new FuOutlineText( pViewSh, pWin, pView, pDoc, rReq ) );
107     xFunc->DoExecute( rReq );
108     return xFunc;
109 }
110 
111 /*************************************************************************
112 |*
113 |* MouseButtonDown-event
114 |*
115 \************************************************************************/
116 
117 sal_Bool FuOutlineText::MouseButtonDown(const MouseEvent& rMEvt)
118 {
119     sal_Bool bReturn = sal_False;
120 
121     mpWindow->GrabFocus();
122 
123     bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonDown(rMEvt);
124 
125     if (bReturn)
126     {
127         // Attributierung der akt. Textstelle kann jetzt anders sein
128         mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
129     }
130     else
131     {
132         bReturn = FuOutline::MouseButtonDown(rMEvt);
133     }
134 
135     return (bReturn);
136 }
137 
138 /*************************************************************************
139 |*
140 |* MouseMove-event
141 |*
142 \************************************************************************/
143 
144 sal_Bool FuOutlineText::MouseMove(const MouseEvent& rMEvt)
145 {
146     sal_Bool bReturn = sal_False;
147 
148     bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseMove(rMEvt);
149 
150     if (!bReturn)
151     {
152         bReturn = FuOutline::MouseMove(rMEvt);
153     }
154 
155     // MT 07/2002: Done in OutlinerView::MouseMove
156     /*
157     const SvxFieldItem* pFieldItem = pOutlineView->GetViewByWindow( mpWindow )->
158                                         GetFieldUnderMousePointer();
159     const SvxFieldData* pField = NULL;
160     if( pFieldItem )
161         pField = pFieldItem->GetField();
162 
163     if( pField && pField->ISA( SvxURLField ) )
164     {
165        mpWindow->SetPointer( Pointer( POINTER_REFHAND ) );
166     }
167     else
168        mpWindow->SetPointer( Pointer( POINTER_TEXT ) );
169     */
170 
171     return (bReturn);
172 }
173 
174 /*************************************************************************
175 |*
176 |* MouseButtonUp-event
177 |*
178 \************************************************************************/
179 
180 sal_Bool FuOutlineText::MouseButtonUp(const MouseEvent& rMEvt)
181 {
182     sal_Bool bReturn = sal_False;
183 
184     bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonUp(rMEvt);
185 
186     if (bReturn)
187     {
188         // Attributierung der akt. Textstelle kann jetzt anders sein
189         mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
190     }
191     else
192     {
193         const SvxFieldItem* pFieldItem = pOutlineView->GetViewByWindow( mpWindow )->GetFieldUnderMousePointer();
194         if( pFieldItem )
195         {
196             const SvxFieldData* pField = pFieldItem->GetField();
197 
198             if( pField && pField->ISA( SvxURLField ) )
199             {
200                 bReturn = sal_True;
201                 mpWindow->ReleaseMouse();
202                 SfxStringItem aStrItem( SID_FILE_NAME, ( (SvxURLField*) pField)->GetURL() );
203                 SfxStringItem aReferer( SID_REFERER, mpDocSh->GetMedium()->GetName() );
204                 SfxBoolItem aBrowseItem( SID_BROWSE, sal_True );
205                 SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
206 
207                 if ( rMEvt.IsMod1() )
208                 {
209                     // Im neuen Frame oeffnen
210                     pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
211                                 &aStrItem, &aBrowseItem, &aReferer, 0L);
212                 }
213                 else
214                 {
215                     // Im aktuellen Frame oeffnen
216                     SfxFrameItem aFrameItem( SID_DOCFRAME, pFrame );
217                     pFrame->GetDispatcher()->Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
218                                 &aStrItem, &aFrameItem, &aBrowseItem, &aReferer, 0L);
219                 }
220             }
221         }
222     }
223 
224     if( !bReturn )
225         bReturn = FuOutline::MouseButtonUp(rMEvt);
226 
227     return (bReturn);
228 }
229 
230 /*************************************************************************
231 |*
232 |* Tastaturereignisse bearbeiten
233 |*
234 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
235 |* sal_False.
236 |*
237 \************************************************************************/
238 
239 sal_Bool FuOutlineText::KeyInput(const KeyEvent& rKEvt)
240 {
241     sal_Bool bReturn = sal_False;
242 
243     sal_uInt16 nKeyGroup = rKEvt.GetKeyCode().GetGroup();
244     if( !mpDocSh->IsReadOnly() || nKeyGroup == KEYGROUP_CURSOR )
245     {
246         mpWindow->GrabFocus();
247 
248         std::auto_ptr< OutlineViewModelChangeGuard > aGuard;
249 
250         if( (nKeyGroup != KEYGROUP_CURSOR) && (nKeyGroup != KEYGROUP_FKEYS) )
251             aGuard.reset( new OutlineViewModelChangeGuard( *pOutlineView ) );
252 
253         bReturn = pOutlineView->GetViewByWindow(mpWindow)->PostKeyEvent(rKEvt);
254 
255         if (bReturn)
256         {
257             UpdateForKeyPress (rKEvt);
258         }
259         else
260         {
261             bReturn = FuOutline::KeyInput(rKEvt);
262         }
263     }
264 
265     return (bReturn);
266 }
267 
268 void FuOutlineText::UpdateForKeyPress (const KeyEvent& rEvent)
269 {
270     // Attributes at the current text position may have changed.
271     mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray);
272 
273     bool bUpdatePreview = true;
274     switch (rEvent.GetKeyCode().GetCode())
275     {
276         // When just the cursor has been moved the preview only changes when
277         // it moved to entries of another page.  To prevent unnecessary
278         // updates we check this here.  This is an early rejection test, so
279         // missing a key is not a problem.
280         case KEY_UP:
281         case KEY_DOWN:
282         case KEY_LEFT:
283         case KEY_RIGHT:
284         case KEY_HOME:
285         case KEY_END:
286         case KEY_PAGEUP:
287         case KEY_PAGEDOWN:
288         {
289             SdPage* pCurrentPage = pOutlineViewShell->GetActualPage();
290             bUpdatePreview = (pCurrentPage != pOutlineViewShell->GetActualPage());
291         }
292         break;
293     }
294     if (bUpdatePreview)
295         pOutlineViewShell->UpdatePreview (pOutlineViewShell->GetActualPage());
296 }
297 
298 
299 
300 
301 /*************************************************************************
302 |*
303 |* Function aktivieren
304 |*
305 \************************************************************************/
306 
307 void FuOutlineText::Activate()
308 {
309     FuOutline::Activate();
310 }
311 
312 /*************************************************************************
313 |*
314 |* Function deaktivieren
315 |*
316 \************************************************************************/
317 
318 void FuOutlineText::Deactivate()
319 {
320     FuOutline::Deactivate();
321 }
322 
323 /*************************************************************************
324 |*
325 |* Cut object to clipboard
326 |*
327 \************************************************************************/
328 
329 void FuOutlineText::DoCut()
330 {
331     pOutlineView->GetViewByWindow(mpWindow)->Cut();
332 }
333 
334 /*************************************************************************
335 |*
336 |* Copy object to clipboard
337 |*
338 \************************************************************************/
339 
340 void FuOutlineText::DoCopy()
341 {
342     pOutlineView->GetViewByWindow(mpWindow)->Copy();
343 }
344 
345 /*************************************************************************
346 |*
347 |* Paste object from clipboard
348 |*
349 \************************************************************************/
350 
351 void FuOutlineText::DoPaste()
352 {
353     pOutlineView->GetViewByWindow(mpWindow)->PasteSpecial();
354 }
355 
356 
357 } // end of namespace sd
358