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 <crsskip.hxx>
22 : #include <hintids.hxx> //_immer_ vor den solar-Items
23 :
24 : #include <sfx2/lnkbase.hxx>
25 : #include <fmtfld.hxx>
26 : #include <vcl/msgbox.hxx>
27 : #include <svl/itempool.hxx>
28 : #include <unotools/useroptions.hxx>
29 : #include <svl/whiter.hxx>
30 : #include <svl/eitem.hxx>
31 : #include <svl/macitem.hxx>
32 : #include <sfx2/viewfrm.hxx>
33 : #include <sfx2/request.hxx>
34 : #include <svx/postattr.hxx>
35 : #include <svx/hlnkitem.hxx>
36 :
37 : #include <svx/svxdlg.hxx>
38 : #include <sfx2/linkmgr.hxx>
39 : #include <unotools/localedatawrapper.hxx>
40 : #include <sfx2/dispatch.hxx>
41 : #include <fmtinfmt.hxx>
42 : #include <fldwrap.hxx>
43 : #include <redline.hxx>
44 : #include <view.hxx>
45 : #include <wrtsh.hxx>
46 : #include <basesh.hxx>
47 : #include <flddat.hxx>
48 : #include <numrule.hxx>
49 : #include <textsh.hxx>
50 : #include <docsh.hxx>
51 : #include <docufld.hxx>
52 : #include <usrfld.hxx>
53 : #include <ddefld.hxx>
54 : #include <expfld.hxx>
55 : #include <fldmgr.hxx>
56 : #include <uitool.hxx>
57 :
58 : #include <cmdid.h>
59 : #include <shells.hrc>
60 :
61 : #include <sfx2/app.hxx>
62 : #include <svx/dialogs.hrc>
63 : #include "swabstdlg.hxx"
64 : #include "dialog.hrc"
65 : #include <fldui.hrc>
66 : #include <doc.hxx>
67 :
68 : #include <app.hrc>
69 :
70 : #include <PostItMgr.hxx>
71 : #include <switerator.hxx>
72 :
73 : using namespace nsSwDocInfoSubType;
74 :
75 : extern sal_Bool bNoInterrupt; // in mainwn.cxx
76 :
77 0 : static String& lcl_AppendRedlineStr( String& rStr, sal_uInt16 nRedlId )
78 : {
79 0 : sal_uInt16 nResId = 0;
80 0 : switch( nRedlId )
81 : {
82 0 : case nsRedlineType_t::REDLINE_INSERT: nResId = STR_REDLINE_INSERTED; break;
83 0 : case nsRedlineType_t::REDLINE_DELETE: nResId = STR_REDLINE_DELETED; break;
84 0 : case nsRedlineType_t::REDLINE_FORMAT: nResId = STR_REDLINE_FORMATED; break;
85 0 : case nsRedlineType_t::REDLINE_TABLE: nResId = STR_REDLINE_TABLECHG; break;
86 0 : case nsRedlineType_t::REDLINE_FMTCOLL: nResId = STR_REDLINE_FMTCOLLSET; break;
87 : }
88 0 : if( nResId )
89 0 : rStr += SW_RESSTR( nResId );
90 0 : return rStr;
91 : }
92 :
93 : // STATIC DATA -----------------------------------------------------------
94 0 : void SwTextShell::ExecField(SfxRequest &rReq)
95 : {
96 0 : SwWrtShell& rSh = GetShell();
97 0 : const SfxPoolItem* pItem = 0;
98 :
99 0 : sal_uInt16 nSlot = rReq.GetSlot();
100 0 : const SfxItemSet* pArgs = rReq.GetArgs();
101 0 : if(pArgs)
102 0 : pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
103 :
104 0 : Window *pMDI = &GetView().GetViewFrame()->GetWindow();
105 0 : sal_Bool bMore = sal_False;
106 0 : sal_Bool bIsText = sal_True;
107 0 : sal_uInt16 nInsertType = 0;
108 0 : sal_uInt16 nInsertSubType = 0;
109 0 : sal_uLong nInsertFormat = 0;
110 :
111 0 : switch(nSlot)
112 : {
113 : case FN_EDIT_FIELD:
114 : {
115 0 : SwField* pFld = rSh.GetCurFld();
116 0 : if( pFld )
117 : {
118 0 : switch ( pFld->GetTypeId() )
119 : {
120 : case TYP_DDEFLD:
121 : {
122 0 : ::sfx2::SvBaseLink& rLink = ((SwDDEFieldType*)pFld->GetTyp())->
123 0 : GetBaseLink();
124 0 : if(rLink.IsVisible())
125 : {
126 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
127 0 : SfxAbstractLinksDialog* pDlg = pFact->CreateLinksDialog( pMDI, &rSh.GetLinkManager(), sal_False, &rLink );
128 0 : if ( pDlg )
129 : {
130 0 : pDlg->Execute();
131 0 : delete pDlg;
132 : }
133 : }
134 0 : break;
135 : }
136 : default:
137 : {
138 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
139 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
140 :
141 0 : SfxAbstractDialog* pDlg = pFact->CreateSwFldEditDlg( GetView(),RC_DLG_SWFLDEDITDLG );
142 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
143 0 : pDlg->Execute();
144 0 : delete pDlg;
145 : }
146 : }
147 : }
148 0 : break;
149 : }
150 : case FN_EXECUTE_MACROFIELD:
151 : {
152 0 : SwField* pFld = rSh.GetCurFld();
153 0 : if(pFld && pFld->GetTyp()->Which() == RES_MACROFLD)
154 : {
155 :
156 0 : const String& rMacro = ((SwMacroField*)pFld)->GetMacro();
157 0 : sal_uInt16 nPos = rMacro.Search('.', 0);
158 0 : if(nPos != STRING_NOTFOUND)
159 : {
160 0 : SvxMacro aMacro( rMacro.Copy(nPos + 1), rMacro.Copy(0,nPos), STARBASIC );
161 0 : rSh.ExecMacro(aMacro);
162 0 : }
163 : }
164 : }
165 0 : break;
166 :
167 : case FN_GOTO_NEXT_INPUTFLD:
168 : case FN_GOTO_PREV_INPUTFLD:
169 : {
170 0 : sal_Bool bRet = sal_False;
171 0 : SwFieldType* pFld = rSh.GetFldType( 0, RES_INPUTFLD );
172 0 : if( pFld && rSh.MoveFldType( pFld,
173 0 : FN_GOTO_NEXT_INPUTFLD == nSlot ))
174 : {
175 0 : rSh.ClearMark();
176 0 : rSh.StartInputFldDlg( rSh.GetCurFld(), sal_False );
177 0 : bRet = sal_True;
178 : }
179 :
180 0 : rReq.SetReturnValue( SfxBoolItem( nSlot, bRet ));
181 : }
182 0 : break;
183 :
184 : default:
185 0 : bMore = sal_True;
186 : }
187 0 : if(bMore)
188 : {
189 : // hier kommen die Slots mit FldMgr
190 0 : SwFldMgr aFldMgr(GetShellPtr());
191 0 : switch(nSlot)
192 : {
193 : case FN_INSERT_DBFIELD:
194 : {
195 0 : sal_Bool bRes = sal_False;
196 0 : if( pItem )
197 : {
198 0 : sal_uLong nFormat = 0;
199 0 : sal_uInt16 nType = 0;
200 0 : String aPar1 = ((SfxStringItem *)pItem)->GetValue();
201 0 : String aPar2;
202 0 : sal_Int32 nCommand = 0;
203 :
204 0 : if( SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_FIELD_TYPE,
205 0 : sal_False, &pItem ))
206 0 : nType = ((SfxUInt16Item *)pItem)->GetValue();
207 0 : aPar1 += DB_DELIM;
208 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
209 0 : FN_PARAM_1, sal_False, &pItem ))
210 : {
211 0 : aPar1 += ((SfxStringItem *)pItem)->GetValue();
212 : }
213 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
214 0 : FN_PARAM_3, sal_False, &pItem ))
215 0 : nCommand = ((SfxInt32Item*)pItem)->GetValue();
216 0 : aPar1 += DB_DELIM;
217 0 : aPar1 += String::CreateFromInt32(nCommand);
218 0 : aPar1 += DB_DELIM;
219 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
220 0 : FN_PARAM_2, sal_False, &pItem ))
221 : {
222 0 : aPar1 += ((SfxStringItem *)pItem)->GetValue();
223 : }
224 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
225 0 : FN_PARAM_FIELD_CONTENT, sal_False, &pItem ))
226 0 : aPar2 = ((SfxStringItem *)pItem)->GetValue();
227 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
228 0 : FN_PARAM_FIELD_FORMAT, sal_False, &pItem ))
229 0 : nFormat = ((SfxUInt32Item *)pItem)->GetValue();
230 : OSL_FAIL("Command is not yet used");
231 0 : sal_Unicode cSeparator = ' ';
232 0 : SwInsertFld_Data aData(nType, 0, aPar1, aPar2, nFormat, GetShellPtr(), cSeparator );
233 0 : bRes = aFldMgr.InsertFld(aData);
234 : }
235 0 : rReq.SetReturnValue(SfxBoolItem( nSlot, bRes ));
236 : }
237 0 : break;
238 : case FN_INSERT_FIELD_CTRL:
239 : case FN_INSERT_FIELD:
240 : {
241 0 : sal_Bool bRes = sal_False;
242 0 : if( pItem && nSlot != FN_INSERT_FIELD_CTRL)
243 : {
244 0 : sal_uLong nFormat = 0;
245 0 : sal_uInt16 nType = 0;
246 0 : sal_uInt16 nSubType = 0;
247 0 : String aPar1 = ((SfxStringItem *)pItem)->GetValue();
248 0 : String aPar2;
249 0 : sal_Unicode cSeparator = ' ';
250 :
251 0 : if( SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_FIELD_TYPE,
252 0 : sal_False, &pItem ))
253 0 : nType = ((SfxUInt16Item *)pItem)->GetValue();
254 0 : if( SFX_ITEM_SET == pArgs->GetItemState( FN_PARAM_FIELD_SUBTYPE,
255 0 : sal_False, &pItem ))
256 0 : nSubType = ((SfxUInt16Item *)pItem)->GetValue();
257 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
258 0 : FN_PARAM_FIELD_CONTENT, sal_False, &pItem ))
259 0 : aPar2 = ((SfxStringItem *)pItem)->GetValue();
260 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
261 0 : FN_PARAM_FIELD_FORMAT, sal_False, &pItem ))
262 0 : nFormat = ((SfxUInt32Item *)pItem)->GetValue();
263 0 : if( SFX_ITEM_SET == pArgs->GetItemState(
264 0 : FN_PARAM_3, sal_False, &pItem ))
265 : {
266 0 : String sTmp = ((SfxStringItem *)pItem)->GetValue();
267 0 : if(sTmp.Len())
268 0 : cSeparator = sTmp.GetChar(0);
269 : }
270 0 : SwInsertFld_Data aData(nType, nSubType, aPar1, aPar2, nFormat, GetShellPtr(), cSeparator );
271 0 : bRes = aFldMgr.InsertFld( aData );
272 : }
273 : else
274 : //#i5788# prevent closing of the field dialog while a modal dialog ( Input field dialog ) is active
275 0 : if(!GetView().GetViewFrame()->IsInModalMode())
276 : {
277 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
278 0 : pVFrame->ToggleChildWindow(FN_INSERT_FIELD);
279 0 : bRes = pVFrame->GetChildWindow( nSlot ) != 0;
280 0 : Invalidate(rReq.GetSlot());
281 0 : Invalidate(FN_INSERT_FIELD_CTRL);
282 0 : rReq.Ignore();
283 : }
284 0 : rReq.SetReturnValue(SfxBoolItem( nSlot, bRes ));
285 : }
286 0 : break;
287 :
288 : case FN_INSERT_REF_FIELD:
289 : {
290 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
291 0 : if (!pVFrame->HasChildWindow(FN_INSERT_FIELD))
292 0 : pVFrame->ToggleChildWindow(FN_INSERT_FIELD); // Dialog anzeigen
293 :
294 : // Flddlg auf neue TabPage umschalten
295 0 : sal_uInt16 nId = SwFldDlgWrapper::GetChildWindowId();
296 0 : SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->GetChildWindow(nId);
297 0 : if (pWrp)
298 0 : pWrp->ShowPage();
299 0 : rReq.Ignore();
300 : }
301 0 : break;
302 : case FN_DELETE_COMMENT:
303 0 : if ( GetView().GetPostItMgr() &&
304 0 : GetView().GetPostItMgr()->HasActiveSidebarWin() )
305 : {
306 0 : GetView().GetPostItMgr()->DeleteActiveSidebarWin();
307 : }
308 0 : break;
309 : case FN_DELETE_ALL_NOTES:
310 0 : if ( GetView().GetPostItMgr() )
311 0 : GetView().GetPostItMgr()->Delete();
312 0 : break;
313 : case FN_DELETE_NOTE_AUTHOR:
314 : {
315 0 : SFX_REQUEST_ARG( rReq, pNoteItem, SfxStringItem, nSlot, sal_False);
316 0 : if ( pNoteItem && GetView().GetPostItMgr() )
317 0 : GetView().GetPostItMgr()->Delete( pNoteItem->GetValue() );
318 : }
319 0 : break;
320 : case FN_HIDE_NOTE:
321 0 : if ( GetView().GetPostItMgr() &&
322 0 : GetView().GetPostItMgr()->HasActiveSidebarWin() )
323 : {
324 0 : GetView().GetPostItMgr()->HideActiveSidebarWin();
325 : }
326 0 : break;
327 : case FN_HIDE_ALL_NOTES:
328 0 : if ( GetView().GetPostItMgr() )
329 0 : GetView().GetPostItMgr()->Hide();
330 0 : break;
331 : case FN_HIDE_NOTE_AUTHOR:
332 : {
333 0 : SFX_REQUEST_ARG( rReq, pNoteItem, SfxStringItem, nSlot, sal_False);
334 0 : if ( pNoteItem && GetView().GetPostItMgr() )
335 0 : GetView().GetPostItMgr()->Hide( pNoteItem->GetValue() );
336 : }
337 0 : break;
338 : case FN_POSTIT:
339 : {
340 0 : SwPostItField* pPostIt = (SwPostItField*)aFldMgr.GetCurFld();
341 0 : sal_Bool bNew = !(pPostIt && pPostIt->GetTyp()->Which() == RES_POSTITFLD);
342 0 : if (bNew || GetView().GetPostItMgr()->IsAnswer())
343 : {
344 0 : SvtUserOptions aUserOpt;
345 0 : String sAuthor;
346 0 : if( !(sAuthor = aUserOpt.GetFullName()).Len())
347 0 : if( !(sAuthor = aUserOpt.GetID()).Len() )
348 0 : sAuthor = String( SW_RES( STR_REDLINE_UNKNOWN_AUTHOR ));
349 :
350 : // Save the current selection, it will be required later for fieldmark insertion.
351 0 : SwPaM& rCurrPam = rSh.GetCurrentShellCursor();
352 0 : SwPaM aSaved(*rCurrPam.GetPoint(), *rCurrPam.GetMark());
353 0 : if( rSh.HasSelection() )
354 : {
355 0 : rSh.NormalizePam(false);
356 0 : rSh.KillPams();
357 0 : rSh.ClearMark();
358 : }
359 0 : SwInsertFld_Data aData(TYP_POSTITFLD, 0, sAuthor, aEmptyStr, 0);
360 0 : aFldMgr.InsertFld(aData, &aSaved);
361 :
362 0 : rSh.Push();
363 0 : rSh.SwCrsrShell::Left(1, CRSR_SKIP_CHARS, sal_False);
364 0 : pPostIt = (SwPostItField*)aFldMgr.GetCurFld();
365 0 : rSh.Pop(sal_False); // Cursorpos restaurieren
366 : }
367 :
368 0 : if (pPostIt)
369 : {
370 0 : SwFieldType* pType = rSh.GetDoc()->GetFldType(RES_POSTITFLD, aEmptyStr,false);
371 0 : SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
372 0 : SwFmtFld* pSwFmtFld = aIter.First();
373 0 : while( pSwFmtFld )
374 : {
375 0 : if ( pSwFmtFld->GetFld() == pPostIt )
376 : {
377 0 : pSwFmtFld->Broadcast( SwFmtFldHint( 0, SWFMTFLD_FOCUS, &GetView() ) );
378 0 : break;
379 : }
380 0 : pSwFmtFld = aIter.Next();
381 0 : }
382 : }
383 : }
384 0 : break;
385 : case FN_REDLINE_COMMENT:
386 : {
387 : /* this code can be used once we want redline comments in the margin, all other stuff can
388 : then be deleted
389 : String sComment;
390 : const SwRedline *pRedline = rSh.GetCurrRedline();
391 :
392 : if (pRedline)
393 : {
394 : sComment = pRedline->GetComment();
395 : if ( !sComment.Len() )
396 : GetView().GetDocShell()->Broadcast(SwRedlineHint(pRedline,SWREDLINE_INSERTED));
397 : const_cast<SwRedline*>(pRedline)->Broadcast(SwRedlineHint(pRedline,SWREDLINE_FOCUS,&GetView()));
398 : }
399 : */
400 :
401 0 : const SwRedline *pRedline = rSh.GetCurrRedline();
402 :
403 0 : if (pRedline)
404 : {
405 0 : rtl::OUString sComment = convertLineEnd(pRedline->GetComment(), GetSystemLineEnd());
406 :
407 0 : sal_Bool bTravel = sal_False;
408 :
409 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
410 : OSL_ENSURE(pFact, "Dialogdiet fail!");
411 0 : ::DialogGetRanges fnGetRange = pFact->GetDialogGetRangesFunc( RID_SVXDLG_POSTIT );
412 : OSL_ENSURE(fnGetRange, "Dialogdiet fail! GetRanges()");
413 0 : SfxItemSet aSet(GetPool(), fnGetRange());
414 0 : aSet.Put(SvxPostItTextItem(sComment, SID_ATTR_POSTIT_TEXT));
415 0 : aSet.Put(SvxPostItAuthorItem(pRedline->GetAuthorString(), SID_ATTR_POSTIT_AUTHOR));
416 :
417 : aSet.Put( SvxPostItDateItem( GetAppLangDateTimeString(
418 0 : pRedline->GetRedlineData().GetTimeStamp() ),
419 0 : SID_ATTR_POSTIT_DATE ));
420 :
421 : // Traveling nur bei mehr als einem Feld
422 0 : rSh.StartAction();
423 :
424 0 : rSh.Push();
425 0 : const SwRedline *pActRed = rSh.SelPrevRedline();
426 :
427 0 : if (pActRed == pRedline)
428 : { // Neuer Cursor steht am Anfang des Current Redlines
429 0 : rSh.Pop(); // Alten Cursor wegwerfen
430 0 : rSh.Push();
431 0 : pActRed = rSh.SelPrevRedline();
432 : }
433 :
434 0 : sal_Bool bPrev = pActRed != 0;
435 0 : rSh.Pop(sal_False);
436 0 : rSh.EndAction();
437 :
438 0 : rSh.ClearMark();
439 0 : rSh.SelNextRedline(); // Aktueller Redline wird selektiert
440 :
441 0 : rSh.StartAction();
442 0 : rSh.Push();
443 0 : pActRed = rSh.SelNextRedline();
444 0 : sal_Bool bNext = pActRed != 0;
445 0 : rSh.Pop(sal_False); // Cursorpos restaurieren
446 :
447 0 : if( rSh.IsCrsrPtAtEnd() )
448 0 : rSh.SwapPam();
449 :
450 0 : rSh.EndAction();
451 :
452 0 : bTravel |= bNext|bPrev;
453 :
454 0 : SvxAbstractDialogFactory* pFact2 = SvxAbstractDialogFactory::Create();
455 : OSL_ENSURE(pFact2, "Dialogdiet fail!");
456 0 : AbstractSvxPostItDialog* pDlg = pFact2->CreateSvxPostItDialog( pMDI, aSet, bTravel, sal_True );
457 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
458 0 : pDlg->HideAuthor();
459 :
460 0 : String sTitle(SW_RES(STR_REDLINE_COMMENT));
461 0 : ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );
462 :
463 0 : pDlg->SetText(sTitle);
464 :
465 0 : if (bTravel)
466 : {
467 0 : pDlg->EnableTravel(bNext, bPrev);
468 0 : pDlg->SetPrevHdl(LINK(this, SwTextShell, RedlinePrevHdl));
469 0 : pDlg->SetNextHdl(LINK(this, SwTextShell, RedlineNextHdl));
470 : }
471 :
472 0 : rSh.SetCareWin(pDlg->GetWindow());
473 0 : bNoInterrupt = sal_True;
474 :
475 0 : if ( pDlg->Execute() == RET_OK )
476 : {
477 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
478 0 : String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());
479 :
480 : // Kommentar einfuegen bzw aendern
481 0 : rSh.SetRedlineComment(sMsg);
482 : }
483 :
484 0 : delete pDlg;
485 0 : rSh.SetCareWin(NULL);
486 0 : bNoInterrupt = sal_False;
487 0 : rSh.ClearMark();
488 0 : GetView().AttrChangedNotify(GetShellPtr());
489 : }
490 : }
491 0 : break;
492 :
493 : case FN_JAVAEDIT:
494 : {
495 0 : rtl::OUString aType, aText;
496 0 : sal_Bool bIsUrl=sal_False;
497 0 : sal_Bool bNew=sal_False, bUpdate=sal_False;
498 0 : SwFldMgr* pMgr = new SwFldMgr;
499 0 : if ( pItem )
500 : {
501 0 : aText = ((SfxStringItem*)pItem)->GetValue();
502 0 : SFX_REQUEST_ARG( rReq, pType, SfxStringItem, FN_PARAM_2 , sal_False );
503 0 : SFX_REQUEST_ARG( rReq, pIsUrl, SfxBoolItem, FN_PARAM_1 , sal_False );
504 0 : if ( pType )
505 0 : aType = pType->GetValue();
506 0 : if ( pIsUrl )
507 0 : bIsUrl = pIsUrl->GetValue();
508 :
509 0 : SwScriptField* pFld = (SwScriptField*)pMgr->GetCurFld();
510 0 : bNew = !pFld || !(pFld->GetTyp()->Which() == RES_SCRIPTFLD);
511 0 : bUpdate = pFld && ( bIsUrl != pFld->GetFormat() || pFld->GetPar2() != aType || pFld->GetPar1() != aText );
512 : }
513 : else
514 : {
515 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
516 : OSL_ENSURE(pFact, "Dialogdiet fail!");
517 0 : AbstractJavaEditDialog* pDlg = pFact->CreateJavaEditDialog(pMDI, &rSh);
518 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
519 0 : if ( pDlg->Execute() )
520 : {
521 0 : aType = pDlg->GetType();
522 0 : aText = pDlg->GetText();
523 0 : bIsUrl = pDlg->IsUrl();
524 0 : bNew = pDlg->IsNew();
525 0 : bUpdate = pDlg->IsUpdate();
526 0 : rReq.AppendItem( SfxStringItem( FN_JAVAEDIT, aText ) );
527 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_2, aType ) );
528 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bIsUrl ) );
529 : }
530 :
531 0 : delete pDlg;
532 : }
533 :
534 0 : if( bNew )
535 : {
536 0 : SwInsertFld_Data aData(TYP_SCRIPTFLD, 0, aType, aText, bIsUrl);
537 0 : pMgr->InsertFld(aData);
538 0 : rReq.Done();
539 : }
540 0 : else if( bUpdate )
541 : {
542 0 : pMgr->UpdateCurFld( bIsUrl, aType, aText );
543 0 : rSh.SetUndoNoResetModified();
544 0 : rReq.Done();
545 : }
546 : else
547 0 : rReq.Ignore();
548 : }
549 0 : break;
550 :
551 : case FN_INSERT_FLD_DATE :
552 0 : nInsertType = TYP_DATEFLD;
553 0 : bIsText = sal_False;
554 0 : goto FIELD_INSERT;
555 : case FN_INSERT_FLD_TIME :
556 0 : nInsertType = TYP_TIMEFLD;
557 0 : bIsText = sal_False;
558 0 : goto FIELD_INSERT;
559 : case FN_INSERT_FLD_PGNUMBER:
560 0 : nInsertType = TYP_PAGENUMBERFLD;
561 0 : nInsertFormat = SVX_NUM_PAGEDESC; // wie Seitenvorlage
562 0 : bIsText = sal_False;
563 0 : goto FIELD_INSERT;
564 : case FN_INSERT_FLD_PGCOUNT :
565 0 : nInsertType = TYP_DOCSTATFLD;
566 0 : nInsertSubType = 0;
567 0 : bIsText = sal_False;
568 0 : nInsertFormat = SVX_NUM_PAGEDESC;
569 0 : goto FIELD_INSERT;
570 : case FN_INSERT_FLD_TOPIC :
571 0 : nInsertType = TYP_DOCINFOFLD;
572 0 : nInsertSubType = DI_THEMA;
573 0 : goto FIELD_INSERT;
574 : case FN_INSERT_FLD_TITLE :
575 0 : nInsertType = TYP_DOCINFOFLD;
576 0 : nInsertSubType = DI_TITEL;
577 0 : goto FIELD_INSERT;
578 : case FN_INSERT_FLD_AUTHOR :
579 0 : nInsertType = TYP_DOCINFOFLD;
580 0 : nInsertSubType = DI_CREATE|DI_SUB_AUTHOR;
581 :
582 : FIELD_INSERT:
583 : {
584 : //format conversion should only be done for number formatter formats
585 0 : if(!nInsertFormat)
586 0 : nInsertFormat = aFldMgr.GetDefaultFormat(nInsertType, bIsText, rSh.GetNumberFormatter());
587 : SwInsertFld_Data aData(nInsertType, nInsertSubType,
588 0 : aEmptyStr, aEmptyStr, nInsertFormat);
589 0 : aFldMgr.InsertFld(aData);
590 0 : rReq.Done();
591 : }
592 0 : break;
593 : default:
594 : OSL_FAIL("wrong dispatcher");
595 0 : return;
596 0 : }
597 : }
598 : }
599 :
600 0 : void SwTextShell::StateField( SfxItemSet &rSet )
601 : {
602 0 : SwWrtShell& rSh = GetShell();
603 0 : SfxWhichIter aIter( rSet );
604 0 : const SwField* pField = 0;
605 0 : int bGetField = sal_False;
606 0 : sal_uInt16 nWhich = aIter.FirstWhich();
607 :
608 0 : while (nWhich)
609 : {
610 0 : switch (nWhich)
611 : {
612 : case FN_DELETE_COMMENT:
613 : case FN_DELETE_NOTE_AUTHOR:
614 : case FN_DELETE_ALL_NOTES:
615 : case FN_HIDE_NOTE:
616 : case FN_HIDE_NOTE_AUTHOR:
617 : case FN_HIDE_ALL_NOTES:
618 : {
619 0 : SwPostItMgr* pPostItMgr = GetView().GetPostItMgr();
620 0 : if ( !pPostItMgr )
621 0 : rSet.InvalidateItem( nWhich );
622 0 : else if ( !pPostItMgr->HasActiveSidebarWin() )
623 : {
624 0 : rSet.InvalidateItem( FN_DELETE_COMMENT );
625 0 : rSet.InvalidateItem( FN_HIDE_NOTE );
626 : }
627 : }
628 0 : break;
629 : case FN_EDIT_FIELD:
630 : {
631 :
632 0 : if( !bGetField )
633 : {
634 0 : pField = rSh.GetCurFld();
635 0 : bGetField = sal_True;
636 : }
637 :
638 0 : sal_uInt16 nTempWhich = pField ? pField->GetTyp()->Which() : USHRT_MAX;
639 0 : if( USHRT_MAX == nTempWhich ||
640 : RES_POSTITFLD == nTempWhich ||
641 : RES_SCRIPTFLD == nTempWhich ||
642 : RES_AUTHORITY == nTempWhich )
643 0 : rSet.DisableItem( nWhich );
644 0 : else if( RES_DDEFLD == nTempWhich &&
645 0 : !((SwDDEFieldType*)pField->GetTyp())->GetBaseLink().IsVisible())
646 : {
647 : // nested links cannot be edited
648 0 : rSet.DisableItem( nWhich );
649 : }
650 : }
651 0 : break;
652 : case FN_EXECUTE_MACROFIELD:
653 : {
654 0 : if(!bGetField)
655 : {
656 0 : pField = rSh.GetCurFld();
657 0 : bGetField = sal_True;
658 : }
659 0 : if(!pField || pField->GetTyp()->Which() != RES_MACROFLD)
660 0 : rSet.DisableItem(nWhich);
661 : }
662 0 : break;
663 :
664 : case FN_INSERT_FIELD:
665 : {
666 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
667 : //#i5788# prevent closing of the field dialog while a modal dialog ( Input field dialog ) is active
668 0 : if(!pVFrame->IsInModalMode() &&
669 0 : pVFrame->KnowsChildWindow(FN_INSERT_FIELD) && !pVFrame->HasChildWindow(FN_INSERT_FIELD_DATA_ONLY) )
670 0 : rSet.Put(SfxBoolItem( FN_INSERT_FIELD, pVFrame->HasChildWindow(nWhich)));
671 : else
672 0 : rSet.DisableItem(FN_INSERT_FIELD);
673 : }
674 0 : break;
675 : case FN_INSERT_REF_FIELD:
676 : {
677 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
678 0 : if (!pVFrame->KnowsChildWindow(FN_INSERT_FIELD))
679 0 : rSet.DisableItem(FN_INSERT_REF_FIELD);
680 : }
681 0 : break;
682 : case FN_INSERT_FIELD_CTRL:
683 0 : rSet.Put(SfxBoolItem( nWhich, GetView().GetViewFrame()->HasChildWindow(FN_INSERT_FIELD)));
684 0 : break;
685 : case FN_REDLINE_COMMENT:
686 0 : if (!rSh.GetCurrRedline())
687 0 : rSet.DisableItem(nWhich);
688 0 : break;
689 : case FN_POSTIT :
690 : case FN_JAVAEDIT :
691 0 : sal_Bool bCurField = sal_False;
692 0 : pField = rSh.GetCurFld();
693 0 : if(nWhich == FN_POSTIT)
694 0 : bCurField = pField && pField->GetTyp()->Which() == RES_POSTITFLD;
695 : else
696 0 : bCurField = pField && pField->GetTyp()->Which() == RES_SCRIPTFLD;
697 :
698 0 : if(!bCurField && rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel() )
699 0 : rSet.DisableItem(nWhich);
700 0 : break;
701 : }
702 0 : nWhich = aIter.NextWhich();
703 0 : }
704 0 : }
705 :
706 0 : void SwTextShell::InsertHyperlink(const SvxHyperlinkItem& rHlnkItem)
707 : {
708 0 : const String& rName = rHlnkItem.GetName();
709 0 : const String& rURL = rHlnkItem.GetURL();
710 0 : const String& rTarget = rHlnkItem.GetTargetFrame();
711 0 : sal_uInt16 nType = (sal_uInt16)rHlnkItem.GetInsertMode();
712 0 : nType &= ~HLINK_HTMLMODE;
713 0 : const SvxMacroTableDtor* pMacroTbl = rHlnkItem.GetMacroTbl();
714 :
715 0 : SwWrtShell& rSh = GetShell();
716 :
717 0 : if( rSh.GetSelectionType() & nsSelectionType::SEL_TXT )
718 : {
719 0 : rSh.StartAction();
720 0 : SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
721 0 : rSh.GetCurAttr( aSet );
722 :
723 : const SfxPoolItem* pItem;
724 0 : if(SFX_ITEM_SET == aSet.GetItemState(RES_TXTATR_INETFMT, sal_False, &pItem))
725 : {
726 : // Links selektieren
727 0 : rSh.SwCrsrShell::SelectTxtAttr(RES_TXTATR_INETFMT, sal_False);
728 : }
729 0 : switch (nType)
730 : {
731 : case HLINK_DEFAULT:
732 : case HLINK_FIELD:
733 : {
734 0 : SwFmtINetFmt aINetFmt( rURL, rTarget );
735 0 : aINetFmt.SetName(rHlnkItem.GetIntName());
736 0 : if(pMacroTbl)
737 : {
738 0 : const SvxMacro *pMacro = pMacroTbl->Get( SFX_EVENT_MOUSEOVER_OBJECT );
739 0 : if( pMacro )
740 0 : aINetFmt.SetMacro(SFX_EVENT_MOUSEOVER_OBJECT, *pMacro);
741 0 : pMacro = pMacroTbl->Get( SFX_EVENT_MOUSECLICK_OBJECT );
742 0 : if( pMacro )
743 0 : aINetFmt.SetMacro(SFX_EVENT_MOUSECLICK_OBJECT, *pMacro);
744 0 : pMacro = pMacroTbl->Get( SFX_EVENT_MOUSEOUT_OBJECT );
745 0 : if( pMacro )
746 0 : aINetFmt.SetMacro(SFX_EVENT_MOUSEOUT_OBJECT, *pMacro);
747 : }
748 0 : rSh.SttSelect();
749 0 : rSh.InsertURL( aINetFmt, rName, sal_True );
750 0 : rSh.EndSelect();
751 : }
752 0 : break;
753 :
754 : case HLINK_BUTTON:
755 0 : sal_Bool bSel = rSh.HasSelection();
756 0 : if(bSel)
757 0 : rSh.DelRight();
758 0 : InsertURLButton( rURL, rTarget, rName );
759 0 : rSh.EnterStdMode();
760 0 : break;
761 : }
762 0 : rSh.EndAction();
763 : }
764 0 : }
765 :
766 0 : IMPL_LINK( SwTextShell, RedlineNextHdl, AbstractSvxPostItDialog *, pBtn )
767 : {
768 0 : SwWrtShell* pSh = GetShellPtr();
769 0 : AbstractSvxPostItDialog *pDlg = (AbstractSvxPostItDialog*)pBtn;
770 :
771 : // Kommentar einfuegen bzw aendern
772 0 : pSh->SetRedlineComment(pDlg->GetNote());
773 :
774 0 : const SwRedline *pRedline = pSh->GetCurrRedline();
775 :
776 0 : if (pRedline)
777 : {
778 : // Traveling nur bei mehr als einem Feld
779 0 : if( !pSh->IsCrsrPtAtEnd() )
780 0 : pSh->SwapPam(); // Cursor hinter den Redline stellen
781 :
782 0 : pSh->Push();
783 0 : const SwRedline *pActRed = pSh->SelNextRedline();
784 0 : pSh->Pop(pActRed != 0);
785 :
786 0 : sal_Bool bEnable = sal_False;
787 :
788 0 : if (pActRed)
789 : {
790 0 : pSh->StartAction();
791 0 : pSh->Push();
792 0 : bEnable = pSh->SelNextRedline() != 0;
793 0 : pSh->Pop(sal_False);
794 0 : pSh->EndAction();
795 : }
796 :
797 0 : pDlg->EnableTravel(bEnable, sal_True);
798 :
799 0 : if( pSh->IsCrsrPtAtEnd() )
800 0 : pSh->SwapPam();
801 :
802 0 : pRedline = pSh->GetCurrRedline();
803 0 : rtl::OUString sComment = convertLineEnd(pRedline->GetComment(), GetSystemLineEnd());
804 :
805 0 : pDlg->SetNote(sComment);
806 0 : pDlg->ShowLastAuthor( pRedline->GetAuthorString(),
807 : GetAppLangDateTimeString(
808 0 : pRedline->GetRedlineData().GetTimeStamp() ));
809 :
810 0 : String sTitle(SW_RES(STR_REDLINE_COMMENT));
811 0 : ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );
812 :
813 0 : pDlg->SetText(sTitle);
814 : }
815 :
816 0 : return 0;
817 : }
818 :
819 0 : IMPL_LINK( SwTextShell, RedlinePrevHdl, AbstractSvxPostItDialog *, pBtn )
820 : {
821 0 : SwWrtShell* pSh = GetShellPtr();
822 0 : AbstractSvxPostItDialog *pDlg = (AbstractSvxPostItDialog*)pBtn;
823 :
824 : // Kommentar einfuegen bzw aendern
825 0 : pSh->SetRedlineComment(pDlg->GetNote());
826 :
827 0 : const SwRedline *pRedline = pSh->GetCurrRedline();
828 :
829 0 : if (pRedline)
830 : {
831 : // Traveling nur bei mehr als einem Feld
832 0 : pSh->Push();
833 0 : const SwRedline *pActRed = pSh->SelPrevRedline();
834 0 : pSh->Pop(pActRed != 0);
835 :
836 0 : sal_Bool bEnable = sal_False;
837 :
838 0 : if (pActRed)
839 : {
840 0 : pSh->StartAction();
841 0 : pSh->Push();
842 0 : bEnable = pSh->SelPrevRedline() != 0;
843 0 : pSh->Pop(sal_False);
844 0 : pSh->EndAction();
845 : }
846 :
847 0 : pDlg->EnableTravel(sal_True, bEnable);
848 :
849 0 : pRedline = pSh->GetCurrRedline();
850 0 : rtl::OUString sComment = convertLineEnd(pRedline->GetComment(), GetSystemLineEnd());
851 :
852 0 : pDlg->SetNote(sComment);
853 0 : pDlg->ShowLastAuthor(pRedline->GetAuthorString(),
854 : GetAppLangDateTimeString(
855 0 : pRedline->GetRedlineData().GetTimeStamp() ));
856 :
857 0 : String sTitle(SW_RES(STR_REDLINE_COMMENT));
858 0 : ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );
859 :
860 0 : pDlg->SetText(sTitle);
861 : }
862 :
863 0 : return 0;
864 30 : }
865 :
866 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|