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 <vcl/layout.hxx>
21 : #include <sot/storinfo.hxx>
22 :
23 : #include <moduldlg.hxx>
24 : #include <basidesh.hrc>
25 : #include <basidesh.hxx>
26 : #include <bastypes.hxx>
27 : #include <basobj.hxx>
28 : #include <baside2.hrc>
29 : #include <iderdll.hxx>
30 : #include <iderdll2.hxx>
31 : #include <svx/passwd.hxx>
32 : #include <sbxitem.hxx>
33 : #include <basdoc.hxx>
34 : #include <ucbhelper/content.hxx>
35 : #include <rtl/uri.hxx>
36 : #include <sfx2/app.hxx>
37 : #include <sfx2/dinfdlg.hxx>
38 : #include <sfx2/dispatch.hxx>
39 : #include <sfx2/request.hxx>
40 : #include <tools/urlobj.hxx>
41 : #include <tools/diagnose_ex.h>
42 : #include <svtools/svlbitm.hxx>
43 : #include <svtools/treelistentry.hxx>
44 :
45 : #include <sot/storage.hxx>
46 : #include <com/sun/star/io/Pipe.hpp>
47 : #include <com/sun/star/ui/dialogs/FilePicker.hpp>
48 : #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
49 : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
50 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
51 : #include <com/sun/star/script/DocumentScriptLibraryContainer.hpp>
52 : #include <com/sun/star/script/DocumentDialogLibraryContainer.hpp>
53 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
54 : #include <com/sun/star/script/XLibraryContainerExport.hpp>
55 : #include <com/sun/star/task/InteractionHandler.hpp>
56 : #include <com/sun/star/ucb/SimpleFileAccess.hpp>
57 : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
58 : #include <com/sun/star/ucb/NameClash.hpp>
59 : #include <com/sun/star/packages/manifest/ManifestWriter.hpp>
60 : #include <unotools/pathoptions.hxx>
61 : #include <comphelper/processfactory.hxx>
62 :
63 : #include <com/sun/star/util/VetoException.hpp>
64 : #include <com/sun/star/script/ModuleSizeExceededRequest.hpp>
65 :
66 : #include <cassert>
67 : #include <memory>
68 :
69 : #include <boost/scoped_ptr.hpp>
70 :
71 : namespace basctl
72 : {
73 :
74 : using namespace ::com::sun::star;
75 : using namespace ::com::sun::star::uno;
76 : using namespace ::com::sun::star::lang;
77 : using namespace ::com::sun::star::ucb;
78 : using namespace ::com::sun::star::ui::dialogs;
79 :
80 : typedef ::cppu::WeakImplHelper1< task::XInteractionHandler > HandlerImpl_BASE;
81 :
82 : namespace
83 : {
84 :
85 0 : class DummyInteractionHandler : public HandlerImpl_BASE
86 : {
87 : Reference< task::XInteractionHandler2 > m_xHandler;
88 : public:
89 0 : DummyInteractionHandler( const Reference< task::XInteractionHandler2 >& xHandler ) : m_xHandler( xHandler ){}
90 :
91 0 : virtual void SAL_CALL handle( const Reference< task::XInteractionRequest >& rRequest ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
92 : {
93 0 : if ( m_xHandler.is() )
94 : {
95 0 : script::ModuleSizeExceededRequest aModSizeException;
96 0 : if ( rRequest->getRequest() >>= aModSizeException )
97 0 : m_xHandler->handle( rRequest );
98 : }
99 0 : }
100 : };
101 :
102 : // LibUserData
103 : class LibUserData
104 : {
105 : private:
106 : ScriptDocument m_aDocument;
107 :
108 : public:
109 0 : LibUserData (ScriptDocument const& rDocument) : m_aDocument(rDocument) { }
110 0 : virtual ~LibUserData() {};
111 :
112 0 : const ScriptDocument& GetDocument() const { return m_aDocument; }
113 : };
114 :
115 : // LibLBoxString
116 0 : class LibLBoxString : public SvLBoxString
117 : {
118 : public:
119 0 : LibLBoxString( SvTreeListEntry* pEntry, sal_uInt16 nFlags, const OUString& rTxt ) :
120 0 : SvLBoxString( pEntry, nFlags, rTxt ) {}
121 :
122 : virtual void Paint(const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* pView, const SvTreeListEntry* pEntry) SAL_OVERRIDE;
123 : };
124 :
125 0 : void LibLBoxString::Paint(const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* /*pView*/, const SvTreeListEntry* pEntry)
126 : {
127 : // Change text color if library is read only:
128 0 : bool bReadOnly = false;
129 0 : if (pEntry && pEntry->GetUserData())
130 : {
131 : ScriptDocument aDocument(
132 0 : static_cast<LibUserData*>(pEntry->GetUserData())->
133 0 : GetDocument() );
134 :
135 0 : OUString aLibName = static_cast<const SvLBoxString*>(pEntry->GetItem(1))->GetText();
136 : Reference< script::XLibraryContainer2 > xModLibContainer(
137 0 : aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY);
138 : Reference< script::XLibraryContainer2 > xDlgLibContainer(
139 0 : aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY);
140 : bReadOnly
141 0 : = (xModLibContainer.is() && xModLibContainer->hasByName(aLibName)
142 0 : && xModLibContainer->isLibraryReadOnly(aLibName))
143 0 : || (xDlgLibContainer.is() && xDlgLibContainer->hasByName(aLibName)
144 0 : && xDlgLibContainer->isLibraryReadOnly(aLibName));
145 : }
146 0 : if (bReadOnly)
147 0 : rDev.DrawCtrlText(rPos, GetText(), 0, -1, TEXT_DRAW_DISABLE);
148 : else
149 0 : rDev.DrawText(rPos, GetText());
150 0 : }
151 :
152 : } // namespace
153 :
154 : // basctl::CheckBox
155 0 : CheckBox::CheckBox(vcl::Window* pParent, WinBits nStyle)
156 : : SvTabListBox(pParent, nStyle)
157 : , eMode(ObjectMode::Module)
158 0 : , m_aDocument(ScriptDocument::getApplicationScriptDocument())
159 : {
160 0 : long aTabs_[] = { 1, 12 }; // TabPos needs at least one...
161 : // 12 because of the CheckBox
162 0 : SetTabs( aTabs_ );
163 0 : Init();
164 0 : }
165 :
166 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeCheckBox(vcl::Window *pParent, VclBuilder::stringmap &rMap)
167 : {
168 0 : WinBits nWinBits = WB_TABSTOP;
169 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
170 0 : if (!sBorder.isEmpty())
171 0 : nWinBits |= WB_BORDER;
172 0 : return new CheckBox(pParent, nWinBits);
173 : }
174 :
175 0 : CheckBox::~CheckBox()
176 : {
177 0 : delete pCheckButton;
178 :
179 : // delete user data
180 0 : SvTreeListEntry* pEntry = First();
181 0 : while ( pEntry )
182 : {
183 0 : delete static_cast<LibUserData*>(pEntry->GetUserData());
184 0 : pEntry = Next( pEntry );
185 : }
186 0 : }
187 :
188 0 : void CheckBox::Init()
189 : {
190 0 : pCheckButton = new SvLBoxButtonData(this);
191 :
192 0 : if (eMode == ObjectMode::Library)
193 0 : EnableCheckButton( pCheckButton );
194 : else
195 0 : EnableCheckButton( 0 );
196 :
197 0 : SetHighlightRange();
198 0 : }
199 :
200 0 : void CheckBox::SetMode (ObjectMode::Mode e)
201 : {
202 0 : eMode = e;
203 :
204 0 : if (eMode == ObjectMode::Library)
205 0 : EnableCheckButton( pCheckButton );
206 : else
207 0 : EnableCheckButton( 0 );
208 0 : }
209 :
210 0 : SvTreeListEntry* CheckBox::DoInsertEntry( const OUString& rStr, sal_uLong nPos )
211 : {
212 0 : return SvTabListBox::InsertEntryToColumn( rStr, nPos, 0 );
213 : }
214 :
215 0 : SvTreeListEntry* CheckBox::FindEntry( const OUString& rName )
216 : {
217 0 : sal_uLong nCount = GetEntryCount();
218 0 : for ( sal_uLong i = 0; i < nCount; i++ )
219 : {
220 0 : SvTreeListEntry* pEntry = GetEntry( i );
221 : DBG_ASSERT( pEntry, "pEntry?!" );
222 0 : if ( rName.equalsIgnoreAsciiCase( GetEntryText( pEntry, 0 ) ) )
223 0 : return pEntry;
224 : }
225 0 : return 0;
226 : }
227 :
228 0 : void CheckBox::CheckEntryPos( sal_uLong nPos )
229 : {
230 0 : if ( nPos < GetEntryCount() )
231 : {
232 0 : SvTreeListEntry* pEntry = GetEntry( nPos );
233 :
234 0 : if ( GetCheckButtonState( pEntry ) != SV_BUTTON_CHECKED )
235 0 : SetCheckButtonState( pEntry, SvButtonState(SV_BUTTON_CHECKED) );
236 : }
237 0 : }
238 :
239 0 : bool CheckBox::IsChecked( sal_uLong nPos ) const
240 : {
241 0 : if ( nPos < GetEntryCount() )
242 0 : return GetCheckButtonState(GetEntry(nPos)) == SV_BUTTON_CHECKED;
243 0 : return false;
244 : }
245 :
246 0 : void CheckBox::InitEntry(SvTreeListEntry* pEntry, const OUString& rTxt,
247 : const Image& rImg1, const Image& rImg2, SvLBoxButtonKind eButtonKind )
248 : {
249 0 : SvTabListBox::InitEntry(pEntry, rTxt, rImg1, rImg2, eButtonKind);
250 :
251 0 : if (eMode == ObjectMode::Module)
252 : {
253 : // initialize all columns with own string class (column 0 == bitmap)
254 0 : sal_uInt16 nCount = pEntry->ItemCount();
255 0 : for ( sal_uInt16 nCol = 1; nCol < nCount; ++nCol )
256 : {
257 0 : SvLBoxString* pCol = static_cast<SvLBoxString*>(pEntry->GetItem( nCol ));
258 0 : LibLBoxString* pStr = new LibLBoxString( pEntry, 0, pCol->GetText() );
259 0 : pEntry->ReplaceItem( pStr, nCol );
260 : }
261 : }
262 0 : }
263 :
264 0 : bool CheckBox::EditingEntry( SvTreeListEntry* pEntry, Selection& )
265 : {
266 0 : if (eMode != ObjectMode::Module)
267 0 : return false;
268 :
269 : DBG_ASSERT( pEntry, "Kein Eintrag?" );
270 :
271 : // check, if Standard library
272 0 : OUString aLibName = GetEntryText( pEntry, 0 );
273 0 : if ( aLibName.equalsIgnoreAsciiCase( "Standard" ) )
274 : {
275 0 : MessageDialog(this, IDE_RESSTR(RID_STR_CANNOTCHANGENAMESTDLIB)).Execute();
276 0 : return false;
277 : }
278 :
279 : // check, if library is readonly
280 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
281 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( m_aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
282 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) && !xModLibContainer->isLibraryLink( aLibName ) ) ||
283 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) && !xDlgLibContainer->isLibraryLink( aLibName ) ) )
284 : {
285 0 : MessageDialog(this, IDE_RESSTR(RID_STR_LIBISREADONLY)).Execute();
286 0 : return false;
287 : }
288 :
289 : // i24094: Password verification necessary for renaming
290 0 : bool bOK = true;
291 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && !xModLibContainer->isLibraryLoaded( aLibName ) )
292 : {
293 : // check password
294 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
295 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) )
296 : {
297 0 : OUString aPassword;
298 0 : Reference< script::XLibraryContainer > xModLibContainer1( xModLibContainer, UNO_QUERY );
299 0 : bOK = QueryPassword( xModLibContainer1, aLibName, aPassword );
300 : }
301 0 : if ( !bOK )
302 0 : return false;
303 : }
304 :
305 : // TODO: check if library is reference/link
306 :
307 0 : return true;
308 : }
309 :
310 0 : bool CheckBox::EditedEntry( SvTreeListEntry* pEntry, const OUString& rNewName )
311 : {
312 0 : bool bValid = rNewName.getLength() <= 30 && IsValidSbxName(rNewName);
313 0 : OUString aOldName( GetEntryText( pEntry, 0 ) );
314 0 : if ( bValid && ( aOldName != rNewName ) )
315 : {
316 : try
317 : {
318 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
319 0 : if ( xModLibContainer.is() )
320 0 : xModLibContainer->renameLibrary( aOldName, rNewName );
321 :
322 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( m_aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
323 0 : if ( xDlgLibContainer.is() )
324 0 : xDlgLibContainer->renameLibrary( aOldName, rNewName );
325 :
326 0 : MarkDocumentModified( m_aDocument );
327 0 : if (SfxBindings* pBindings = GetBindingsPtr())
328 : {
329 0 : pBindings->Invalidate( SID_BASICIDE_LIBSELECTOR );
330 0 : pBindings->Update( SID_BASICIDE_LIBSELECTOR );
331 0 : }
332 : }
333 0 : catch (const container::ElementExistException& )
334 : {
335 0 : MessageDialog(this, IDE_RESSTR(RID_STR_SBXNAMEALLREADYUSED)).Execute();
336 0 : return false;
337 : }
338 0 : catch (const container::NoSuchElementException& )
339 : {
340 : DBG_UNHANDLED_EXCEPTION();
341 0 : return false;
342 : }
343 : }
344 :
345 0 : if ( !bValid )
346 : {
347 0 : if ( rNewName.getLength() > 30 )
348 0 : MessageDialog(this, IDE_RESSTR(RID_STR_LIBNAMETOLONG)).Execute();
349 : else
350 0 : MessageDialog(this, IDE_RESSTR(RID_STR_BADSBXNAME)).Execute();
351 : }
352 :
353 0 : return bValid;
354 : }
355 :
356 : // NewObjectDialog
357 0 : IMPL_LINK_NOARG(NewObjectDialog, OkButtonHandler)
358 : {
359 0 : if (IsValidSbxName(m_pEdit->GetText()))
360 0 : EndDialog(1);
361 : else
362 : {
363 0 : MessageDialog(this, IDE_RESSTR(RID_STR_BADSBXNAME)).Execute();
364 0 : m_pEdit->GrabFocus();
365 : }
366 0 : return 0;
367 : }
368 :
369 0 : NewObjectDialog::NewObjectDialog(vcl::Window * pParent, ObjectMode::Mode eMode,
370 : bool bCheckName)
371 0 : : ModalDialog(pParent, "NewLibDialog", "modules/BasicIDE/ui/newlibdialog.ui")
372 : {
373 0 : get(m_pOKButton, "ok");
374 0 : get(m_pEdit, "entry");
375 :
376 0 : m_pEdit->GrabFocus();
377 :
378 0 : switch (eMode)
379 : {
380 : case ObjectMode::Library:
381 0 : SetText( IDE_RESSTR(RID_STR_NEWLIB) );
382 0 : break;
383 : case ObjectMode::Module:
384 0 : SetText( IDE_RESSTR(RID_STR_NEWMOD) );
385 0 : break;
386 : case ObjectMode::Method:
387 0 : SetText( IDE_RESSTR(RID_STR_NEWMETH) );
388 0 : break;
389 : case ObjectMode::Dialog:
390 0 : SetText( IDE_RESSTR(RID_STR_NEWDLG) );
391 0 : break;
392 : default:
393 : assert(false);
394 : }
395 :
396 0 : if (bCheckName)
397 0 : m_pOKButton->SetClickHdl(LINK(this, NewObjectDialog, OkButtonHandler));
398 0 : }
399 :
400 : // GotoLineDialog
401 0 : GotoLineDialog::GotoLineDialog(vcl::Window * pParent )
402 : : ModalDialog(pParent, "GotoLineDialog",
403 0 : "modules/BasicIDE/ui/gotolinedialog.ui")
404 : {
405 0 : get(m_pEdit, "entry");
406 0 : get(m_pOKButton, "ok");
407 0 : m_pEdit->GrabFocus();
408 0 : m_pOKButton->SetClickHdl(LINK(this, GotoLineDialog, OkButtonHandler));
409 0 : }
410 :
411 0 : sal_Int32 GotoLineDialog::GetLineNumber() const
412 : {
413 0 : return m_pEdit->GetText().toInt32();
414 : }
415 :
416 0 : IMPL_LINK_NOARG(GotoLineDialog, OkButtonHandler)
417 : {
418 0 : if ( GetLineNumber() )
419 0 : EndDialog(1);
420 : else
421 0 : m_pEdit->SetText(m_pEdit->GetText(), Selection(0, m_pEdit->GetText().getLength()));
422 0 : return 0;
423 : }
424 :
425 : // ExportDialog
426 0 : IMPL_LINK_NOARG(ExportDialog, OkButtonHandler)
427 : {
428 0 : mbExportAsPackage = m_pExportAsPackageButton->IsChecked();
429 0 : EndDialog(1);
430 0 : return 0;
431 : }
432 :
433 0 : ExportDialog::ExportDialog(vcl::Window * pParent)
434 : : ModalDialog(pParent, "ExportDialog",
435 : "modules/BasicIDE/ui/exportdialog.ui")
436 0 : , mbExportAsPackage(false)
437 : {
438 0 : get(m_pExportAsPackageButton, "extension");
439 0 : get(m_pOKButton, "ok");
440 :
441 0 : m_pExportAsPackageButton->Check();
442 0 : m_pOKButton->SetClickHdl(LINK(this, ExportDialog, OkButtonHandler));
443 0 : }
444 :
445 : // LibPage
446 0 : LibPage::LibPage(vcl::Window * pParent)
447 : : TabPage(pParent, "LibPage",
448 : "modules/BasicIDE/ui/libpage.ui")
449 0 : , m_aCurDocument(ScriptDocument::getApplicationScriptDocument())
450 0 : , m_eCurLocation(LIBRARY_LOCATION_UNKNOWN)
451 : {
452 0 : get(m_pBasicsBox, "location");
453 0 : get(m_pLibBox, "library");
454 0 : Size aSize(m_pLibBox->LogicToPixel(Size(130, 87), MAP_APPFONT));
455 0 : m_pLibBox->set_height_request(aSize.Height());
456 0 : m_pLibBox->set_width_request(aSize.Width());
457 0 : get(m_pEditButton, "edit");
458 0 : get(m_pPasswordButton, "password");
459 0 : get(m_pNewLibButton, "new");
460 0 : get(m_pInsertLibButton, "import");
461 0 : get(m_pExportButton, "export");
462 0 : get(m_pDelButton, "delete");
463 :
464 0 : pTabDlg = 0;
465 :
466 0 : m_pEditButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
467 0 : m_pNewLibButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
468 0 : m_pPasswordButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
469 0 : m_pExportButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
470 0 : m_pInsertLibButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
471 0 : m_pDelButton->SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
472 0 : m_pLibBox->SetSelectHdl( LINK( this, LibPage, TreeListHighlightHdl ) );
473 :
474 0 : m_pBasicsBox->SetSelectHdl( LINK( this, LibPage, BasicSelectHdl ) );
475 :
476 0 : m_pLibBox->SetMode(ObjectMode::Module);
477 0 : m_pLibBox->EnableInplaceEditing(true);
478 0 : m_pLibBox->SetStyle( WB_HSCROLL | WB_BORDER | WB_TABSTOP );
479 :
480 0 : long aTabs[] = { 2, 30, 120 };
481 0 : m_pLibBox->SetTabs( aTabs, MAP_PIXEL );
482 :
483 0 : FillListBox();
484 0 : m_pBasicsBox->SelectEntryPos( 0 );
485 0 : SetCurLib();
486 :
487 0 : CheckButtons();
488 0 : }
489 :
490 0 : LibPage::~LibPage()
491 : {
492 0 : sal_uInt16 nCount = m_pBasicsBox->GetEntryCount();
493 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
494 : {
495 0 : DocumentEntry* pEntry = (DocumentEntry*)m_pBasicsBox->GetEntryData( i );
496 0 : delete pEntry;
497 : }
498 0 : }
499 :
500 0 : void LibPage::CheckButtons()
501 : {
502 0 : SvTreeListEntry* pCur = m_pLibBox->GetCurEntry();
503 0 : if ( pCur )
504 : {
505 0 : OUString aLibName = m_pLibBox->GetEntryText( pCur, 0 );
506 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
507 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( m_aCurDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
508 :
509 0 : if ( m_eCurLocation == LIBRARY_LOCATION_SHARE )
510 : {
511 0 : m_pPasswordButton->Disable();
512 0 : m_pNewLibButton->Disable();
513 0 : m_pInsertLibButton->Disable();
514 0 : m_pDelButton->Disable();
515 : }
516 0 : else if ( aLibName.equalsIgnoreAsciiCase( "Standard" ) )
517 : {
518 0 : m_pPasswordButton->Disable();
519 0 : m_pNewLibButton->Enable();
520 0 : m_pInsertLibButton->Enable();
521 0 : m_pExportButton->Disable();
522 0 : m_pDelButton->Disable();
523 : }
524 0 : else if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) ) ||
525 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) ) )
526 : {
527 0 : m_pPasswordButton->Disable();
528 0 : m_pNewLibButton->Enable();
529 0 : m_pInsertLibButton->Enable();
530 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) && !xModLibContainer->isLibraryLink( aLibName ) ) ||
531 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) && !xDlgLibContainer->isLibraryLink( aLibName ) ) )
532 0 : m_pDelButton->Disable();
533 : else
534 0 : m_pDelButton->Enable();
535 : }
536 : else
537 : {
538 0 : if ( xModLibContainer.is() && !xModLibContainer->hasByName( aLibName ) )
539 0 : m_pPasswordButton->Disable();
540 : else
541 0 : m_pPasswordButton->Enable();
542 :
543 0 : m_pNewLibButton->Enable();
544 0 : m_pInsertLibButton->Enable();
545 0 : m_pExportButton->Enable();
546 0 : m_pDelButton->Enable();
547 0 : }
548 : }
549 0 : }
550 :
551 0 : void LibPage::ActivatePage()
552 : {
553 0 : SetCurLib();
554 0 : }
555 :
556 0 : void LibPage::DeactivatePage()
557 : {
558 0 : }
559 :
560 0 : IMPL_LINK_INLINE_START( LibPage, TreeListHighlightHdl, SvTreeListBox *, pBox )
561 : {
562 0 : if ( pBox->IsSelected( pBox->GetHdlEntry() ) )
563 0 : CheckButtons();
564 0 : return 0;
565 : }
566 0 : IMPL_LINK_INLINE_END( LibPage, TreeListHighlightHdl, SvTreeListBox *, pBox )
567 :
568 0 : IMPL_LINK_INLINE_START( LibPage, BasicSelectHdl, ListBox *, pBox )
569 : {
570 : (void)pBox;
571 0 : SetCurLib();
572 0 : CheckButtons();
573 0 : return 0;
574 : }
575 0 : IMPL_LINK_INLINE_END( LibPage, BasicSelectHdl, ListBox *, pBox )
576 :
577 0 : IMPL_LINK( LibPage, ButtonHdl, Button *, pButton )
578 : {
579 0 : if (pButton == m_pEditButton)
580 : {
581 0 : SfxAllItemSet aArgs( SfxGetpApp()->GetPool() );
582 0 : SfxRequest aRequest( SID_BASICIDE_APPEAR, SfxCallMode::SYNCHRON, aArgs );
583 0 : SfxGetpApp()->ExecuteSlot( aRequest );
584 :
585 0 : SfxUsrAnyItem aDocItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, makeAny( m_aCurDocument.getDocumentOrNull() ) );
586 0 : SvTreeListEntry* pCurEntry = m_pLibBox->GetCurEntry();
587 : DBG_ASSERT( pCurEntry, "Entry?!" );
588 0 : OUString aLibName( m_pLibBox->GetEntryText( pCurEntry, 0 ) );
589 0 : SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName );
590 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
591 : pDispatcher->Execute( SID_BASICIDE_LIBSELECTED,
592 0 : SfxCallMode::ASYNCHRON, &aDocItem, &aLibNameItem, 0L );
593 0 : EndTabDialog( 1 );
594 0 : return 0;
595 : }
596 0 : else if (pButton == m_pNewLibButton)
597 0 : NewLib();
598 0 : else if (pButton == m_pInsertLibButton)
599 0 : InsertLib();
600 0 : else if (pButton == m_pExportButton)
601 0 : Export();
602 0 : else if (pButton == m_pDelButton)
603 0 : DeleteCurrent();
604 0 : else if (pButton == m_pPasswordButton)
605 : {
606 0 : SvTreeListEntry* pCurEntry = m_pLibBox->GetCurEntry();
607 0 : OUString aLibName( m_pLibBox->GetEntryText( pCurEntry, 0 ) );
608 :
609 : // load module library (if not loaded)
610 0 : Reference< script::XLibraryContainer > xModLibContainer = m_aCurDocument.getLibraryContainer( E_SCRIPTS );
611 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && !xModLibContainer->isLibraryLoaded( aLibName ) )
612 : {
613 0 : Shell* pShell = GetShell();
614 0 : if (pShell)
615 0 : pShell->GetViewFrame()->GetWindow().EnterWait();
616 0 : xModLibContainer->loadLibrary( aLibName );
617 0 : if (pShell)
618 0 : pShell->GetViewFrame()->GetWindow().LeaveWait();
619 : }
620 :
621 : // load dialog library (if not loaded)
622 0 : Reference< script::XLibraryContainer > xDlgLibContainer = m_aCurDocument.getLibraryContainer( E_DIALOGS );
623 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && !xDlgLibContainer->isLibraryLoaded( aLibName ) )
624 : {
625 0 : Shell* pShell = GetShell();
626 0 : if (pShell)
627 0 : pShell->GetViewFrame()->GetWindow().EnterWait();
628 0 : xDlgLibContainer->loadLibrary( aLibName );
629 0 : if (pShell)
630 0 : pShell->GetViewFrame()->GetWindow().LeaveWait();
631 : }
632 :
633 : // check, if library is password protected
634 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
635 : {
636 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
637 0 : if ( xPasswd.is() )
638 : {
639 0 : bool const bProtected = xPasswd->isLibraryPasswordProtected( aLibName );
640 :
641 : // change password dialog
642 0 : boost::scoped_ptr<SvxPasswordDialog> pDlg(new SvxPasswordDialog( this, true, !bProtected ));
643 0 : pDlg->SetCheckPasswordHdl( LINK( this, LibPage, CheckPasswordHdl ) );
644 :
645 0 : if ( pDlg->Execute() == RET_OK )
646 : {
647 0 : bool const bNewProtected = xPasswd->isLibraryPasswordProtected( aLibName );
648 :
649 0 : if ( bNewProtected != bProtected )
650 : {
651 0 : sal_uLong nPos = (sal_uLong)m_pLibBox->GetModel()->GetAbsPos( pCurEntry );
652 0 : m_pLibBox->GetModel()->Remove( pCurEntry );
653 0 : ImpInsertLibEntry( aLibName, nPos );
654 0 : m_pLibBox->SetCurEntry( m_pLibBox->GetEntry( nPos ) );
655 : }
656 :
657 0 : MarkDocumentModified( m_aCurDocument );
658 0 : }
659 0 : }
660 0 : }
661 : }
662 0 : CheckButtons();
663 0 : return 0;
664 : }
665 :
666 0 : IMPL_LINK_INLINE_START( LibPage, CheckPasswordHdl, SvxPasswordDialog *, pDlg )
667 : {
668 0 : long nRet = 0;
669 :
670 0 : SvTreeListEntry* pCurEntry = m_pLibBox->GetCurEntry();
671 0 : OUString aLibName( m_pLibBox->GetEntryText( pCurEntry, 0 ) );
672 0 : Reference< script::XLibraryContainerPassword > xPasswd( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
673 :
674 0 : if ( xPasswd.is() )
675 : {
676 : try
677 : {
678 0 : OUString aOldPassword( pDlg->GetOldPassword() );
679 0 : OUString aNewPassword( pDlg->GetNewPassword() );
680 0 : xPasswd->changeLibraryPassword( aLibName, aOldPassword, aNewPassword );
681 0 : nRet = 1;
682 : }
683 0 : catch (...)
684 : {
685 : }
686 : }
687 :
688 0 : return nRet;
689 : }
690 0 : IMPL_LINK_INLINE_END( LibPage, CheckPasswordHdl, SvxPasswordDialog *, pDlg )
691 :
692 0 : void LibPage::NewLib()
693 : {
694 0 : createLibImpl( static_cast<vcl::Window*>( this ), m_aCurDocument, m_pLibBox, NULL);
695 0 : }
696 :
697 0 : void LibPage::InsertLib()
698 : {
699 0 : Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
700 : // file open dialog
701 0 : Reference < XFilePicker3 > xFP = FilePicker::createWithMode(xContext, TemplateDescription::FILEOPEN_SIMPLE);
702 0 : xFP->setTitle(IDEResId(RID_STR_APPENDLIBS).toString());
703 :
704 : // filter
705 0 : OUString aTitle(IDEResId(RID_STR_BASIC).toString());
706 0 : OUString aFilter;
707 0 : aFilter = "*.sbl;*.xlc;*.xlb" ; // library files
708 0 : aFilter += ";*.sdw;*.sxw;*.odt" ; // text
709 0 : aFilter += ";*.vor;*.stw;*.ott" ; // text template
710 0 : aFilter += ";*.sgl;*.sxg;*.odm" ; // master document
711 0 : aFilter += ";*.oth" ; // html document template
712 0 : aFilter += ";*.sdc;*.sxc;*.ods" ; // spreadsheet
713 0 : aFilter += ";*.stc;*.ots" ; // spreadsheet template
714 0 : aFilter += ";*.sda;*.sxd;*.odg" ; // drawing
715 0 : aFilter += ";*.std;*.otg" ; // drawing template
716 0 : aFilter += ";*.sdd;*.sxi;*.odp" ; // presentation
717 0 : aFilter += ";*.sti;*.otp" ; // presentation template
718 0 : aFilter += ";*.sxm;*.odf" ; // formula
719 0 : xFP->appendFilter( aTitle, aFilter );
720 :
721 : // set display directory and filter
722 0 : OUString aPath(GetExtraData()->GetAddLibPath());
723 0 : if ( !aPath.isEmpty() )
724 0 : xFP->setDisplayDirectory( aPath );
725 : else
726 : {
727 : // macro path from configuration management
728 0 : xFP->setDisplayDirectory( SvtPathOptions().GetWorkPath() );
729 : }
730 :
731 0 : OUString aLastFilter(GetExtraData()->GetAddLibFilter());
732 0 : if ( !aLastFilter.isEmpty() )
733 0 : xFP->setCurrentFilter( aLastFilter );
734 : else
735 0 : xFP->setCurrentFilter( IDE_RESSTR(RID_STR_BASIC) );
736 :
737 0 : if ( xFP->execute() == RET_OK )
738 : {
739 0 : GetExtraData()->SetAddLibPath( xFP->getDisplayDirectory() );
740 0 : GetExtraData()->SetAddLibFilter( xFP->getCurrentFilter() );
741 :
742 : // library containers for import
743 0 : Reference< script::XLibraryContainer2 > xModLibContImport;
744 0 : Reference< script::XLibraryContainer2 > xDlgLibContImport;
745 :
746 : // file URLs
747 0 : Sequence< OUString > aFiles = xFP->getFiles();
748 0 : INetURLObject aURLObj( aFiles[0] );
749 0 : INetURLObject aModURLObj( aURLObj );
750 0 : INetURLObject aDlgURLObj( aURLObj );
751 :
752 0 : OUString aBase = aURLObj.getBase();
753 0 : OUString aModBase( "script" );
754 0 : OUString aDlgBase( "dialog" );
755 :
756 0 : if ( aBase == aModBase || aBase == aDlgBase )
757 : {
758 0 : aModURLObj.setBase( aModBase );
759 0 : aDlgURLObj.setBase( aDlgBase );
760 : }
761 :
762 0 : Reference< XSimpleFileAccess3 > xSFA( SimpleFileAccess::create(comphelper::getProcessComponentContext()) );
763 :
764 0 : OUString aModURL( aModURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
765 0 : if ( xSFA->exists( aModURL ) )
766 : {
767 0 : xModLibContImport = Reference< script::XLibraryContainer2 >(
768 0 : script::DocumentScriptLibraryContainer::createWithURL(xContext, aModURL), UNO_QUERY );
769 : }
770 :
771 0 : OUString aDlgURL( aDlgURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
772 0 : if ( xSFA->exists( aDlgURL ) )
773 : {
774 0 : xDlgLibContImport = Reference< script::XLibraryContainer2 >(
775 0 : script::DocumentDialogLibraryContainer::createWithURL(xContext, aDlgURL), UNO_QUERY );
776 : }
777 :
778 0 : if ( xModLibContImport.is() || xDlgLibContImport.is() )
779 : {
780 0 : boost::scoped_ptr<LibDialog> pLibDlg;
781 :
782 0 : Reference< script::XLibraryContainer > xModLibContImp( xModLibContImport, UNO_QUERY );
783 0 : Reference< script::XLibraryContainer > xDlgLibContImp( xDlgLibContImport, UNO_QUERY );
784 0 : Sequence< OUString > aLibNames = GetMergedLibraryNames( xModLibContImp, xDlgLibContImp );
785 0 : sal_Int32 nLibCount = aLibNames.getLength();
786 0 : const OUString* pLibNames = aLibNames.getConstArray();
787 0 : for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
788 : {
789 : // library import dialog
790 0 : if ( !pLibDlg )
791 : {
792 0 : pLibDlg.reset(new LibDialog( this ));
793 0 : pLibDlg->SetStorageName( aURLObj.getName() );
794 0 : pLibDlg->GetLibBox().SetMode(ObjectMode::Library);
795 : }
796 :
797 : // libbox entries
798 0 : OUString aLibName( pLibNames[ i ] );
799 0 : if ( !( ( xModLibContImport.is() && xModLibContImport->hasByName( aLibName ) && xModLibContImport->isLibraryLink( aLibName ) ) ||
800 0 : ( xDlgLibContImport.is() && xDlgLibContImport->hasByName( aLibName ) && xDlgLibContImport->isLibraryLink( aLibName ) ) ) )
801 : {
802 0 : SvTreeListEntry* pEntry = pLibDlg->GetLibBox().DoInsertEntry( aLibName );
803 0 : sal_uInt16 nPos = (sal_uInt16) pLibDlg->GetLibBox().GetModel()->GetAbsPos( pEntry );
804 0 : pLibDlg->GetLibBox().CheckEntryPos(nPos);
805 : }
806 0 : }
807 :
808 0 : if ( !pLibDlg )
809 0 : MessageDialog(this, IDE_RESSTR(RID_STR_NOLIBINSTORAGE), VCL_MESSAGE_INFO).Execute();
810 : else
811 : {
812 0 : bool bChanges = false;
813 0 : OUString aExtension( aURLObj.getExtension() );
814 0 : OUString aLibExtension( "xlb" );
815 0 : OUString aContExtension( "xlc" );
816 :
817 : // disable reference checkbox for documents and sbls
818 0 : if ( aExtension != aLibExtension && aExtension != aContExtension )
819 0 : pLibDlg->EnableReference(false);
820 :
821 0 : if ( pLibDlg->Execute() )
822 : {
823 0 : sal_uLong nNewPos = m_pLibBox->GetEntryCount();
824 0 : bool bRemove = false;
825 0 : bool bReplace = pLibDlg->IsReplace();
826 0 : bool bReference = pLibDlg->IsReference();
827 0 : for ( sal_uInt16 nLib = 0; nLib < pLibDlg->GetLibBox().GetEntryCount(); nLib++ )
828 : {
829 0 : if ( pLibDlg->GetLibBox().IsChecked( nLib ) )
830 : {
831 0 : SvTreeListEntry* pEntry = pLibDlg->GetLibBox().GetEntry( nLib );
832 : DBG_ASSERT( pEntry, "Entry?!" );
833 0 : OUString aLibName( pLibDlg->GetLibBox().GetEntryText( pEntry, 0 ) );
834 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
835 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( m_aCurDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
836 :
837 : // check, if the library is already existing
838 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) ) ||
839 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) ) )
840 : {
841 0 : if ( bReplace )
842 : {
843 : // check, if the library is the Standard library
844 0 : if ( aLibName == "Standard" )
845 : {
846 0 : MessageDialog(this, IDE_RESSTR(RID_STR_REPLACESTDLIB)).Execute();
847 0 : continue;
848 : }
849 :
850 : // check, if the library is readonly and not a link
851 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) && xModLibContainer->isLibraryReadOnly( aLibName ) && !xModLibContainer->isLibraryLink( aLibName ) ) ||
852 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) && xDlgLibContainer->isLibraryReadOnly( aLibName ) && !xDlgLibContainer->isLibraryLink( aLibName ) ) )
853 : {
854 0 : OUString aErrStr( IDE_RESSTR(RID_STR_REPLACELIB) );
855 0 : aErrStr = aErrStr.replaceAll("XX", aLibName);
856 0 : aErrStr += "\n";
857 0 : aErrStr += IDE_RESSTR(RID_STR_LIBISREADONLY);
858 0 : MessageDialog(this, aErrStr).Execute();
859 0 : continue;
860 : }
861 :
862 : // remove existing libraries
863 0 : bRemove = true;
864 : }
865 : else
866 : {
867 0 : OUString aErrStr;
868 0 : if ( bReference )
869 0 : aErrStr = IDE_RESSTR(RID_STR_REFNOTPOSSIBLE);
870 : else
871 0 : aErrStr = IDE_RESSTR(RID_STR_IMPORTNOTPOSSIBLE);
872 0 : aErrStr = aErrStr.replaceAll("XX", aLibName);
873 0 : aErrStr += "\n" ;
874 0 : aErrStr += IDE_RESSTR(RID_STR_SBXNAMEALLREADYUSED);
875 0 : MessageDialog(this, aErrStr).Execute();
876 0 : continue;
877 : }
878 : }
879 :
880 : // check, if the library is password protected
881 0 : bool bOK = false;
882 0 : OUString aPassword;
883 0 : if ( xModLibContImport.is() && xModLibContImport->hasByName( aLibName ) )
884 : {
885 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContImport, UNO_QUERY );
886 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aLibName ) && !xPasswd->isLibraryPasswordVerified( aLibName ) && !bReference )
887 : {
888 0 : bOK = QueryPassword( xModLibContImp, aLibName, aPassword, true, true );
889 :
890 0 : if ( !bOK )
891 : {
892 0 : OUString aErrStr( IDE_RESSTR(RID_STR_NOIMPORT) );
893 0 : aErrStr = aErrStr.replaceAll("XX", aLibName);
894 0 : MessageDialog(this, aErrStr).Execute();
895 0 : continue;
896 : }
897 0 : }
898 : }
899 :
900 : // remove existing libraries
901 0 : if ( bRemove )
902 : {
903 : // remove listbox entry
904 0 : SvTreeListEntry* pEntry_ = m_pLibBox->FindEntry( aLibName );
905 0 : if ( pEntry_ )
906 0 : m_pLibBox->SvTreeListBox::GetModel()->Remove( pEntry_ );
907 :
908 : // remove module library
909 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aLibName ) )
910 0 : xModLibContainer->removeLibrary( aLibName );
911 :
912 : // remove dialog library
913 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aLibName ) )
914 0 : xDlgLibContainer->removeLibrary( aLibName );
915 : }
916 :
917 : // copy module library
918 0 : if ( xModLibContImport.is() && xModLibContImport->hasByName( aLibName ) && xModLibContainer.is() && !xModLibContainer->hasByName( aLibName ) )
919 : {
920 0 : Reference< container::XNameContainer > xModLib;
921 0 : if ( bReference )
922 : {
923 : // storage URL
924 0 : INetURLObject aModStorageURLObj( aModURLObj );
925 0 : if ( aExtension == aContExtension )
926 : {
927 0 : sal_Int32 nCount = aModStorageURLObj.getSegmentCount();
928 0 : aModStorageURLObj.insertName( aLibName, false, nCount-1 );
929 0 : aModStorageURLObj.setExtension( aLibExtension );
930 0 : aModStorageURLObj.setFinalSlash();
931 : }
932 0 : OUString aModStorageURL( aModStorageURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
933 :
934 : // create library link
935 0 : xModLib = Reference< container::XNameContainer >( xModLibContainer->createLibraryLink( aLibName, aModStorageURL, true ), UNO_QUERY);
936 : }
937 : else
938 : {
939 : // create library
940 0 : xModLib = xModLibContainer->createLibrary( aLibName );
941 0 : if ( xModLib.is() )
942 : {
943 : // get import library
944 0 : Reference< container::XNameContainer > xModLibImport;
945 0 : Any aElement = xModLibContImport->getByName( aLibName );
946 0 : aElement >>= xModLibImport;
947 :
948 0 : if ( xModLibImport.is() )
949 : {
950 : // load library
951 0 : if ( !xModLibContImport->isLibraryLoaded( aLibName ) )
952 0 : xModLibContImport->loadLibrary( aLibName );
953 :
954 : // copy all modules
955 0 : Sequence< OUString > aModNames = xModLibImport->getElementNames();
956 0 : sal_Int32 nModCount = aModNames.getLength();
957 0 : const OUString* pModNames = aModNames.getConstArray();
958 0 : for ( sal_Int32 i = 0 ; i < nModCount ; i++ )
959 : {
960 0 : OUString aModName( pModNames[ i ] );
961 0 : Any aElement_ = xModLibImport->getByName( aModName );
962 0 : xModLib->insertByName( aModName, aElement_ );
963 0 : }
964 :
965 : // set password
966 0 : if ( bOK )
967 : {
968 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
969 0 : if ( xPasswd.is() )
970 : {
971 : try
972 : {
973 0 : OUString _aPassword( aPassword );
974 0 : xPasswd->changeLibraryPassword( aLibName, OUString(), _aPassword );
975 : }
976 0 : catch (...)
977 : {
978 : }
979 0 : }
980 0 : }
981 0 : }
982 : }
983 0 : }
984 : }
985 :
986 : // copy dialog library
987 0 : if ( xDlgLibContImport.is() && xDlgLibContImport->hasByName( aLibName ) && xDlgLibContainer.is() && !xDlgLibContainer->hasByName( aLibName ) )
988 : {
989 0 : Reference< container::XNameContainer > xDlgLib;
990 0 : if ( bReference )
991 : {
992 : // storage URL
993 0 : INetURLObject aDlgStorageURLObj( aDlgURLObj );
994 0 : if ( aExtension == aContExtension )
995 : {
996 0 : sal_Int32 nCount = aDlgStorageURLObj.getSegmentCount();
997 0 : aDlgStorageURLObj.insertName( aLibName, false, nCount - 1 );
998 0 : aDlgStorageURLObj.setExtension( aLibExtension );
999 0 : aDlgStorageURLObj.setFinalSlash();
1000 : }
1001 0 : OUString aDlgStorageURL( aDlgStorageURLObj.GetMainURL( INetURLObject::NO_DECODE ) );
1002 :
1003 : // create library link
1004 0 : xDlgLib = Reference< container::XNameContainer >( xDlgLibContainer->createLibraryLink( aLibName, aDlgStorageURL, true ), UNO_QUERY);
1005 : }
1006 : else
1007 : {
1008 : // create library
1009 0 : xDlgLib = xDlgLibContainer->createLibrary( aLibName );
1010 0 : if ( xDlgLib.is() )
1011 : {
1012 : // get import library
1013 0 : Reference< container::XNameContainer > xDlgLibImport;
1014 0 : Any aElement = xDlgLibContImport->getByName( aLibName );
1015 0 : aElement >>= xDlgLibImport;
1016 :
1017 0 : if ( xDlgLibImport.is() )
1018 : {
1019 : // load library
1020 0 : if ( !xDlgLibContImport->isLibraryLoaded( aLibName ) )
1021 0 : xDlgLibContImport->loadLibrary( aLibName );
1022 :
1023 : // copy all dialogs
1024 0 : Sequence< OUString > aDlgNames = xDlgLibImport->getElementNames();
1025 0 : sal_Int32 nDlgCount = aDlgNames.getLength();
1026 0 : const OUString* pDlgNames = aDlgNames.getConstArray();
1027 0 : for ( sal_Int32 i = 0 ; i < nDlgCount ; i++ )
1028 : {
1029 0 : OUString aDlgName( pDlgNames[ i ] );
1030 0 : Any aElement_ = xDlgLibImport->getByName( aDlgName );
1031 0 : xDlgLib->insertByName( aDlgName, aElement_ );
1032 0 : }
1033 0 : }
1034 : }
1035 0 : }
1036 : }
1037 :
1038 : // insert listbox entry
1039 0 : ImpInsertLibEntry( aLibName, m_pLibBox->GetEntryCount() );
1040 0 : bChanges = true;
1041 : }
1042 : }
1043 :
1044 0 : SvTreeListEntry* pFirstNew = m_pLibBox->GetEntry( nNewPos );
1045 0 : if ( pFirstNew )
1046 0 : m_pLibBox->SetCurEntry( pFirstNew );
1047 : }
1048 :
1049 0 : pLibDlg.reset();
1050 0 : if ( bChanges )
1051 0 : MarkDocumentModified( m_aCurDocument );
1052 0 : }
1053 0 : }
1054 0 : }
1055 0 : }
1056 :
1057 0 : void LibPage::Export( void )
1058 : {
1059 0 : SvTreeListEntry* pCurEntry = m_pLibBox->GetCurEntry();
1060 0 : OUString aLibName( m_pLibBox->GetEntryText( pCurEntry, 0 ) );
1061 :
1062 : // Password verification
1063 0 : OUString aOULibName( aLibName );
1064 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
1065 :
1066 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && !xModLibContainer->isLibraryLoaded( aOULibName ) )
1067 : {
1068 0 : bool bOK = true;
1069 :
1070 : // check password
1071 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
1072 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aOULibName ) && !xPasswd->isLibraryPasswordVerified( aOULibName ) )
1073 : {
1074 0 : OUString aPassword;
1075 0 : Reference< script::XLibraryContainer > xModLibContainer1( xModLibContainer, UNO_QUERY );
1076 0 : bOK = QueryPassword( xModLibContainer1, aLibName, aPassword );
1077 : }
1078 0 : if ( !bOK )
1079 0 : return;
1080 : }
1081 :
1082 0 : ExportDialog aNewDlg(this);
1083 0 : if (aNewDlg.Execute() == RET_OK)
1084 : {
1085 : try
1086 : {
1087 0 : if (aNewDlg.isExportAsPackage())
1088 0 : ExportAsPackage( aLibName );
1089 : else
1090 0 : ExportAsBasic( aLibName );
1091 : }
1092 0 : catch(const util::VetoException& ) // user cancled operation
1093 : {
1094 : }
1095 0 : }
1096 : }
1097 :
1098 0 : void LibPage::implExportLib( const OUString& aLibName, const OUString& aTargetURL,
1099 : const Reference< task::XInteractionHandler >& Handler )
1100 : {
1101 0 : OUString aOULibName( aLibName );
1102 : Reference< script::XLibraryContainerExport > xModLibContainerExport
1103 0 : ( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
1104 : Reference< script::XLibraryContainerExport > xDlgLibContainerExport
1105 0 : ( m_aCurDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
1106 0 : if ( xModLibContainerExport.is() )
1107 0 : xModLibContainerExport->exportLibrary( aOULibName, aTargetURL, Handler );
1108 :
1109 0 : if (!xDlgLibContainerExport.is())
1110 0 : return;
1111 0 : Reference<container::XNameAccess> xNameAcc(xDlgLibContainerExport, UNO_QUERY);
1112 0 : if (!xNameAcc.is())
1113 0 : return;
1114 0 : if (!xNameAcc->hasByName(aOULibName))
1115 0 : return;
1116 0 : xDlgLibContainerExport->exportLibrary(aOULibName, aTargetURL, Handler);
1117 : }
1118 :
1119 : // Implementation XCommandEnvironment
1120 : typedef cppu::WeakImplHelper1< XCommandEnvironment > LibCommandEnvironmentHelper;
1121 :
1122 0 : class OLibCommandEnvironment : public LibCommandEnvironmentHelper
1123 : {
1124 : Reference< task::XInteractionHandler > mxInteraction;
1125 :
1126 : public:
1127 0 : OLibCommandEnvironment( Reference< task::XInteractionHandler > xInteraction )
1128 0 : : mxInteraction( xInteraction )
1129 0 : {}
1130 :
1131 : // Methods
1132 : virtual Reference< task::XInteractionHandler > SAL_CALL getInteractionHandler()
1133 : throw(RuntimeException, std::exception) SAL_OVERRIDE;
1134 : virtual Reference< XProgressHandler > SAL_CALL getProgressHandler()
1135 : throw(RuntimeException, std::exception) SAL_OVERRIDE;
1136 : };
1137 :
1138 0 : Reference< task::XInteractionHandler > OLibCommandEnvironment::getInteractionHandler()
1139 : throw(RuntimeException, std::exception)
1140 : {
1141 0 : return mxInteraction;
1142 : }
1143 :
1144 0 : Reference< XProgressHandler > OLibCommandEnvironment::getProgressHandler()
1145 : throw(RuntimeException, std::exception)
1146 : {
1147 0 : Reference< XProgressHandler > xRet;
1148 0 : return xRet;
1149 : }
1150 :
1151 0 : void LibPage::ExportAsPackage( const OUString& aLibName )
1152 : {
1153 : // file open dialog
1154 0 : Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1155 0 : Reference< task::XInteractionHandler2 > xHandler( task::InteractionHandler::createWithParent(xContext, 0) );
1156 0 : Reference< XSimpleFileAccess3 > xSFA = SimpleFileAccess::create(xContext);
1157 :
1158 0 : Reference < XFilePicker3 > xFP = FilePicker::createWithMode(xContext, TemplateDescription::FILESAVE_SIMPLE);
1159 :
1160 0 : xFP->setTitle(IDEResId(RID_STR_EXPORTPACKAGE).toString());
1161 :
1162 : // filter
1163 0 : OUString aTitle(IDEResId(RID_STR_PACKAGE_BUNDLE).toString());
1164 0 : OUString aFilter;
1165 0 : aFilter = "*.oxt" ; // library files
1166 0 : xFP->appendFilter( aTitle, aFilter );
1167 :
1168 : // set display directory and filter
1169 0 : OUString aPath = GetExtraData()->GetAddLibPath();
1170 0 : if ( !aPath.isEmpty() )
1171 : {
1172 0 : xFP->setDisplayDirectory( aPath );
1173 : }
1174 : else
1175 : {
1176 : // macro path from configuration management
1177 0 : xFP->setDisplayDirectory( SvtPathOptions().GetWorkPath() );
1178 : }
1179 0 : xFP->setCurrentFilter( aTitle );
1180 :
1181 0 : if ( xFP->execute() == RET_OK )
1182 : {
1183 0 : GetExtraData()->SetAddLibPath(xFP->getDisplayDirectory());
1184 :
1185 0 : Sequence< OUString > aFiles = xFP->getFiles();
1186 0 : INetURLObject aURL( aFiles[0] );
1187 0 : if( aURL.getExtension().isEmpty() )
1188 0 : aURL.setExtension( "oxt" );
1189 :
1190 0 : OUString aPackageURL( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
1191 :
1192 0 : OUString aTmpPath = SvtPathOptions().GetTempPath();
1193 0 : INetURLObject aInetObj( aTmpPath );
1194 0 : aInetObj.insertName( aLibName, true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
1195 0 : OUString aSourcePath = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
1196 0 : if( xSFA->exists( aSourcePath ) )
1197 0 : xSFA->kill( aSourcePath );
1198 0 : Reference< task::XInteractionHandler > xDummyHandler( new DummyInteractionHandler( xHandler ) );
1199 0 : implExportLib( aLibName, aTmpPath, xDummyHandler );
1200 :
1201 : Reference< XCommandEnvironment > xCmdEnv =
1202 : static_cast<XCommandEnvironment*>(
1203 : new OLibCommandEnvironment(
1204 : Reference< task::XInteractionHandler >(
1205 0 : xHandler, UNO_QUERY ) ) );
1206 :
1207 0 : ::ucbhelper::Content sourceContent( aSourcePath, xCmdEnv, comphelper::getProcessComponentContext() );
1208 :
1209 0 : OUString destFolder = "vnd.sun.star.zip://" +
1210 : ::rtl::Uri::encode( aPackageURL,
1211 : rtl_UriCharClassRegName,
1212 : rtl_UriEncodeIgnoreEscapes,
1213 0 : RTL_TEXTENCODING_UTF8 ) +
1214 0 : "/";
1215 :
1216 0 : if( xSFA->exists( aPackageURL ) )
1217 0 : xSFA->kill( aPackageURL );
1218 :
1219 0 : ::ucbhelper::Content destFolderContent( destFolder, xCmdEnv, comphelper::getProcessComponentContext() );
1220 : destFolderContent.transferContent(
1221 : sourceContent, ::ucbhelper::InsertOperation_COPY,
1222 0 : OUString(), NameClash::OVERWRITE );
1223 :
1224 0 : INetURLObject aMetaInfInetObj( aTmpPath );
1225 : aMetaInfInetObj.insertName( "META-INF",
1226 0 : true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
1227 0 : OUString aMetaInfFolder = aMetaInfInetObj.GetMainURL( INetURLObject::NO_DECODE );
1228 0 : if( xSFA->exists( aMetaInfFolder ) )
1229 0 : xSFA->kill( aMetaInfFolder );
1230 0 : xSFA->createFolder( aMetaInfFolder );
1231 :
1232 0 : ::std::vector< Sequence<beans::PropertyValue> > manifest;
1233 0 : const OUString strMediaType = "MediaType" ;
1234 0 : const OUString strFullPath = "FullPath" ;
1235 0 : const OUString strBasicMediaType = "application/vnd.sun.star.basic-library" ;
1236 :
1237 0 : Sequence<beans::PropertyValue> attribs( 2 );
1238 0 : beans::PropertyValue * pattribs = attribs.getArray();
1239 0 : pattribs[ 0 ].Name = strFullPath;
1240 0 : OUString fullPath = aLibName;
1241 0 : fullPath += "/" ;
1242 0 : pattribs[ 0 ].Value <<= fullPath;
1243 0 : pattribs[ 1 ].Name = strMediaType;
1244 0 : pattribs[ 1 ].Value <<= strBasicMediaType;
1245 0 : manifest.push_back( attribs );
1246 :
1247 : // write into pipe:
1248 0 : Reference<packages::manifest::XManifestWriter> xManifestWriter = packages::manifest::ManifestWriter::create( xContext );
1249 0 : Reference<io::XOutputStream> xPipe( io::Pipe::create( xContext ), UNO_QUERY_THROW );
1250 0 : xManifestWriter->writeManifestSequence(
1251 : xPipe, Sequence< Sequence<beans::PropertyValue> >(
1252 0 : &manifest[ 0 ], manifest.size() ) );
1253 :
1254 : aMetaInfInetObj.insertName( "manifest.xml",
1255 0 : true, INetURLObject::LAST_SEGMENT, true, INetURLObject::ENCODE_ALL );
1256 :
1257 : // write buffered pipe data to content:
1258 0 : ::ucbhelper::Content manifestContent( aMetaInfInetObj.GetMainURL( INetURLObject::NO_DECODE ), xCmdEnv, comphelper::getProcessComponentContext() );
1259 0 : manifestContent.writeStream( Reference<io::XInputStream>( xPipe, UNO_QUERY_THROW ), true );
1260 :
1261 0 : ::ucbhelper::Content MetaInfContent( aMetaInfFolder, xCmdEnv, comphelper::getProcessComponentContext() );
1262 : destFolderContent.transferContent(
1263 : MetaInfContent, ::ucbhelper::InsertOperation_COPY,
1264 0 : OUString(), NameClash::OVERWRITE );
1265 :
1266 0 : if( xSFA->exists( aSourcePath ) )
1267 0 : xSFA->kill( aSourcePath );
1268 0 : if( xSFA->exists( aMetaInfFolder ) )
1269 0 : xSFA->kill( aMetaInfFolder );
1270 0 : }
1271 0 : }
1272 :
1273 0 : void LibPage::ExportAsBasic( const OUString& aLibName )
1274 : {
1275 : // Folder picker
1276 0 : Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1277 0 : Reference< XFolderPicker2 > xFolderPicker = FolderPicker::create(xContext);
1278 0 : Reference< task::XInteractionHandler2 > xHandler( task::InteractionHandler::createWithParent(xContext, 0) );
1279 :
1280 0 : xFolderPicker->setTitle(IDEResId(RID_STR_EXPORTBASIC).toString());
1281 :
1282 : // set display directory and filter
1283 0 : OUString aPath =GetExtraData()->GetAddLibPath();
1284 0 : if( aPath.isEmpty() )
1285 0 : aPath = SvtPathOptions().GetWorkPath();
1286 :
1287 : // INetURLObject aURL(m_sSavePath, INET_PROT_FILE);
1288 0 : xFolderPicker->setDisplayDirectory( aPath );
1289 0 : short nRet = xFolderPicker->execute();
1290 0 : if( nRet == RET_OK )
1291 : {
1292 0 : OUString aTargetURL = xFolderPicker->getDirectory();
1293 0 : GetExtraData()->SetAddLibPath(aTargetURL);
1294 :
1295 0 : Reference< task::XInteractionHandler > xDummyHandler( new DummyInteractionHandler( xHandler ) );
1296 0 : implExportLib( aLibName, aTargetURL, xDummyHandler );
1297 0 : }
1298 0 : }
1299 :
1300 0 : void LibPage::DeleteCurrent()
1301 : {
1302 0 : SvTreeListEntry* pCurEntry = m_pLibBox->GetCurEntry();
1303 0 : OUString aLibName( m_pLibBox->GetEntryText( pCurEntry, 0 ) );
1304 :
1305 : // check, if library is link
1306 0 : bool bIsLibraryLink = false;
1307 0 : OUString aOULibName( aLibName );
1308 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
1309 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( m_aCurDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
1310 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryLink( aOULibName ) ) ||
1311 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryLink( aOULibName ) ) )
1312 : {
1313 0 : bIsLibraryLink = true;
1314 : }
1315 :
1316 0 : if ( QueryDelLib( aLibName, bIsLibraryLink, this ) )
1317 : {
1318 : // inform BasicIDE
1319 0 : SfxUsrAnyItem aDocItem( SID_BASICIDE_ARG_DOCUMENT_MODEL, makeAny( m_aCurDocument.getDocumentOrNull() ) );
1320 0 : SfxStringItem aLibNameItem( SID_BASICIDE_ARG_LIBNAME, aLibName );
1321 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
1322 : pDispatcher->Execute( SID_BASICIDE_LIBREMOVED,
1323 0 : SfxCallMode::SYNCHRON, &aDocItem, &aLibNameItem, 0L );
1324 :
1325 : // remove library from module and dialog library containers
1326 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
1327 0 : xModLibContainer->removeLibrary( aOULibName );
1328 0 : if ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) )
1329 0 : xDlgLibContainer->removeLibrary( aOULibName );
1330 :
1331 0 : static_cast<SvTreeListBox&>(*m_pLibBox).GetModel()->Remove( pCurEntry );
1332 0 : MarkDocumentModified( m_aCurDocument );
1333 0 : }
1334 0 : }
1335 :
1336 0 : void LibPage::EndTabDialog( sal_uInt16 nRet )
1337 : {
1338 : DBG_ASSERT( pTabDlg, "TabDlg nicht gesetzt!" );
1339 0 : if ( pTabDlg )
1340 0 : pTabDlg->EndDialog( nRet );
1341 0 : }
1342 :
1343 0 : void LibPage::FillListBox()
1344 : {
1345 0 : InsertListBoxEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_USER );
1346 0 : InsertListBoxEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_SHARE );
1347 :
1348 0 : ScriptDocuments aDocuments( ScriptDocument::getAllScriptDocuments( ScriptDocument::DocumentsSorted ) );
1349 0 : for ( ScriptDocuments::const_iterator doc = aDocuments.begin();
1350 0 : doc != aDocuments.end();
1351 : ++doc
1352 : )
1353 : {
1354 0 : InsertListBoxEntry( *doc, LIBRARY_LOCATION_DOCUMENT );
1355 0 : }
1356 0 : }
1357 :
1358 0 : void LibPage::InsertListBoxEntry( const ScriptDocument& rDocument, LibraryLocation eLocation )
1359 : {
1360 0 : OUString aEntryText( rDocument.getTitle( eLocation ) );
1361 0 : sal_uInt16 nPos = m_pBasicsBox->InsertEntry( aEntryText, LISTBOX_APPEND );
1362 0 : m_pBasicsBox->SetEntryData( nPos, new DocumentEntry(rDocument, eLocation) );
1363 0 : }
1364 :
1365 0 : void LibPage::SetCurLib()
1366 : {
1367 0 : sal_uInt16 nSelPos = m_pBasicsBox->GetSelectEntryPos();
1368 0 : DocumentEntry* pEntry = (DocumentEntry*)m_pBasicsBox->GetEntryData( nSelPos );
1369 0 : if ( pEntry )
1370 : {
1371 0 : ScriptDocument aDocument( pEntry->GetDocument() );
1372 : DBG_ASSERT( aDocument.isAlive(), "LibPage::SetCurLib: no document, or document is dead!" );
1373 0 : if ( !aDocument.isAlive() )
1374 0 : return;
1375 0 : LibraryLocation eLocation = pEntry->GetLocation();
1376 0 : if ( aDocument != m_aCurDocument || eLocation != m_eCurLocation )
1377 : {
1378 0 : m_aCurDocument = aDocument;
1379 0 : m_eCurLocation = eLocation;
1380 0 : m_pLibBox->SetDocument( aDocument );
1381 0 : m_pLibBox->Clear();
1382 :
1383 : // get a sorted list of library names
1384 0 : Sequence< OUString > aLibNames = aDocument.getLibraryNames();
1385 0 : sal_Int32 nLibCount = aLibNames.getLength();
1386 0 : const OUString* pLibNames = aLibNames.getConstArray();
1387 :
1388 0 : for ( sal_Int32 i = 0 ; i < nLibCount ; i++ )
1389 : {
1390 0 : OUString aLibName( pLibNames[ i ] );
1391 0 : if ( eLocation == aDocument.getLibraryLocation( aLibName ) )
1392 0 : ImpInsertLibEntry( aLibName, i );
1393 0 : }
1394 :
1395 0 : SvTreeListEntry* pEntry_ = m_pLibBox->FindEntry( OUString( "Standard" ) );
1396 0 : if ( !pEntry_ )
1397 0 : pEntry_ = m_pLibBox->GetEntry( 0 );
1398 0 : m_pLibBox->SetCurEntry( pEntry_ );
1399 0 : }
1400 : }
1401 : }
1402 :
1403 0 : SvTreeListEntry* LibPage::ImpInsertLibEntry( const OUString& rLibName, sal_uLong nPos )
1404 : {
1405 : // check, if library is password protected
1406 0 : bool bProtected = false;
1407 0 : OUString aOULibName( rLibName );
1408 0 : Reference< script::XLibraryContainer2 > xModLibContainer( m_aCurDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
1409 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
1410 : {
1411 0 : Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
1412 0 : if ( xPasswd.is() )
1413 : {
1414 0 : bProtected = xPasswd->isLibraryPasswordProtected( aOULibName );
1415 0 : }
1416 : }
1417 :
1418 0 : SvTreeListEntry* pNewEntry = m_pLibBox->DoInsertEntry( rLibName, nPos );
1419 0 : pNewEntry->SetUserData( new LibUserData(m_aCurDocument) );
1420 :
1421 0 : if (bProtected)
1422 : {
1423 0 : Image aImage(IDEResId(RID_IMG_LOCKED));
1424 0 : m_pLibBox->SetExpandedEntryBmp(pNewEntry, aImage);
1425 0 : m_pLibBox->SetCollapsedEntryBmp(pNewEntry, aImage);
1426 : }
1427 :
1428 : // check, if library is link
1429 0 : if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryLink( aOULibName ) )
1430 : {
1431 0 : OUString aLinkURL = xModLibContainer->getLibraryLinkURL( aOULibName );
1432 0 : m_pLibBox->SetEntryText( aLinkURL, pNewEntry, 1 );
1433 : }
1434 :
1435 0 : return pNewEntry;
1436 : }
1437 :
1438 : // Helper function
1439 0 : void createLibImpl( vcl::Window* pWin, const ScriptDocument& rDocument,
1440 : CheckBox* pLibBox, TreeListBox* pBasicBox )
1441 : {
1442 : OSL_ENSURE( rDocument.isAlive(), "createLibImpl: invalid document!" );
1443 0 : if ( !rDocument.isAlive() )
1444 0 : return;
1445 :
1446 : // create library name
1447 0 : OUString aLibName;
1448 0 : OUString aLibStdName( "Library" );
1449 : //String aLibStdName( IDEResId( RID_STR_STDLIBNAME ) );
1450 0 : bool bValid = false;
1451 0 : sal_Int32 i = 1;
1452 0 : while ( !bValid )
1453 : {
1454 0 : aLibName = aLibStdName + OUString::number( i );
1455 0 : if ( !rDocument.hasLibrary( E_SCRIPTS, aLibName ) && !rDocument.hasLibrary( E_DIALOGS, aLibName ) )
1456 0 : bValid = true;
1457 0 : i++;
1458 : }
1459 :
1460 0 : NewObjectDialog aNewDlg(pWin, ObjectMode::Library);
1461 0 : aNewDlg.SetObjectName(aLibName);
1462 :
1463 0 : if (aNewDlg.Execute())
1464 : {
1465 0 : if (!aNewDlg.GetObjectName().isEmpty())
1466 0 : aLibName = aNewDlg.GetObjectName();
1467 :
1468 0 : if ( aLibName.getLength() > 30 )
1469 : {
1470 0 : MessageDialog(pWin, IDEResId(RID_STR_LIBNAMETOLONG).toString()).Execute();
1471 : }
1472 0 : else if ( !IsValidSbxName( aLibName ) )
1473 : {
1474 0 : MessageDialog(pWin, IDEResId(RID_STR_BADSBXNAME).toString()).Execute();
1475 : }
1476 0 : else if ( rDocument.hasLibrary( E_SCRIPTS, aLibName ) || rDocument.hasLibrary( E_DIALOGS, aLibName ) )
1477 : {
1478 0 : MessageDialog(pWin, IDEResId(RID_STR_SBXNAMEALLREADYUSED2).toString()).Execute();
1479 : }
1480 : else
1481 : {
1482 : try
1483 : {
1484 : // create module and dialog library
1485 0 : Reference< container::XNameContainer > xModLib( rDocument.getOrCreateLibrary( E_SCRIPTS, aLibName ) );
1486 0 : Reference< container::XNameContainer > xDlgLib( rDocument.getOrCreateLibrary( E_DIALOGS, aLibName ) );
1487 :
1488 0 : if( pLibBox )
1489 : {
1490 0 : SvTreeListEntry* pEntry = pLibBox->DoInsertEntry( aLibName );
1491 0 : pEntry->SetUserData( new LibUserData( rDocument ) );
1492 0 : pLibBox->SetCurEntry( pEntry );
1493 : }
1494 :
1495 : // create a module
1496 0 : OUString aModName = rDocument.createObjectName( E_SCRIPTS, aLibName );
1497 0 : OUString sModuleCode;
1498 0 : if ( !rDocument.createModule( aLibName, aModName, true, sModuleCode ) )
1499 0 : throw Exception();
1500 :
1501 0 : SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, rDocument, aLibName, aModName, TYPE_MODULE );
1502 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
1503 : pDispatcher->Execute( SID_BASICIDE_SBXINSERTED,
1504 0 : SfxCallMode::SYNCHRON, &aSbxItem, 0L );
1505 :
1506 0 : if( pBasicBox )
1507 : {
1508 0 : SvTreeListEntry* pEntry = pBasicBox->GetCurEntry();
1509 0 : SvTreeListEntry* pRootEntry = NULL;
1510 0 : while( pEntry )
1511 : {
1512 0 : pRootEntry = pEntry;
1513 0 : pEntry = pBasicBox->GetParent( pEntry );
1514 : }
1515 :
1516 0 : sal_uInt16 nMode = pBasicBox->GetMode();
1517 0 : bool bDlgMode = ( nMode & BROWSEMODE_DIALOGS ) && !( nMode & BROWSEMODE_MODULES );
1518 0 : sal_uInt16 nId = bDlgMode ? RID_IMG_DLGLIB : RID_IMG_MODLIB;
1519 0 : std::unique_ptr<Entry> e(new Entry(OBJ_TYPE_LIBRARY));
1520 : SvTreeListEntry* pNewLibEntry = pBasicBox->AddEntry(
1521 : aLibName,
1522 : Image( IDEResId( nId ) ),
1523 0 : pRootEntry, false, &e);
1524 : DBG_ASSERT( pNewLibEntry, "InsertEntry fehlgeschlagen!" );
1525 :
1526 0 : if( pNewLibEntry )
1527 : {
1528 0 : e.reset(new Entry(OBJ_TYPE_MODULE));
1529 : SvTreeListEntry* pEntry_ = pBasicBox->AddEntry(
1530 : aModName,
1531 : Image( IDEResId( RID_IMG_MODULE ) ),
1532 0 : pNewLibEntry, false, &e);
1533 : DBG_ASSERT( pEntry_, "InsertEntry fehlgeschlagen!" );
1534 0 : pBasicBox->SetCurEntry( pEntry_ );
1535 0 : pBasicBox->Select( pBasicBox->GetCurEntry() ); // OV-Bug?!
1536 0 : }
1537 0 : }
1538 : }
1539 0 : catch (const uno::Exception& )
1540 : {
1541 : DBG_UNHANDLED_EXCEPTION();
1542 : }
1543 : }
1544 0 : }
1545 : }
1546 0 : } // namespace basctl
1547 :
1548 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|