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 <hintids.hxx>
21 :
22 : #include <vcl/menu.hxx>
23 : #include <vcl/layout.hxx>
24 : #include <vcl/help.hxx>
25 : #include <vcl/builderfactory.hxx>
26 : #include <svl/stritem.hxx>
27 : #include <unotools/pathoptions.hxx>
28 : #include <unotools/lingucfg.hxx>
29 : #include <sfx2/request.hxx>
30 : #include <sfx2/fcontnr.hxx>
31 :
32 : #include <svx/svxdlg.hxx>
33 : #include <svx/dialogs.hrc>
34 : #include <editeng/acorrcfg.hxx>
35 : #include <sfx2/viewfrm.hxx>
36 : #include <unocrsr.hxx>
37 : #include <unotools.hxx>
38 : #include <comphelper/processfactory.hxx>
39 : #include <comphelper/string.hxx>
40 : #include <ucbhelper/content.hxx>
41 : #include <com/sun/star/text/AutoTextContainer.hpp>
42 : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
43 : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
44 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
45 : #include <svl/urihelper.hxx>
46 : #include <unotools/charclass.hxx>
47 : #include <svtools/treelistentry.hxx>
48 : #include <swwait.hxx>
49 : #include <swtypes.hxx>
50 : #include <wrtsh.hxx>
51 : #include <view.hxx>
52 : #include <basesh.hxx>
53 : #include <glossary.hxx>
54 : #include <gloshdl.hxx>
55 : #include <glosbib.hxx>
56 : #include <initui.hxx>
57 : #include <glosdoc.hxx>
58 : #include <macassgn.hxx>
59 : #include <swevent.hxx>
60 : #include <docsh.hxx>
61 : #include <shellio.hxx>
62 :
63 : #include <cmdid.h>
64 : #include <helpid.h>
65 : #include <swerror.h>
66 : #include <globals.hrc>
67 : #include <misc.hrc>
68 : #include <swmodule.hxx>
69 : #include <sfx2/filedlghelper.hxx>
70 :
71 : #include <boost/scoped_ptr.hpp>
72 :
73 : #include "access.hrc"
74 :
75 : using namespace ::com::sun::star;
76 : using namespace ::com::sun::star::lang;
77 : using namespace ::com::sun::star::uno;
78 : using namespace ::com::sun::star::text;
79 : using namespace ::com::sun::star::ucb;
80 : using namespace ::com::sun::star::ui::dialogs;
81 : using namespace ::ucbhelper;
82 : using namespace ::sfx2;
83 :
84 0 : static OUString lcl_GetValidShortCut( const OUString& rName )
85 : {
86 0 : const sal_Int32 nSz = rName.getLength();
87 :
88 0 : if ( 0 == nSz )
89 0 : return rName;
90 :
91 0 : sal_Int32 nStart = 1;
92 0 : while( rName[nStart-1]==' ' && nStart < nSz )
93 0 : nStart++;
94 :
95 0 : OUString aBuf = OUString(rName[nStart-1]);
96 :
97 0 : for( ; nStart < nSz; ++nStart )
98 : {
99 0 : if( rName[nStart-1]==' ' && rName[nStart]!=' ')
100 0 : aBuf += OUString(rName[nStart]);
101 : }
102 0 : return aBuf;
103 : }
104 :
105 0 : struct GroupUserData
106 : {
107 : OUString sGroupName;
108 : sal_uInt16 nPathIdx;
109 : bool bReadonly;
110 :
111 0 : GroupUserData()
112 : : nPathIdx(0),
113 0 : bReadonly(false) {}
114 : };
115 :
116 : // dialog for new block name
117 : class SwNewGlosNameDlg : public ModalDialog
118 : {
119 : VclPtr<Edit> m_pNewName;
120 : TextFilter m_aNoSpaceFilter;
121 : VclPtr<Edit> m_pNewShort;
122 : VclPtr<OKButton> m_pOk;
123 : VclPtr<Edit> m_pOldName;
124 : VclPtr<Edit> m_pOldShort;
125 :
126 : protected:
127 : DECL_LINK( Modify, Edit * );
128 : DECL_LINK(Rename, void *);
129 :
130 : public:
131 : SwNewGlosNameDlg( vcl::Window* pParent,
132 : const OUString& rOldName,
133 : const OUString& rOldShort );
134 : virtual ~SwNewGlosNameDlg();
135 : virtual void dispose() SAL_OVERRIDE;
136 :
137 0 : OUString GetNewName() const { return m_pNewName->GetText(); }
138 0 : OUString GetNewShort() const { return m_pNewShort->GetText(); }
139 : };
140 :
141 0 : SwNewGlosNameDlg::SwNewGlosNameDlg(vcl::Window* pParent,
142 : const OUString& rOldName,
143 : const OUString& rOldShort )
144 : : ModalDialog(pParent, "RenameAutoTextDialog",
145 0 : "modules/swriter/ui/renameautotextdialog.ui")
146 : {
147 0 : get(m_pNewName, "newname");
148 0 : get(m_pNewShort, "newsc");
149 0 : m_pNewShort->SetTextFilter(&m_aNoSpaceFilter);
150 0 : get(m_pOk, "ok");
151 0 : get(m_pOldName, "oldname");
152 0 : get(m_pOldShort, "oldsc");
153 :
154 0 : m_pOldName->SetText( rOldName );
155 0 : m_pOldShort->SetText( rOldShort );
156 0 : m_pNewName->SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
157 0 : m_pNewShort->SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
158 0 : m_pOk->SetClickHdl(LINK(this, SwNewGlosNameDlg, Rename ));
159 0 : m_pNewName->GrabFocus();
160 0 : }
161 :
162 0 : SwNewGlosNameDlg::~SwNewGlosNameDlg()
163 : {
164 0 : disposeOnce();
165 0 : }
166 :
167 0 : void SwNewGlosNameDlg::dispose()
168 : {
169 0 : m_pNewName.clear();
170 0 : m_pNewShort.clear();
171 0 : m_pOk.clear();
172 0 : m_pOldName.clear();
173 0 : m_pOldShort.clear();
174 0 : ModalDialog::dispose();
175 0 : }
176 :
177 : // query / set currently set group
178 0 : OUString SwGlossaryDlg::GetCurrGroup()
179 : {
180 0 : if( !::GetCurrGlosGroup().isEmpty() )
181 0 : return ::GetCurrGlosGroup();
182 0 : return SwGlossaries::GetDefName();
183 : }
184 :
185 0 : void SwGlossaryDlg::SetActGroup(const OUString &rGrp)
186 : {
187 0 : ::SetCurrGlosGroup(rGrp);
188 0 : }
189 :
190 0 : SwGlossaryDlg::SwGlossaryDlg(SfxViewFrame* pViewFrame,
191 : SwGlossaryHdl * pGlosHdl, SwWrtShell *pWrtShell)
192 0 : : SvxStandardDialog(&pViewFrame->GetWindow(), "AutoTextDialog",
193 : "modules/swriter/ui/autotext.ui")
194 : , sReadonlyPath(SW_RESSTR(STR_READONLY_PATH))
195 : , pExampleFrame(0)
196 : , pGlossaryHdl(pGlosHdl)
197 : , bResume(false)
198 0 : , bSelection(pWrtShell->IsSelection())
199 : , bReadOnly(false)
200 : , bIsOld(false)
201 : , bIsDocReadOnly(false)
202 0 : , pSh(pWrtShell)
203 : {
204 0 : get(m_pInsertTipCB, "inserttip");
205 0 : get(m_pNameED, "name");
206 0 : get(m_pShortNameLbl, "shortnameft");
207 0 : get(m_pShortNameEdit, "shortname");
208 0 : m_pShortNameEdit->SetTextFilter(&m_aNoSpaceFilter);
209 0 : get(m_pCategoryBox, "category");
210 0 : get(m_pFileRelCB, "relfile");
211 0 : get(m_pNetRelCB, "relnet");
212 0 : get(m_pInsertBtn, "insert");
213 0 : get(m_pBibBtn, "categories");
214 0 : get(m_pPathBtn, "path");
215 0 : get(m_pExampleWIN, "example");
216 0 : get(m_pEditBtn, "autotext");
217 :
218 0 : SvtLinguConfig aLocalLinguConfig;
219 :
220 0 : PopupMenu *pMenu = m_pEditBtn->GetPopupMenu();
221 : assert(pMenu);
222 0 : pMenu->SetActivateHdl(LINK(this,SwGlossaryDlg,EnableHdl));
223 0 : pMenu->SetSelectHdl(LINK(this,SwGlossaryDlg,MenuHdl));
224 0 : m_pEditBtn->SetSelectHdl(LINK(this,SwGlossaryDlg,EditHdl));
225 0 : m_pPathBtn->SetClickHdl(LINK(this, SwGlossaryDlg, PathHdl));
226 :
227 0 : m_pNameED->SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
228 0 : m_pShortNameEdit->SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
229 :
230 0 : m_pCategoryBox->SetDoubleClickHdl(LINK(this,SwGlossaryDlg, NameDoubleClick));
231 0 : m_pCategoryBox->SetSelectHdl(LINK(this,SwGlossaryDlg,GrpSelect));
232 0 : m_pBibBtn->SetClickHdl(LINK(this,SwGlossaryDlg,BibHdl));
233 :
234 0 : m_pInsertBtn->SetClickHdl(LINK(this,SwGlossaryDlg,InsertHdl));
235 :
236 0 : ShowPreview();
237 :
238 0 : bIsDocReadOnly = pSh->GetView().GetDocShell()->IsReadOnly() ||
239 0 : pSh->HasReadonlySel();
240 0 : if( bIsDocReadOnly )
241 0 : m_pInsertBtn->Enable(false);
242 0 : m_pNameED->GrabFocus();
243 0 : m_pCategoryBox->SetStyle(m_pCategoryBox->GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL|WB_VSCROLL|WB_CLIPCHILDREN|WB_SORT);
244 0 : m_pCategoryBox->GetModel()->SetSortMode(SortAscending);
245 0 : m_pCategoryBox->SetHighlightRange(); // select over full width
246 0 : m_pCategoryBox->SetNodeDefaultImages( );
247 :
248 0 : Init();
249 0 : }
250 :
251 0 : SwGlossaryDlg::~SwGlossaryDlg()
252 : {
253 0 : disposeOnce();
254 0 : }
255 :
256 0 : void SwGlossaryDlg::dispose()
257 : {
258 0 : m_pCategoryBox->Clear();
259 0 : delete pExampleFrame;
260 0 : m_pInsertTipCB.clear();
261 0 : m_pNameED.clear();
262 0 : m_pShortNameLbl.clear();
263 0 : m_pShortNameEdit.clear();
264 0 : m_pCategoryBox.clear();
265 0 : m_pFileRelCB.clear();
266 0 : m_pNetRelCB.clear();
267 0 : m_pExampleWIN.clear();
268 0 : m_pInsertBtn.clear();
269 0 : m_pEditBtn.clear();
270 0 : m_pBibBtn.clear();
271 0 : m_pPathBtn.clear();
272 0 : SvxStandardDialog::dispose();
273 0 : }
274 :
275 : // select new group
276 0 : IMPL_LINK( SwGlossaryDlg, GrpSelect, SvTreeListBox *, pBox )
277 : {
278 0 : SvTreeListEntry* pEntry = pBox->FirstSelected();
279 0 : if(!pEntry)
280 0 : return 0;
281 0 : SvTreeListEntry* pParent = pBox->GetParent(pEntry) ? pBox->GetParent(pEntry) : pEntry;
282 0 : GroupUserData* pGroupData = static_cast<GroupUserData*>(pParent->GetUserData());
283 : ::SetCurrGlosGroup(pGroupData->sGroupName
284 0 : + OUStringLiteral1<GLOS_DELIM>()
285 0 : + OUString::number(pGroupData->nPathIdx));
286 0 : pGlossaryHdl->SetCurGroup(::GetCurrGlosGroup());
287 : // set current text block
288 0 : bReadOnly = pGlossaryHdl->IsReadOnly();
289 0 : EnableShortName( !bReadOnly );
290 0 : m_pEditBtn->Enable(!bReadOnly);
291 0 : bIsOld = pGlossaryHdl->IsOld();
292 0 : if( pParent != pEntry)
293 : {
294 0 : OUString aName(pBox->GetEntryText(pEntry));
295 0 : m_pNameED->SetText(aName);
296 0 : m_pShortNameEdit->SetText(*static_cast<OUString*>(pEntry->GetUserData()));
297 0 : m_pInsertBtn->Enable( !bIsDocReadOnly);
298 0 : ShowAutoText(::GetCurrGlosGroup(), m_pShortNameEdit->GetText());
299 : }
300 : else
301 : {
302 0 : m_pNameED->SetText("");
303 0 : m_pShortNameEdit->SetText("");
304 0 : m_pShortNameEdit->Enable(false);
305 0 : ShowAutoText("", "");
306 : }
307 : // update controls
308 0 : NameModify(m_pShortNameEdit);
309 0 : if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
310 : {
311 0 : SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_SET_ACT_GLOSSARY );
312 0 : OUString sTemp(::GetCurrGlosGroup());
313 : // the zeroth path is not being recorded!
314 0 : if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
315 0 : sTemp = sTemp.getToken(0, GLOS_DELIM);
316 0 : aReq.AppendItem(SfxStringItem(FN_SET_ACT_GLOSSARY, sTemp));
317 0 : aReq.Done();
318 : }
319 0 : return 0;
320 : }
321 :
322 0 : void SwGlossaryDlg::Apply()
323 : {
324 0 : const OUString aGlosName(m_pShortNameEdit->GetText());
325 0 : if (!aGlosName.isEmpty())
326 : {
327 0 : pGlossaryHdl->InsertGlossary(aGlosName);
328 : }
329 0 : if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
330 : {
331 0 : SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_INSERT_GLOSSARY );
332 0 : OUString sTemp(::GetCurrGlosGroup());
333 : // the zeroth path is not being recorded!
334 0 : if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
335 0 : sTemp = sTemp.getToken(0, GLOS_DELIM);
336 0 : aReq.AppendItem(SfxStringItem(FN_INSERT_GLOSSARY, sTemp));
337 0 : aReq.AppendItem(SfxStringItem(FN_PARAM_1, aGlosName));
338 0 : aReq.Done();
339 0 : }
340 0 : }
341 :
342 0 : void SwGlossaryDlg::EnableShortName(bool bOn)
343 : {
344 0 : m_pShortNameLbl->Enable(bOn);
345 0 : m_pShortNameEdit->Enable(bOn);
346 0 : }
347 :
348 : // does the title exist in the selected group?
349 0 : SvTreeListEntry* SwGlossaryDlg::DoesBlockExist(const OUString& rBlock,
350 : const OUString& rShort)
351 : {
352 : // look for possible entry in TreeListBox
353 0 : SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
354 0 : if(pEntry)
355 : {
356 0 : if(m_pCategoryBox->GetParent(pEntry))
357 0 : pEntry = m_pCategoryBox->GetParent(pEntry);
358 0 : sal_uInt32 nChildCount = m_pCategoryBox->GetChildCount( pEntry );
359 0 : for(sal_uInt32 i = 0; i < nChildCount; i++)
360 : {
361 0 : SvTreeListEntry* pChild = m_pCategoryBox->GetEntry( pEntry, i );
362 0 : if (rBlock == m_pCategoryBox->GetEntryText(pChild) &&
363 0 : (rShort.isEmpty() ||
364 0 : rShort==*static_cast<OUString*>(pChild->GetUserData()))
365 : )
366 : {
367 0 : return pChild;
368 : }
369 : }
370 : }
371 0 : return 0;
372 : }
373 :
374 0 : IMPL_LINK( SwGlossaryDlg, NameModify, Edit *, pEdit )
375 : {
376 0 : const OUString aName(m_pNameED->GetText());
377 0 : bool bNameED = pEdit == m_pNameED;
378 0 : if( aName.isEmpty() )
379 : {
380 0 : if(bNameED)
381 0 : m_pShortNameEdit->SetText(aName);
382 0 : m_pInsertBtn->Enable(false);
383 0 : return 0;
384 : }
385 0 : const bool bNotFound = !DoesBlockExist(aName, bNameED ? OUString() : pEdit->GetText());
386 0 : if(bNameED)
387 : {
388 : // did the text get in to the Listbbox in the Edit with a click?
389 0 : if(bNotFound)
390 : {
391 0 : m_pShortNameEdit->SetText( lcl_GetValidShortCut( aName ) );
392 0 : EnableShortName();
393 : }
394 : else
395 : {
396 0 : m_pShortNameEdit->SetText(pGlossaryHdl->GetGlossaryShortName(aName));
397 0 : EnableShortName(!bReadOnly);
398 : }
399 0 : m_pInsertBtn->Enable(!bNotFound && !bIsDocReadOnly);
400 : }
401 : else
402 : {
403 : //ShortNameEdit
404 0 : if(!bNotFound)
405 : {
406 0 : bool bEnable = !bNotFound;
407 0 : bEnable &= !bIsDocReadOnly;
408 0 : m_pInsertBtn->Enable(bEnable);
409 : }
410 : }
411 0 : return 0;
412 : }
413 :
414 0 : IMPL_LINK( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox )
415 : {
416 0 : SvTreeListEntry* pEntry = pBox->FirstSelected();
417 0 : if(pBox->GetParent(pEntry) && !bIsDocReadOnly)
418 0 : EndDialog( RET_OK );
419 0 : return 0;
420 : }
421 :
422 0 : IMPL_LINK_TYPED( SwGlossaryDlg, EnableHdl, Menu *, pMn, bool )
423 : {
424 0 : SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
425 :
426 0 : const OUString aEditText(m_pNameED->GetText());
427 0 : const bool bHasEntry = !aEditText.isEmpty() && !m_pShortNameEdit->GetText().isEmpty();
428 0 : const bool bExists = 0 != DoesBlockExist(aEditText, m_pShortNameEdit->GetText());
429 0 : const bool bIsGroup = pEntry && !m_pCategoryBox->GetParent(pEntry);
430 0 : pMn->EnableItem("new", bSelection && bHasEntry && !bExists);
431 0 : pMn->EnableItem("newtext", bSelection && bHasEntry && !bExists);
432 0 : pMn->EnableItem("copy", bExists && !bIsGroup);
433 0 : pMn->EnableItem("replace", bSelection && bExists && !bIsGroup && !bIsOld );
434 0 : pMn->EnableItem("replacetext", bSelection && bExists && !bIsGroup && !bIsOld );
435 0 : pMn->EnableItem("edit", bExists && !bIsGroup );
436 0 : pMn->EnableItem("rename", bExists && !bIsGroup );
437 0 : pMn->EnableItem("delete", bExists && !bIsGroup );
438 0 : pMn->EnableItem("macro", bExists && !bIsGroup && !bIsOld &&
439 0 : !pGlossaryHdl->IsReadOnly() );
440 0 : pMn->EnableItem("import", bIsGroup && !bIsOld && !pGlossaryHdl->IsReadOnly() );
441 0 : return true;
442 : }
443 :
444 0 : IMPL_LINK( SwGlossaryDlg, MenuHdl, Menu *, pMn )
445 : {
446 0 : OString sItemIdent(pMn->GetCurItemIdent());
447 :
448 0 : if (sItemIdent == "replace")
449 : {
450 0 : pGlossaryHdl->NewGlossary(m_pNameED->GetText(),
451 0 : m_pShortNameEdit->GetText(),
452 0 : false, false);
453 : }
454 0 : else if (sItemIdent == "replacetext")
455 : {
456 0 : pGlossaryHdl->NewGlossary(m_pNameED->GetText(),
457 0 : m_pShortNameEdit->GetText(),
458 0 : false, true);
459 : }
460 0 : else if (sItemIdent == "new" || sItemIdent == "newtext")
461 : {
462 0 : bool bNoAttr = sItemIdent == "newtext";
463 :
464 0 : const OUString aStr(m_pNameED->GetText());
465 0 : const OUString aShortName(m_pShortNameEdit->GetText());
466 0 : if(pGlossaryHdl->HasShortName(aShortName))
467 : {
468 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES(STR_DOUBLE_SHORTNAME), VCL_MESSAGE_INFO)->Execute();
469 0 : m_pShortNameEdit->SetSelection(Selection(0, SELECTION_MAX));
470 0 : m_pShortNameEdit->GrabFocus();
471 0 : return 1;
472 : }
473 0 : if(pGlossaryHdl->NewGlossary(aStr, aShortName, false, bNoAttr ))
474 : {
475 0 : SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
476 0 : if(m_pCategoryBox->GetParent(pEntry))
477 0 : pEntry = m_pCategoryBox->GetParent(pEntry);
478 :
479 0 : SvTreeListEntry* pChild = m_pCategoryBox->InsertEntry(aStr, pEntry);
480 0 : pChild->SetUserData(new OUString(aShortName));
481 0 : m_pNameED->SetText(aStr);
482 0 : m_pShortNameEdit->SetText(aShortName);
483 0 : NameModify(m_pNameED); // for toggling the buttons
484 :
485 0 : if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
486 : {
487 0 : SfxRequest aReq(pSh->GetView().GetViewFrame(), FN_NEW_GLOSSARY);
488 0 : OUString sTemp(::GetCurrGlosGroup());
489 : // the zeroth path is not being recorded!
490 0 : if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
491 0 : sTemp = sTemp.getToken(0, GLOS_DELIM);
492 0 : aReq.AppendItem(SfxStringItem(FN_NEW_GLOSSARY, sTemp));
493 0 : aReq.AppendItem(SfxStringItem(FN_PARAM_1, aShortName));
494 0 : aReq.AppendItem(SfxStringItem(FN_PARAM_2, aStr));
495 0 : aReq.Done();
496 : }
497 0 : }
498 : }
499 0 : else if (sItemIdent == "copy")
500 : {
501 0 : pGlossaryHdl->CopyToClipboard(*pSh, m_pShortNameEdit->GetText());
502 : }
503 0 : else if (sItemIdent == "rename")
504 : {
505 0 : m_pShortNameEdit->SetText(pGlossaryHdl->GetGlossaryShortName(m_pNameED->GetText()));
506 0 : ScopedVclPtrInstance<SwNewGlosNameDlg> pNewNameDlg(this, m_pNameED->GetText(),
507 0 : m_pShortNameEdit->GetText());
508 0 : if( RET_OK == pNewNameDlg->Execute() &&
509 0 : pGlossaryHdl->Rename( m_pShortNameEdit->GetText(),
510 : pNewNameDlg->GetNewShort(),
511 0 : pNewNameDlg->GetNewName()))
512 : {
513 0 : SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
514 0 : SvTreeListEntry* pNewEntry = m_pCategoryBox->InsertEntry(
515 0 : pNewNameDlg->GetNewName(), m_pCategoryBox->GetParent(pEntry));
516 0 : pNewEntry->SetUserData(new OUString(pNewNameDlg->GetNewShort()));
517 0 : delete static_cast<OUString*>(pEntry->GetUserData());
518 0 : m_pCategoryBox->GetModel()->Remove(pEntry);
519 0 : m_pCategoryBox->Select(pNewEntry);
520 0 : m_pCategoryBox->MakeVisible(pNewEntry);
521 : }
522 0 : GrpSelect(m_pCategoryBox);
523 : }
524 0 : else if (sItemIdent == "delete")
525 : {
526 0 : ScopedVclPtrInstance< MessageDialog > aQuery(this, SW_RES(STR_QUERY_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
527 0 : if (RET_YES == aQuery->Execute())
528 : {
529 0 : const OUString aShortName(m_pShortNameEdit->GetText());
530 0 : const OUString aTitle(m_pNameED->GetText());
531 0 : if (!aTitle.isEmpty() && pGlossaryHdl->DelGlossary(aShortName))
532 : {
533 0 : SvTreeListEntry* pChild = DoesBlockExist(aTitle, aShortName);
534 : OSL_ENSURE(pChild, "entry not found!");
535 0 : SvTreeListEntry* pParent = m_pCategoryBox->GetParent(pChild);
536 0 : m_pCategoryBox->Select(pParent);
537 :
538 0 : m_pCategoryBox->GetModel()->Remove(pChild);
539 0 : m_pNameED->SetText(OUString());
540 0 : NameModify(m_pNameED);
541 0 : }
542 0 : }
543 : }
544 0 : else if (sItemIdent == "macro")
545 : {
546 0 : SfxItemSet aSet( pSh->GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
547 :
548 0 : SvxMacro aStart(aEmptyOUStr, aEmptyOUStr, STARBASIC);
549 0 : SvxMacro aEnd(aEmptyOUStr, aEmptyOUStr, STARBASIC);
550 0 : pGlossaryHdl->GetMacros(m_pShortNameEdit->GetText(), aStart, aEnd );
551 :
552 0 : SvxMacroItem aItem(RES_FRMMACRO);
553 0 : if( aStart.HasMacro() )
554 0 : aItem.SetMacro( SW_EVENT_START_INS_GLOSSARY, aStart );
555 0 : if( aEnd.HasMacro() )
556 0 : aItem.SetMacro( SW_EVENT_END_INS_GLOSSARY, aEnd );
557 :
558 0 : aSet.Put( aItem );
559 0 : aSet.Put( SwMacroAssignDlg::AddEvents( MACASSGN_AUTOTEXT ) );
560 :
561 : const SfxPoolItem* pItem;
562 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
563 : boost::scoped_ptr<SfxAbstractDialog> pMacroDlg(pFact->CreateSfxDialog( this, aSet,
564 0 : pSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(), SID_EVENTCONFIG ));
565 0 : if ( pMacroDlg && pMacroDlg->Execute() == RET_OK &&
566 0 : SfxItemState::SET == pMacroDlg->GetOutputItemSet()->GetItemState( RES_FRMMACRO, false, &pItem ) )
567 : {
568 0 : const SvxMacroTableDtor& rTable = static_cast<const SvxMacroItem*>(pItem)->GetMacroTable();
569 0 : pGlossaryHdl->SetMacros( m_pShortNameEdit->GetText(),
570 : rTable.Get( SW_EVENT_START_INS_GLOSSARY ),
571 0 : rTable.Get( SW_EVENT_END_INS_GLOSSARY ) );
572 0 : }
573 : }
574 0 : else if (sItemIdent == "import")
575 : {
576 : // call the FileOpenDialog do find WinWord - Files with templates
577 0 : FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 );
578 0 : uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
579 :
580 0 : SvtPathOptions aPathOpt;
581 0 : xFP->setDisplayDirectory(aPathOpt.GetWorkPath() );
582 :
583 0 : uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
584 0 : SfxFilterMatcher aMatcher( OUString::createFromAscii(SwDocShell::Factory().GetShortName()) );
585 0 : SfxFilterMatcherIter aIter( aMatcher );
586 0 : const SfxFilter* pFilter = aIter.First();
587 0 : while ( pFilter )
588 : {
589 0 : if( pFilter->GetUserData() == FILTER_WW8 )
590 : {
591 0 : xFltMgr->appendFilter( pFilter->GetUIName(),
592 0 : pFilter->GetWildcard().getGlob() );
593 0 : xFltMgr->setCurrentFilter( pFilter->GetUIName() ) ;
594 : }
595 :
596 0 : pFilter = aIter.Next();
597 : }
598 :
599 0 : if( aDlgHelper.Execute() == ERRCODE_NONE )
600 : {
601 0 : if( pGlossaryHdl->ImportGlossaries( xFP->getFiles().getConstArray()[0] ))
602 0 : Init();
603 : else
604 : {
605 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES( STR_NO_GLOSSARIES ), VCL_MESSAGE_INFO)->Execute();
606 : }
607 0 : }
608 : }
609 : else
610 : {
611 0 : return 0;
612 : }
613 0 : return 1;
614 : }
615 :
616 : // dialog manage regions
617 0 : IMPL_LINK_NOARG(SwGlossaryDlg, BibHdl)
618 : {
619 0 : SwGlossaries* pGloss = ::GetGlossaries();
620 0 : if( pGloss->IsGlosPathErr() )
621 0 : pGloss->ShowError();
622 : else
623 : {
624 : //check if at least one glossary path is write enabled
625 0 : SvtPathOptions aPathOpt;
626 0 : const OUString sGlosPath( aPathOpt.GetAutoTextPath() );
627 0 : const sal_Int32 nPaths = comphelper::string::getTokenCount(sGlosPath, ';');
628 0 : bool bIsWritable = false;
629 0 : for(sal_Int32 nPath = 0; nPath < nPaths; nPath++)
630 : {
631 : const OUString sPath = URIHelper::SmartRel2Abs(
632 : INetURLObject(), sGlosPath.getToken(nPath, ';'),
633 0 : URIHelper::GetMaybeFileHdl());
634 : try
635 : {
636 : Content aTestContent( sPath,
637 : uno::Reference< XCommandEnvironment >(),
638 0 : comphelper::getProcessComponentContext() );
639 0 : Any aAny = aTestContent.getPropertyValue( "IsReadOnly" );
640 0 : if(aAny.hasValue())
641 : {
642 0 : bIsWritable = !*static_cast<sal_Bool const *>(aAny.getValue());
643 0 : }
644 : }
645 0 : catch (const Exception&)
646 : {
647 : }
648 0 : if(bIsWritable)
649 0 : break;
650 0 : }
651 0 : if(bIsWritable)
652 : {
653 :
654 0 : ScopedVclPtrInstance< SwGlossaryGroupDlg > pDlg( this, pGloss->GetPathArray(), pGlossaryHdl );
655 0 : if ( RET_OK == pDlg->Execute() )
656 : {
657 0 : Init();
658 : //if new groups were created - select one of them
659 0 : const OUString sNewGroup = pDlg->GetCreatedGroupName();
660 0 : SvTreeListEntry* pEntry = m_pCategoryBox->First();
661 0 : while (!sNewGroup.isEmpty() && pEntry)
662 : {
663 0 : if(!m_pCategoryBox->GetParent(pEntry))
664 : {
665 0 : GroupUserData* pGroupData = static_cast<GroupUserData*>(pEntry->GetUserData());
666 : const OUString sGroup = pGroupData->sGroupName
667 0 : + OUStringLiteral1<GLOS_DELIM>()
668 0 : + OUString::number(pGroupData->nPathIdx);
669 0 : if(sGroup == sNewGroup)
670 : {
671 0 : m_pCategoryBox->Select(pEntry);
672 0 : m_pCategoryBox->MakeVisible(pEntry);
673 0 : GrpSelect(m_pCategoryBox);
674 0 : break;
675 0 : }
676 : }
677 0 : pEntry = m_pCategoryBox->Next(pEntry);
678 0 : }
679 :
680 0 : }
681 : }
682 : else
683 : {
684 0 : ScopedVclPtrInstance< MessageDialog > aBox(this, sReadonlyPath, VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
685 :
686 0 : if(RET_YES == aBox->Execute())
687 0 : PathHdl(m_pPathBtn);
688 0 : }
689 : }
690 0 : return 0;
691 : }
692 :
693 : // initialisation; from Ctor and after editing regions
694 0 : void SwGlossaryDlg::Init()
695 : {
696 0 : m_pCategoryBox->SetUpdateMode( false );
697 0 : m_pCategoryBox->Clear();
698 : // display text block regions
699 0 : const size_t nCnt = pGlossaryHdl->GetGroupCnt();
700 0 : SvTreeListEntry* pSelEntry = 0;
701 0 : const OUString sSelStr(::GetCurrGlosGroup().getToken(0, GLOS_DELIM));
702 0 : const sal_Int32 nSelPath = ::GetCurrGlosGroup().getToken(1, GLOS_DELIM).toInt32();
703 : // #i66304# - "My AutoText" comes from mytexts.bau, but should be translated
704 0 : const OUString sMyAutoTextEnglish("My AutoText");
705 0 : const OUString sMyAutoTextTranslated(SW_RES(STR_MY_AUTOTEXT));
706 0 : for(size_t nId = 0; nId < nCnt; ++nId )
707 : {
708 0 : OUString sTitle;
709 0 : OUString sGroupName(pGlossaryHdl->GetGroupName(nId, &sTitle));
710 0 : if(sGroupName.isEmpty())
711 0 : continue;
712 0 : if(sTitle.isEmpty())
713 0 : sTitle = sGroupName.getToken( 0, GLOS_DELIM );
714 0 : if(sTitle == sMyAutoTextEnglish)
715 0 : sTitle = sMyAutoTextTranslated;
716 0 : SvTreeListEntry* pEntry = m_pCategoryBox->InsertEntry( sTitle );
717 0 : const sal_Int32 nPath = sGroupName.getToken( 1, GLOS_DELIM ).toInt32();
718 :
719 0 : GroupUserData* pData = new GroupUserData;
720 0 : pData->sGroupName = sGroupName.getToken(0, GLOS_DELIM);
721 0 : pData->nPathIdx = static_cast< sal_uInt16 >(nPath);
722 0 : pData->bReadonly = pGlossaryHdl->IsReadOnly(&sGroupName);
723 :
724 0 : pEntry->SetUserData(pData);
725 0 : if(sSelStr == pData->sGroupName && nSelPath == nPath)
726 0 : pSelEntry = pEntry;
727 :
728 : // fill entries for the groups
729 : {
730 0 : pGlossaryHdl->SetCurGroup(sGroupName, false, true);
731 0 : const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt();
732 0 : for(sal_uInt16 i = 0; i < nCount; ++i)
733 : {
734 0 : SvTreeListEntry* pChild = m_pCategoryBox->InsertEntry(
735 0 : pGlossaryHdl->GetGlossaryName(i), pEntry);
736 0 : pChild->SetUserData(new OUString(pGlossaryHdl->GetGlossaryShortName(i)));
737 : }
738 : }
739 0 : }
740 : // set current group and display text blocks
741 0 : if(!pSelEntry)
742 : {
743 : //find a non-readonly group
744 0 : SvTreeListEntry* pSearch = m_pCategoryBox->First();
745 0 : while(pSearch)
746 : {
747 0 : if(!m_pCategoryBox->GetParent(pSearch))
748 : {
749 0 : GroupUserData* pData = static_cast<GroupUserData*>(pSearch->GetUserData());
750 0 : if(!pData->bReadonly)
751 : {
752 0 : pSelEntry = pSearch;
753 0 : break;
754 : }
755 : }
756 0 : pSearch = m_pCategoryBox->Next(pSearch);
757 : }
758 0 : if(!pSelEntry)
759 0 : pSelEntry = m_pCategoryBox->GetEntry(0);
760 : }
761 0 : if(pSelEntry)
762 : {
763 0 : m_pCategoryBox->Expand(pSelEntry);
764 0 : m_pCategoryBox->Select(pSelEntry);
765 0 : m_pCategoryBox->MakeVisible(pSelEntry);
766 0 : GrpSelect(m_pCategoryBox);
767 : }
768 : //JP 16.11.99: the SvxTreeListBox has a Bug. The Box dont recalc the
769 : // outputsize, when all entries are insertet. The result is, that
770 : // the Focus/Highlight rectangle is to large and paintet over the
771 : // HScrollbar. -> Fix: call the resize
772 0 : m_pCategoryBox->Resize();
773 :
774 0 : m_pCategoryBox->GetModel()->Resort();
775 0 : m_pCategoryBox->SetUpdateMode( true );
776 0 : m_pCategoryBox->Update();
777 :
778 0 : const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
779 0 : m_pFileRelCB->Check( rCfg.IsSaveRelFile() );
780 0 : m_pFileRelCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
781 0 : m_pNetRelCB->Check( rCfg.IsSaveRelNet() );
782 0 : m_pNetRelCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
783 0 : m_pInsertTipCB->Check( rCfg.IsAutoTextTip() );
784 0 : m_pInsertTipCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
785 0 : }
786 :
787 0 : IMPL_LINK_NOARG_TYPED(SwGlossaryDlg, EditHdl, MenuButton *, void)
788 : {
789 : // EndDialog must not be called in MenuHdl
790 0 : if (m_pEditBtn->GetCurItemIdent() == "edit")
791 : {
792 0 : SwTextBlocks *pGroup = ::GetGlossaries()->GetGroupDoc ( GetCurrGrpName () );
793 0 : delete pGroup;
794 0 : EndDialog(RET_EDIT);
795 : }
796 0 : }
797 :
798 : // KeyInput for ShortName - Edits without Spaces
799 0 : IMPL_LINK( SwNewGlosNameDlg, Modify, Edit *, pBox )
800 : {
801 0 : OUString aName(m_pNewName->GetText());
802 0 : SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParent());
803 0 : if (pBox == m_pNewName)
804 0 : m_pNewShort->SetText( lcl_GetValidShortCut( aName ) );
805 :
806 0 : bool bEnable = !aName.isEmpty() && !m_pNewShort->GetText().isEmpty() &&
807 0 : (!pDlg->DoesBlockExist(aName, m_pNewShort->GetText())
808 0 : || aName == m_pOldName->GetText());
809 0 : m_pOk->Enable(bEnable);
810 0 : return 0;
811 : }
812 :
813 0 : IMPL_LINK_NOARG(SwNewGlosNameDlg, Rename)
814 : {
815 0 : SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParent());
816 0 : OUString sNew = GetAppCharClass().uppercase(m_pNewShort->GetText());
817 0 : if( pDlg->pGlossaryHdl->HasShortName(m_pNewShort->GetText())
818 0 : && sNew != m_pOldShort->GetText() )
819 : {
820 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES(STR_DOUBLE_SHORTNAME), VCL_MESSAGE_INFO)->Execute();
821 0 : m_pNewShort->GrabFocus();
822 : }
823 : else
824 0 : EndDialog(RET_OK);
825 0 : return 0;
826 : }
827 :
828 0 : IMPL_LINK( SwGlossaryDlg, CheckBoxHdl, CheckBox *, pBox )
829 : {
830 0 : SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
831 0 : bool bCheck = pBox->IsChecked();
832 0 : if (pBox == m_pInsertTipCB)
833 0 : rCfg.SetAutoTextTip(bCheck);
834 0 : else if(pBox == m_pFileRelCB)
835 0 : rCfg.SetSaveRelFile(bCheck);
836 : else
837 0 : rCfg.SetSaveRelNet(bCheck);
838 0 : rCfg.Commit();
839 0 : return 0;
840 : }
841 :
842 : // TreeListBox for groups and blocks
843 0 : SwGlTreeListBox::SwGlTreeListBox(vcl::Window* pParent, WinBits nBits)
844 : : SvTreeListBox(pParent, nBits)
845 : , sReadonly(SW_RESSTR(SW_STR_READONLY)),
846 0 : pDragEntry(0)
847 : {
848 0 : SetDragDropMode( DragDropMode::CTRL_MOVE|DragDropMode::CTRL_COPY );
849 0 : }
850 :
851 0 : Size SwGlTreeListBox::GetOptimalSize() const
852 : {
853 0 : return LogicToPixel(Size(212, 84), MapMode(MAP_APPFONT));
854 : }
855 :
856 0 : VCL_BUILDER_FACTORY_ARGS(SwGlTreeListBox, WB_BORDER | WB_TABSTOP)
857 :
858 0 : void SwGlTreeListBox::Clear()
859 : {
860 0 : SvTreeListEntry* pEntry = First();
861 0 : while(pEntry)
862 : {
863 0 : if(GetParent(pEntry))
864 0 : delete static_cast<OUString*>(pEntry->GetUserData());
865 : else
866 0 : delete static_cast<GroupUserData*>(pEntry->GetUserData());
867 0 : pEntry = Next(pEntry);
868 : }
869 0 : SvTreeListBox::Clear();
870 0 : }
871 :
872 0 : void SwGlTreeListBox::RequestHelp( const HelpEvent& rHEvt )
873 : {
874 0 : Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
875 0 : SvTreeListEntry* pEntry = GetEntry( aPos );
876 : // there's only help for groups' names
877 0 : if(pEntry)
878 : {
879 : SvLBoxTab* pTab;
880 0 : SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
881 0 : if(pItem)
882 : {
883 0 : aPos = GetEntryPosition( pEntry );
884 0 : Size aSize(pItem->GetSize( this, pEntry ));
885 0 : aPos.X() = GetTabPos( pEntry, pTab );
886 :
887 0 : if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
888 0 : aSize.Width() = GetSizePixel().Width() - aPos.X();
889 0 : aPos = OutputToScreenPixel(aPos);
890 0 : Rectangle aItemRect( aPos, aSize );
891 0 : OUString sMsg;
892 0 : if(!GetParent(pEntry))
893 : {
894 0 : GroupUserData* pData = static_cast<GroupUserData*>(pEntry->GetUserData());
895 0 : const std::vector<OUString> & rPathArr = ::GetGlossaries()->GetPathArray();
896 0 : if( !rPathArr.empty() )
897 : {
898 0 : INetURLObject aTmp(rPathArr[pData->nPathIdx]
899 0 : + "/"
900 0 : + pData->sGroupName
901 0 : + SwGlossaries::GetExtension());
902 0 : sMsg = aTmp.GetPath();
903 :
904 0 : if(pData->bReadonly)
905 : {
906 0 : sMsg += " (" + sReadonly + ")";
907 0 : }
908 : }
909 : }
910 : else
911 0 : sMsg = *static_cast<OUString*>(pEntry->GetUserData());
912 : Help::ShowQuickHelp( this, aItemRect, sMsg,
913 0 : QuickHelpFlags::Left|QuickHelpFlags::VCenter );
914 : }
915 : }
916 0 : }
917 :
918 0 : DragDropMode SwGlTreeListBox::NotifyStartDrag(
919 : TransferDataContainer& /*rContainer*/,
920 : SvTreeListEntry* pEntry )
921 : {
922 : DragDropMode eRet;
923 0 : pDragEntry = pEntry;
924 0 : if(!GetParent(pEntry))
925 0 : eRet = DragDropMode::NONE;
926 : else
927 : {
928 0 : SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParentDialog());
929 0 : SvTreeListEntry* pParent = GetParent(pEntry);
930 :
931 0 : GroupUserData* pGroupData = static_cast<GroupUserData*>(pParent->GetUserData());
932 : OUString sEntry = pGroupData->sGroupName
933 0 : + OUStringLiteral1<GLOS_DELIM>()
934 0 : + OUString::number(pGroupData->nPathIdx);
935 0 : sal_Int8 nDragOption = DND_ACTION_COPY;
936 0 : eRet = DragDropMode::CTRL_COPY;
937 0 : if(!pDlg->pGlossaryHdl->IsReadOnly(&sEntry))
938 : {
939 0 : eRet |= DragDropMode::CTRL_MOVE;
940 0 : nDragOption |= DND_ACTION_MOVE;
941 : }
942 0 : SetDragOptions( nDragOption );
943 : }
944 0 : return eRet;
945 : }
946 :
947 0 : bool SwGlTreeListBox::NotifyAcceptDrop( SvTreeListEntry* pEntry)
948 : {
949 : // TODO: Readonly - check still missing!
950 0 : SvTreeListEntry* pSrcParent = GetParent(pEntry) ? GetParent(pEntry) : pEntry;
951 : SvTreeListEntry* pDestParent =
952 0 : GetParent(pDragEntry ) ? GetParent(pDragEntry ) : pDragEntry ;
953 0 : return pDestParent != pSrcParent;
954 :
955 : }
956 :
957 0 : TriState SwGlTreeListBox::NotifyMoving( SvTreeListEntry* pTarget,
958 : SvTreeListEntry* pEntry,
959 : SvTreeListEntry*& /*rpNewParent*/,
960 : sal_uLong& /*rNewChildPos*/
961 : )
962 : {
963 0 : return NotifyCopyingOrMoving(pTarget, pEntry, true);
964 : }
965 :
966 0 : TriState SwGlTreeListBox::NotifyCopying( SvTreeListEntry* pTarget,
967 : SvTreeListEntry* pEntry,
968 : SvTreeListEntry*& /*rpNewParent*/,
969 : sal_uLong& /*rNewChildPos*/
970 : )
971 : {
972 0 : return NotifyCopyingOrMoving(pTarget, pEntry, false);
973 : }
974 :
975 0 : TriState SwGlTreeListBox::NotifyCopyingOrMoving(
976 : SvTreeListEntry* pTarget,
977 : SvTreeListEntry* pEntry,
978 : bool bIsMove)
979 : {
980 0 : pDragEntry = 0;
981 : // 1. move in different groups?
982 : // 2. allowed to write to both groups?
983 0 : if(!pTarget) // move to the beginning
984 : {
985 0 : pTarget = GetEntry(0);
986 : }
987 0 : SvTreeListEntry* pSrcParent = GetParent(pEntry);
988 : SvTreeListEntry* pDestParent =
989 0 : GetParent(pTarget) ? GetParent(pTarget) : pTarget;
990 0 : if(pDestParent != pSrcParent)
991 : {
992 0 : SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParentDialog());
993 0 : SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), true );
994 :
995 0 : GroupUserData* pGroupData = static_cast<GroupUserData*>(pSrcParent->GetUserData());
996 : OUString sSourceGroup = pGroupData->sGroupName
997 0 : + OUStringLiteral1<GLOS_DELIM>()
998 0 : + OUString::number(pGroupData->nPathIdx);
999 :
1000 0 : pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
1001 0 : OUString sTitle(GetEntryText(pEntry));
1002 0 : OUString sShortName(*static_cast<OUString*>(pEntry->GetUserData()));
1003 :
1004 0 : GroupUserData* pDestData = static_cast<GroupUserData*>(pDestParent->GetUserData());
1005 : OUString sDestName = pDestData->sGroupName
1006 0 : + OUStringLiteral1<GLOS_DELIM>()
1007 0 : + OUString::number(pDestData->nPathIdx);
1008 :
1009 : const bool bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup, sShortName,
1010 0 : sDestName, sTitle, bIsMove );
1011 0 : if(bRet)
1012 : {
1013 0 : SvTreeListEntry* pChild = InsertEntry(sTitle, pDestParent);
1014 0 : pChild->SetUserData(new OUString(sShortName));
1015 0 : if (bIsMove)
1016 : {
1017 0 : GetModel()->Remove(pEntry);
1018 : }
1019 0 : }
1020 : }
1021 0 : return TRISTATE_FALSE; // otherwise the entry is being set automatically
1022 : }
1023 :
1024 0 : OUString SwGlossaryDlg::GetCurrGrpName() const
1025 : {
1026 0 : SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
1027 0 : if(pEntry)
1028 : {
1029 : pEntry =
1030 0 : m_pCategoryBox->GetParent(pEntry) ? m_pCategoryBox->GetParent(pEntry) : pEntry;
1031 0 : GroupUserData* pGroupData = static_cast<GroupUserData*>(pEntry->GetUserData());
1032 0 : return pGroupData->sGroupName + OUStringLiteral1<GLOS_DELIM>() + OUString::number(pGroupData->nPathIdx);
1033 : }
1034 0 : return OUString();
1035 : }
1036 :
1037 0 : IMPL_LINK( SwGlossaryDlg, PathHdl, Button *, pBtn )
1038 : {
1039 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1040 0 : if(pFact)
1041 : {
1042 0 : boost::scoped_ptr<AbstractSvxMultiPathDialog> pDlg(pFact->CreateSvxPathSelectDialog(pBtn));
1043 : OSL_ENSURE(pDlg, "Dialog creation failed!");
1044 0 : SvtPathOptions aPathOpt;
1045 0 : const OUString sGlosPath( aPathOpt.GetAutoTextPath() );
1046 0 : pDlg->SetPath(sGlosPath);
1047 0 : if(RET_OK == pDlg->Execute())
1048 : {
1049 0 : const OUString sTmp(pDlg->GetPath());
1050 0 : if(sTmp != sGlosPath)
1051 : {
1052 0 : aPathOpt.SetAutoTextPath( sTmp );
1053 0 : ::GetGlossaries()->UpdateGlosPath( true );
1054 0 : Init();
1055 0 : }
1056 0 : }
1057 : }
1058 0 : return 0;
1059 : }
1060 :
1061 0 : IMPL_LINK_NOARG(SwGlossaryDlg, InsertHdl)
1062 : {
1063 0 : EndDialog(RET_OK);
1064 0 : return 0;
1065 : }
1066 :
1067 0 : void SwGlossaryDlg::ShowPreview()
1068 : {
1069 : //create example
1070 0 : if (!pExampleFrame)
1071 : {
1072 0 : Link<> aLink(LINK(this, SwGlossaryDlg, PreviewLoadedHdl));
1073 0 : pExampleFrame = new SwOneExampleFrame( *m_pExampleWIN,
1074 0 : EX_SHOW_ONLINE_LAYOUT, &aLink );
1075 : }
1076 :
1077 0 : ShowAutoText(::GetCurrGlosGroup(), m_pShortNameEdit->GetText());
1078 0 : };
1079 :
1080 0 : IMPL_LINK_NOARG(SwGlossaryDlg, PreviewLoadedHdl)
1081 : {
1082 0 : ResumeShowAutoText();
1083 0 : return 0;
1084 : }
1085 :
1086 0 : void SwGlossaryDlg::ShowAutoText(const OUString& rGroup, const OUString& rShortName)
1087 : {
1088 0 : if(m_pExampleWIN->IsVisible())
1089 : {
1090 0 : SetResumeData(rGroup, rShortName);
1091 : //try to make an Undo()
1092 0 : pExampleFrame->ClearDocument( true );
1093 : }
1094 0 : }
1095 :
1096 0 : void SwGlossaryDlg::ResumeShowAutoText()
1097 : {
1098 0 : OUString sGroup;
1099 0 : OUString sShortName;
1100 0 : if(GetResumeData(sGroup, sShortName) && m_pExampleWIN->IsVisible())
1101 : {
1102 0 : if(!m_xAutoText.is())
1103 : {
1104 : //now the AutoText ListBoxes have to be filled
1105 0 : m_xAutoText = text::AutoTextContainer::create( comphelper::getProcessComponentContext() );
1106 : }
1107 :
1108 0 : uno::Reference< XTextCursor > & xCrsr = pExampleFrame->GetTextCursor();
1109 0 : if(xCrsr.is())
1110 : {
1111 0 : if (!sShortName.isEmpty())
1112 : {
1113 0 : uno::Any aGroup = m_xAutoText->getByName(sGroup);
1114 0 : uno::Reference< XAutoTextGroup > xGroup;
1115 0 : OUString uShortName(sShortName);
1116 0 : if((aGroup >>= xGroup) && xGroup->hasByName(uShortName))
1117 : {
1118 0 : uno::Any aEntry(xGroup->getByName(uShortName));
1119 0 : uno::Reference< XAutoTextEntry > xEntry;
1120 0 : aEntry >>= xEntry;
1121 0 : uno::Reference< XTextRange > xRange(xCrsr, uno::UNO_QUERY);
1122 0 : xEntry->applyTo(xRange);
1123 0 : }
1124 : }
1125 : }
1126 : }
1127 0 : ResetResumeData();
1128 0 : }
1129 :
1130 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|