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 : #include <comphelper/string.hxx>
21 : #include <hintids.hxx>
22 :
23 : #include <doc.hxx>
24 : #if OSL_DEBUG_LEVEL > 1
25 : #include <stdio.h>
26 : #endif
27 :
28 : #include <vcl/help.hxx>
29 : #include <svl/stritem.hxx>
30 : #include <unotools/securityoptions.hxx>
31 : #include <tools/urlobj.hxx>
32 : #include <txtrfmrk.hxx>
33 : #include <fmtrfmrk.hxx>
34 : #include <editeng/flditem.hxx>
35 : #include <svl/urihelper.hxx>
36 : #include <svx/svdotext.hxx>
37 : #include <editeng/outliner.hxx>
38 : #include <svl/itemiter.hxx>
39 : #include <svx/svdview.hxx>
40 : #include <svx/svdpagv.hxx>
41 : #include <swmodule.hxx>
42 : #include <modcfg.hxx>
43 : #include <view.hxx>
44 : #include <wrtsh.hxx>
45 : #include <docsh.hxx>
46 : #include <edtwin.hxx>
47 : #include <dpage.hxx>
48 : #include <shellres.hxx>
49 : #include <docufld.hxx>
50 : #include <dbfld.hxx>
51 : #include <reffld.hxx>
52 : #include <cellatr.hxx>
53 : #include <shdwcrsr.hxx>
54 : #include <fmtcol.hxx>
55 : #include <charfmt.hxx>
56 : #include <fmtftn.hxx>
57 : #include <redline.hxx>
58 : #include <tox.hxx>
59 : #include <txttxmrk.hxx>
60 : #include <uitool.hxx>
61 : #include <viewopt.hxx>
62 : #include <docvw.hrc>
63 : #include <utlui.hrc>
64 :
65 : #include <PostItMgr.hxx>
66 : #include <fmtfld.hxx>
67 :
68 : // #i104300#
69 : #include <IDocumentMarkAccess.hxx>
70 : #include <ndtxt.hxx>
71 :
72 : /*--------------------------------------------------------------------
73 : Description: KeyEvents
74 : --------------------------------------------------------------------*/
75 0 : static void lcl_GetRedlineHelp( const SwRedline& rRedl, String& rTxt, sal_Bool bBalloon )
76 : {
77 0 : sal_uInt16 nResId = 0;
78 0 : switch( rRedl.GetType() )
79 : {
80 0 : case nsRedlineType_t::REDLINE_INSERT: nResId = STR_REDLINE_INSERT; break;
81 0 : case nsRedlineType_t::REDLINE_DELETE: nResId = STR_REDLINE_DELETE; break;
82 0 : case nsRedlineType_t::REDLINE_FORMAT: nResId = STR_REDLINE_FORMAT; break;
83 0 : case nsRedlineType_t::REDLINE_TABLE: nResId = STR_REDLINE_TABLE; break;
84 0 : case nsRedlineType_t::REDLINE_FMTCOLL: nResId = STR_REDLINE_FMTCOLL; break;
85 : }
86 :
87 0 : if( nResId )
88 : {
89 0 : rTxt = SW_RESSTR( nResId );
90 0 : rTxt.AppendAscii( RTL_CONSTASCII_STRINGPARAM(": " ));
91 0 : rTxt += rRedl.GetAuthorString();
92 0 : rTxt.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " - " ));
93 0 : rTxt += GetAppLangDateTimeString( rRedl.GetTimeStamp() );
94 0 : if( bBalloon && rRedl.GetComment().Len() )
95 0 : ( rTxt += '\n' ) += rRedl.GetComment();
96 : }
97 0 : }
98 :
99 :
100 0 : void SwEditWin::RequestHelp(const HelpEvent &rEvt)
101 : {
102 0 : SwWrtShell &rSh = rView.GetWrtShell();
103 0 : sal_Bool bQuickBalloon = 0 != (rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ));
104 0 : if(bQuickBalloon && rSh.GetViewOptions()->IsPreventTips())
105 0 : return;
106 0 : sal_Bool bWeiter = sal_True;
107 0 : SET_CURR_SHELL(&rSh);
108 0 : String sTxt;
109 0 : Point aPos( PixelToLogic( ScreenToOutputPixel( rEvt.GetMousePosPixel() ) ));
110 0 : sal_Bool bBalloon = static_cast< sal_Bool >(rEvt.GetMode() & HELPMODE_BALLOON);
111 :
112 0 : SdrView *pSdrView = rSh.GetDrawView();
113 :
114 0 : if( bQuickBalloon )
115 : {
116 0 : if( pSdrView )
117 : {
118 0 : SdrPageView* pPV = pSdrView->GetSdrPageView();
119 0 : SwDPage* pPage = pPV ? ((SwDPage*)pPV->GetPage()) : 0;
120 0 : bWeiter = pPage && pPage->RequestHelp(this, pSdrView, rEvt);
121 : }
122 : }
123 :
124 0 : if( bWeiter && bQuickBalloon)
125 : {
126 0 : SwRect aFldRect;
127 : SwContentAtPos aCntntAtPos( SwContentAtPos::SW_FIELD |
128 : SwContentAtPos::SW_INETATTR |
129 : SwContentAtPos::SW_FTN |
130 : SwContentAtPos::SW_REDLINE |
131 : SwContentAtPos::SW_TOXMARK |
132 : SwContentAtPos::SW_REFMARK |
133 : SwContentAtPos::SW_SMARTTAG |
134 : #ifdef DBG_UTIL
135 : SwContentAtPos::SW_TABLEBOXVALUE |
136 : ( bBalloon ? SwContentAtPos::SW_CURR_ATTRS : 0) |
137 : #endif
138 0 : SwContentAtPos::SW_TABLEBOXFML );
139 :
140 0 : if( rSh.GetContentAtPos( aPos, aCntntAtPos, sal_False, &aFldRect ) )
141 : {
142 0 : sal_uInt16 nStyle = 0; // style of quick help
143 0 : switch( aCntntAtPos.eCntntAtPos )
144 : {
145 : case SwContentAtPos::SW_TABLEBOXFML:
146 0 : sTxt.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "= " ));
147 0 : sTxt += ((SwTblBoxFormula*)aCntntAtPos.aFnd.pAttr)->GetFormula();
148 0 : break;
149 : #ifdef DBG_UTIL
150 : case SwContentAtPos::SW_TABLEBOXVALUE:
151 : {
152 : sTxt = rtl::OStringToOUString(rtl::OString::valueOf(
153 : ((SwTblBoxValue*)aCntntAtPos.aFnd.pAttr)->GetValue()),
154 : osl_getThreadTextEncoding());
155 : }
156 : break;
157 : case SwContentAtPos::SW_CURR_ATTRS:
158 : sTxt = aCntntAtPos.sStr;
159 : break;
160 : #endif
161 :
162 : case SwContentAtPos::SW_INETATTR:
163 : {
164 0 : sTxt = ((SfxStringItem*)aCntntAtPos.aFnd.pAttr)->GetValue();
165 : sTxt = URIHelper::removePassword( sTxt,
166 : INetURLObject::WAS_ENCODED,
167 0 : INetURLObject::DECODE_UNAMBIGUOUS);
168 : //#i63832# remove the link target type
169 0 : xub_StrLen nFound = sTxt.Search(cMarkSeperator);
170 0 : if( nFound != STRING_NOTFOUND && (++nFound) < sTxt.Len() )
171 : {
172 0 : String sSuffix( sTxt.Copy(nFound) );
173 0 : if( sSuffix.EqualsAscii( pMarkToTable ) ||
174 0 : sSuffix.EqualsAscii( pMarkToFrame ) ||
175 0 : sSuffix.EqualsAscii( pMarkToRegion ) ||
176 0 : sSuffix.EqualsAscii( pMarkToOutline ) ||
177 0 : sSuffix.EqualsAscii( pMarkToText ) ||
178 0 : sSuffix.EqualsAscii( pMarkToGraphic ) ||
179 0 : sSuffix.EqualsAscii( pMarkToOLE ))
180 0 : sTxt = sTxt.Copy( 0, nFound - 1);
181 : }
182 : // #i104300#
183 : // special handling if target is a cross-reference bookmark
184 : {
185 0 : String sTmpSearchStr = sTxt.Copy( 1, sTxt.Len() );
186 : IDocumentMarkAccess* const pMarkAccess =
187 0 : rSh.getIDocumentMarkAccess();
188 : IDocumentMarkAccess::const_iterator_t ppBkmk =
189 0 : pMarkAccess->findBookmark( sTmpSearchStr );
190 0 : if ( ppBkmk != pMarkAccess->getBookmarksEnd() &&
191 0 : IDocumentMarkAccess::GetType( *(ppBkmk->get()) )
192 : == IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK )
193 : {
194 0 : SwTxtNode* pTxtNode = ppBkmk->get()->GetMarkStart().nNode.GetNode().GetTxtNode();
195 0 : if ( pTxtNode )
196 : {
197 0 : sTxt = pTxtNode->GetExpandTxt( 0, pTxtNode->Len(), true, true );
198 :
199 0 : if( sTxt.Len() )
200 : {
201 0 : sTxt = comphelper::string::remove(sTxt, 0xad);
202 0 : for( sal_Unicode* p = sTxt.GetBufferAccess(); *p; ++p )
203 : {
204 0 : if( *p < 0x20 )
205 0 : *p = 0x20;
206 0 : else if(*p == 0x2011)
207 0 : *p = '-';
208 : }
209 : }
210 : }
211 0 : }
212 : }
213 : // #i80029#
214 0 : sal_Bool bExecHyperlinks = rView.GetDocShell()->IsReadOnly();
215 0 : if ( !bExecHyperlinks )
216 : {
217 0 : SvtSecurityOptions aSecOpts;
218 0 : bExecHyperlinks = !aSecOpts.IsOptionSet( SvtSecurityOptions::E_CTRLCLICK_HYPERLINK );
219 :
220 0 : if ( !bExecHyperlinks )
221 : {
222 0 : sTxt.InsertAscii( ": ", 0 );
223 0 : sTxt.Insert( ViewShell::GetShellRes()->aHyperlinkClick, 0 );
224 0 : }
225 : }
226 0 : break;
227 : }
228 : case SwContentAtPos::SW_SMARTTAG:
229 : {
230 0 : sTxt = SW_RESSTR(STR_SMARTTAG_CLICK);
231 :
232 0 : KeyCode aCode( KEY_SPACE );
233 0 : KeyCode aModifiedCode( KEY_SPACE, KEY_MOD1 );
234 0 : String aModStr( aModifiedCode.GetName() );
235 0 : aModStr.SearchAndReplace( aCode.GetName(), String() );
236 0 : aModStr.SearchAndReplaceAllAscii( "+", String() );
237 0 : sTxt.SearchAndReplaceAllAscii( "%s", aModStr );
238 : }
239 0 : break;
240 :
241 : case SwContentAtPos::SW_FTN:
242 0 : if( aCntntAtPos.pFndTxtAttr && aCntntAtPos.aFnd.pAttr )
243 : {
244 0 : const SwFmtFtn* pFtn = (SwFmtFtn*)aCntntAtPos.aFnd.pAttr;
245 0 : pFtn->GetFtnText( sTxt );
246 0 : sTxt.Insert( SW_RESSTR( pFtn->IsEndNote()
247 0 : ? STR_ENDNOTE : STR_FTNNOTE ), 0 );
248 0 : bBalloon = sal_True;
249 0 : if( aCntntAtPos.IsInRTLText() )
250 0 : nStyle |= QUICKHELP_BIDI_RTL;
251 : }
252 0 : break;
253 :
254 : case SwContentAtPos::SW_REDLINE:
255 0 : lcl_GetRedlineHelp( *aCntntAtPos.aFnd.pRedl, sTxt, bBalloon );
256 0 : break;
257 :
258 : case SwContentAtPos::SW_TOXMARK:
259 0 : sTxt = aCntntAtPos.sStr;
260 0 : if( sTxt.Len() && aCntntAtPos.pFndTxtAttr )
261 : {
262 : const SwTOXType* pTType = aCntntAtPos.pFndTxtAttr->
263 0 : GetTOXMark().GetTOXType();
264 0 : if( pTType && pTType->GetTypeName().Len() )
265 : {
266 0 : sTxt.InsertAscii( ": ", 0 );
267 0 : sTxt.Insert( pTType->GetTypeName(), 0 );
268 : }
269 : }
270 0 : break;
271 : case SwContentAtPos::SW_REFMARK:
272 0 : if(aCntntAtPos.aFnd.pAttr)
273 : {
274 0 : sTxt = SW_RESSTR(STR_CONTENT_TYPE_SINGLE_REFERENCE);
275 0 : sTxt.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": "));
276 0 : sTxt += ((const SwFmtRefMark*)aCntntAtPos.aFnd.pAttr)->GetRefName();
277 : }
278 0 : break;
279 :
280 : default:
281 : {
282 0 : SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
283 0 : if(!pModOpt->IsHideFieldTips())
284 : {
285 0 : const SwField* pFld = aCntntAtPos.aFnd.pFld;
286 0 : switch( pFld->Which() )
287 : {
288 : case RES_SETEXPFLD:
289 : case RES_TABLEFLD:
290 : case RES_GETEXPFLD:
291 : {
292 0 : sal_uInt16 nOldSubType = pFld->GetSubType();
293 0 : ((SwField*)pFld)->SetSubType(nsSwExtendedSubType::SUB_CMD);
294 0 : sTxt = pFld->ExpandField(true);
295 0 : ((SwField*)pFld)->SetSubType(nOldSubType);
296 : }
297 0 : break;
298 :
299 : case RES_POSTITFLD:
300 : {
301 0 : break;
302 : }
303 : case RES_INPUTFLD: // BubbleHelp, because the suggestion could be quite long
304 0 : bBalloon = sal_True;
305 : /* no break */
306 : case RES_JUMPEDITFLD:
307 0 : sTxt = pFld->GetPar2();
308 0 : break;
309 :
310 : case RES_DBFLD:
311 0 : sTxt = pFld->GetFieldName();
312 0 : break;
313 :
314 : case RES_USERFLD:
315 : case RES_HIDDENTXTFLD:
316 0 : sTxt = pFld->GetPar1();
317 0 : break;
318 :
319 : case RES_DOCSTATFLD:
320 0 : break;
321 :
322 : case RES_MACROFLD:
323 0 : sTxt = ((const SwMacroField*)pFld)->GetMacro();
324 0 : break;
325 :
326 : case RES_GETREFFLD:
327 : {
328 : // #i85090#
329 0 : const SwGetRefField* pRefFld( dynamic_cast<const SwGetRefField*>(pFld) );
330 : OSL_ENSURE( pRefFld,
331 : "<SwEditWin::RequestHelp(..)> - unexpected type of <pFld>" );
332 0 : if ( pRefFld )
333 : {
334 0 : if ( pRefFld->IsRefToHeadingCrossRefBookmark() ||
335 0 : pRefFld->IsRefToNumItemCrossRefBookmark() )
336 : {
337 0 : sTxt = pRefFld->GetExpandedTxtOfReferencedTxtNode();
338 0 : if ( sTxt.Len() > 80 )
339 : {
340 0 : sTxt.Erase( 80 );
341 0 : sTxt += '.';
342 0 : sTxt += '.';
343 0 : sTxt += '.';
344 : }
345 : }
346 : else
347 : {
348 0 : sTxt = ((SwGetRefField*)pFld)->GetSetRefName();
349 : }
350 : }
351 : }
352 0 : break;
353 : }
354 : }
355 :
356 0 : if( !sTxt.Len() )
357 : {
358 0 : aCntntAtPos.eCntntAtPos = SwContentAtPos::SW_REDLINE;
359 0 : if( rSh.GetContentAtPos( aPos, aCntntAtPos, sal_False, &aFldRect ) )
360 : lcl_GetRedlineHelp( *aCntntAtPos.aFnd.pRedl,
361 0 : sTxt, bBalloon );
362 : }
363 : }
364 : }
365 0 : if (sTxt.Len() )
366 : {
367 0 : if( bBalloon )
368 0 : Help::ShowBalloon( this, rEvt.GetMousePosPixel(), sTxt );
369 : else
370 : {
371 : // the show the help
372 0 : Rectangle aRect( aFldRect.SVRect() );
373 0 : Point aPt( OutputToScreenPixel( LogicToPixel( aRect.TopLeft() )));
374 0 : aRect.Left() = aPt.X();
375 0 : aRect.Top() = aPt.Y();
376 0 : aPt = OutputToScreenPixel( LogicToPixel( aRect.BottomRight() ));
377 0 : aRect.Right() = aPt.X();
378 0 : aRect.Bottom() = aPt.Y();
379 0 : Help::ShowQuickHelp( this, aRect, sTxt, nStyle );
380 : }
381 : }
382 :
383 0 : bWeiter = sal_False;
384 : }
385 0 : if( bWeiter )
386 : {
387 0 : sal_uInt8 nTabCols = rSh.WhichMouseTabCol(aPos);
388 0 : sal_uInt16 nTabRes = 0;
389 0 : switch(nTabCols)
390 : {
391 : case SW_TABCOL_HORI:
392 : case SW_TABCOL_VERT:
393 0 : nTabRes = STR_TABLE_COL_ADJUST;
394 0 : break;
395 : case SW_TABROW_HORI:
396 : case SW_TABROW_VERT:
397 0 : nTabRes = STR_TABLE_ROW_ADJUST;
398 0 : break;
399 : // #i32329# Enhanced table selection
400 : case SW_TABSEL_HORI:
401 : case SW_TABSEL_HORI_RTL:
402 : case SW_TABSEL_VERT:
403 0 : nTabRes = STR_TABLE_SELECT_ALL;
404 0 : break;
405 : case SW_TABROWSEL_HORI:
406 : case SW_TABROWSEL_HORI_RTL:
407 : case SW_TABROWSEL_VERT:
408 0 : nTabRes = STR_TABLE_SELECT_ROW;
409 0 : break;
410 : case SW_TABCOLSEL_HORI:
411 : case SW_TABCOLSEL_VERT:
412 0 : nTabRes = STR_TABLE_SELECT_COL;
413 0 : break;
414 : }
415 0 : if(nTabRes)
416 : {
417 0 : sTxt = SW_RESSTR(nTabRes);
418 0 : Size aTxtSize( GetTextWidth(sTxt), GetTextHeight());
419 0 : Rectangle aRect(rEvt.GetMousePosPixel(), aTxtSize);
420 0 : Help::ShowQuickHelp(this, aRect, sTxt);
421 : }
422 0 : bWeiter = sal_False;
423 0 : }
424 : }
425 :
426 0 : if( bWeiter && pSdrView && bQuickBalloon)
427 : {
428 0 : SdrViewEvent aVEvt;
429 0 : SdrHitKind eHit = pSdrView->PickAnything(aPos, aVEvt);
430 : const SvxURLField *pField;
431 0 : SdrObject* pObj = NULL;
432 :
433 0 : if ((pField = aVEvt.pURLField) != 0)
434 : {
435 : // hit an URL field
436 0 : if (pField)
437 : {
438 0 : pObj = aVEvt.pObj;
439 0 : sTxt = pField->GetURL();
440 :
441 0 : bWeiter = sal_False;
442 : }
443 : }
444 0 : if (bWeiter && eHit == SDRHIT_TEXTEDIT)
445 : {
446 : // look for URL field in DrawText object that is opened for editing
447 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
448 : const SvxFieldItem* pFieldItem;
449 :
450 0 : if (pSdrView->AreObjectsMarked())
451 : {
452 0 : const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
453 :
454 0 : if (rMarkList.GetMarkCount() == 1)
455 0 : pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
456 : }
457 :
458 0 : if (pObj && pObj->ISA(SdrTextObj) && pOLV &&
459 : (pFieldItem = pOLV->GetFieldUnderMousePointer()) != 0)
460 : {
461 0 : pField = dynamic_cast<const SvxURLField*>(pFieldItem->GetField());
462 :
463 0 : if (pField )
464 : {
465 0 : sTxt = ((const SvxURLField*) pField)->GetURL();
466 0 : bWeiter = sal_False;
467 : }
468 : }
469 : }
470 0 : if (sTxt.Len() && pObj)
471 : {
472 : sTxt = URIHelper::removePassword( sTxt, INetURLObject::WAS_ENCODED,
473 0 : INetURLObject::DECODE_UNAMBIGUOUS);
474 :
475 0 : Rectangle aLogicPix = LogicToPixel(pObj->GetLogicRect());
476 0 : Rectangle aScreenRect(OutputToScreenPixel(aLogicPix.TopLeft()),
477 0 : OutputToScreenPixel(aLogicPix.BottomRight()));
478 :
479 0 : if (bBalloon)
480 0 : Help::ShowBalloon(this, rEvt.GetMousePosPixel(), aScreenRect, sTxt);
481 : else
482 0 : Help::ShowQuickHelp(this, aScreenRect, sTxt);
483 0 : }
484 : }
485 :
486 0 : if( bWeiter )
487 0 : Window::RequestHelp( rEvt );
488 : }
489 :
490 1049 : void SwEditWin::PrePaint()
491 : {
492 1049 : SwWrtShell* pWrtShell = GetView().GetWrtShellPtr();
493 :
494 1049 : if(pWrtShell)
495 : {
496 1049 : pWrtShell->PrePaint();
497 : }
498 1049 : }
499 :
500 282 : void SwEditWin::Paint(const Rectangle& rRect)
501 : {
502 282 : SwWrtShell* pWrtShell = GetView().GetWrtShellPtr();
503 282 : if(!pWrtShell)
504 282 : return;
505 282 : sal_Bool bPaintShadowCrsr = sal_False;
506 282 : if( pShadCrsr )
507 : {
508 0 : Rectangle aRect( pShadCrsr->GetRect());
509 : // fully resides inside?
510 0 : if( rRect.IsInside( aRect ) )
511 : // dann aufheben
512 0 : delete pShadCrsr, pShadCrsr = 0;
513 0 : else if( rRect.IsOver( aRect ))
514 : {
515 : // resides somewhat above, then everything is clipped outside
516 : // and we have to make the "inner part" at the end of the
517 : // Paint visible again. Otherwise Paint errors occur!
518 0 : bPaintShadowCrsr = sal_True;
519 : }
520 : }
521 :
522 564 : if ( GetView().GetVisArea().GetWidth() <= 0 ||
523 282 : GetView().GetVisArea().GetHeight() <= 0 )
524 0 : Invalidate( rRect );
525 : else
526 282 : pWrtShell->Paint( rRect );
527 :
528 282 : if( bPaintShadowCrsr )
529 0 : pShadCrsr->Paint();
530 : }
531 :
532 :
533 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|