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