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 "baside2.hrc"
21 : #include "basidesh.hrc"
22 : #include "helpid.hrc"
23 :
24 : #include "baside2.hxx" // unfortunately pModulWindow is needed partly...
25 : #include "baside3.hxx"
26 : #include "basobj.hxx"
27 : #include "iderdll.hxx"
28 : #include "iderdll2.hxx"
29 :
30 : #include <basic/basmgr.hxx>
31 : #include <com/sun/star/script/ModuleType.hpp>
32 : #include <com/sun/star/script/XLibraryContainerPassword.hpp>
33 : #include <sfx2/dispatch.hxx>
34 : #include <sfx2/passwd.hxx>
35 : #include <sfx2/viewfrm.hxx>
36 : #include <svl/intitem.hxx>
37 : #include <svl/stritem.hxx>
38 : #include <vcl/msgbox.hxx>
39 :
40 : namespace basctl
41 : {
42 :
43 : using namespace ::com::sun::star::uno;
44 : using namespace ::com::sun::star;
45 :
46 :
47 : //
48 : // BaseWindow
49 : // ==========
50 : //
51 :
52 : DBG_NAME( BaseWindow )
53 :
54 0 : TYPEINIT0( BaseWindow )
55 0 : TYPEINIT1( SbxItem, SfxPoolItem );
56 :
57 0 : BaseWindow::BaseWindow( Window* pParent, const ScriptDocument& rDocument, OUString aLibName, OUString aName )
58 : :Window( pParent, WinBits( WB_3DLOOK ) )
59 : ,m_aDocument( rDocument )
60 : ,m_aLibName( aLibName )
61 0 : ,m_aName( aName )
62 : {
63 : DBG_CTOR( BaseWindow, 0 );
64 0 : pShellHScrollBar = 0;
65 0 : pShellVScrollBar = 0;
66 0 : nStatus = 0;
67 0 : }
68 :
69 0 : BaseWindow::~BaseWindow()
70 : {
71 : DBG_DTOR( BaseWindow, 0 );
72 0 : if ( pShellVScrollBar )
73 0 : pShellVScrollBar->SetScrollHdl( Link() );
74 0 : if ( pShellHScrollBar )
75 0 : pShellHScrollBar->SetScrollHdl( Link() );
76 0 : }
77 :
78 :
79 :
80 0 : void BaseWindow::Init()
81 : {
82 : DBG_CHKTHIS( BaseWindow, 0 );
83 0 : if ( pShellVScrollBar )
84 0 : pShellVScrollBar->SetScrollHdl( LINK( this, BaseWindow, ScrollHdl ) );
85 0 : if ( pShellHScrollBar )
86 0 : pShellHScrollBar->SetScrollHdl( LINK( this, BaseWindow, ScrollHdl ) );
87 0 : DoInit(); // virtual...
88 0 : }
89 :
90 :
91 :
92 0 : void BaseWindow::DoInit()
93 0 : { }
94 :
95 :
96 :
97 0 : void BaseWindow::GrabScrollBars( ScrollBar* pHScroll, ScrollBar* pVScroll )
98 : {
99 : DBG_CHKTHIS( BaseWindow, 0 );
100 0 : pShellHScrollBar = pHScroll;
101 0 : pShellVScrollBar = pVScroll;
102 : // Init(); // does not make sense, leads to flickering and errors...
103 0 : }
104 :
105 :
106 :
107 0 : IMPL_LINK_INLINE_START( BaseWindow, ScrollHdl, ScrollBar *, pCurScrollBar )
108 : {
109 : DBG_CHKTHIS( BaseWindow, 0 );
110 0 : DoScroll( pCurScrollBar );
111 0 : return 0;
112 : }
113 0 : IMPL_LINK_INLINE_END( BaseWindow, ScrollHdl, ScrollBar *, pCurScrollBar )
114 :
115 :
116 0 : void BaseWindow::ExecuteCommand (SfxRequest&)
117 0 : { }
118 :
119 0 : void BaseWindow::ExecuteGlobal (SfxRequest&)
120 0 : { }
121 :
122 :
123 0 : long BaseWindow::Notify( NotifyEvent& rNEvt )
124 : {
125 0 : long nDone = 0;
126 :
127 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
128 : {
129 0 : KeyEvent aKEvt = *rNEvt.GetKeyEvent();
130 0 : KeyCode aCode = aKEvt.GetKeyCode();
131 0 : sal_uInt16 nCode = aCode.GetCode();
132 :
133 0 : switch ( nCode )
134 : {
135 : case KEY_PAGEUP:
136 : case KEY_PAGEDOWN:
137 : {
138 0 : if ( aCode.IsMod1() )
139 : {
140 0 : if (Shell* pShell = GetShell())
141 0 : pShell->NextPage( nCode == KEY_PAGEUP );
142 0 : nDone = 1;
143 : }
144 : }
145 0 : break;
146 : }
147 : }
148 :
149 0 : return nDone ? nDone : Window::Notify( rNEvt );
150 : }
151 :
152 :
153 0 : void BaseWindow::DoScroll( ScrollBar* )
154 : {
155 : DBG_CHKTHIS( BaseWindow, 0 );
156 0 : }
157 :
158 :
159 0 : void BaseWindow::StoreData()
160 : {
161 0 : }
162 :
163 0 : bool BaseWindow::CanClose()
164 : {
165 0 : return true;
166 : }
167 :
168 0 : bool BaseWindow::AllowUndo()
169 : {
170 0 : return true;
171 : }
172 :
173 :
174 :
175 0 : void BaseWindow::UpdateData()
176 : {
177 0 : }
178 :
179 0 : OUString BaseWindow::GetTitle()
180 : {
181 0 : return OUString();
182 : }
183 :
184 0 : OUString BaseWindow::CreateQualifiedName()
185 : {
186 0 : OUString aName;
187 0 : if ( !m_aLibName.isEmpty() )
188 : {
189 0 : LibraryLocation eLocation = m_aDocument.getLibraryLocation( m_aLibName );
190 0 : aName = m_aDocument.getTitle(eLocation) + "." + m_aLibName + "." +
191 0 : GetTitle();
192 : }
193 0 : return aName;
194 : }
195 :
196 0 : void BaseWindow::SetReadOnly (bool)
197 : {
198 0 : }
199 :
200 0 : bool BaseWindow::IsReadOnly ()
201 : {
202 0 : return false;
203 : }
204 :
205 0 : void BaseWindow::BasicStarted()
206 : {
207 0 : }
208 :
209 0 : void BaseWindow::BasicStopped()
210 : {
211 0 : }
212 :
213 0 : bool BaseWindow::IsModified ()
214 : {
215 0 : return true;
216 : }
217 :
218 0 : bool BaseWindow::IsPasteAllowed ()
219 : {
220 0 : return false;
221 : }
222 :
223 0 : ::svl::IUndoManager* BaseWindow::GetUndoManager()
224 : {
225 0 : return NULL;
226 : }
227 :
228 0 : sal_uInt16 BaseWindow::GetSearchOptions()
229 : {
230 0 : return 0;
231 : }
232 :
233 0 : sal_uInt16 BaseWindow::StartSearchAndReplace (SvxSearchItem const&, bool bFromStart)
234 : {
235 : static_cast<void>(bFromStart);
236 0 : return 0;
237 : }
238 :
239 0 : void BaseWindow::OnNewDocument ()
240 0 : { }
241 :
242 0 : void BaseWindow::InsertLibInfo () const
243 : {
244 0 : if (ExtraData* pData = GetExtraData())
245 0 : pData->GetLibInfos().InsertInfo(m_aDocument, m_aLibName, m_aName, GetType());
246 0 : }
247 :
248 0 : bool BaseWindow::Is (
249 : ScriptDocument const& rDocument,
250 : OUString const& rLibName, OUString const& rName,
251 : ItemType eType, bool bFindSuspended
252 : )
253 : {
254 0 : if (bFindSuspended || !IsSuspended())
255 : {
256 : // any non-suspended window is ok
257 0 : if (rLibName.isEmpty() || rName.isEmpty() || eType == TYPE_UNKNOWN)
258 0 : return true;
259 : // ok if the parameters match
260 0 : if (m_aDocument == rDocument && m_aLibName == rLibName && m_aName == rName && GetType() == eType)
261 0 : return true;
262 : }
263 0 : return false;
264 : }
265 :
266 0 : bool BaseWindow::HasActiveEditor () const
267 : {
268 0 : return false;
269 : }
270 :
271 :
272 : //
273 : // DockingWindow
274 : // =============
275 : //
276 :
277 : // style bits for DockingWindow
278 : WinBits const DockingWindow::StyleBits =
279 : WB_BORDER | WB_3DLOOK | WB_CLIPCHILDREN |
280 : WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_DOCKABLE;
281 :
282 0 : DockingWindow::DockingWindow (Window* pParent) :
283 : ::DockingWindow(pParent, StyleBits),
284 : pLayout(0),
285 0 : nShowCount(0)
286 0 : { }
287 :
288 0 : DockingWindow::DockingWindow (Layout* pParent) :
289 : ::DockingWindow(pParent, StyleBits),
290 : pLayout(pParent),
291 0 : nShowCount(0)
292 0 : { }
293 :
294 : // Sets the position and the size of the docking window. This property is saved
295 : // when the window is floating. Called by Layout.
296 0 : void DockingWindow::ResizeIfDocking (Point const& rPos, Size const& rSize)
297 : {
298 0 : Rectangle const rRect(rPos, rSize);
299 0 : if (rRect != aDockingRect)
300 : {
301 : // saving the position and the size
302 0 : aDockingRect = rRect;
303 : // resizing if actually docking
304 0 : if (!IsFloatingMode())
305 0 : SetPosSizePixel(rPos, rSize);
306 : }
307 0 : }
308 0 : void DockingWindow::ResizeIfDocking (Size const& rSize)
309 : {
310 0 : ResizeIfDocking(aDockingRect.TopLeft(), rSize);
311 0 : }
312 :
313 : // Sets the parent Layout window.
314 : // The physical parent is set only when the window is docking.
315 0 : void DockingWindow::SetLayoutWindow (Layout* pLayout_)
316 : {
317 0 : pLayout = pLayout_;
318 0 : if (!IsFloatingMode())
319 0 : SetParent(pLayout);
320 :
321 0 : }
322 :
323 : // Increases the "show" reference count.
324 : // The window is shown when the reference count is positive.
325 0 : void DockingWindow::Show (bool bShow) // = true
326 : {
327 0 : if (bShow)
328 : {
329 0 : if (++nShowCount == 1)
330 0 : ::DockingWindow::Show();
331 : }
332 : else
333 : {
334 0 : if (--nShowCount == 0)
335 0 : ::DockingWindow::Hide();
336 : }
337 0 : }
338 :
339 : // Decreases the "show" reference count.
340 : // The window is hidden when the reference count reaches zero.
341 0 : void DockingWindow::Hide ()
342 : {
343 0 : Show(false);
344 0 : }
345 :
346 0 : sal_Bool DockingWindow::Docking( const Point& rPos, Rectangle& rRect )
347 : {
348 0 : if (!IsDockingPrevented() && aDockingRect.IsInside(rPos))
349 : {
350 0 : rRect.SetSize(aDockingRect.GetSize());
351 0 : return false; // dock
352 : }
353 : else // adjust old size
354 : {
355 0 : if (!aFloatingRect.IsEmpty())
356 0 : rRect.SetSize(aFloatingRect.GetSize());
357 0 : return true; // float
358 : }
359 : }
360 :
361 0 : void DockingWindow::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode )
362 : {
363 0 : if ( bFloatMode )
364 0 : ::DockingWindow::EndDocking( rRect, bFloatMode );
365 : else
366 : {
367 0 : SetFloatingMode(false);
368 0 : DockThis();
369 : }
370 0 : }
371 :
372 0 : void DockingWindow::ToggleFloatingMode()
373 : {
374 0 : if (IsFloatingMode())
375 : {
376 0 : if (!aFloatingRect.IsEmpty())
377 : SetPosSizePixel(
378 0 : GetParent()->ScreenToOutputPixel(aFloatingRect.TopLeft()),
379 0 : aFloatingRect.GetSize()
380 0 : );
381 : }
382 0 : DockThis();
383 0 : }
384 :
385 0 : sal_Bool DockingWindow::PrepareToggleFloatingMode()
386 : {
387 0 : if (IsFloatingMode())
388 : {
389 : // memorize position and size on the desktop...
390 : aFloatingRect = Rectangle(
391 0 : GetParent()->OutputToScreenPixel(GetPosPixel()),
392 0 : GetSizePixel()
393 0 : );
394 : }
395 0 : return true;
396 : }
397 :
398 0 : void DockingWindow::StartDocking()
399 : {
400 0 : if (IsFloatingMode())
401 : {
402 : aFloatingRect = Rectangle(
403 0 : GetParent()->OutputToScreenPixel(GetPosPixel()),
404 0 : GetSizePixel()
405 0 : );
406 : }
407 0 : }
408 :
409 0 : void DockingWindow::DockThis ()
410 : {
411 : // resizing when floating -> docking
412 0 : if (!IsFloatingMode())
413 : {
414 0 : Point const aPos = aDockingRect.TopLeft();
415 0 : Size const aSize = aDockingRect.GetSize();
416 0 : if (aSize != GetSizePixel() || aPos != GetPosPixel())
417 0 : SetPosSizePixel(aPos, aSize);
418 : }
419 :
420 0 : if (pLayout)
421 : {
422 0 : if (!IsFloatingMode() && GetParent() != pLayout)
423 0 : SetParent(pLayout);
424 0 : pLayout->DockaWindow(this);
425 : }
426 0 : }
427 :
428 :
429 : //
430 : // ExtendedEdit
431 : // ============
432 : //
433 :
434 0 : ExtendedEdit::ExtendedEdit( Window* pParent, IDEResId nRes ) :
435 0 : Edit( pParent, nRes )
436 : {
437 0 : aAcc.SetSelectHdl( LINK( this, ExtendedEdit, EditAccHdl ) );
438 0 : Control::SetGetFocusHdl( LINK( this, ExtendedEdit, ImplGetFocusHdl ) );
439 0 : Control::SetLoseFocusHdl( LINK( this, ExtendedEdit, ImplLoseFocusHdl ) );
440 0 : }
441 :
442 0 : IMPL_LINK_NOARG(ExtendedEdit, ImplGetFocusHdl)
443 : {
444 0 : Application::InsertAccel( &aAcc );
445 0 : aLoseFocusHdl.Call( this );
446 0 : return 0;
447 : }
448 :
449 :
450 0 : IMPL_LINK_NOARG(ExtendedEdit, ImplLoseFocusHdl)
451 : {
452 0 : Application::RemoveAccel( &aAcc );
453 0 : return 0;
454 : }
455 :
456 :
457 0 : IMPL_LINK_INLINE_START( ExtendedEdit, EditAccHdl, Accelerator *, pAcc )
458 : {
459 0 : aAccHdl.Call( pAcc );
460 0 : return 0;
461 : }
462 0 : IMPL_LINK_INLINE_END( ExtendedEdit, EditAccHdl, Accelerator *, pAcc )
463 :
464 :
465 : //
466 : // TabBar
467 : // ========
468 : //
469 :
470 0 : TabBar::TabBar( Window* pParent ) :
471 0 : ::TabBar( pParent, WinBits( WB_3DLOOK | WB_SCROLL | WB_BORDER | WB_SIZEABLE | WB_DRAG ) )
472 : {
473 0 : EnableEditMode(true);
474 :
475 0 : SetHelpId( HID_BASICIDE_TABBAR );
476 0 : }
477 :
478 0 : void TabBar::MouseButtonDown( const MouseEvent& rMEvt )
479 : {
480 0 : if ( rMEvt.IsLeft() && ( rMEvt.GetClicks() == 2 ) && !IsInEditMode() )
481 : {
482 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
483 0 : pDispatcher->Execute( SID_BASICIDE_MODULEDLG );
484 : }
485 : else
486 : {
487 0 : ::TabBar::MouseButtonDown( rMEvt ); // base class version
488 : }
489 0 : }
490 :
491 0 : void TabBar::Command( const CommandEvent& rCEvt )
492 : {
493 0 : if ( ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) && !IsInEditMode() )
494 : {
495 0 : Point aPos( rCEvt.IsMouseEvent() ? rCEvt.GetMousePosPixel() : Point(1,1) );
496 0 : if ( rCEvt.IsMouseEvent() ) // select right tab
497 : {
498 0 : Point aP = PixelToLogic( aPos );
499 0 : MouseEvent aMouseEvent( aP, 1, MOUSE_SIMPLECLICK, MOUSE_LEFT );
500 0 : ::TabBar::MouseButtonDown( aMouseEvent ); // base class
501 : }
502 :
503 0 : PopupMenu aPopup( IDEResId( RID_POPUP_TABBAR ) );
504 0 : if ( GetPageCount() == 0 )
505 : {
506 0 : aPopup.EnableItem(SID_BASICIDE_DELETECURRENT, false);
507 0 : aPopup.EnableItem(SID_BASICIDE_RENAMECURRENT, false);
508 0 : aPopup.EnableItem(SID_BASICIDE_HIDECURPAGE, false);
509 : }
510 :
511 0 : if ( StarBASIC::IsRunning() )
512 : {
513 0 : aPopup.EnableItem(SID_BASICIDE_DELETECURRENT, false);
514 0 : aPopup.EnableItem(SID_BASICIDE_RENAMECURRENT, false);
515 0 : aPopup.EnableItem(SID_BASICIDE_MODULEDLG, false);
516 : }
517 :
518 0 : if (Shell* pShell = GetShell())
519 : {
520 0 : ScriptDocument aDocument( pShell->GetCurDocument() );
521 0 : OUString aOULibName( pShell->GetCurLibName() );
522 0 : Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
523 0 : Reference< script::XLibraryContainer2 > xDlgLibContainer( aDocument.getLibraryContainer( E_DIALOGS ), UNO_QUERY );
524 0 : if ( ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryReadOnly( aOULibName ) ) ||
525 0 : ( xDlgLibContainer.is() && xDlgLibContainer->hasByName( aOULibName ) && xDlgLibContainer->isLibraryReadOnly( aOULibName ) ) )
526 : {
527 0 : aPopup.EnableItem(aPopup.GetItemId( 0 ), false);
528 0 : aPopup.EnableItem(SID_BASICIDE_DELETECURRENT, false);
529 0 : aPopup.EnableItem(SID_BASICIDE_RENAMECURRENT, false);
530 0 : aPopup.RemoveDisabledEntries();
531 : }
532 0 : if ( aDocument.isInVBAMode() )
533 : {
534 : // disable to delete or remove object modules in IDE
535 0 : if (BasicManager* pBasMgr = aDocument.getBasicManager())
536 : {
537 0 : if (StarBASIC* pBasic = pBasMgr->GetLib(aOULibName))
538 : {
539 0 : Shell::WindowTable& aWindowTable = pShell->GetWindowTable();
540 0 : Shell::WindowTableIt it = aWindowTable.find( GetCurPageId() );
541 0 : if (it != aWindowTable.end() && dynamic_cast<ModulWindow*>(it->second))
542 : {
543 0 : SbModule* pActiveModule = (SbModule*)pBasic->FindModule( it->second->GetName() );
544 0 : if( pActiveModule && ( pActiveModule->GetModuleType() == script::ModuleType::DOCUMENT ) )
545 : {
546 0 : aPopup.EnableItem(SID_BASICIDE_DELETECURRENT, false);
547 0 : aPopup.EnableItem(SID_BASICIDE_RENAMECURRENT, false);
548 : }
549 : }
550 : }
551 : }
552 0 : }
553 : }
554 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
555 0 : pDispatcher->Execute(aPopup.Execute(this, aPos));
556 : }
557 0 : }
558 :
559 0 : long TabBar::AllowRenaming()
560 : {
561 0 : bool const bValid = IsValidSbxName(GetEditText());
562 :
563 0 : if ( !bValid )
564 0 : ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_BADSBXNAME ) ) ).Execute();
565 :
566 0 : return bValid ? TABBAR_RENAMING_YES : TABBAR_RENAMING_NO;
567 : }
568 :
569 :
570 0 : void TabBar::EndRenaming()
571 : {
572 0 : if ( !IsEditModeCanceled() )
573 : {
574 0 : SfxUInt16Item aID( SID_BASICIDE_ARG_TABID, GetEditPageId() );
575 0 : SfxStringItem aNewName( SID_BASICIDE_ARG_MODULENAME, GetEditText() );
576 0 : if (SfxDispatcher* pDispatcher = GetDispatcher())
577 : pDispatcher->Execute( SID_BASICIDE_NAMECHANGEDONTAB,
578 0 : SFX_CALLMODE_SYNCHRON, &aID, &aNewName, 0L );
579 : }
580 0 : }
581 :
582 :
583 : namespace
584 : {
585 :
586 : // helper class for sorting TabBar
587 0 : struct TabBarSortHelper
588 : {
589 : sal_uInt16 nPageId;
590 : String aPageText;
591 :
592 0 : bool operator < (TabBarSortHelper const& rComp) const
593 : {
594 0 : return aPageText.CompareIgnoreCaseToAscii(rComp.aPageText) == COMPARE_LESS;
595 : }
596 : };
597 :
598 : } // namespace
599 :
600 0 : void TabBar::Sort()
601 : {
602 0 : if (Shell* pShell = GetShell())
603 : {
604 0 : Shell::WindowTable& aWindowTable = pShell->GetWindowTable();
605 0 : TabBarSortHelper aTabBarSortHelper;
606 0 : std::vector<TabBarSortHelper> aModuleList;
607 0 : std::vector<TabBarSortHelper> aDialogList;
608 0 : sal_uInt16 nPageCount = GetPageCount();
609 : sal_uInt16 i;
610 :
611 : // create module and dialog lists for sorting
612 0 : for ( i = 0; i < nPageCount; i++)
613 : {
614 0 : sal_uInt16 nId = GetPageId( i );
615 0 : aTabBarSortHelper.nPageId = nId;
616 0 : aTabBarSortHelper.aPageText = GetPageText( nId );
617 0 : BaseWindow* pWin = aWindowTable[ nId ];
618 :
619 0 : if (dynamic_cast<ModulWindow*>(pWin))
620 : {
621 0 : aModuleList.push_back( aTabBarSortHelper );
622 : }
623 0 : else if (dynamic_cast<DialogWindow*>(pWin))
624 : {
625 0 : aDialogList.push_back( aTabBarSortHelper );
626 : }
627 : }
628 :
629 : // sort module and dialog lists by page text
630 0 : ::std::sort( aModuleList.begin() , aModuleList.end() );
631 0 : ::std::sort( aDialogList.begin() , aDialogList.end() );
632 :
633 :
634 0 : sal_uInt16 nModules = sal::static_int_cast<sal_uInt16>( aModuleList.size() );
635 0 : sal_uInt16 nDialogs = sal::static_int_cast<sal_uInt16>( aDialogList.size() );
636 :
637 : // move module pages to new positions
638 0 : for (i = 0; i < nModules; i++)
639 : {
640 0 : MovePage( aModuleList[i].nPageId , i );
641 : }
642 :
643 : // move dialog pages to new positions
644 0 : for (i = 0; i < nDialogs; i++)
645 : {
646 0 : MovePage( aDialogList[i].nPageId , nModules + i );
647 0 : }
648 : }
649 0 : }
650 :
651 0 : void CutLines( OUString& rStr, sal_Int32 nStartLine, sal_Int32 nLines, bool bEraseTrailingEmptyLines )
652 : {
653 0 : sal_Int32 nStartPos = 0;
654 0 : sal_Int32 nLine = 0;
655 0 : while ( nLine < nStartLine )
656 : {
657 0 : nStartPos = searchEOL( rStr, nStartPos );
658 0 : if( nStartPos == -1 )
659 0 : break;
660 0 : nStartPos++; // not the \n.
661 0 : nLine++;
662 : }
663 :
664 : DBG_ASSERTWARNING( nStartPos != -1, "CutLines: Startzeile nicht gefunden!" );
665 :
666 0 : if ( nStartPos != -1 )
667 : {
668 0 : sal_Int32 nEndPos = nStartPos;
669 :
670 0 : for ( sal_Int32 i = 0; i < nLines; i++ )
671 0 : nEndPos = searchEOL( rStr, nEndPos+1 );
672 :
673 0 : if ( nEndPos == -1 ) // might happen at the last line
674 0 : nEndPos = rStr.getLength();
675 : else
676 0 : nEndPos++;
677 :
678 0 : OUString aEndStr = rStr.copy( nEndPos );
679 0 : rStr = rStr.copy( 0, nStartPos );
680 0 : rStr += aEndStr;
681 : }
682 0 : if ( bEraseTrailingEmptyLines )
683 : {
684 0 : sal_Int32 n = nStartPos;
685 0 : sal_Int32 nLen = rStr.getLength();
686 0 : while ( ( n < nLen ) && ( rStr.getStr()[ n ] == LINE_SEP ||
687 0 : rStr.getStr()[ n ] == LINE_SEP_CR ) )
688 : {
689 0 : n++;
690 : }
691 :
692 0 : if ( n > nStartPos )
693 : {
694 0 : OUString aEndStr = rStr.copy( n );
695 0 : rStr = rStr.copy( 0, nStartPos );
696 0 : rStr += aEndStr;
697 : }
698 : }
699 0 : }
700 :
701 0 : sal_uLong CalcLineCount( SvStream& rStream )
702 : {
703 0 : sal_uLong nLFs = 0;
704 0 : sal_uLong nCRs = 0;
705 : char c;
706 :
707 0 : rStream.Seek( 0 );
708 0 : rStream >> c;
709 0 : while ( !rStream.IsEof() )
710 : {
711 0 : if ( c == '\n' )
712 0 : nLFs++;
713 0 : else if ( c == '\r' )
714 0 : nCRs++;
715 0 : rStream >> c;
716 : }
717 :
718 0 : rStream.Seek( 0 );
719 0 : if ( nLFs > nCRs )
720 0 : return nLFs;
721 0 : return nCRs;
722 : }
723 :
724 : //
725 : // LibInfos
726 : // ========
727 : //
728 :
729 0 : LibInfos::LibInfos ()
730 0 : { }
731 :
732 0 : LibInfos::~LibInfos ()
733 0 : { }
734 :
735 0 : void LibInfos::InsertInfo (
736 : ScriptDocument const& rDocument,
737 : OUString const& rLibName,
738 : OUString const& rCurrentName,
739 : ItemType eCurrentType
740 : )
741 : {
742 0 : Key aKey(rDocument, rLibName);
743 0 : m_aMap.erase(aKey);
744 0 : m_aMap.insert(Map::value_type(aKey, Item(rDocument, rLibName, rCurrentName, eCurrentType)));
745 0 : }
746 :
747 0 : void LibInfos::RemoveInfoFor (ScriptDocument const& rDocument)
748 : {
749 0 : Map::iterator it;
750 0 : for (it = m_aMap.begin(); it != m_aMap.end(); ++it)
751 0 : if (it->first.GetDocument() == rDocument)
752 0 : break;
753 0 : if (it != m_aMap.end())
754 0 : m_aMap.erase(it);
755 0 : }
756 :
757 0 : LibInfos::Item const* LibInfos::GetInfo (
758 : ScriptDocument const& rDocument, OUString const& rLibName
759 : )
760 : {
761 0 : Map::iterator it = m_aMap.find(Key(rDocument, rLibName));
762 0 : return it != m_aMap.end() ? &it->second : 0;
763 : }
764 :
765 0 : LibInfos::Key::Key (ScriptDocument const& rDocument, OUString const& rLibName) :
766 0 : m_aDocument(rDocument), m_aLibName(rLibName)
767 0 : { }
768 :
769 0 : LibInfos::Key::~Key ()
770 0 : { }
771 :
772 0 : bool LibInfos::Key::operator == (Key const& rKey) const
773 : {
774 0 : return m_aDocument == rKey.m_aDocument && m_aLibName == rKey.m_aLibName;
775 : }
776 :
777 0 : size_t LibInfos::Key::Hash::operator () (Key const& rKey) const
778 : {
779 0 : return rKey.m_aDocument.hashCode() + rKey.m_aLibName.hashCode();
780 : }
781 :
782 0 : LibInfos::Item::Item (
783 : ScriptDocument const& rDocument,
784 : OUString const& rLibName,
785 : OUString const& rCurrentName,
786 : ItemType eCurrentType
787 : ) :
788 : m_aDocument(rDocument),
789 : m_aLibName(rLibName),
790 : m_aCurrentName(rCurrentName),
791 0 : m_eCurrentType(eCurrentType)
792 0 : { }
793 :
794 0 : LibInfos::Item::~Item ()
795 0 : { }
796 :
797 0 : bool QueryDel( const OUString& rName, const ResId& rId, Window* pParent )
798 : {
799 0 : OUString aQuery(rId.toString());
800 0 : OUStringBuffer aNameBuf( rName );
801 0 : aNameBuf.append('\'');
802 0 : aNameBuf.insert(sal_Int32(0), sal_Unicode('\''));
803 0 : aQuery = aQuery.replaceAll("XX", aNameBuf.makeStringAndClear());
804 0 : QueryBox aQueryBox( pParent, WB_YES_NO | WB_DEF_YES, aQuery );
805 0 : return ( aQueryBox.Execute() == RET_YES );
806 : }
807 :
808 0 : bool QueryDelMacro( const OUString& rName, Window* pParent )
809 : {
810 0 : return QueryDel( rName, IDEResId( RID_STR_QUERYDELMACRO ), pParent );
811 : }
812 :
813 0 : bool QueryReplaceMacro( const OUString& rName, Window* pParent )
814 : {
815 0 : return QueryDel( rName, IDEResId( RID_STR_QUERYREPLACEMACRO ), pParent );
816 : }
817 :
818 0 : bool QueryDelDialog( const OUString& rName, Window* pParent )
819 : {
820 0 : return QueryDel( rName, IDEResId( RID_STR_QUERYDELDIALOG ), pParent );
821 : }
822 :
823 0 : bool QueryDelLib( const OUString& rName, bool bRef, Window* pParent )
824 : {
825 0 : return QueryDel( rName, IDEResId( bRef ? RID_STR_QUERYDELLIBREF : RID_STR_QUERYDELLIB ), pParent );
826 : }
827 :
828 0 : bool QueryDelModule( const OUString& rName, Window* pParent )
829 : {
830 0 : return QueryDel( rName, IDEResId( RID_STR_QUERYDELMODULE ), pParent );
831 : }
832 :
833 0 : bool QueryPassword( const Reference< script::XLibraryContainer >& xLibContainer, const OUString& rLibName, OUString& rPassword, bool bRepeat, bool bNewTitle )
834 : {
835 0 : bool bOK = false;
836 0 : sal_uInt16 nRet = 0;
837 :
838 0 : do
839 : {
840 : // password dialog
841 0 : SfxPasswordDialog aDlg(Application::GetDefDialogParent());
842 0 : aDlg.SetMinLen( 1 );
843 :
844 : // set new title
845 0 : if ( bNewTitle )
846 : {
847 0 : OUString aTitle(IDE_RESSTR(RID_STR_ENTERPASSWORD));
848 0 : aTitle = aTitle.replaceAll("XX", rLibName);
849 0 : aDlg.SetText( aTitle );
850 : }
851 :
852 : // execute dialog
853 0 : nRet = aDlg.Execute();
854 :
855 : // verify password
856 0 : if ( nRet == RET_OK )
857 : {
858 0 : if ( xLibContainer.is() && xLibContainer->hasByName( rLibName ) )
859 : {
860 0 : Reference< script::XLibraryContainerPassword > xPasswd( xLibContainer, UNO_QUERY );
861 0 : if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( rLibName ) && !xPasswd->isLibraryPasswordVerified( rLibName ) )
862 : {
863 0 : rPassword = aDlg.GetPassword();
864 : // OUString aOUPassword( rPassword );
865 0 : bOK = xPasswd->verifyLibraryPassword( rLibName, rPassword );
866 :
867 0 : if ( !bOK )
868 : {
869 0 : ErrorBox aErrorBox( Application::GetDefDialogParent(), WB_OK, IDE_RESSTR(RID_STR_WRONGPASSWORD) );
870 0 : aErrorBox.Execute();
871 : }
872 0 : }
873 : }
874 0 : }
875 : }
876 0 : while ( bRepeat && !bOK && nRet == RET_OK );
877 :
878 0 : return bOK;
879 : }
880 :
881 :
882 0 : } // namespace basctl
883 :
884 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|