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