diff options
author | Uray M. János <uray.janos@gmail.com> | 2012-08-17 07:29:20 +0200 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2012-08-17 13:10:15 +0100 |
commit | 44861f2435a0c487d4fb5b196f7e4fe7f9569396 (patch) | |
tree | 2220c769287bdea3a82c6feb6b3ea09db81b6038 /basctl | |
parent | 87a723da66a16293b1611e08991fbf6925144448 (diff) |
Object Catalog in Dialog Editor
Change-Id: Ia74faa1452a4200c28fbd7c63130700df0a70b24
Object Catalog in Dialog Editor
Change-Id: I97f2e0497b0e87cf630bba16dd98f9f7d0bb86e7
Diffstat (limited to 'basctl')
27 files changed, 1738 insertions, 1219 deletions
diff --git a/basctl/Library_basctl.mk b/basctl/Library_basctl.mk index c2d23f6dd3de..3e7db4cd7da8 100644 --- a/basctl/Library_basctl.mk +++ b/basctl/Library_basctl.mk @@ -88,6 +88,7 @@ $(eval $(call gb_Library_add_exception_objects,basctl,\ basctl/source/basicide/docsignature \ basctl/source/basicide/documentenumeration \ basctl/source/basicide/iderdll \ + basctl/source/basicide/layout \ basctl/source/basicide/linenumberwindow \ basctl/source/basicide/localizationmgr \ basctl/source/basicide/macrodlg \ diff --git a/basctl/source/accessibility/accessibledialogcontrolshape.cxx b/basctl/source/accessibility/accessibledialogcontrolshape.cxx index 4b8f05d8304c..ccfd4af7247b 100644 --- a/basctl/source/accessibility/accessibledialogcontrolshape.cxx +++ b/basctl/source/accessibility/accessibledialogcontrolshape.cxx @@ -45,7 +45,7 @@ using namespace ::comphelper; // class AccessibleDialogControlShape // ----------------------------------------------------------------------------- -AccessibleDialogControlShape::AccessibleDialogControlShape( DialogWindow* pDialogWindow, DlgEdObj* pDlgEdObj ) +AccessibleDialogControlShape::AccessibleDialogControlShape (basctl::DialogWindow* pDialogWindow, DlgEdObj* pDlgEdObj) :AccessibleExtendedComponentHelper_BASE( new VCLExternalSolarLock() ) ,m_pDialogWindow( pDialogWindow ) ,m_pDlgEdObj( pDlgEdObj ) diff --git a/basctl/source/accessibility/accessibledialogwindow.cxx b/basctl/source/accessibility/accessibledialogwindow.cxx index 4621e7e52f4a..a36c5b2b221e 100644 --- a/basctl/source/accessibility/accessibledialogwindow.cxx +++ b/basctl/source/accessibility/accessibledialogwindow.cxx @@ -105,7 +105,7 @@ bool AccessibleDialogWindow::ChildDescriptor::operator<( const ChildDescriptor& // class AccessibleDialogWindow // ----------------------------------------------------------------------------- -AccessibleDialogWindow::AccessibleDialogWindow( DialogWindow* pDialogWindow ) +AccessibleDialogWindow::AccessibleDialogWindow (basctl::DialogWindow* pDialogWindow) :AccessibleExtendedComponentHelper_BASE( new VCLExternalSolarLock() ) ,m_pDialogWindow( pDialogWindow ) { diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx index 3d2bfd842455..fbda06a1648f 100644 --- a/basctl/source/basicide/baside2.cxx +++ b/basctl/source/basicide/baside2.cxx @@ -22,7 +22,10 @@ #include "iderdll.hxx" #include "iderdll2.hxx" #include "objdlg.hxx" +#include "moduldlg.hxx" +#include "docsignature.hxx" +#include "helpid.hrc" #include "baside2.hrc" #include <basic/basmgr.hxx> @@ -41,13 +44,15 @@ #include <sfx2/request.hxx> #include <svl/aeitem.hxx> #include <svl/srchitem.hxx> +#include <svl/visitem.hxx> #include <svl/whiter.hxx> #include <vcl/xtextedt.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/msgbox.hxx> +#include <cassert> -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; +namespace basctl +{ #define LMARGPRN 1700 #define RMARGPRN 900 @@ -74,6 +79,9 @@ DBG_NAME( ModulWindow ) TYPEINIT1( ModulWindow , IDEBaseWindow ); +namespace +{ + void lcl_PrintHeader( Printer* pPrinter, sal_uInt16 nPages, sal_uInt16 nCurPage, const ::rtl::OUString& rTitle, bool bOutput ) { short nLeftMargin = LMARGPRN; @@ -160,17 +168,31 @@ void lcl_ConvertTabsToSpaces( String& rLine ) } } -ModulWindow::ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, ::rtl::OUString aLibName, - ::rtl::OUString aName, ::rtl::OUString& aModule ) - :IDEBaseWindow( pParent, rDocument, aLibName, aName ) - ,aXEditorWindow( this ) - ,m_aModule( aModule ) +// until we have some configuration lets just keep +// persist this value for the process lifetime +bool bSourceLinesEnabled = false; + +} // namespace + + +// +// ModulWindow +// =========== +// + +ModulWindow::ModulWindow ( + ModulWindowLayout* pParent, + ScriptDocument const& rDocument, + rtl::OUString aLibName, rtl::OUString aName, rtl::OUString& aModule +) : + IDEBaseWindow(pParent, rDocument, aLibName, aName), + rLayout(*pParent), + nValid(VALIDWINDOW), + aXEditorWindow(this), + m_aModule(aModule) { DBG_CTOR( ModulWindow, 0 ); - nValid = VALIDWINDOW; - pLayout = pParent; aXEditorWindow.Show(); - SetBackground(); } @@ -514,8 +536,13 @@ bool ModulWindow::SaveBasicSource() return bDone; } +} // namespace basctl + bool implImportDialog( Window* pWin, const ::rtl::OUString& rCurPath, const ScriptDocument& rDocument, const ::rtl::OUString& aLibName ); +namespace basctl +{ + bool ModulWindow::ImportDialog() { const ScriptDocument& rDocument = GetDocument(); @@ -664,7 +691,7 @@ long ModulWindow::BasicErrorHdl( StarBASIC * pBasic ) aErrorTextPrefixBuf.append(IDE_RESSTR(RID_STR_RUNTIMEERROR)); aErrorTextPrefixBuf.append(StarBASIC::GetVBErrorCode(pBasic->GetErrorCode())); aErrorTextPrefixBuf.append(' '); - pLayout->GetStackWindow().UpdateCalls(); + rLayout.UpdateDebug(); } ::rtl::OUString aErrorTextPrefix(aErrorTextPrefixBuf.makeStringAndClear()); // if other basic, the IDE should try to display the correct module @@ -712,8 +739,7 @@ long ModulWindow::BasicBreakHdl( StarBASIC* pBasic ) GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, 0 ), TextPaM( nErrorLine, 0 ) ) ); aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine ); - pLayout->GetWatchWindow().UpdateWatches(); - pLayout->GetStackWindow().UpdateCalls(); + rLayout.UpdateDebug(); aStatus.bIsInReschedule = true; aStatus.bIsRunning = true; @@ -755,24 +781,13 @@ void ModulWindow::BasicAddWatch() if ( bAdd ) { TextSelection aSel = GetEditView()->GetSelection(); - if ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() ) - { - aWatchStr = GetEditView()->GetSelected(); - pLayout->GetWatchWindow().AddWatch( aWatchStr ); - pLayout->GetWatchWindow().UpdateWatches(); - } + if ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() ) // single line selection + rLayout.BasicAddWatch(GetEditView()->GetSelected()); } } -void ModulWindow::BasicRemoveWatch() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - pLayout->GetWatchWindow().RemoveSelectedWatch(); -} - - void ModulWindow::EditMacro( const String& rMacroName ) { DBG_CHKTHIS( ModulWindow, 0 ); @@ -941,12 +956,11 @@ sal_Int32 ModulWindow::FormatAndPrint( Printer* pPrinter, sal_Int32 nPrintPage ) } -void ModulWindow::ExecuteCommand( SfxRequest& rReq ) +void ModulWindow::ExecuteCommand (SfxRequest& rReq) { DBG_CHKTHIS( ModulWindow, 0 ); AssertValidEditEngine(); - sal_uInt16 nSlot = rReq.GetSlot(); - switch ( nSlot ) + switch (rReq.GetSlot()) { case SID_DELETE: { @@ -1024,7 +1038,7 @@ void ModulWindow::ExecuteCommand( SfxRequest& rReq ) break; case SID_BASICIDE_REMOVEWATCH: { - BasicRemoveWatch(); + rLayout.BasicRemoveWatch(); } break; case SID_CUT: @@ -1032,8 +1046,7 @@ void ModulWindow::ExecuteCommand( SfxRequest& rReq ) if ( !IsReadOnly() ) { GetEditView()->Cut(); - SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); - if ( pBindings ) + if (SfxBindings* pBindings = BasicIDE::GetBindingsPtr()) pBindings->Invalidate( SID_DOC_MODIFIED ); } } @@ -1048,8 +1061,7 @@ void ModulWindow::ExecuteCommand( SfxRequest& rReq ) if ( !IsReadOnly() ) { GetEditView()->Paste(); - SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); - if ( pBindings ) + if (SfxBindings* pBindings = BasicIDE::GetBindingsPtr()) pBindings->Invalidate( SID_DOC_MODIFIED ); } } @@ -1059,6 +1071,52 @@ void ModulWindow::ExecuteCommand( SfxRequest& rReq ) GetBreakPointWindow().Invalidate(); } break; + case SID_SHOWLINES: + { + SFX_REQUEST_ARG(rReq, pItem, SfxBoolItem, rReq.GetSlot(), false); + bSourceLinesEnabled = pItem && pItem->GetValue(); + aXEditorWindow.SetLineNumberDisplay(bSourceLinesEnabled); + } + break; + case SID_BASICIDE_DELETECURRENT: + { + if (QueryDelModule(m_aName, this)) + if (m_aDocument.removeModule(m_aLibName, m_aName)) + BasicIDE::MarkDocumentModified(m_aDocument); + } + break; + case FID_SEARCH_OFF: + GrabFocus(); + break; + case SID_GOTOLINE: + { + GotoLineDialog aGotoDlg(this); + if (aGotoDlg.Execute()) + if (sal_Int32 const nLine = aGotoDlg.GetLineNumber()) + { + TextSelection const aSel(TextPaM(nLine - 1, 0), TextPaM(nLine - 1, 0)); + GetEditView()->SetSelection(aSel); + } + break; + } + } +} + +void ModulWindow::ExecuteGlobal (SfxRequest& rReq) +{ + switch (rReq.GetSlot()) + { + case SID_SIGNATURE: + { + basctl::DocumentSignature aSignature(m_aDocument); + if (aSignature.supportsSignatures()) + { + aSignature.signScriptingContent(); + if (SfxBindings* pBindings = BasicIDE::GetBindingsPtr()) + pBindings->Invalidate(SID_SIGNATURE); + } + } + break; } } @@ -1124,6 +1182,11 @@ void ModulWindow::GetState( SfxItemSet &rSet ) } } break; + case SID_SHOWLINES: + { + rSet.Put(SfxBoolItem(nWh, bSourceLinesEnabled)); + break; + } } } } @@ -1191,25 +1254,30 @@ void ModulWindow::ShowCursor( bool bOn ) } -Window* ModulWindow::GetLayoutWindow() -{ - return pLayout; -} - void ModulWindow::AssertValidEditEngine() { if ( !GetEditEngine() ) GetEditorWindow().CreateEditEngine(); } +void ModulWindow::Activating () +{ + aXEditorWindow.SetLineNumberDisplay(bSourceLinesEnabled); + Show(); +} + void ModulWindow::Deactivating() { + Hide(); if ( GetEditView() ) GetEditView()->EraseVirtualDevice(); } sal_uInt16 ModulWindow::StartSearchAndReplace( const SvxSearchItem& rSearchItem, bool bFromStart ) { + if (IsSuspended()) + return 0; + // one could also relinquish syntaxhighlighting/formatting instead of the stupid replace-everything... AssertValidEditEngine(); ExtTextView* pView = GetEditView(); @@ -1354,11 +1422,6 @@ void ModulWindow::SetLineNumberDisplay(bool b) aXEditorWindow.SetLineNumberDisplay(b); } -void ModulWindow::SetObjectCatalogDisplay(bool b) -{ - aXEditorWindow.SetObjectCatalogDisplay(b); -} - bool ModulWindow::IsPasteAllowed() { bool bPaste = false; @@ -1383,374 +1446,207 @@ bool ModulWindow::IsPasteAllowed() return bPaste; } -ModulWindowLayout::ModulWindowLayout( Window* pParent ) : - Window(pParent, WB_CLIPCHILDREN), - bFirstArrange(true), - aLeftSplit(this, WB_HSCROLL), - aBottomSplit(this, WB_VSCROLL), - aVertSplit(this, WB_HSCROLL), - aObjectCatalog(this), - aWatchWindow(this), - aStackWindow(this), - m_pModulWindow(0), - m_aImagesNormal(IDEResId(RID_IMGLST_LAYOUT)) +void ModulWindow::OnNewDocument () +{ + aXEditorWindow.SetLineNumberDisplay(bSourceLinesEnabled); +} + +char const* ModulWindow::GetHid () const +{ + return HID_BASICIDE_MODULWINDOW; +} +BasicIDEType ModulWindow::GetType () const { - SetBackground(GetSettings().GetStyleSettings().GetWindowColor()); + return BASICIDE_TYPE_MODULE; +} - Color splitterColor(GetSettings().GetStyleSettings().GetShadowColor()); +bool ModulWindow::HasActiveEditor () const +{ + return !IsSuspended(); +} - aLeftSplit.SetLineColor(splitterColor); - aLeftSplit.SetFillColor(splitterColor); - aBottomSplit.SetLineColor(splitterColor); - aBottomSplit.SetFillColor(splitterColor); - aVertSplit.SetLineColor(splitterColor); - aVertSplit.SetFillColor(splitterColor); - aLeftSplit.Show(); - aBottomSplit.Show(); - aVertSplit.Show(); - aLeftSplit.SetSplitHdl( LINK(this, ModulWindowLayout, SplitHdl) ); - aBottomSplit.SetSplitHdl( LINK(this, ModulWindowLayout, SplitHdl) ); - aVertSplit.SetSplitHdl( LINK(this, ModulWindowLayout, SplitHdl) ); +void ModulWindow::UpdateModule () +{ + rtl::OUString const aModule = getTextEngineText(GetEditEngine()); - aWatchWindow.Show(); - aStackWindow.Show(); - aObjectCatalog.Show(); - - Color aColor(GetSettings().GetStyleSettings().GetFieldTextColor()); - m_aSyntaxColors[TT_UNKNOWN] = aColor; - m_aSyntaxColors[TT_WHITESPACE] = aColor; - m_aSyntaxColors[TT_EOL] = aColor; - m_aColorConfig.AddListener(this); - m_aSyntaxColors[TT_IDENTIFIER] - = Color(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER).nColor); - m_aSyntaxColors[TT_NUMBER] - = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor); - m_aSyntaxColors[TT_STRING] - = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor); - m_aSyntaxColors[TT_COMMENT] - = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT).nColor); - m_aSyntaxColors[TT_ERROR] - = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor); - m_aSyntaxColors[TT_OPERATOR] - = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR).nColor); - m_aSyntaxColors[TT_KEYWORDS] - = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD).nColor); - - Font aFont( GetFont() ); - Size aSz( aFont.GetSize() ); - aSz.Height() *= 3; - aSz.Height() /= 2; - aFont.SetSize( aSz ); - aFont.SetWeight( WEIGHT_BOLD ); - aFont.SetColor(GetSettings().GetStyleSettings().GetWindowTextColor()); - SetFont( aFont ); + // update module in basic + assert(xModule); + + // update module in module window + SetModule(aModule); + + // update module in library + OSL_VERIFY(m_aDocument.updateModule(m_aLibName, m_aName, aModule)); + + GetEditEngine()->SetModified(false); + BasicIDE::MarkDocumentModified(m_aDocument); } -ModulWindowLayout::~ModulWindowLayout() + +// +// ModulWindowLayout +// ================= +// + +ModulWindowLayout::ModulWindowLayout (Window* pParent, ObjectCatalog& rObjectCatalog_) : + Layout(pParent), + pChild(0), + aWatchWindow(this), + aStackWindow(this), + rObjectCatalog(rObjectCatalog_) +{ } + +void ModulWindowLayout::UpdateDebug (bool bBasicStopped) { - m_aColorConfig.RemoveListener(this); + aWatchWindow.UpdateWatches(bBasicStopped); + aStackWindow.UpdateCalls(); } -void ModulWindowLayout::Resize() +void ModulWindowLayout::Paint (Rectangle const&) { - // ScrollBars, etc. happens in BasicIDEShell:Adjust... - ArrangeWindows(); + DrawText(Point(), String(IDEResId(RID_STR_NOMODULE))); } -void ModulWindowLayout::Paint( const Rectangle& ) +// virtual +void ModulWindowLayout::DataChanged (DataChangedEvent const& rDCEvt) { - DrawText( Point(), String( IDEResId( RID_STR_NOMODULE ) ) ); + Layout::DataChanged(rDCEvt); + if (rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE)) + aSyntaxColors.SettingsChanged(); } -void ModulWindowLayout::ArrangeWindows() +void ModulWindowLayout::Activating (IDEBaseWindow& rChild) { - static long const nSplitThickness = 2; - static double const - fDefaultLeftSplit = 0.2, - fDefaultBottomSplit = 0.75, - fDefaultVertSplit = 0.67; + assert(dynamic_cast<ModulWindow*>(&rChild)); + pChild = &static_cast<ModulWindow&>(rChild); + aWatchWindow.Show(); + aStackWindow.Show(); + rObjectCatalog.Show(); + rObjectCatalog.SetLayoutWindow(this); + rObjectCatalog.UpdateEntries(); + Layout::Activating(rChild); + aSyntaxColors.SetActiveEditor(&pChild->GetEditorWindow()); +} - Size const aSize = GetOutputSizePixel(); - long const nWidth = aSize.Width(), nHeight = aSize.Height(); - if (!nWidth || !nHeight) // empty size - return; +void ModulWindowLayout::Deactivating () +{ + aSyntaxColors.SetActiveEditor(0); + Layout::Deactivating(); + aWatchWindow.Hide(); + aStackWindow.Hide(); + rObjectCatalog.Hide(); + pChild = 0; +} - // When ArrangeWindows() is called first, - // the initial positions of the splitter lines are set. - if (bFirstArrange) +void ModulWindowLayout::GetState (SfxItemSet &rSet, unsigned nWhich) +{ + switch (nWhich) { - aLeftSplit.SetSplitPosPixel(aSize.Width() * fDefaultLeftSplit); - aBottomSplit.SetSplitPosPixel(aSize.Height() * fDefaultBottomSplit); - aVertSplit.SetSplitPosPixel(aSize.Width() * fDefaultVertSplit); - bFirstArrange = false; + case SID_BASICIDE_CHOOSEMACRO: + rSet.Put(SfxVisibilityItem(nWhich, true)); + break; } +} - // resizing windows to the splitting lines - long const nLeftSplitPos = aLeftSplit.GetSplitPosPixel(); - long const nBottomSplitPos = aBottomSplit.GetSplitPosPixel(); - long const nVertSplitPos = aVertSplit.GetSplitPosPixel(); - // which window is docked? - bool const bObjCat = !aObjectCatalog.IsFloatingMode() && aObjectCatalog.IsVisible(); - bool const bWatchWin = !aWatchWindow.IsFloatingMode() && aWatchWindow.IsVisible(); - bool const bStackWin = !aStackWindow.IsFloatingMode() && aStackWindow.IsVisible(); - long const nBottom = bStackWin || bWatchWin ? nBottomSplitPos : nHeight; - // left splitting line - if (bObjCat) - { - aLeftSplit.SetDragRectPixel(Rectangle(Point(0, 0), Size(nWidth, nBottom))); - aLeftSplit.SetPosPixel(Point(nLeftSplitPos, 0)); - aLeftSplit.SetSizePixel(Size(nSplitThickness, nBottom)); - aLeftSplit.Show(); - } - else - aLeftSplit.Hide(); - // bottom splitting line - if (bWatchWin || bStackWin) - { - aBottomSplit.SetDragRectPixel(Rectangle(Point(0, 0), aSize)); - aBottomSplit.SetPosPixel(Point(0, nBottomSplitPos)); - aBottomSplit.SetSizePixel(Size(nWidth, nSplitThickness)); - aBottomSplit.Show(); - } - else - aBottomSplit.Hide(); - // vertical (bottom) splitting line - if (bWatchWin || bStackWin) - { - Point const aPos(nVertSplitPos, nBottomSplitPos + nSplitThickness); - aVertSplit.SetDragRectPixel(Rectangle(Point(0, aPos.Y()), Size(nWidth, nHeight - aPos.Y()))); - aVertSplit.SetPosSizePixel(aPos, Size(nSplitThickness, nHeight - aPos.Y())); - aVertSplit.Show(); - } - else - aVertSplit.Hide(); - // editor window - if (m_pModulWindow) - { - DBG_CHKOBJ(m_pModulWindow, ModulWindow, 0); - long const nLeft = bObjCat ? nLeftSplitPos + nSplitThickness : 0; - m_pModulWindow->SetPosSizePixel( - Point(nLeft, 0), - Size(nWidth - nLeft, nBottom) - ); - } - // object catalog (left) - if (bObjCat) - { - aObjectCatalog.SetPosPixel(Point(0, 0)); - aObjectCatalog.SetSizePixel(Size(nLeftSplitPos, nBottom)); - } - // watch (bottom left) - if (bWatchWin) - { - Point const aPos(0, nBottomSplitPos + nSplitThickness); - aWatchWindow.SetPosPixel(aPos); - aWatchWindow.SetSizePixel(Size(nVertSplitPos, nHeight - aPos.Y())); - } - // call stack (bottom right) - if (bStackWin) - { - Point const aPos(nVertSplitPos + nSplitThickness, nBottomSplitPos + nSplitThickness); - aStackWindow.SetPosPixel(aPos); - aStackWindow.SetSizePixel(Size(nWidth - aPos.X(), nHeight - aPos.Y())); - } +void ModulWindowLayout::BasicAddWatch (String const& rWatchStr) +{ + aWatchWindow.AddWatch(rWatchStr); } -IMPL_LINK( ModulWindowLayout, SplitHdl, Splitter *, pSplitter ) -{ - // The split line cannot be closer to the edges than nMargin pixels. - static long const nMargin = 16; - // Checking margins: - if (long const nSize = pSplitter->IsHorizontal() ? - GetOutputSizePixel().Width() : - GetOutputSizePixel().Height() - ) { - long const nPos = pSplitter->GetSplitPosPixel(); - if (nPos < nMargin) - pSplitter->SetSplitPosPixel(nMargin); - if (nPos > nSize - nMargin) - pSplitter->SetSplitPosPixel(nSize - nMargin); - } - ArrangeWindows(); - return 0; +void ModulWindowLayout::BasicRemoveWatch () +{ + DBG_CHKTHIS( ModulWindow, 0 ); + aWatchWindow.RemoveSelectedWatch(); } +void ModulWindowLayout::OnFirstSize (int const nWidth, int const nHeight) +{ + AddToLeft(&rObjectCatalog, Size(nWidth * 0.20, nHeight * 0.75)); + AddToBottom(&aWatchWindow, Size(nWidth * 0.67, nHeight * 0.25)); + AddToBottom(&aStackWindow, Size(nWidth * 0.33, nHeight * 0.25)); +} + + // -// IsToBeDocked() -- test whether dock or child: -// true: Floating -// false: Child +// SyntaxColors +// ============ // -bool ModulWindowLayout::IsToBeDocked ( - DockingWindow* pDockingWindow, Point const& rPos, Rectangle& rRect -) { - Point const aPos = ScreenToOutputPixel(rPos); - Size const aSize = GetOutputSizePixel(); - long const nWidth = aSize.Width(), nHeight = aSize.Height(); - - if (aPos.X() > 0 && aPos.X() < nWidth && aPos.Y() > 0 && aPos.Y() < nHeight) - { - long const nLeftSplit = aLeftSplit.GetSplitPosPixel(); - long const nBottomSplit = aBottomSplit.GetSplitPosPixel(); - long const nVertSplit = aVertSplit.GetSplitPosPixel(); - if (pDockingWindow == &aObjectCatalog) - { - if (aPos.Y() < nBottomSplit && aPos.X() < nLeftSplit) - { - rRect = Rectangle( - OutputToScreenPixel(Point(0, 0)), - Size(nLeftSplit, nBottomSplit) - ); - return true; - } - } - else if (pDockingWindow == &aWatchWindow) - { - if (aPos.Y() > nBottomSplit && aPos.X() < nVertSplit) - { - rRect = Rectangle( - OutputToScreenPixel(Point(0, nBottomSplit)), - Size(nVertSplit, nHeight - nBottomSplit) - ); - return true; - } - } - else if (pDockingWindow == &aStackWindow) - { - if (aPos.Y() > nBottomSplit && aPos.X() > nVertSplit) - { - rRect = Rectangle( - OutputToScreenPixel(Point(nVertSplit, nBottomSplit)), - Size(nWidth - nVertSplit, nHeight - nBottomSplit) - ); - return true; - } - } - } - return false; -} -void ModulWindowLayout::DockaWindow (DockingWindow*) +ModulWindowLayout::SyntaxColors::SyntaxColors () : + pEditor(0) { - ArrangeWindows(); + aConfig.AddListener(this); + + aColors[TT_UNKNOWN] = + aColors[TT_WHITESPACE] = + aColors[TT_EOL] = + Application::GetSettings().GetStyleSettings().GetFieldTextColor(); + + NewConfig(true); } -void ModulWindowLayout::SetModulWindow (ModulWindow* pModulWindow) +ModulWindowLayout::SyntaxColors::~SyntaxColors () { - m_pModulWindow = pModulWindow; - ArrangeWindows(); + aConfig.RemoveListener(this); } -// virtual -void ModulWindowLayout::DataChanged(DataChangedEvent const & rDCEvt) +void ModulWindowLayout::SyntaxColors::SettingsChanged () { - Window::DataChanged(rDCEvt); - if (rDCEvt.GetType() == DATACHANGED_SETTINGS - && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0) + Color const aColor = Application::GetSettings().GetStyleSettings().GetFieldTextColor(); + if (aColor != aColors[TT_UNKNOWN]) { - bool bInvalidate = false; - Color aColor(GetSettings().GetStyleSettings().GetWindowColor()); - if (aColor - != rDCEvt.GetOldSettings()->GetStyleSettings().GetWindowColor()) - { - SetBackground(Wallpaper(aColor)); - bInvalidate = true; - } - aColor = GetSettings().GetStyleSettings().GetWindowTextColor(); - if (aColor != rDCEvt.GetOldSettings()-> - GetStyleSettings().GetWindowTextColor()) - { - Font aFont(GetFont()); - aFont.SetColor(aColor); - SetFont(aFont); - bInvalidate = true; - } - if (bInvalidate) - Invalidate(); - aColor = GetSettings().GetStyleSettings().GetFieldTextColor(); - if (aColor != m_aSyntaxColors[TT_UNKNOWN]) - { - m_aSyntaxColors[TT_UNKNOWN] = aColor; - m_aSyntaxColors[TT_WHITESPACE] = aColor; - m_aSyntaxColors[TT_EOL] = aColor; - updateSyntaxHighlighting(); - } + aColors[TT_UNKNOWN] = + aColors[TT_WHITESPACE] = + aColors[TT_EOL] = + aColor; + if (pEditor) + pEditor->UpdateSyntaxHighlighting(); } } // virtual -void ModulWindowLayout::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) +void ModulWindowLayout::SyntaxColors::ConfigurationChanged (utl::ConfigurationBroadcaster*, sal_uInt32) { - { - Color aColor(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER). - nColor); - bool bChanged = aColor != m_aSyntaxColors[TT_IDENTIFIER]; - m_aSyntaxColors[TT_IDENTIFIER] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_NUMBER]) - bChanged = true; - m_aSyntaxColors[TT_NUMBER] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_STRING]) - bChanged = true; - m_aSyntaxColors[TT_STRING] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT). - nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_COMMENT]) - bChanged = true; - m_aSyntaxColors[TT_COMMENT] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_ERROR]) - bChanged = true; - m_aSyntaxColors[TT_ERROR] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR). - nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_OPERATOR]) - bChanged = true; - m_aSyntaxColors[TT_OPERATOR] = aColor; - aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD). - nColor); - if (bChanged || aColor != m_aSyntaxColors[TT_KEYWORDS]) - bChanged = true; - m_aSyntaxColors[TT_KEYWORDS] = aColor; - if (bChanged) - updateSyntaxHighlighting(); - } + NewConfig(false); } -void ModulWindowLayout::updateSyntaxHighlighting() +// when a new configuration has to be set +void ModulWindowLayout::SyntaxColors::NewConfig (bool bFirst) { - if (m_pModulWindow != 0) + static struct { - EditorWindow & rEditor = m_pModulWindow->GetEditorWindow(); - sal_uLong nCount = rEditor.GetEditEngine()->GetParagraphCount(); - for (sal_uLong i = 0; i < nCount; ++i) - rEditor.DoDelayedSyntaxHighlight(i); + TokenTypes eTokenType; + svtools::ColorConfigEntry eEntry; } + const vIds[] = + { + { TT_IDENTIFIER, svtools::BASICIDENTIFIER }, + { TT_NUMBER, svtools::BASICNUMBER }, + { TT_STRING, svtools::BASICSTRING }, + { TT_COMMENT, svtools::BASICCOMMENT }, + { TT_ERROR, svtools::BASICERROR }, + { TT_OPERATOR, svtools::BASICOPERATOR }, + { TT_KEYWORDS, svtools::BASICKEYWORD }, + }; + + bool bChanged = false; + for (unsigned i = 0; i != sizeof vIds / sizeof vIds[0]; ++i) + { + Color const aColor = aConfig.GetColorValue(vIds[i].eEntry).nColor; + Color& rMyColor = aColors[vIds[i].eTokenType]; + if (bFirst || aColor != rMyColor) + { + rMyColor = aColor; + bChanged = true; + } + } + if (bChanged && !bFirst && pEditor) + pEditor->UpdateSyntaxHighlighting(); } -Image ModulWindowLayout::getImage(sal_uInt16 nId) const -{ - return m_aImagesNormal.GetImage(nId); -} - -// shows or hides the Object Catalog window (depending on its state) -void ModulWindowLayout::ToggleObjectCatalog () -{ - // show or hide? - bool const bShow = !aObjectCatalog.IsVisible(); - bShow ? aObjectCatalog.Show() : aObjectCatalog.Hide(); - if (m_pModulWindow) - m_pModulWindow->SetObjectCatalogDisplay(bShow); - // refreshing - ArrangeWindows(); -} -// Updates the Object Catalog window. -void ModulWindowLayout::UpdateObjectCatalog () -{ - aObjectCatalog.UpdateEntries(); -} +} // namespace basctl /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx index e3aeeedb5277..e1e639244357 100644 --- a/basctl/source/basicide/baside2.hxx +++ b/basctl/source/basicide/baside2.hxx @@ -20,12 +20,13 @@ #ifndef BASCTL_BASIDE2_HXX #define BASCTL_BASIDE2_HXX -#include <svheader.hxx> - +#include "layout.hxx" #include <bastypes.hxx> #include <bastype3.hxx> #include <basidesh.hxx> +#include <svheader.hxx> + class ExtTextEngine; class ExtTextView; class SvxSearchItem; @@ -40,22 +41,25 @@ class SvxSearchItem; #include <svtools/colorcfg.hxx> #include <sfx2/progress.hxx> -#include <svtools/syntaxhighlight.hxx> #include <unotools/options.hxx> #include "breakpoint.hxx" #include "linenumberwindow.hxx" -#include "objdlg.hxx" #include <set> -DBG_NAMEEX( ModulWindow ) - #define MARKER_NOMARKER 0xFFFF namespace com { namespace sun { namespace star { namespace beans { class XMultiPropertySet; } } } } +namespace basctl +{ + +class ObjectCatalog; + +DBG_NAMEEX( ModulWindow ) + // #108672 Helper functions to get/set text in TextEngine // using the stream interface (get/setText() only supports // tools Strings limited to 64K). @@ -90,10 +94,10 @@ class EditorWindow : public Window, public SfxListener { private: class ChangesListener; - friend class ChangesListener; ExtTextView* pEditView; ExtTextEngine* pEditEngine; + ModulWindow& rModulWindow; rtl::Reference< ChangesListener > listener_; osl::Mutex mutex_; @@ -107,7 +111,6 @@ private: SyntaxLineSet aSyntaxLineTable; DECL_LINK(SyntaxTimerHdl, void *); ProgressInfo* pProgress; - ModulWindow* pModulWindow; virtual void DataChanged(DataChangedEvent const & rDCEvt); @@ -141,7 +144,7 @@ protected: bool ImpCanModify(); public: - EditorWindow( Window* pParent ); + EditorWindow (Window* pParent, ModulWindow*); ~EditorWindow(); ExtTextEngine* GetEditEngine() const { return pEditEngine; } @@ -157,23 +160,23 @@ public: void CreateEditEngine(); void SetScrollBarRanges(); void InitScrollBars(); - void SetModulWindow( ModulWindow* pWin ) - { pModulWindow = pWin; } void ForceSyntaxTimeout(); bool SetSourceInBasic(); bool CanModify() { return ImpCanModify(); } + + void UpdateSyntaxHighlighting (); }; class BreakPointWindow : public Window { private: + ModulWindow& rModulWindow; long nCurYOffset; - sal_uInt16 nMarkerPos; + sal_uInt16 nMarkerPos; BreakPointList aBreakPointList; - ModulWindow* pModulWindow; bool bErrorMarker; virtual void DataChanged(DataChangedEvent const & rDCEvt); @@ -191,12 +194,9 @@ protected: bool SyncYOffset(); public: - BreakPointWindow( Window* pParent ); + BreakPointWindow (Window* pParent, ModulWindow*); ~BreakPointWindow(); - void SetModulWindow( ModulWindow* pWin ) - { pModulWindow = pWin; } - void SetMarkerPos( sal_uInt16 nLine, bool bErrorMarker = false ); void DoScroll( long nHorzScroll, long nVertScroll ); @@ -249,7 +249,7 @@ protected: public: - WatchWindow( Window* pParent ); + WatchWindow (Layout* pParent); ~WatchWindow(); void AddWatch( const String& rVName ); @@ -271,7 +271,7 @@ protected: virtual void Paint( const Rectangle& rRect ); public: - StackWindow( Window* pParent ); + StackWindow (Layout* pParent); ~StackWindow(); void UpdateCalls(); @@ -285,8 +285,6 @@ private: LineNumberWindow aLineNumberWindow; EditorWindow aEdtWindow; ScrollBar aEWVScrollBar; - bool bLineNumberDisplay; - bool bObjectCatalogDisplay; virtual void DataChanged(DataChangedEvent const & rDCEvt); @@ -303,32 +301,25 @@ public: ScrollBar& GetEWVScrollBar() { return aEWVScrollBar; } void SetLineNumberDisplay(bool b); - void SetObjectCatalogDisplay(bool b); }; class ModulWindow: public IDEBaseWindow { - friend class BasicIDEShell; - private: + ModulWindowLayout& rLayout; StarBASICRef xBasic; short nValid; ComplexEditorWindow aXEditorWindow; BasicStatus aStatus; SbModuleRef xModule; - ModulWindowLayout* pLayout; ::rtl::OUString aCurPath; ::rtl::OUString m_aModule; - long BasicErrorHdl( StarBASIC* pBasic ); - long BasicBreakHdl( StarBASIC* pBasic ); - void CheckCompileBasic(); bool BasicExecute(); void GoOnTop(); - void AssertValidEditEngine(); sal_Int32 FormatAndPrint( Printer* pPrinter, sal_Int32 nPage = -1 ); SbModuleRef XModule(); @@ -336,7 +327,6 @@ protected: virtual void Resize(); virtual void GetFocus(); virtual void Paint( const Rectangle& ); - virtual void Deactivating(); virtual void DoInit(); virtual void DoScroll( ScrollBar* pCurScrollBar ); @@ -347,7 +337,8 @@ public: ~ModulWindow(); - virtual void ExecuteCommand( SfxRequest& rReq ); + virtual void ExecuteCommand (SfxRequest& rReq); + virtual void ExecuteGlobal (SfxRequest& rReq); virtual void GetState( SfxItemSet& ); virtual void StoreData(); virtual void UpdateData(); @@ -363,7 +354,6 @@ public: virtual bool IsReadOnly(); void SetLineNumberDisplay(bool); - void SetObjectCatalogDisplay(bool); StarBASIC* GetBasic() { XModule(); return xBasic; } @@ -384,6 +374,10 @@ public: void BasicAddWatch(); void BasicRemoveWatch(); + long BasicErrorHdl( StarBASIC* pBasic ); + long BasicBreakHdl( StarBASIC* pBasic ); + void AssertValidEditEngine(); + bool LoadBasic(); bool SaveBasicSource(); bool ImportDialog(); @@ -401,9 +395,7 @@ public: void ShowCursor( bool bOn ); virtual sal_uInt16 GetSearchOptions(); - sal_uInt16 StartSearchAndReplace( const SvxSearchItem& rSearchItem, bool bFromStart = false ); - - virtual Window* GetLayoutWindow(); + virtual sal_uInt16 StartSearchAndReplace (SvxSearchItem const&, bool bFromStart = false); EditorWindow& GetEditorWindow() { return aXEditorWindow.GetEdtWindow(); } BreakPointWindow& GetBreakPointWindow() { return aXEditorWindow.GetBrkWindow(); } @@ -412,7 +404,7 @@ public: ExtTextEngine* GetEditEngine() { return GetEditorWindow().GetEditEngine(); } ExtTextView* GetEditView() { return GetEditorWindow().GetEditView(); } BreakPointList& GetBreakPoints() { return GetBreakPointWindow().GetBreakPoints(); } - ModulWindowLayout* GetLayout() const { return pLayout; } + ModulWindowLayout& GetLayout () { return rLayout; } virtual void BasicStarted(); virtual void BasicStopped(); @@ -422,67 +414,78 @@ public: const ::rtl::OUString& GetModule() const { return m_aModule; } void SetModule( const ::rtl::OUString& aModule ) { m_aModule = aModule; } + + virtual void Activating (); + virtual void Deactivating (); + + virtual void OnNewDocument (); + virtual char const* GetHid () const; + virtual BasicIDEType GetType () const; + virtual bool HasActiveEditor () const; + + void UpdateModule (); }; -class ModulWindowLayout: public Window, public utl::ConfigurationListener +class ModulWindowLayout: public Layout { -private: - // is ArrangeWindows() called first in this object? - bool bFirstArrange; +public: + ModulWindowLayout (Window* pParent, ObjectCatalog&); +public: + // Layout: + virtual void Activating (IDEBaseWindow&); + virtual void Deactivating (); + virtual void GetState (SfxItemSet&, unsigned nWhich); + virtual void UpdateDebug (bool bBasicStopped = false); +public: + void BasicAddWatch (String const&); + void BasicRemoveWatch (); + Color GetSyntaxColor (TokenTypes eType) const { return aSyntaxColors.GetColor(eType); } - // splitter lines - Splitter aLeftSplit, aBottomSplit, aVertSplit; +protected: + // Window: + virtual void Paint (const Rectangle& rRect); + // Layout: + virtual void OnFirstSize (int nWidth, int nHeight); +private: + // main child window + ModulWindow* pChild; // dockable windows - ObjectCatalog aObjectCatalog; WatchWindow aWatchWindow; StackWindow aStackWindow; - - ModulWindow* m_pModulWindow; - - Color m_aSyntaxColors[TT_KEYWORDS + 1]; - svtools::ColorConfig m_aColorConfig; - - ImageList m_aImagesNormal; - - virtual void DataChanged(DataChangedEvent const & rDCEvt); - - virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); - - void updateSyntaxHighlighting(); - - DECL_LINK( SplitHdl, Splitter * ); - - void ArrangeWindows(); - -protected: - virtual void Resize(); - virtual void Paint( const Rectangle& rRect ); - -public: - ModulWindowLayout( Window* pParent ); - ~ModulWindowLayout(); - - void DockaWindow( DockingWindow* pDockingWin ); - bool IsToBeDocked( DockingWindow* pDockingWin, const Point& rPos, Rectangle& rRect ); - - void SetModulWindow( ModulWindow* pModWin ); - ModulWindow* GetModulWindow() const { return m_pModulWindow; } - - WatchWindow& GetWatchWindow() { return aWatchWindow; } - StackWindow& GetStackWindow() { return aStackWindow; } - ObjectCatalog& GetObjectCatalog() { return aObjectCatalog; } - - Image getImage(sal_uInt16 nId) const; - - inline Color const & getSyntaxColor(TokenTypes eType) const - { return m_aSyntaxColors[eType]; } - - void ToggleObjectCatalog (); - bool HasObjectCatalog () const { return aObjectCatalog.IsVisible(); } - void UpdateObjectCatalog (); + ObjectCatalog& rObjectCatalog; +private: + virtual void DataChanged (DataChangedEvent const& rDCEvt); +private: + // SyntaxColors -- stores Basic syntax highlighting colors + class SyntaxColors : public utl::ConfigurationListener + { + public: + SyntaxColors (); + ~SyntaxColors (); + public: + void SetActiveEditor (EditorWindow* pEditor_) { pEditor = pEditor_; } + void SettingsChanged (); + public: + Color GetColor (TokenTypes eType) const { return aColors[eType]; } + + private: + virtual void ConfigurationChanged (utl::ConfigurationBroadcaster*, sal_uInt32); + void NewConfig (bool bFirst); + + private: + // the color values (the indexes are TokenTypes, see svtools/syntaxhighlight.hxx) + Color aColors[TT_KEYWORDS + 1]; + // the configuration + svtools::ColorConfig aConfig; + // the active editor + EditorWindow* pEditor; + + } aSyntaxColors; }; +} // namespace basctl + #endif // BASCTL_BASIDE2_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx index dd6337e6601b..a784d4dba7c5 100644 --- a/basctl/source/basicide/baside2b.cxx +++ b/basctl/source/basicide/baside2b.cxx @@ -41,9 +41,13 @@ #include <vcl/xtextedt.hxx> #include <vcl/txtattr.hxx> #include <svtools/textwindowpeer.hxx> +#include <svtools/syntaxhighlight.hxx> #include <vcl/taskpanelist.hxx> #include <vcl/help.hxx> +namespace basctl +{ + using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -62,6 +66,12 @@ SbxVariable* IsSbxVariable (SbxBase* pBase) return 0; } +Image GetImage (unsigned nId) +{ + static ImageList const aImagesNormal(IDEResId(RID_IMGLST_LAYOUT)); + return aImagesNormal.GetImage(nId); +} + } // namespace #define SCROLL_LINE 12 @@ -99,7 +109,7 @@ void setTextEngineText( ExtTextEngine* pEngine, const ::rtl::OUString aStr ) pEngine->Read( aMemStream ); } -void lcl_DrawIDEWindowFrame( DockingWindow* pWin ) +void lcl_DrawIDEWindowFrame( BasicDockingWindow* pWin ) { if ( pWin->IsFloatingMode() ) return; @@ -147,6 +157,12 @@ void lcl_SeparateNameAndIndex( const String& rVName, String& rVar, String& rInde } } + +// +// EditorWindow +// ============ +// + class EditorWindow::ChangesListener: public cppu::WeakImplHelper1< beans::XPropertiesChangeListener > { @@ -172,25 +188,21 @@ private: EditorWindow & editor_; }; -EditorWindow::EditorWindow( Window* pParent ) : - Window( pParent, WB_BORDER ) -{ - bDoSyntaxHighlight = true; - bDelayHighlight = true; - pModulWindow = 0; - pEditView = 0; - pEditEngine = 0; - bHighlightning = false; - pProgress = 0; - nCurTextWidth = 0; - SetBackground( - Wallpaper(GetSettings().GetStyleSettings().GetFieldColor())); +EditorWindow::EditorWindow (Window* pParent, ModulWindow* pModulWindow) : + Window(pParent, WB_BORDER), + pEditView(0), + pEditEngine(0), + rModulWindow(*pModulWindow), + nCurTextWidth(0), + pProgress(0), + bHighlightning(false), + bDoSyntaxHighlight(true), + bDelayHighlight(true) +{ + SetBackground(Wallpaper(GetSettings().GetStyleSettings().GetFieldColor())); SetPointer( Pointer( POINTER_TEXT ) ); - SetHelpId( HID_BASICIDE_EDITORWINDOW ); - // Using "this" in ctor is a little fishy, but should work here at least as - // long as there are no derivations: listener_ = new ChangesListener(*this); Reference< beans::XMultiPropertySet > n( officecfg::Office::Common::Font::SourceViewFont::get(), @@ -206,7 +218,6 @@ EditorWindow::EditorWindow( Window* pParent ) : } - EditorWindow::~EditorWindow() { Reference< beans::XMultiPropertySet > n; @@ -364,8 +375,8 @@ void EditorWindow::Resize() aStartDocPos.Y() = nMaxVisAreaStart; pEditView->SetStartDocPos( aStartDocPos ); pEditView->ShowCursor(); - pModulWindow->GetBreakPointWindow().GetCurYOffset() = aStartDocPos.Y(); - pModulWindow->GetLineNumberWindow().GetCurYOffset() = aStartDocPos.Y(); + rModulWindow.GetBreakPointWindow().GetCurYOffset() = aStartDocPos.Y(); + rModulWindow.GetLineNumberWindow().GetCurYOffset() = aStartDocPos.Y(); } InitScrollBars(); if ( nVisY != pEditView->GetStartDocPos().Y() ) @@ -410,7 +421,7 @@ void EditorWindow::Command( const CommandEvent& rCEvt ) ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) || ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) ) { - HandleScrollCommand( rCEvt, pModulWindow->GetHScrollBar(), &pModulWindow->GetEditVScrollBar() ); + HandleScrollCommand( rCEvt, rModulWindow.GetHScrollBar(), &rModulWindow.GetEditVScrollBar() ); } } } @@ -424,7 +435,7 @@ bool EditorWindow::ImpCanModify() // Remove markers in the modules in Notify at Basic::Stoped if ( QueryBox( 0, WB_OK_CANCEL, String( IDEResId( RID_STR_WILLSTOPPRG ) ) ).Execute() == RET_OK ) { - pModulWindow->GetBasicStatus().bIsRunning = false; + rModulWindow.GetBasicStatus().bIsRunning = false; BasicIDE::StopBasic(); } else @@ -439,11 +450,11 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt ) return; #if OSL_DEBUG_LEVEL > 1 - Range aRange = pModulWindow->GetHScrollBar()->GetRange(); (void)aRange; - long nVisSz = pModulWindow->GetHScrollBar()->GetVisibleSize(); (void)nVisSz; - long nPapSz = pModulWindow->GetHScrollBar()->GetPageSize(); (void)nPapSz; - long nLinSz = pModulWindow->GetHScrollBar()->GetLineSize(); (void)nLinSz; - long nThumb = pModulWindow->GetHScrollBar()->GetThumbPos(); (void)nThumb; + Range aRange = rModulWindow.GetHScrollBar()->GetRange(); (void)aRange; + long nVisSz = rModulWindow.GetHScrollBar()->GetVisibleSize(); (void)nVisSz; + long nPapSz = rModulWindow.GetHScrollBar()->GetPageSize(); (void)nPapSz; + long nLinSz = rModulWindow.GetHScrollBar()->GetLineSize(); (void)nLinSz; + long nThumb = rModulWindow.GetHScrollBar()->GetThumbPos(); (void)nThumb; #endif bool const bWasModified = pEditEngine->IsModified(); // see if there is an accelerator to be processed first @@ -521,31 +532,14 @@ bool EditorWindow::SetSourceInBasic() { if ( !StarBASIC::IsRunning() ) // Not at runtime! { - ::rtl::OUString aModule = getTextEngineText( pEditEngine ); - - // update module in basic -#ifdef DBG_UTIL - SbModule* pModule = pModulWindow->GetSbModule(); -#endif - DBG_ASSERT(pModule, "EditorWindow::SetSourceInBasic: No Module found!"); - - // update module in module window - pModulWindow->SetModule( aModule ); - - // update module in library - ScriptDocument aDocument( pModulWindow->GetDocument() ); - String aLibName = pModulWindow->GetLibName(); - String aName = pModulWindow->GetName(); - OSL_VERIFY( aDocument.updateModule( aLibName, aName, aModule ) ); - - pEditEngine->SetModified(false); - BasicIDE::MarkDocumentModified( aDocument ); + rModulWindow.UpdateModule(); bChanged = true; } } return bChanged; } +} // namespace basctl // Returns the position of the last character of any of the following // EOL char combinations: CR, CR/LF, LF, return -1 if no EOL is found @@ -566,6 +560,9 @@ sal_Int32 searchEOL( const ::rtl::OUString& rStr, sal_Int32 fromIndex ) } +namespace basctl +{ + void EditorWindow::CreateEditEngine() { if ( pEditEngine ) @@ -586,7 +583,7 @@ void EditorWindow::CreateEditEngine() bool bWasDoSyntaxHighlight = bDoSyntaxHighlight; bDoSyntaxHighlight = false; // too slow for large texts... - ::rtl::OUString aOUSource( pModulWindow->GetModule() ); + rtl::OUString aOUSource(rModulWindow.GetModule()); sal_Int32 nLines = 0; sal_Int32 nIndex = -1; do @@ -604,15 +601,10 @@ void EditorWindow::CreateEditEngine() pEditView->SetStartDocPos( Point( 0, 0 ) ); pEditView->SetSelection( TextSelection() ); - pModulWindow->GetBreakPointWindow().GetCurYOffset() = 0; - pModulWindow->GetLineNumberWindow().GetCurYOffset() = 0; + rModulWindow.GetBreakPointWindow().GetCurYOffset() = 0; + rModulWindow.GetLineNumberWindow().GetCurYOffset() = 0; pEditEngine->SetUpdateMode(true); - Update(); // has only been invalidated at UpdateMode = true - - pModulWindow->GetLayout()->GetWatchWindow().Update(); - pModulWindow->GetLayout()->GetStackWindow().Update(); - pModulWindow->GetBreakPointWindow().Update(); - pModulWindow->GetLineNumberWindow().Update(); + rModulWindow.Update(); // has only been invalidated at UpdateMode = true pEditView->ShowCursor( true, true ); @@ -638,19 +630,19 @@ void EditorWindow::CreateEditEngine() if ( pBindings ) pBindings->Invalidate( SID_BASICIDE_STAT_POS ); - DBG_ASSERT( pModulWindow->GetBreakPointWindow().GetCurYOffset() == 0, "CreateEditEngine: Brechpunkte verschoben?" ); + DBG_ASSERT( rModulWindow.GetBreakPointWindow().GetCurYOffset() == 0, "CreateEditEngine: Brechpunkte verschoben?" ); // set readonly mode for readonly libraries - ScriptDocument aDocument( pModulWindow->GetDocument() ); - ::rtl::OUString aOULibName( pModulWindow->GetLibName() ); + ScriptDocument aDocument(rModulWindow.GetDocument()); + rtl::OUString aOULibName(rModulWindow.GetLibName()); Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY ); if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryReadOnly( aOULibName ) ) { - pModulWindow->SetReadOnly(true); + rModulWindow.SetReadOnly(true); } if ( aDocument.isDocument() && aDocument.isReadOnly() ) - pModulWindow->SetReadOnly(true); + rModulWindow.SetReadOnly(true); } // virtual @@ -688,13 +680,13 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) TextHint const& rTextHint = *pTextHint; if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED ) { - if ( pModulWindow->GetHScrollBar() ) - pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); - pModulWindow->GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() ); - pModulWindow->GetBreakPointWindow().DoScroll - ( 0, pModulWindow->GetBreakPointWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); - pModulWindow->GetLineNumberWindow().DoScroll - ( 0, pModulWindow->GetLineNumberWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); + if ( rModulWindow.GetHScrollBar() ) + rModulWindow.GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); + rModulWindow.GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() ); + rModulWindow.GetBreakPointWindow().DoScroll + ( 0, rModulWindow.GetBreakPointWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); + rModulWindow.GetLineNumberWindow().DoScroll + ( 0, rModulWindow.GetLineNumberWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); } else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED ) { @@ -705,21 +697,21 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) if ( nTextHeight < nOutHeight ) pEditView->Scroll( 0, pEditView->GetStartDocPos().Y() ); - pModulWindow->GetLineNumberWindow().Invalidate(); + rModulWindow.GetLineNumberWindow().Invalidate(); } SetScrollBarRanges(); } else if( rTextHint.GetId() == TEXT_HINT_TEXTFORMATTED ) { - if ( pModulWindow->GetHScrollBar() ) + if ( rModulWindow.GetHScrollBar() ) { sal_uLong nWidth = pEditEngine->CalcTextWidth(); if ( (long)nWidth != nCurTextWidth ) { nCurTextWidth = nWidth; - pModulWindow->GetHScrollBar()->SetRange( Range( 0, (long)nCurTextWidth-1) ); - pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); + rModulWindow.GetHScrollBar()->SetRange( Range( 0, (long)nCurTextWidth-1) ); + rModulWindow.GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); } } long nPrevTextWidth = nCurTextWidth; @@ -749,10 +741,10 @@ void EditorWindow::SetScrollBarRanges() if ( !pEditEngine ) return; - if ( pModulWindow->GetHScrollBar() ) - pModulWindow->GetHScrollBar()->SetRange( Range( 0, nCurTextWidth-1 ) ); + if ( rModulWindow.GetHScrollBar() ) + rModulWindow.GetHScrollBar()->SetRange( Range( 0, nCurTextWidth-1 ) ); - pModulWindow->GetEditVScrollBar().SetRange( Range( 0, pEditEngine->GetTextHeight()-1 ) ); + rModulWindow.GetEditVScrollBar().SetRange( Range( 0, pEditEngine->GetTextHeight()-1 ) ); } void EditorWindow::InitScrollBars() @@ -762,19 +754,19 @@ void EditorWindow::InitScrollBars() SetScrollBarRanges(); Size aOutSz( GetOutputSizePixel() ); - pModulWindow->GetEditVScrollBar().SetVisibleSize( aOutSz.Height() ); - pModulWindow->GetEditVScrollBar().SetPageSize( aOutSz.Height() * 8 / 10 ); - pModulWindow->GetEditVScrollBar().SetLineSize( GetTextHeight() ); - pModulWindow->GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() ); - pModulWindow->GetEditVScrollBar().Show(); + rModulWindow.GetEditVScrollBar().SetVisibleSize( aOutSz.Height() ); + rModulWindow.GetEditVScrollBar().SetPageSize( aOutSz.Height() * 8 / 10 ); + rModulWindow.GetEditVScrollBar().SetLineSize( GetTextHeight() ); + rModulWindow.GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() ); + rModulWindow.GetEditVScrollBar().Show(); - if ( pModulWindow->GetHScrollBar() ) + if ( rModulWindow.GetHScrollBar() ) { - pModulWindow->GetHScrollBar()->SetVisibleSize( aOutSz.Width() ); - pModulWindow->GetHScrollBar()->SetPageSize( aOutSz.Width() * 8 / 10 ); - pModulWindow->GetHScrollBar()->SetLineSize( GetTextWidth( rtl::OUString('x') ) ); - pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); - pModulWindow->GetHScrollBar()->Show(); + rModulWindow.GetHScrollBar()->SetVisibleSize( aOutSz.Width() ); + rModulWindow.GetHScrollBar()->SetPageSize( aOutSz.Width() * 8 / 10 ); + rModulWindow.GetHScrollBar()->SetLineSize( GetTextWidth( rtl::OUString('x') ) ); + rModulWindow.GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() ); + rModulWindow.GetHScrollBar()->Show(); } } @@ -799,14 +791,21 @@ void EditorWindow::ImpDoHighlight( sal_uLong nLine ) for ( size_t i = 0; i < aPortions.size(); i++ ) { HighlightPortion& r = aPortions[i]; - const Color& rColor = dynamic_cast<ModulWindowLayout*>(pModulWindow->GetLayoutWindow())->getSyntaxColor(r.tokenType); - pEditEngine->SetAttrib( TextAttribFontColor( rColor ), nLine, r.nBegin, r.nEnd, true ); + Color const aColor = rModulWindow.GetLayout().GetSyntaxColor(r.tokenType); + pEditEngine->SetAttrib( TextAttribFontColor(aColor), nLine, r.nBegin, r.nEnd, true ); } pEditEngine->SetModified( bWasModified ); } } +void EditorWindow::UpdateSyntaxHighlighting () +{ + unsigned nCount = pEditEngine->GetParagraphCount(); + for (unsigned i = 0; i < nCount; ++i) + DoDelayedSyntaxHighlight(i); +} + void EditorWindow::ImplSetFont() { rtl::OUString sFontName( @@ -817,18 +816,14 @@ void EditorWindow::ImplSetFont() Font aTmpFont( OutputDevice::GetDefaultFont( DEFAULTFONT_FIXED, Application::GetSettings().GetUILanguage(), 0 , this ) ); sFontName = aTmpFont.GetName(); } - Size aFontSize( - 0, officecfg::Office::Common::Font::SourceViewFont::FontHeight::get() ); + Size aFontSize(0, officecfg::Office::Common::Font::SourceViewFont::FontHeight::get()); Font aFont( sFontName, aFontSize ); aFont.SetColor( GetSettings().GetStyleSettings().GetFieldTextColor() ); SetPointFont( aFont ); aFont = GetFont(); - if ( pModulWindow ) - { - pModulWindow->GetBreakPointWindow().SetFont( aFont ); - pModulWindow->GetLineNumberWindow().SetFont( aFont ); - } + rModulWindow.GetBreakPointWindow().SetFont( aFont ); + rModulWindow.GetLineNumberWindow().SetFont( aFont ); if ( pEditEngine ) { @@ -904,26 +899,26 @@ void EditorWindow::ParagraphInsertedDeleted( sal_uLong nPara, bool bInserted ) if ( !bInserted && ( nPara == TEXT_PARA_ALL ) ) { - pModulWindow->GetBreakPoints().reset(); - pModulWindow->GetBreakPointWindow().Invalidate(); - pModulWindow->GetLineNumberWindow().Invalidate(); + rModulWindow.GetBreakPoints().reset(); + rModulWindow.GetBreakPointWindow().Invalidate(); + rModulWindow.GetLineNumberWindow().Invalidate(); aHighlighter.initialize( HIGHLIGHT_BASIC ); } else { - pModulWindow->GetBreakPoints().AdjustBreakPoints( (sal_uInt16)nPara+1, bInserted ); + rModulWindow.GetBreakPoints().AdjustBreakPoints( (sal_uInt16)nPara+1, bInserted ); long nLineHeight = GetTextHeight(); - Size aSz = pModulWindow->GetBreakPointWindow().GetOutputSize(); + Size aSz = rModulWindow.GetBreakPointWindow().GetOutputSize(); Rectangle aInvRec( Point( 0, 0 ), aSz ); - long nY = nPara*nLineHeight - pModulWindow->GetBreakPointWindow().GetCurYOffset(); + long nY = nPara*nLineHeight - rModulWindow.GetBreakPointWindow().GetCurYOffset(); aInvRec.Top() = nY; - pModulWindow->GetBreakPointWindow().Invalidate( aInvRec ); + rModulWindow.GetBreakPointWindow().Invalidate( aInvRec ); - Size aLnSz(pModulWindow->GetLineNumberWindow().GetWidth(), + Size aLnSz(rModulWindow.GetLineNumberWindow().GetWidth(), GetOutputSizePixel().Height() - 2 * DWBORDER); - pModulWindow->GetLineNumberWindow().SetPosSizePixel(Point(DWBORDER + 19, DWBORDER), aLnSz); - pModulWindow->GetLineNumberWindow().Invalidate(); + rModulWindow.GetLineNumberWindow().SetPosSizePixel(Point(DWBORDER + 19, DWBORDER), aLnSz); + rModulWindow.GetLineNumberWindow().Invalidate(); if ( bDoSyntaxHighlight ) { @@ -951,22 +946,21 @@ void EditorWindow::ForceSyntaxTimeout() } +// +// BreakPointWindow +// ================ +// -BreakPointWindow::BreakPointWindow( Window* pParent ) : - Window( pParent, WB_BORDER ) +BreakPointWindow::BreakPointWindow (Window* pParent, ModulWindow* pModulWindow) : + Window(pParent, WB_BORDER), + rModulWindow(*pModulWindow), + nCurYOffset(0), // memorize nCurYOffset and not take it from EditEngine + nMarkerPos(MARKER_NOMARKER) { - pModulWindow = 0; - nCurYOffset = 0; setBackgroundColor(GetSettings().GetStyleSettings().GetFieldColor()); - nMarkerPos = MARKER_NOMARKER; - - // memorize nCurYOffset and not take it from EditEngine - - SetHelpId( HID_BASICIDE_BREAKPOINTWINDOW ); + SetHelpId(HID_BASICIDE_BREAKPOINTWINDOW); } - - BreakPointWindow::~BreakPointWindow() { } @@ -985,27 +979,24 @@ void BreakPointWindow::Paint( const Rectangle& ) if ( SyncYOffset() ) return; - Size aOutSz( GetOutputSize() ); - long nLineHeight = GetTextHeight(); - - ModulWindowLayout* pModulWindowLayout = dynamic_cast<ModulWindowLayout*>(pModulWindow->GetLayoutWindow()); + Size const aOutSz = GetOutputSize(); + long const nLineHeight = GetTextHeight(); - Image aBrk1(pModulWindowLayout->getImage(IMGID_BRKENABLED)); - Image aBrk0(pModulWindowLayout->getImage(IMGID_BRKDISABLED)); - Size aBmpSz( aBrk1.GetSizePixel() ); - aBmpSz = PixelToLogic( aBmpSz ); - Point aBmpOff( 0, 0 ); - aBmpOff.X() = ( aOutSz.Width() - aBmpSz.Width() ) / 2; - aBmpOff.Y() = ( nLineHeight - aBmpSz.Height() ) / 2; + Image const aBrk[2] = { GetImage(IMGID_BRKDISABLED), GetImage(IMGID_BRKENABLED) }; + Size const aBmpSz = PixelToLogic(aBrk[1].GetSizePixel()); + Point const aBmpOff( + (aOutSz.Width() - aBmpSz.Width()) / 2, + (nLineHeight - aBmpSz.Height()) / 2 + ); - for ( size_t i = 0, n = GetBreakPoints().size(); i < n ; ++i ) + for (size_t i = 0, n = GetBreakPoints().size(); i < n; ++i) { - BreakPoint* pBrk = GetBreakPoints().at( i ); - size_t nLine = pBrk->nLine-1; - size_t nY = nLine*nLineHeight - nCurYOffset; - DrawImage( Point( 0, nY ) + aBmpOff, pBrk->bEnabled ? aBrk1 : aBrk0 ); + BreakPoint& rBrk = *GetBreakPoints().at(i); + size_t const nLine = rBrk.nLine - 1; + size_t const nY = nLine*nLineHeight - nCurYOffset; + DrawImage(Point(0, nY) + aBmpOff, aBrk[rBrk.bEnabled]); } - ShowMarker( true ); + ShowMarker(true); } @@ -1034,11 +1025,10 @@ void BreakPointWindow::ShowMarker( bool bShow ) if ( nMarkerPos == MARKER_NOMARKER ) return; - Size aOutSz( GetOutputSize() ); - long nLineHeight = GetTextHeight(); + Size const aOutSz = GetOutputSize(); + long const nLineHeight = GetTextHeight(); - ModulWindowLayout* pModulWindowLayout = dynamic_cast<ModulWindowLayout*>(pModulWindow->GetLayoutWindow()); - Image aMarker(pModulWindowLayout->getImage(bErrorMarker ? IMGID_ERRORMARKER : IMGID_STEPMARKER)); + Image aMarker = GetImage(bErrorMarker ? IMGID_ERRORMARKER : IMGID_STEPMARKER); Size aMarkerSz( aMarker.GetSizePixel() ); aMarkerSz = PixelToLogic( aMarkerSz ); @@ -1082,7 +1072,7 @@ void BreakPointWindow::MouseButtonDown( const MouseEvent& rMEvt ) long nLineHeight = GetTextHeight(); long nYPos = aMousePos.Y() + nCurYOffset; long nLine = nYPos / nLineHeight + 1; - pModulWindow->ToggleBreakPoint( (sal_uLong)nLine ); + rModulWindow.ToggleBreakPoint( (sal_uLong)nLine ); Invalidate(); } } @@ -1106,7 +1096,7 @@ void BreakPointWindow::Command( const CommandEvent& rCEvt ) case RID_ACTIV: { pBrk->bEnabled = !pBrk->bEnabled; - pModulWindow->UpdateBreakPoint( *pBrk ); + rModulWindow.UpdateBreakPoint( *pBrk ); Invalidate(); } break; @@ -1139,7 +1129,7 @@ void BreakPointWindow::Command( const CommandEvent& rCEvt ) bool BreakPointWindow::SyncYOffset() { - TextView* pView = pModulWindow->GetEditView(); + TextView* pView = rModulWindow.GetEditView(); if ( pView ) { long nViewYOffset = pView->GetStartDocPos().Y(); @@ -1176,12 +1166,20 @@ void BreakPointWindow::setBackgroundColor(Color aColor) } -const sal_uInt16 ITEM_ID_VARIABLE = 1; -const sal_uInt16 ITEM_ID_VALUE = 2; -const sal_uInt16 ITEM_ID_TYPE = 3; +// +// WatchWindow +// =========== +// -WatchWindow::WatchWindow( Window* pParent ) : - BasicDockingWindow( pParent ), +namespace +{ + const sal_uInt16 ITEM_ID_VARIABLE = 1; + const sal_uInt16 ITEM_ID_VALUE = 2; + const sal_uInt16 ITEM_ID_TYPE = 3; +} + +WatchWindow::WatchWindow (Layout* pParent) : + BasicDockingWindow(pParent), aWatchStr( IDEResId( RID_STR_REMOVEWATCH ) ), aXEdit( this, IDEResId( RID_EDT_WATCHEDIT ) ), aRemoveWatchButton( this, IDEResId( RID_IMGBTN_REMOVEWATCH ) ), @@ -1406,6 +1404,8 @@ void WatchWindow::AddWatch( const String& rVName ) aTreeListBox.Select(pNewEntry, true); aTreeListBox.MakeVisible(pNewEntry); aRemoveWatchButton.Enable(); + + UpdateWatches(); } bool WatchWindow::RemoveSelectedWatch() @@ -1503,7 +1503,6 @@ IMPL_LINK( WatchWindow, EditAccHdl, Accelerator *, pAcc ) { AddWatch( aCurText ); aXEdit.SetSelection( Selection( 0, 0xFFFF ) ); - UpdateWatches(); } } break; @@ -1523,8 +1522,13 @@ void WatchWindow::UpdateWatches( bool bBasicStopped ) } -StackWindow::StackWindow( Window* pParent ) : - BasicDockingWindow( pParent ), +// +// StackWindow +// =========== +// + +StackWindow::StackWindow (Layout* pParent) : + BasicDockingWindow(pParent), aTreeListBox( this, WB_BORDER | WB_3DLOOK | WB_HSCROLL | WB_TABSTOP ), aStackStr( IDEResId( RID_STR_STACK ) ) { @@ -1642,17 +1646,19 @@ void StackWindow::UpdateCalls() aTreeListBox.SetUpdateMode(true); } + +// +// ComplexEditorWindow +// =================== +// + ComplexEditorWindow::ComplexEditorWindow( ModulWindow* pParent ) : Window( pParent, WB_3DLOOK | WB_CLIPCHILDREN ), - aBrkWindow( this ), - aLineNumberWindow( this, pParent ), - aEdtWindow( this ), - aEWVScrollBar( this, WB_VSCROLL | WB_DRAG ), - bLineNumberDisplay(false), - bObjectCatalogDisplay(true) -{ - aEdtWindow.SetModulWindow( pParent ); - aBrkWindow.SetModulWindow( pParent ); + aBrkWindow(this, pParent), + aLineNumberWindow(this, pParent), + aEdtWindow(this, pParent), + aEWVScrollBar( this, WB_VSCROLL | WB_DRAG ) +{ aEdtWindow.Show(); aBrkWindow.Show(); @@ -1675,7 +1681,7 @@ void ComplexEditorWindow::Resize() Size aLnSz(aLineNumberWindow.GetWidth(), aSz.Height()); - if(bLineNumberDisplay) + if (aLineNumberWindow.IsVisible()) { aBrkWindow.SetPosSizePixel( Point( DWBORDER, DWBORDER ), aBrkSz ); aLineNumberWindow.SetPosSizePixel(Point(DWBORDER + aBrkSz.Width() - 1, DWBORDER), aLnSz); @@ -1726,18 +1732,7 @@ void ComplexEditorWindow::DataChanged(DataChangedEvent const & rDCEvt) void ComplexEditorWindow::SetLineNumberDisplay(bool b) { - bLineNumberDisplay = b; - Resize(); - - if(b) - aLineNumberWindow.Show(); - else - aLineNumberWindow.Hide(); -} - -void ComplexEditorWindow::SetObjectCatalogDisplay(bool b) -{ - bObjectCatalogDisplay = b; + aLineNumberWindow.Show(b); Resize(); } @@ -1758,6 +1753,12 @@ EditorWindow::GetComponentInterface(sal_Bool bCreate) return xPeer; } + +// +// WatchTreeListBox +// ================ +// + WatchTreeListBox::WatchTreeListBox( Window* pParent, WinBits nWinBits ) : SvHeaderTabListBox( pParent, nWinBits ) {} @@ -2251,4 +2252,7 @@ void WatchTreeListBox::UpdateWatches( bool bBasicStopped ) setBasicWatchMode( false ); } + +} // namespace basctl + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/baside3.cxx b/basctl/source/basicide/baside3.cxx index adf4581e9ecd..951b5beffb17 100644 --- a/basctl/source/basicide/baside3.cxx +++ b/basctl/source/basicide/baside3.cxx @@ -32,6 +32,7 @@ #include "idetemp.hxx" #include "localizationmgr.hxx" #include "propbrw.hxx" +#include "objdlg.hxx" #include <basic/basmgr.hxx> #include <com/sun/star/resource/StringResourceWithLocation.hpp> @@ -46,6 +47,7 @@ #include <sfx2/dispatch.hxx> #include <sfx2/request.hxx> #include <svl/aeitem.hxx> +#include <svl/visitem.hxx> #include <svl/whiter.hxx> #include <tools/diagnose_ex.h> #include <tools/urlobj.hxx> @@ -59,6 +61,9 @@ using namespace ::com::sun::star::io; using namespace ::com::sun::star::resource; using namespace ::com::sun::star::ui::dialogs; +namespace basctl +{ + #if defined(UNX) #define FILTERMASK_ALL "*" #else @@ -69,10 +74,15 @@ DBG_NAME( DialogWindow ) TYPEINIT1( DialogWindow, IDEBaseWindow ); -DialogWindow::DialogWindow( Window* pParent, const ScriptDocument& rDocument, ::rtl::OUString aLibName, ::rtl::OUString aName, - const com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >& xDialogModel ) - :IDEBaseWindow( pParent, rDocument, aLibName, aName ) - ,pUndoMgr(NULL) +DialogWindow::DialogWindow ( + DialogWindowLayout* pParent, + ScriptDocument const& rDocument, + rtl::OUString aLibName, rtl::OUString aName, + com::sun::star::uno::Reference<com::sun::star::container::XNameContainer> const& xDialogModel +) : + IDEBaseWindow(pParent, rDocument, aLibName, aName), + rLayout(*pParent), + pUndoMgr(0) { InitSettings( true, true, true ); @@ -395,12 +405,19 @@ void DialogWindow::GetState( SfxItemSet& rSet ) rSet.DisableItem( nWh ); } break; + case SID_SHOWLINES: + { + // if this is not a module window hide the + // setting, doesn't make sense for example if the + // dialog editor is open + rSet.DisableItem(nWh); + rSet.Put(SfxVisibilityItem(nWh, false)); + break; + } } } } - - void DialogWindow::ExecuteCommand( SfxRequest& rReq ) { switch ( rReq.GetSlot() ) @@ -647,6 +664,17 @@ void DialogWindow::ExecuteCommand( SfxRequest& rReq ) case SID_IMPORT_DIALOG: ImportDialog(); break; + + case SID_BASICIDE_DELETECURRENT: + if (QueryDelDialog(m_aName, this)) + { + if (BasicIDE::RemoveDialog(m_aDocument, m_aLibName, m_aName)) + { + BasicIDE::MarkDocumentModified(m_aDocument); + BasicIDEGlobals::GetShell()->RemoveWindow(this, true); + } + } + break; } rReq.Done(); @@ -865,6 +893,9 @@ bool DialogWindow::SaveDialog() return bDone; } +} // namespace basctl + + extern bool localesAreEqual( const ::com::sun::star::lang::Locale& rLocaleLeft, const ::com::sun::star::lang::Locale& rLocaleRight ); @@ -952,6 +983,7 @@ LanguageMismatchQueryBox::LanguageMismatchQueryBox( Window* pParent, SetImage( QueryBox::GetStandardImage() ); } + bool implImportDialog( Window* pWin, const ::rtl::OUString& rCurPath, const ScriptDocument& rDocument, const ::rtl::OUString& aLibName ) { bool bDone = false; @@ -1239,7 +1271,7 @@ bool implImportDialog( Window* pWin, const ::rtl::OUString& rCurPath, const Scri bool bSuccess = rDocument.insertDialog( aLibName, aNewDlgName, xISP ); if( bSuccess ) { - DialogWindow* pNewDlgWin = pIDEShell->CreateDlgWin( rDocument, aLibName, aNewDlgName ); + basctl::DialogWindow* pNewDlgWin = pIDEShell->CreateDlgWin( rDocument, aLibName, aNewDlgName ); pIDEShell->SetCurWindow( pNewDlgWin, true ); } @@ -1252,6 +1284,10 @@ bool implImportDialog( Window* pWin, const ::rtl::OUString& rCurPath, const Scri return bDone; } + +namespace basctl +{ + bool DialogWindow::ImportDialog() { DBG_CHKTHIS( DialogWindow, 0 ); @@ -1348,10 +1384,18 @@ void DialogWindow::StoreData() } } +void DialogWindow::Activating () +{ + UpdateBrowser(); + Show(); +} + void DialogWindow::Deactivating() { + Hide(); if ( IsModified() ) BasicIDE::MarkDocumentModified( GetDocument() ); + DisableBrowser(); } sal_Int32 DialogWindow::countPages( Printer* pPrinter ) @@ -1400,4 +1444,60 @@ void DialogWindow::InitSettings(bool bFont, bool bForeground, bool bBackground) return (::com::sun::star::accessibility::XAccessible*) new AccessibleDialogWindow( this ); } +char const* DialogWindow::GetHid () const +{ + return HID_BASICIDE_DIALOGWINDOW; +} +BasicIDEType DialogWindow::GetType () const +{ + return BASICIDE_TYPE_DIALOG; +} + + +// +// DialogWindowLayout +// ================== +// + +DialogWindowLayout::DialogWindowLayout (Window* pParent, ObjectCatalog& rObjectCatalog_) : + Layout(pParent), + pChild(0), + rObjectCatalog(rObjectCatalog_) +{ } + +void DialogWindowLayout::Activating (IDEBaseWindow& rChild) +{ + assert(dynamic_cast<DialogWindow*>(&rChild)); + pChild = &static_cast<DialogWindow&>(rChild); + rObjectCatalog.SetLayoutWindow(this); + rObjectCatalog.UpdateEntries(); + rObjectCatalog.Show(); + Layout::Activating(rChild); +} + +void DialogWindowLayout::Deactivating () +{ + Layout::Deactivating(); + rObjectCatalog.Hide(); + pChild = 0; +} + +void DialogWindowLayout::GetState (SfxItemSet& rSet, unsigned nWhich) +{ + switch (nWhich) + { + case SID_BASICIDE_CHOOSEMACRO: + rSet.Put(SfxVisibilityItem(nWhich, false)); + break; + } +} + +void DialogWindowLayout::OnFirstSize (int const nWidth, int const nHeight) +{ + AddToLeft(&rObjectCatalog, Size(nWidth * 0.2, nHeight)); +} + + +} // namespace basctl + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/basides1.cxx b/basctl/source/basicide/basides1.cxx index 97447f49566f..841c4bc13f1b 100644 --- a/basctl/source/basicide/basides1.cxx +++ b/basctl/source/basicide/basides1.cxx @@ -30,7 +30,6 @@ #include "iderdll2.hxx" #include "localizationmgr.hxx" #include "managelang.hxx" -#include "moduldlg.hxx" #include <basic/basmgr.hxx> #include <basic/sbmeth.hxx> @@ -57,18 +56,10 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::frame; -// until we have some configuration lets just keep -// persist this value for the process lifetime -bool& lcl_GetSourceLinesEnabledValue() -{ - static bool bSourceLinesEnabled(false); - return bSourceLinesEnabled; -} - -bool BasicIDEShell::SourceLinesDisplayed() -{ - return lcl_GetSourceLinesEnabledValue(); -} +using basctl::ModulWindow; +using basctl::ModulWindowLayout; +using basctl::DialogWindow; +using basctl::DialogWindowLayout; void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq ) { @@ -77,214 +68,135 @@ void BasicIDEShell::ExecuteCurrent( SfxRequest& rReq ) switch ( rReq.GetSlot() ) { - case SID_SHOWLINES: - { - SFX_REQUEST_ARG(rReq, pItem, SfxBoolItem, rReq.GetSlot(), false); - bool const bValue = pItem && pItem->GetValue(); - lcl_GetSourceLinesEnabledValue() = bValue; - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) - pMCurWin->SetLineNumberDisplay(bValue); - } - break; - case SID_BASICIDE_HIDECURPAGE: { pCurWin->StoreData(); RemoveWindow( pCurWin, false ); } break; - case SID_BASICIDE_DELETECURRENT: + case SID_BASICIDE_RENAMECURRENT: { - ScriptDocument aDocument( pCurWin->GetDocument() ); - ::rtl::OUString aLibName = pCurWin->GetLibName(); - ::rtl::OUString aName = pCurWin->GetName(); - - if (dynamic_cast<ModulWindow*>(pCurWin)) + pTabBar->StartEditMode( pTabBar->GetCurPageId() ); + } + break; + case FID_SEARCH_NOW: + { + if (!pCurWin->HasActiveEditor()) + break; + DBG_ASSERT( rReq.GetArgs(), "arguments expected" ); + SfxItemSet const& rArgs = *rReq.GetArgs(); + // unfortunately I don't know the ID: + sal_uInt16 nWhich = rArgs.GetWhichByPos( 0 ); + DBG_ASSERT( nWhich, "Wich fuer SearchItem ?" ); + SfxPoolItem const& rItem = rArgs.Get(nWhich); + DBG_ASSERT(dynamic_cast<SvxSearchItem const*>(&rItem), "no searchitem!"); + SvxSearchItem const& rSearchItem = static_cast<SvxSearchItem const&>(rItem); + // memorize item because of the adjustments... + BasicIDEGlobals::GetExtraData()->SetSearchItem(rSearchItem); + sal_Int32 nFound = 0; + bool bCanceled = false; + if (rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) { - if ( QueryDelModule( aName, pCurWin ) ) + sal_uInt16 nActModWindows = 0; + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { - if ( aDocument.removeModule( aLibName, aName ) ) - { - BasicIDE::MarkDocumentModified( aDocument ); - } + IDEBaseWindow* pWin = it->second; + if (pWin->HasActiveEditor()) + nActModWindows++; } - } - else - { - if ( QueryDelDialog( aName, pCurWin ) ) + + if ( nActModWindows <= 1 || ( !rSearchItem.GetSelection() && QueryBox( pCurWin, WB_YES_NO|WB_DEF_YES, String(IDEResId(RID_STR_SEARCHALLMODULES)) ).Execute() == RET_YES ) ) { - if ( BasicIDE::RemoveDialog( aDocument, aLibName, aName ) ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { - RemoveWindow( pCurWin, true ); - BasicIDE::MarkDocumentModified( aDocument ); + IDEBaseWindow* pWin = it->second; + nFound += pWin->StartSearchAndReplace(rSearchItem); } } + else + nFound = pCurWin->StartSearchAndReplace(rSearchItem); + + rtl::OUString aReplStr(IDE_RESSTR(RID_STR_SEARCHREPLACES)); + aReplStr = aReplStr.replaceAll("XX", rtl::OUString::valueOf(nFound)); + InfoBox( pCurWin, aReplStr ).Execute(); } - } - break; - case SID_BASICIDE_RENAMECURRENT: - { - pTabBar->StartEditMode( pTabBar->GetCurPageId() ); - } - break; - case FID_SEARCH_NOW: - { - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) + else { - DBG_ASSERT( rReq.GetArgs(), "arguments expected" ); - const SfxItemSet* pArgs = rReq.GetArgs(); - // unfortunately I don't know the ID: - sal_uInt16 nWhich = pArgs->GetWhichByPos( 0 ); - DBG_ASSERT( nWhich, "Wich fuer SearchItem ?" ); - const SfxPoolItem& rItem = pArgs->Get( nWhich ); - IDEWindowTable::const_iterator it; - if (SvxSearchItem const* pSearchItem = dynamic_cast<SvxSearchItem const*>(&rItem)) + nFound = pCurWin->StartSearchAndReplace(rSearchItem); + if ( !nFound && !rSearchItem.GetSelection() ) { - // memorize item because of the adjustments... - BasicIDEGlobals::GetExtraData()->SetSearchItem(*pSearchItem); - sal_Int32 nFound = 0; - bool bCanceled = false; - if (pSearchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) + // search other modules... + bool bChangeCurWindow = false; + WindowTableIt it; + for (it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) + if (it->second == pCurWin) + break; + if (it != aIDEWindowTable.end()) + ++it; + IDEBaseWindow* pWin = it != aIDEWindowTable.end() ? it->second : 0; + + bool bSearchedFromStart = false; + while ( !nFound && !bCanceled && ( pWin || !bSearchedFromStart ) ) { - sal_uInt16 nActModWindows = 0; - for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + if ( !pWin ) { - IDEBaseWindow* pWin = it->second; - if (!pWin->IsSuspended() && dynamic_cast<ModulWindow*>(pWin)) - nActModWindows++; + SfxViewFrame* pViewFrame = GetViewFrame(); + SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow( SID_SEARCH_DLG ) : NULL; + Window* pParent = pChildWin ? pChildWin->GetWindow() : NULL; + QueryBox aQuery(pParent, WB_YES_NO|WB_DEF_YES, IDE_RESSTR(RID_STR_SEARCHFROMSTART)); + if ( aQuery.Execute() == RET_YES ) + { + it = aIDEWindowTable.begin(); + if ( it != aIDEWindowTable.end() ) + pWin = it->second; + bSearchedFromStart = true; + } + else + bCanceled = true; } - if ( ( nActModWindows <= 1 ) || ( !pSearchItem->GetSelection() && QueryBox( pCurWin, WB_YES_NO|WB_DEF_YES, String( IDEResId( RID_STR_SEARCHALLMODULES ) ) ).Execute() == RET_YES ) ) + if (pWin && pWin->HasActiveEditor()) { - for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + if ( pWin != pCurWin ) { - IDEBaseWindow* pWin = it->second; - if (!pWin->IsSuspended()) - if (ModulWindow* pMWin = dynamic_cast<ModulWindow*>(pWin)) - nFound += pMWin->StartSearchAndReplace(*pSearchItem); + if ( pCurWin ) + pWin->SetSizePixel( pCurWin->GetSizePixel() ); + nFound = pWin->StartSearchAndReplace(rSearchItem, true); + } + if ( nFound ) + { + bChangeCurWindow = true; + break; } } - else - nFound = pMCurWin->StartSearchAndReplace(*pSearchItem); - - ::rtl::OUString aReplStr(IDE_RESSTR(RID_STR_SEARCHREPLACES)); - aReplStr = aReplStr.replaceAll("XX", rtl::OUString::valueOf(nFound)); - InfoBox( pCurWin, aReplStr ).Execute(); - } - else - { - nFound = pMCurWin->StartSearchAndReplace(*pSearchItem); - if ( !nFound && !pSearchItem->GetSelection() ) + if ( pWin && ( pWin != pCurWin ) ) { - // search other modules... - bool bChangeCurWindow = false; - for( it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) - if ( it->second == pCurWin) - break; if ( it != aIDEWindowTable.end() ) ++it; - IDEBaseWindow* pWin = NULL; - if ( it != aIDEWindowTable.end() ) - pWin = it->second; - - bool bSearchedFromStart = false; - while ( !nFound && !bCanceled && ( pWin || !bSearchedFromStart ) ) - { - if ( !pWin ) - { - SfxViewFrame* pViewFrame = GetViewFrame(); - SfxChildWindow* pChildWin = pViewFrame ? pViewFrame->GetChildWindow( SID_SEARCH_DLG ) : NULL; - Window* pParent = pChildWin ? pChildWin->GetWindow() : NULL; - QueryBox aQuery(pParent, WB_YES_NO|WB_DEF_YES, IDE_RESSTR(RID_STR_SEARCHFROMSTART)); - if ( aQuery.Execute() == RET_YES ) - { - it = aIDEWindowTable.begin(); - if ( it != aIDEWindowTable.end() ) - pWin = it->second; - bSearchedFromStart = true; - } - else - bCanceled = true; - } - - if (ModulWindow* pMWin = dynamic_cast<ModulWindow*>(pWin)) - if (!pWin->IsSuspended()) - { - if ( pWin != pCurWin ) - { - if ( pCurWin ) - pWin->SetSizePixel( pCurWin->GetSizePixel() ); - nFound = pMWin->StartSearchAndReplace(*pSearchItem, true); - } - if ( nFound ) - { - bChangeCurWindow = true; - break; - } - } - if ( pWin && ( pWin != pCurWin ) ) - { - if ( it != aIDEWindowTable.end() ) - ++it; - if ( it != aIDEWindowTable.end() ) - pWin = it->second; - else - pWin = 0; - } - else - pWin = 0; - } - if ( !nFound && bSearchedFromStart ) - nFound = pMCurWin->StartSearchAndReplace(*pSearchItem, true); - if ( bChangeCurWindow ) - SetCurWindow( pWin, true ); + pWin = it != aIDEWindowTable.end() ? it->second : 0; } - if ( !nFound && !bCanceled ) - InfoBox( pCurWin, String( IDEResId( RID_STR_SEARCHNOTFOUND ) ) ).Execute(); + else + pWin = 0; } - - rReq.Done(); + if ( !nFound && bSearchedFromStart ) + nFound = pCurWin->StartSearchAndReplace(rSearchItem, true); + if ( bChangeCurWindow ) + SetCurWindow( pWin, true ); } - else - DBG_ASSERT(false, "no searchitem!"); + if ( !nFound && !bCanceled ) + InfoBox( pCurWin, String(IDEResId(RID_STR_SEARCHNOTFOUND)) ).Execute(); } - } - break; - case FID_SEARCH_OFF: - { - if (dynamic_cast<ModulWindow*>(pCurWin)) - pCurWin->GrabFocus(); + + rReq.Done(); } break; case SID_UNDO: case SID_REDO: - { if ( GetUndoManager() && pCurWin->AllowUndo() ) - { GetViewFrame()->ExecuteSlot( rReq ); - } - } - break; - case SID_GOTOLINE: - { - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) - { - std::auto_ptr< GotoLineDialog > xGotoDlg( new GotoLineDialog( pCurWin ) ); - if ( xGotoDlg->Execute() ) - { - rtl::OUString sText = xGotoDlg->GetText(); - - sal_Int32 nLine = xGotoDlg->GetLineNumber(); - - if ( nLine ) - pMCurWin->GetEditView()->SetSelection( TextSelection( TextPaM( nLine - 1 , 0 ), TextPaM( nLine - 1, 0 ) ) ); - } - } - } + break; default: - { pCurWin->ExecuteCommand( rReq ); - } } } @@ -350,22 +262,6 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq ) } } break; - case SID_SIGNATURE: - { - if ( pCurWin ) - { - ::basctl::DocumentSignature aSignature( pCurWin->GetDocument() ); - if ( aSignature.supportsSignatures() ) - { - aSignature.signScriptingContent(); - SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); - if ( pBindings ) - pBindings->Invalidate( SID_SIGNATURE ); - } - } - } - break; - case SID_BASICIDE_MODULEDLG: { if ( rReq.GetArgs() ) @@ -441,10 +337,13 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq ) break; case SID_BASICIDE_OBJCAT: - pModulLayout->ToggleObjectCatalog(); + // toggling object catalog + aObjectCatalog.Show(!aObjectCatalog.IsVisible()); + if (pLayout) + pLayout->ArrangeWindows(); // refresh the button state if (SfxBindings* pBindings = BasicIDE::GetBindingsPtr()) - pBindings->Invalidate(nSlot); + pBindings->Invalidate(SID_BASICIDE_OBJCAT); break; case SID_BASICIDE_NAMECHANGEDONTAB: @@ -519,7 +418,7 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq ) case SID_BASICIDE_STOREALLMODULESOURCES: case SID_BASICIDE_UPDATEALLMODULESOURCES: { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if (!pWin->IsSuspended() && dynamic_cast<ModulWindow*>(pWin)) @@ -793,11 +692,18 @@ void BasicIDEShell::ExecuteGlobal( SfxRequest& rReq ) case SID_BASICIDE_MANAGE_LANG: { - ManageLanguageDialog aDlg( GetCurWindow(), GetCurLocalizationMgr() ); + ManageLanguageDialog aDlg(pCurWin, m_pCurLocalizationMgr); aDlg.Execute(); rReq.Done(); } break; + + default: + if (pLayout) + pLayout->ExecuteGlobal(rReq); + if (pCurWin) + pCurWin->ExecuteGlobal(rReq); + break; } } @@ -808,20 +714,6 @@ void BasicIDEShell::GetState(SfxItemSet &rSet) { switch ( nWh ) { - case SID_SHOWLINES: - { - // if this is not a module window hide the - // setting, doesn't make sense for example if the - // dialog editor is open - if(pCurWin && !dynamic_cast<ModulWindow*>(pCurWin)) - { - rSet.DisableItem( nWh ); - rSet.Put(SfxVisibilityItem(nWh, false)); - } - else - rSet.Put( SfxBoolItem( nWh, lcl_GetSourceLinesEnabledValue() ) ); - break; - } case SID_DOCINFO: { rSet.DisableItem( nWh ); @@ -872,25 +764,12 @@ void BasicIDEShell::GetState(SfxItemSet &rSet) rSet.DisableItem( nWh ); } break; - case SID_BASICIDE_CHOOSEMACRO: case SID_BASICIDE_OBJCAT: - { - // FIXME: hide Object Catalog icon from the toolbar, - // when window type is not macro editor. - if(pCurWin && !dynamic_cast<ModulWindow*>(pCurWin)) - { - rSet.DisableItem( nWh ); - rSet.Put(SfxVisibilityItem(nWh, false)); - } + if (pLayout) + rSet.Put(SfxBoolItem(nWh, aObjectCatalog.IsVisible())); else - { - if (nWh == SID_BASICIDE_OBJCAT) - rSet.Put(SfxBoolItem(nWh, pModulLayout && pModulLayout->HasObjectCatalog())); - else - rSet.Put(SfxVisibilityItem(nWh, true)); - } + rSet.Put(SfxVisibilityItem(nWh, false)); break; - } case SID_BASICIDE_SHOWSBX: case SID_BASICIDE_CREATEMACRO: case SID_BASICIDE_EDITMACRO: @@ -1098,6 +977,9 @@ void BasicIDEShell::GetState(SfxItemSet &rSet) } break; } + default: + if (pLayout) + pLayout->GetState(rSet, nWh); } } if ( pCurWin ) @@ -1120,67 +1002,25 @@ sal_Bool BasicIDEShell::HasUIFeature( sal_uInt32 nFeature ) void BasicIDEShell::SetCurWindow( IDEBaseWindow* pNewWin, bool bUpdateTabBar, bool bRememberAsCurrent ) { - // an EditWindow must be set at Sfx for resizing... - if ( !pNewWin && ( GetWindow() != pModulLayout ) ) - { - pModulLayout->Show(); - AdjustPosSizePixel( Point( 0, 0 ), GetViewFrame()->GetWindow().GetOutputSizePixel() ); - SetWindow( pModulLayout ); - EnableScrollbars( false ); - aVScrollBar.Hide(); - } - if ( pNewWin != pCurWin ) { - IDEBaseWindow* pPrevCurWin = pCurWin; pCurWin = pNewWin; - if ( pPrevCurWin ) + if (pLayout) + pLayout->Deactivating(); + if (pCurWin) { - pPrevCurWin->Hide(); - pPrevCurWin->Deactivating(); -// pPrevCurWin->GetLayoutWindow()->Hide(); - if (DialogWindow* pDialogWin = dynamic_cast<DialogWindow*>(pPrevCurWin)) - { - pDialogWin->DisableBrowser(); - } - else - { - pModulLayout->SetModulWindow( NULL ); - } - } - if ( pCurWin ) - { - AdjustPosSizePixel( Point( 0, 0 ), GetViewFrame()->GetWindow().GetOutputSizePixel() ); - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) - { - pMCurWin->SetLineNumberDisplay(SourceLinesDisplayed()); - GetViewFrame()->GetWindow().SetHelpId( HID_BASICIDE_MODULWINDOW ); - pModulLayout->SetModulWindow(pMCurWin); - pModulLayout->Show(); - } + if (pCurWin->GetType() == BASICIDE_TYPE_MODULE) + pLayout = pModulLayout.get(); else - { - pModulLayout->Hide(); - GetViewFrame()->GetWindow().SetHelpId( HID_BASICIDE_DIALOGWINDOW ); - } - - if ( bRememberAsCurrent ) - { - BasicIDEData* pData = BasicIDEGlobals::GetExtraData(); - if ( pData ) - { - sal_uInt16 nCurrentType = dynamic_cast<ModulWindow*>(pCurWin) ? - BASICIDE_TYPE_MODULE : BASICIDE_TYPE_DIALOG; - LibInfoItem* pLibInfoItem = new LibInfoItem( pCurWin->GetDocument(), pCurWin->GetLibName(), pCurWin->GetName(), nCurrentType ); - pData->GetLibInfos().InsertInfo( pLibInfoItem ); - } - } - - if ( GetViewFrame()->GetWindow().IsVisible() ) // SFX will do it later otherwise + pLayout = pDialogLayout.get(); + AdjustPosSizePixel(Point(0, 0), GetViewFrame()->GetWindow().GetOutputSizePixel()); + pLayout->Activating(*pCurWin); + GetViewFrame()->GetWindow().SetHelpId(pCurWin->GetHid()); + if (bRememberAsCurrent) + pCurWin->InsertLibInfo(); + if (GetViewFrame()->GetWindow().IsVisible()) // SFX will do it later otherwise pCurWin->Show(); - pCurWin->Init(); - if ( !BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() ) { Window* pFrameWindow = &GetViewFrame()->GetWindow(); @@ -1190,9 +1030,9 @@ void BasicIDEShell::SetCurWindow( IDEBaseWindow* pNewWin, bool bUpdateTabBar, bo if ( pFocusWindow ) // Focus in BasicIDE pNewWin->GrabFocus(); } - if (DialogWindow* pDCurWin = dynamic_cast<DialogWindow*>(pCurWin)) - pDCurWin->UpdateBrowser(); } + else + pLayout = 0; if ( bUpdateTabBar ) { sal_uLong nKey = GetIDEWindowId( pCurWin ); @@ -1208,16 +1048,16 @@ void BasicIDEShell::SetCurWindow( IDEBaseWindow* pNewWin, bool bUpdateTabBar, bo if ( pCurWin->GetDocument().isDocument() ) SfxObjectShell::SetCurrentComponent( pCurWin->GetDocument().getDocument() ); } - else + else if (pLayout) { - SetWindow( pModulLayout ); + SetWindow(pLayout); GetViewFrame()->GetWindow().SetHelpId( HID_BASICIDE_MODULWINDOW ); - SfxObjectShell::SetCurrentComponent( NULL ); + SfxObjectShell::SetCurrentComponent(0); } - pModulLayout->GetObjectCatalog().SetCurrentEntry(pCurWin); + aObjectCatalog.SetCurrentEntry(pCurWin); SetUndoManager( pCurWin ? pCurWin->GetUndoManager() : 0 ); InvalidateBasicIDESlots(); - EnableScrollbars( pCurWin ? true : false ); + EnableScrollbars(pCurWin != 0); if ( m_pCurLocalizationMgr ) m_pCurLocalizationMgr->handleTranslationbar(); @@ -1277,25 +1117,17 @@ IDEBaseWindow* BasicIDEShell::FindApplicationWindow() return FindWindow( ScriptDocument::getApplicationScriptDocument() ); } -IDEBaseWindow* BasicIDEShell::FindWindow( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rName, BasicIDEType nType, bool bFindSuspended ) +IDEBaseWindow* BasicIDEShell::FindWindow( + ScriptDocument const& rDocument, + rtl::OUString const& rLibName, rtl::OUString const& rName, + BasicIDEType eType, bool bFindSuspended +) { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { - IDEBaseWindow* pWin = it->second; - if ( !pWin->IsSuspended() || bFindSuspended ) - { - if ( rLibName.isEmpty() || rName.isEmpty() || nType == BASICIDE_TYPE_UNKNOWN ) - { - // return any non-suspended window - return pWin; - } - else if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName && pWin->GetName() == rName && - ( ( dynamic_cast<ModulWindow*>(pWin) && nType == BASICIDE_TYPE_MODULE ) || - ( dynamic_cast<DialogWindow*>(pWin) && nType == BASICIDE_TYPE_DIALOG ) ) ) - { - return pWin; - } - } + IDEBaseWindow* const pWin = it->second; + if (pWin->Is(rDocument, rLibName, rName, eType, bFindSuspended)) + return pWin; } return 0; } @@ -1406,8 +1238,8 @@ void BasicIDEShell::AdjustPosSizePixel( const Point &rPos, const Size &rSize ) pTabBar->SetPosSizePixel( Point( rPos.X(), rPos.Y()+aSz.Height() ), Size( aSz.Width()/2, aScrollBarBoxSz.Height() ) ); } - if (Window* pEdtWin = pCurWin ? pCurWin->GetLayoutWindow() : pModulLayout) - pEdtWin->SetPosSizePixel(rPos, dynamic_cast<DialogWindow*>(pCurWin) ? aSz : aOutSz); + if (pLayout) + pLayout->SetPosSizePixel(rPos, dynamic_cast<DialogWindow*>(pCurWin) ? aSz : aOutSz); } Reference< XModel > BasicIDEShell::GetCurrentDocument() const @@ -1444,7 +1276,7 @@ void BasicIDEShell::Deactivate( sal_Bool bMDI ) // test CanClose to also test during deactivating the BasicIDE whether // the sourcecode is too large in one of the modules... - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if ( /* !pWin->IsSuspended() && */ !pWin->CanClose() ) diff --git a/basctl/source/basicide/basides2.cxx b/basctl/source/basicide/basides2.cxx index e30ec199da1e..6a1a5b4a064e 100644 --- a/basctl/source/basicide/basides2.cxx +++ b/basctl/source/basicide/basides2.cxx @@ -45,6 +45,9 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::uno; namespace css = ::com::sun::star; +using basctl::ModulWindow; +using basctl::ModulWindowLayout; + Reference< view::XRenderable > BasicIDEShell::GetRenderable() { return Reference< view::XRenderable >( new basicide::BasicRenderable( pCurWin ) ); @@ -142,27 +145,6 @@ void BasicIDEShell::SetMDITitle() } } -void BasicIDEShell::DestroyModulWindowLayout() -{ - delete pModulLayout; - pModulLayout = 0; -} - - -void BasicIDEShell::UpdateModulWindowLayout( bool bBasicStopped ) -{ - if ( pModulLayout ) - { - pModulLayout->GetStackWindow().UpdateCalls(); - pModulLayout->GetWatchWindow().UpdateWatches( bBasicStopped ); - } -} - -void BasicIDEShell::CreateModulWindowLayout() -{ - pModulLayout = new ModulWindowLayout( &GetViewFrame()->GetWindow() ); -} - ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName ) { bCreatingWindow = true; @@ -199,7 +181,9 @@ ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const if( !pWin ) { // new module window - pWin = new ModulWindow( pModulLayout, rDocument, aLibName, aModName, aModule ); + if (!pModulLayout) + pModulLayout.reset(new ModulWindowLayout(&GetViewFrame()->GetWindow(), aObjectCatalog)); + pWin = new ModulWindow(pModulLayout.get(), rDocument, aLibName, aModName, aModule); nKey = InsertWindowInTable( pWin ); } else // we've gotten called recursively ( via listener from createModule above ), get outta here @@ -238,20 +222,15 @@ ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const return pWin; } -ModulWindow* BasicIDEShell::FindBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName, bool bCreateIfNotExist, bool bFindSuspended ) +ModulWindow* BasicIDEShell::FindBasWin ( + ScriptDocument const& rDocument, + rtl::OUString const& rLibName, rtl::OUString const& rName, + bool bCreateIfNotExist, bool bFindSuspended +) { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); - it != aIDEWindowTable.end(); ++it ) - { - IDEBaseWindow* pWin = it->second; - if (!pWin->IsSuspended() || bFindSuspended) - if (rLibName.isEmpty() || (pWin->IsDocument(rDocument) && pWin->GetLibName() == rLibName && pWin->GetName() == rModName)) - { - if (ModulWindow* pModWin = dynamic_cast<ModulWindow*>(pWin)) - return pModWin; - } - } - return bCreateIfNotExist ? CreateBasWin(rDocument, rLibName, rModName) : 0; + if (IDEBaseWindow* pWin = FindWindow(rDocument, rLibName, rName, BASICIDE_TYPE_MODULE, bFindSuspended)) + return static_cast<ModulWindow*>(pWin); + return bCreateIfNotExist ? CreateBasWin(rDocument, rLibName, rName) : 0; } void BasicIDEShell::Move() @@ -272,13 +251,12 @@ sal_Int32 getBasicIDEShellCount( void ); // only if basic window above: void BasicIDEShell::ExecuteBasic( SfxRequest& rReq ) { - if (!dynamic_cast<ModulWindow*>(pCurWin)) - return; - - pCurWin->ExecuteCommand( rReq ); - sal_Int32 nCount = getBasicIDEShellCount(); - if( nCount ) - CheckWindows(); + if (dynamic_cast<ModulWindow*>(pCurWin)) + { + pCurWin->ExecuteCommand( rReq ); + if (getBasicIDEShellCount()) + CheckWindows(); + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/basides3.cxx b/basctl/source/basicide/basides3.cxx index 17bbddbab67c..ed0af7e9ca9a 100644 --- a/basctl/source/basicide/basides3.cxx +++ b/basctl/source/basicide/basides3.cxx @@ -41,6 +41,9 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::io; +using basctl::DialogWindow; +using basctl::DialogWindowLayout; + DialogWindow* BasicIDEShell::CreateDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName ) { bCreatingWindow = true; @@ -86,7 +89,9 @@ DialogWindow* BasicIDEShell::CreateDlgWin( const ScriptDocument& rDocument, cons LocalizationMgr::setStringResourceAtDialog( rDocument, rLibName, aDlgName, xDialogModel ); // new dialog window - pWin = new DialogWindow( &GetViewFrame()->GetWindow(), rDocument, aLibName, aDlgName, xDialogModel ); + if (!pDialogLayout) + pDialogLayout.reset(new DialogWindowLayout(&GetViewFrame()->GetWindow(), aObjectCatalog)); + pWin = new DialogWindow(pDialogLayout.get(), rDocument, aLibName, aDlgName, xDialogModel); nKey = InsertWindowInTable( pWin ); } } @@ -115,22 +120,20 @@ DialogWindow* BasicIDEShell::CreateDlgWin( const ScriptDocument& rDocument, cons return pWin; } -DialogWindow* BasicIDEShell::FindDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName, bool bCreateIfNotExist, bool bFindSuspended ) +DialogWindow* BasicIDEShell::FindDlgWin ( + ScriptDocument const& rDocument, + rtl::OUString const& rLibName, rtl::OUString const& rName, + bool bCreateIfNotExist, bool bFindSuspended +) { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) - { - IDEBaseWindow* pWin = it->second; - if (!pWin->IsSuspended() || bFindSuspended) - if (rLibName.isEmpty() || (pWin->IsDocument(rDocument) && pWin->GetLibName() == rLibName && pWin->GetName() == rDlgName)) - if (DialogWindow* pDlgWin = dynamic_cast<DialogWindow*>(pWin)) - return pDlgWin; - } - return bCreateIfNotExist ? CreateDlgWin(rDocument, rLibName, rDlgName) : 0; + if (IDEBaseWindow* pWin = FindWindow(rDocument, rLibName, rName, BASICIDE_TYPE_DIALOG, bFindSuspended)) + return static_cast<DialogWindow*>(pWin); + return bCreateIfNotExist ? CreateDlgWin(rDocument, rLibName, rName) : 0; } sal_uInt16 BasicIDEShell::GetIDEWindowId(const IDEBaseWindow* pWin) const { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) if ( it->second == pWin ) return it->first; return 0; @@ -147,11 +150,8 @@ SdrView* BasicIDEShell::GetCurDlgView() const // only if dialogue window above: void BasicIDEShell::ExecuteDialog( SfxRequest& rReq ) { - if (pCurWin && (dynamic_cast<DialogWindow*>(pCurWin) || - (rReq.GetSlot() == SID_IMPORT_DIALOG && dynamic_cast<ModulWindow*>(pCurWin)))) - { - pCurWin->ExecuteCommand( rReq ); - } + if (pCurWin && (dynamic_cast<DialogWindow*>(pCurWin) || rReq.GetSlot() == SID_IMPORT_DIALOG)) + pCurWin->ExecuteCommand(rReq); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/basidesh.cxx b/basctl/source/basicide/basidesh.cxx index b271811695f8..c1b7dfe4dee2 100644 --- a/basctl/source/basicide/basidesh.cxx +++ b/basctl/source/basicide/basidesh.cxx @@ -24,7 +24,8 @@ #include <tools/diagnose_ex.h> #include <basic/basmgr.hxx> #include <basidesh.hrc> -#include <baside2.hxx> +#include "baside2.hxx" +#include "baside3.hxx" #include <basdoc.hxx> #include <basicbox.hxx> #include <editeng/sizeitem.hxx> @@ -68,7 +69,7 @@ class ContainerListenerImpl : public ContainerListenerBASE BasicIDEShell* mpShell; public: - ContainerListenerImpl( BasicIDEShell* pShell ) : mpShell( pShell ) {} + ContainerListenerImpl (BasicIDEShell* pShell) : mpShell(pShell) { } ~ContainerListenerImpl() { @@ -117,7 +118,7 @@ public: rtl::OUString sModuleName; if( mpShell && ( Event.Accessor >>= sModuleName ) ) { - IDEBaseWindow* pWin = mpShell->FindWindow( mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, BASICIDE_TYPE_MODULE, true ); + basctl::ModulWindow* pWin = mpShell->FindBasWin(mpShell->m_aCurDocument, mpShell->m_aCurLibName, sModuleName, false, true); if( pWin ) mpShell->RemoveWindow( pWin, true, true ); } @@ -150,13 +151,15 @@ sal_Int32 getBasicIDEShellCount( void ) { return GnBasicIDEShellCount; } BasicIDEShell::BasicIDEShell( SfxViewFrame* pFrame_, SfxViewShell* /* pOldShell */ ) : - SfxViewShell( pFrame_, IDE_VIEWSHELL_FLAGS ), - m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ), - aHScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG ) ), - aVScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG ) ), - aScrollBarBox( &GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE ) ), - m_bAppBasicModified( false ), - m_aNotifier( *this ) + SfxViewShell( pFrame_, IDE_VIEWSHELL_FLAGS ), + m_aCurDocument( ScriptDocument::getApplicationScriptDocument() ), + aHScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_HSCROLL | WB_DRAG ) ), + aVScrollBar( &GetViewFrame()->GetWindow(), WinBits( WB_VSCROLL | WB_DRAG ) ), + aScrollBarBox( &GetViewFrame()->GetWindow(), WinBits( WB_SIZEABLE ) ), + pLayout(0), + aObjectCatalog(&GetViewFrame()->GetWindow()), + m_bAppBasicModified( false ), + m_aNotifier( *this ) { m_xLibListener = new ContainerListenerImpl( this ); Init(); @@ -184,9 +187,9 @@ void BasicIDEShell::Init() LibBoxControl::RegisterControl( SID_BASICIDE_LIBSELECTOR ); LanguageBoxControl::RegisterControl( SID_BASICIDE_CURRENT_LANG ); - CreateModulWindowLayout(); - - GetViewFrame()->GetWindow().SetBackground(); + GetViewFrame()->GetWindow().SetBackground( + GetViewFrame()->GetWindow().GetSettings().GetStyleSettings().GetWindowColor() + ); pCurWin = 0; m_aCurDocument = ScriptDocument::getApplicationScriptDocument(); @@ -229,7 +232,7 @@ BasicIDEShell::~BasicIDEShell() SetWindow( 0 ); SetCurWindow( 0 ); - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) { // no store; does already happen when the BasicManagers are destroyed delete it->second; @@ -237,12 +240,10 @@ BasicIDEShell::~BasicIDEShell() aIDEWindowTable.clear(); delete pTabBar; - DestroyModulWindowLayout(); - ContainerListenerImpl* pListener = static_cast< ContainerListenerImpl* >( m_xLibListener.get() ); - // Destroy all ContainerListeners for Basic Container. - if ( pListener ) - pListener->removeContainerListener( m_aCurDocument, m_aCurLibName ); + // Destroy all ContainerListeners for Basic Container. + if (ContainerListenerImpl* pListener = static_cast<ContainerListenerImpl*>(m_xLibListener.get())) + pListener->removeContainerListener(m_aCurDocument, m_aCurLibName); BasicIDEGlobals::GetExtraData()->ShellInCriticalSection() = false; @@ -251,15 +252,15 @@ BasicIDEShell::~BasicIDEShell() void BasicIDEShell::onDocumentCreated( const ScriptDocument& /*_rDocument*/ ) { - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) - pMCurWin->SetLineNumberDisplay(SourceLinesDisplayed()); + if (pCurWin) + pCurWin->OnNewDocument(); UpdateWindows(); } void BasicIDEShell::onDocumentOpened( const ScriptDocument& /*_rDocument*/ ) { - if (ModulWindow* pMCurWin = dynamic_cast<ModulWindow*>(pCurWin)) - pMCurWin->SetLineNumberDisplay(SourceLinesDisplayed()); + if (pCurWin) + pCurWin->OnNewDocument(); UpdateWindows(); } @@ -296,7 +297,7 @@ void BasicIDEShell::onDocumentClosed( const ScriptDocument& _rDocument ) std::vector<IDEBaseWindow*> aDeleteVec; // remove all windows which belong to this document - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) { IDEBaseWindow* pWin = it->second; if ( pWin->IsDocument( _rDocument ) ) @@ -344,7 +345,7 @@ void BasicIDEShell::onDocumentTitleChanged( const ScriptDocument& /*_rDocument*/ void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument ) { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) { IDEBaseWindow* pWin = it->second; if ( pWin->IsDocument( _rDocument ) && _rDocument.isDocument() ) @@ -354,7 +355,7 @@ void BasicIDEShell::onDocumentModeChanged( const ScriptDocument& _rDocument ) void BasicIDEShell::StoreAllWindowData( bool bPersistent ) { - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) { IDEBaseWindow* pWin = it->second; DBG_ASSERT( pWin, "PrepareClose: NULL-Pointer in Table?" ); @@ -396,7 +397,7 @@ sal_uInt16 BasicIDEShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing ) else { bool bCanClose = true; - for (IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); bCanClose && (it != aIDEWindowTable.end()); ++it) + for (WindowTableIt it = aIDEWindowTable.begin(); bCanClose && (it != aIDEWindowTable.end()); ++it) { IDEBaseWindow* pWin = it->second; if ( !pWin->CanClose() ) @@ -537,7 +538,7 @@ void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&, case SFX_HINT_DYING: { EndListening( rBC, true /* log off all */ ); - UpdateObjectCatalog(); + aObjectCatalog.UpdateEntries(); } break; } @@ -577,7 +578,8 @@ void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&, // not only at error/break or explicit stoppage, // if the update is turned off due to a programming bug BasicIDE::BasicStopped(); - UpdateModulWindowLayout( true ); // clear... + if (pLayout) + pLayout->UpdateDebug(true); // clear... if( m_pCurLocalizationMgr ) m_pCurLocalizationMgr->handleBasicStopped(); } @@ -586,8 +588,7 @@ void BasicIDEShell::SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId&, m_pCurLocalizationMgr->handleBasicStarted(); } - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); - it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if ( nHintId == SBX_HINT_BASICSTART ) @@ -607,7 +608,7 @@ void BasicIDEShell::CheckWindows() { bool bSetCurWindow = false; std::vector<IDEBaseWindow*> aDeleteVec; - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if ( pWin->GetStatus() & BASWIN_TOBEKILLED ) @@ -631,7 +632,7 @@ void BasicIDEShell::RemoveWindows( const ScriptDocument& rDocument, const ::rtl: { bool bChangeCurWindow = pCurWin ? false : true; std::vector<IDEBaseWindow*> aDeleteVec; - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName ) @@ -658,7 +659,7 @@ void BasicIDEShell::UpdateWindows() if ( !m_aCurLibName.isEmpty() ) { std::vector<IDEBaseWindow*> aDeleteVec; - for( IDEWindowTable::const_iterator it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it ) + for (WindowTableIt it = aIDEWindowTable.begin(); it != aIDEWindowTable.end(); ++it) { IDEBaseWindow* pWin = it->second; if ( !pWin->IsDocument( m_aCurDocument ) || pWin->GetLibName() != m_aCurLibName ) @@ -739,7 +740,7 @@ void BasicIDEShell::UpdateWindows() for ( sal_Int32 j = 0 ; j < nModCount ; j++ ) { ::rtl::OUString aModName = pModNames[ j ]; - ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, false ); + basctl::ModulWindow* pWin = FindBasWin( *doc, aLibName, aModName, false ); if ( !pWin ) pWin = CreateBasWin( *doc, aLibName, aModName ); if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aModName && @@ -770,7 +771,7 @@ void BasicIDEShell::UpdateWindows() ::rtl::OUString aDlgName = pDlgNames[ j ]; // this find only looks for non-suspended windows; // suspended windows are handled in CreateDlgWin - DialogWindow* pWin = FindDlgWin( *doc, aLibName, aDlgName, false ); + basctl::DialogWindow* pWin = FindDlgWin( *doc, aLibName, aDlgName, false ); if ( !pWin ) pWin = CreateDlgWin( *doc, aLibName, aDlgName ); if ( !pNextActiveWindow && pLibInfoItem && pLibInfoItem->GetCurrentName() == aDlgName && @@ -842,7 +843,6 @@ void BasicIDEShell::RemoveWindow( IDEBaseWindow* pWindow_, bool bDestroy, bool b } else { - pWindow_->Hide(); pWindow_->AddStatus( BASWIN_SUSPENDED ); pWindow_->Deactivating(); aIDEWindowTable[ nKey ] = pWindow_; // jump in again @@ -975,10 +975,4 @@ void BasicIDEShell::ImplStartListening( StarBASIC* pBasic ) StartListening( pBasic->GetBroadcaster(), true /* log on only once */ ); } -// Updates the "Object Catalog" window. -void BasicIDEShell::UpdateObjectCatalog () -{ - pModulLayout->UpdateObjectCatalog(); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/basobj2.cxx b/basctl/source/basicide/basobj2.cxx index 01df2eac19c1..ab9d9a085ad1 100644 --- a/basctl/source/basicide/basobj2.cxx +++ b/basctl/source/basicide/basobj2.cxx @@ -186,18 +186,15 @@ bool RenameModule( Window* pErrorParent, const ScriptDocument& rDocument, const if ( !rDocument.renameModule( rLibName, rOldName, rNewName ) ) return false; - BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell(); - if ( pIDEShell ) + if (BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell()) { - IDEBaseWindow* pWin = pIDEShell->FindWindow( rDocument, rLibName, rNewName, BASICIDE_TYPE_MODULE, true ); - if ( pWin ) + if (basctl::ModulWindow* pWin = pIDEShell->FindBasWin(rDocument, rLibName, rNewName, false, true)) { // set new name in window pWin->SetName( rNewName ); // set new module in module window - ModulWindow* pModWin = dynamic_cast<ModulWindow*>(pWin); - pModWin->SetSbModule( (SbModule*)pModWin->GetBasic()->FindModule( rNewName ) ); + pWin->SetSbModule( (SbModule*)pWin->GetBasic()->FindModule( rNewName ) ); // update tabwriter sal_uInt16 nId = pIDEShell->GetIDEWindowId( pWin ); diff --git a/basctl/source/basicide/basobj3.cxx b/basctl/source/basicide/basobj3.cxx index 7325904540c9..731d4021a3cf 100644 --- a/basctl/source/basicide/basobj3.cxx +++ b/basctl/source/basicide/basobj3.cxx @@ -189,10 +189,10 @@ bool RenameDialog( Window* pErrorParent, const ScriptDocument& rDocument, const } BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell(); - IDEBaseWindow* pWin = pIDEShell ? pIDEShell->FindWindow( rDocument, rLibName, rOldName, BASICIDE_TYPE_DIALOG, false ) : NULL; + basctl::DialogWindow* pWin = pIDEShell ? pIDEShell->FindDlgWin(rDocument, rLibName, rOldName) : 0; Reference< XNameContainer > xExistingDialog; if ( pWin ) - xExistingDialog = ((DialogWindow*)pWin)->GetEditor()->GetDialog(); + xExistingDialog = pWin->GetEditor()->GetDialog(); if ( xExistingDialog.is() ) LocalizationMgr::renameStringResourceIDs( rDocument, rLibName, rNewName, xExistingDialog ); @@ -206,7 +206,7 @@ bool RenameDialog( Window* pErrorParent, const ScriptDocument& rDocument, const pWin->SetName( rNewName ); // update property browser - ((DialogWindow*)pWin)->UpdateBrowser(); + pWin->UpdateBrowser(); // update tabwriter sal_uInt16 nId = pIDEShell->GetIDEWindowId( pWin ); @@ -229,8 +229,7 @@ bool RemoveDialog( const ScriptDocument& rDocument, const ::rtl::OUString& rLibN BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell(); if ( pIDEShell ) { - DialogWindow* pDlgWin = pIDEShell->FindDlgWin( rDocument, rLibName, rDlgName, false ); - if( pDlgWin ) + if (basctl::DialogWindow* pDlgWin = pIDEShell->FindDlgWin(rDocument, rLibName, rDlgName)) { Reference< container::XNameContainer > xDialogModel = pDlgWin->GetDialog(); LocalizationMgr::removeResourceForDialog( rDocument, rLibName, rDlgName, xDialogModel ); @@ -286,9 +285,11 @@ void MarkDocumentModified( const ScriptDocument& rDocument ) // does not have to come from a document... if ( rDocument.isApplication() ) { - BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell(); - if ( pIDEShell ) + if (BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell()) + { pIDEShell->SetAppBasicModified(); + pIDEShell->UpdateObjectCatalog(); + } } else { @@ -302,10 +303,6 @@ void MarkDocumentModified( const ScriptDocument& rDocument ) pBindings->Invalidate( SID_SAVEDOC ); pBindings->Update( SID_SAVEDOC ); } - - // updating the Object Catalog - if (BasicIDEShell* pIdeShell = BasicIDEGlobals::GetShell()) - pIdeShell->UpdateObjectCatalog(); } //---------------------------------------------------------------------------- @@ -499,6 +496,5 @@ SfxBindings* GetBindingsPtr() } //namespace BasicIDE -//---------------------------------------------------------------------------- /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/bastype2.hxx b/basctl/source/basicide/bastype2.hxx index efcaa4f23460..397be358215f 100644 --- a/basctl/source/basicide/bastype2.hxx +++ b/basctl/source/basicide/bastype2.hxx @@ -30,7 +30,19 @@ #include <sbxitem.hxx> #include "basobj.hxx" -enum BasicEntryType { OBJ_TYPE_UNKNOWN, OBJ_TYPE_DOCUMENT, OBJ_TYPE_LIBRARY, OBJ_TYPE_MODULE, OBJ_TYPE_DIALOG, OBJ_TYPE_METHOD, OBJ_TYPE_DOCUMENT_OBJECTS, OBJ_TYPE_USERFORMS, OBJ_TYPE_NORMAL_MODULES, OBJ_TYPE_CLASS_MODULES }; +enum BasicEntryType +{ + OBJ_TYPE_UNKNOWN, + OBJ_TYPE_DOCUMENT, + OBJ_TYPE_LIBRARY, + OBJ_TYPE_MODULE, + OBJ_TYPE_DIALOG, + OBJ_TYPE_METHOD, + OBJ_TYPE_DOCUMENT_OBJECTS, + OBJ_TYPE_USERFORMS, + OBJ_TYPE_NORMAL_MODULES, + OBJ_TYPE_CLASS_MODULES +}; #define BROWSEMODE_MODULES 0x01 #define BROWSEMODE_SUBS 0x02 diff --git a/basctl/source/basicide/bastypes.cxx b/basctl/source/basicide/bastypes.cxx index 3aa29e6db930..616f281d62c3 100644 --- a/basctl/source/basicide/bastypes.cxx +++ b/basctl/source/basicide/bastypes.cxx @@ -25,6 +25,7 @@ #include "baside3.hxx" #include "basobj.hxx" #include "iderdll.hxx" +#include "iderdll2.hxx" #include <basic/basmgr.hxx> #include <com/sun/star/script/ModuleType.hpp> @@ -40,6 +41,7 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star; using ::std::vector; +using basctl::Layout; DBG_NAME( IDEBaseWindow ) @@ -106,18 +108,11 @@ IMPL_LINK_INLINE_START( IDEBaseWindow, ScrollHdl, ScrollBar *, pCurScrollBar ) IMPL_LINK_INLINE_END( IDEBaseWindow, ScrollHdl, ScrollBar *, pCurScrollBar ) +void IDEBaseWindow::ExecuteCommand (SfxRequest&) +{ } -void IDEBaseWindow::ExecuteCommand( SfxRequest& ) -{ - DBG_CHKTHIS( IDEBaseWindow, 0 ); -} - - - -void IDEBaseWindow::GetState( SfxItemSet& ) -{ - DBG_CHKTHIS( IDEBaseWindow, 0 ); -} +void IDEBaseWindow::ExecuteGlobal (SfxRequest&) +{ } long IDEBaseWindow::Notify( NotifyEvent& rNEvt ) @@ -225,51 +220,143 @@ bool IDEBaseWindow::IsPasteAllowed () return false; } -Window* IDEBaseWindow::GetLayoutWindow() -{ - return this; -} - ::svl::IUndoManager* IDEBaseWindow::GetUndoManager() { return NULL; } -void IDEBaseWindow::Deactivating() +sal_uInt16 IDEBaseWindow::GetSearchOptions() { + return 0; } -sal_uInt16 IDEBaseWindow::GetSearchOptions() +sal_uInt16 IDEBaseWindow::StartSearchAndReplace (SvxSearchItem const&, bool bFromStart) { + static_cast<void>(bFromStart); return 0; } +void IDEBaseWindow::OnNewDocument () +{ } -BasicDockingWindow::BasicDockingWindow( Window* pParent ) : - DockingWindow( pParent, WB_BORDER | WB_3DLOOK | WB_DOCKABLE | WB_MOVEABLE | - WB_SIZEABLE | WB_ROLLABLE | - WB_DOCKABLE | WB_CLIPCHILDREN ) +void IDEBaseWindow::InsertLibInfo () const { + if (BasicIDEData* pData = BasicIDEGlobals::GetExtraData()) + { + pData->GetLibInfos().InsertInfo( + new LibInfoItem(m_aDocument, m_aLibName, m_aName, GetType()) + ); + } } -sal_Bool BasicDockingWindow::Docking( const Point& rPos, Rectangle& rRect ) +bool IDEBaseWindow::Is ( + ScriptDocument const& rDocument, + rtl::OUString const& rLibName, rtl::OUString const& rName, + BasicIDEType eType, bool bFindSuspended +) +{ + if (bFindSuspended || !IsSuspended()) + { + // any non-suspended window is ok + if (rLibName.isEmpty() || rName.isEmpty() || eType == BASICIDE_TYPE_UNKNOWN) + return true; + // ok if the parameters match + if (m_aDocument == rDocument && m_aLibName == rLibName && m_aName == rName && GetType() == eType) + return true; + } + return false; +} + +bool IDEBaseWindow::HasActiveEditor () const +{ + return false; +} + + +// +// BasicDockingWindow +// ================== +// + +// style bits for BasicDockingWindow +WinBits const BasicDockingWindow::StyleBits = + WB_BORDER | WB_3DLOOK | WB_CLIPCHILDREN | + WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_DOCKABLE; + +BasicDockingWindow::BasicDockingWindow (Window* pParent) : + DockingWindow(pParent, StyleBits), + pLayout(0), + nShowCount(0) +{ } + +BasicDockingWindow::BasicDockingWindow (Layout* pParent) : + DockingWindow(pParent, StyleBits), + pLayout(pParent), + nShowCount(0) +{ } + +// Sets the position and the size of the docking window. This property is saved +// when the window is floating. Called by Layout. +void BasicDockingWindow::ResizeIfDocking (Point const& rPos, Size const& rSize) +{ + Rectangle const rRect(rPos, rSize); + if (rRect != aDockingRect) + { + // saving the position and the size + aDockingRect = rRect; + // resizing if actually docking + if (!IsFloatingMode()) + SetPosSizePixel(rPos, rSize); + } +} + +// Sets the parent Layout window. +// The physical parent is set only when the window is docking. +void BasicDockingWindow::SetLayoutWindow (Layout* pLayout_) +{ + pLayout = pLayout_; + if (!IsFloatingMode()) + SetParent(pLayout); + +} + +// Increases the "show" reference count. +// The window is shown when the reference count is positive. +void BasicDockingWindow::Show (bool bShow) // = true { - ModulWindowLayout* pLayout = (ModulWindowLayout*)GetParent(); - Rectangle aTmpRec( rRect ); - bool const bDock = !IsDockingPrevented() && pLayout->IsToBeDocked( this, rPos, aTmpRec ); - if ( bDock ) + if (bShow) { - rRect.SetSize( aTmpRec.GetSize() ); + if (++nShowCount == 1) + DockingWindow::Show(); } - else // adjust old size + else { - if ( !aFloatingPosAndSize.IsEmpty() ) - rRect.SetSize( aFloatingPosAndSize.GetSize() ); + if (--nShowCount == 0) + DockingWindow::Hide(); } - return !bDock; // bFloat } +// Decreases the "show" reference count. +// The window is hidden when the reference count reaches zero. +void BasicDockingWindow::Hide () +{ + Show(false); +} +sal_Bool BasicDockingWindow::Docking( const Point& rPos, Rectangle& rRect ) +{ + if (!IsDockingPrevented() && aDockingRect.IsInside(rPos)) + { + rRect.SetSize(aDockingRect.GetSize()); + return false; // dock + } + else // adjust old size + { + if (!aFloatingRect.IsEmpty()) + rRect.SetSize(aFloatingRect.GetSize()); + return true; // float + } +} void BasicDockingWindow::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode ) { @@ -278,51 +365,72 @@ void BasicDockingWindow::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode else { SetFloatingMode(false); - ModulWindowLayout* pLayout = (ModulWindowLayout*)GetParent(); - pLayout->DockaWindow( this ); + DockThis(); } } - - void BasicDockingWindow::ToggleFloatingMode() { - ModulWindowLayout* pLayout = (ModulWindowLayout*)GetParent(); - if ( IsFloatingMode() ) + if (IsFloatingMode()) { - if ( !aFloatingPosAndSize.IsEmpty() ) - SetPosSizePixel( GetParent()->ScreenToOutputPixel( aFloatingPosAndSize.TopLeft() ), - aFloatingPosAndSize.GetSize() ); + if (!aFloatingRect.IsEmpty()) + SetPosSizePixel( + GetParent()->ScreenToOutputPixel(aFloatingRect.TopLeft()), + aFloatingRect.GetSize() + ); } - pLayout->DockaWindow( this ); + DockThis(); } - - sal_Bool BasicDockingWindow::PrepareToggleFloatingMode() { - if ( IsFloatingMode() ) + if (IsFloatingMode()) { // memorize position and size on the desktop... - aFloatingPosAndSize.SetPos( GetParent()->OutputToScreenPixel( GetPosPixel() ) ); - aFloatingPosAndSize.SetSize( GetSizePixel() ); + aFloatingRect = Rectangle( + GetParent()->OutputToScreenPixel(GetPosPixel()), + GetSizePixel() + ); } return true; } - - void BasicDockingWindow::StartDocking() { - if ( IsFloatingMode() ) + if (IsFloatingMode()) { - aFloatingPosAndSize.SetPos( GetParent()->OutputToScreenPixel( GetPosPixel() ) ); - aFloatingPosAndSize.SetSize( GetSizePixel() ); + aFloatingRect = Rectangle( + GetParent()->OutputToScreenPixel(GetPosPixel()), + GetSizePixel() + ); } } +void BasicDockingWindow::DockThis () +{ + // resizing when floating -> docking + if (!IsFloatingMode()) + { + Point const aPos = aDockingRect.TopLeft(); + Size const aSize = aDockingRect.GetSize(); + if (aSize != GetSizePixel() || aPos != GetPosPixel()) + SetPosSizePixel(aPos, aSize); + } + + if (pLayout) + { + if (!IsFloatingMode() && GetParent() != pLayout) + SetParent(pLayout); + pLayout->DockaWindow(this); + } +} +// +// ExtendedEdit +// ============ +// + ExtendedEdit::ExtendedEdit( Window* pParent, IDEResId nRes ) : Edit( pParent, nRes ) { @@ -442,7 +550,7 @@ void BasicIDETabBar::Command( const CommandEvent& rCEvt ) { IDEWindowTable& aIDEWindowTable = pIDEShell->GetIDEWindowTable(); IDEWindowTable::const_iterator it = aIDEWindowTable.find( GetCurPageId() ); - if (it != aIDEWindowTable.end() && dynamic_cast<ModulWindow*>(it->second)) + if (it != aIDEWindowTable.end() && dynamic_cast<basctl::ModulWindow*>(it->second)) { SbModule* pActiveModule = (SbModule*)pBasic->FindModule( it->second->GetName() ); if( pActiveModule && ( pActiveModule->GetModuleType() == script::ModuleType::DOCUMENT ) ) @@ -493,6 +601,23 @@ void BasicIDETabBar::EndRenaming() } +namespace +{ + +// helper class for sorting TabBar +struct TabBarSortHelper +{ + sal_uInt16 nPageId; + String aPageText; + + bool operator < (TabBarSortHelper const& rComp) const + { + return aPageText.CompareIgnoreCaseToAscii(rComp.aPageText) == COMPARE_LESS; + } +}; + +} // namespace + void BasicIDETabBar::Sort() { BasicIDEShell* pIDEShell = BasicIDEGlobals::GetShell(); @@ -513,11 +638,11 @@ void BasicIDETabBar::Sort() aTabBarSortHelper.aPageText = GetPageText( nId ); IDEBaseWindow* pWin = aIDEWindowTable[ nId ]; - if (dynamic_cast<ModulWindow*>(pWin)) + if (dynamic_cast<basctl::ModulWindow*>(pWin)) { aModuleList.push_back( aTabBarSortHelper ); } - else if (dynamic_cast<DialogWindow*>(pWin)) + else if (dynamic_cast<basctl::DialogWindow*>(pWin)) { aDialogList.push_back( aTabBarSortHelper ); } @@ -628,19 +753,6 @@ LibInfoKey::~LibInfoKey() { } -LibInfoKey::LibInfoKey( const LibInfoKey& rKey ) - :m_aDocument( rKey.m_aDocument ) - ,m_aLibName( rKey.m_aLibName ) -{ -} - -LibInfoKey& LibInfoKey::operator=( const LibInfoKey& rKey ) -{ - m_aDocument = rKey.m_aDocument; - m_aLibName = rKey.m_aLibName; - return *this; -} - bool LibInfoKey::operator==( const LibInfoKey& rKey ) const { bool bRet = false; diff --git a/basctl/source/basicide/layout.cxx b/basctl/source/basicide/layout.cxx new file mode 100644 index 000000000000..7fd33d7f5e9b --- /dev/null +++ b/basctl/source/basicide/layout.cxx @@ -0,0 +1,362 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "layout.hxx" + +#include "bastypes.hxx" + +#include <boost/make_shared.hpp> + +namespace basctl +{ + +namespace +{ +// the thickness of the splitting lines +static int const nSplitThickness = 3; +} // namespace + +// ctor for derived classes +// pParent: the parent window (BasicIDEShell) +Layout::Layout (Window* pParent) : + Window(pParent, WB_CLIPCHILDREN), + pChild(0), + bFirstSize(true), + aLeftSide(this, SplittedSide::Left), + aBottomSide(this, SplittedSide::Bottom) +{ + SetBackground(GetSettings().GetStyleSettings().GetWindowColor()); + + Font aFont = GetFont(); + Size aSz = aFont.GetSize(); + aSz.Height() *= 1.5; + aFont.SetSize(aSz); + aFont.SetWeight(WEIGHT_BOLD); + aFont.SetColor(GetSettings().GetStyleSettings().GetWindowTextColor()); + SetFont(aFont); +} + +// virtual dtor +Layout::~Layout() +{ } + +// called by Window when resized +void Layout::Resize() +{ + if (IsVisible()) + ArrangeWindows(); +} + +// ArrangeWindows() -- arranges the child windows +void Layout::ArrangeWindows () +{ + Size const aSize = GetOutputSizePixel(); + int const nWidth = aSize.Width(), nHeight = aSize.Height(); + if (!nWidth || !nHeight) // empty size + return; + if (bFirstSize) + { + this->OnFirstSize(nWidth, nHeight); // virtual + bFirstSize = false; + } + + // sides + aBottomSide.ArrangeIn(Rectangle(Point(0, 0), aSize)); + aLeftSide.ArrangeIn(Rectangle(Point(0, 0), Size(nWidth, nHeight - aBottomSide.GetSize()))); + // child in the middle + pChild->SetPosSizePixel( + Point(aLeftSide.GetSize(), 0), + Size(nWidth - aLeftSide.GetSize(), nHeight - aBottomSide.GetSize()) + ); +} + +void Layout::DockaWindow (DockingWindow*) +{ + ArrangeWindows(); +} + +void Layout::Activating (IDEBaseWindow& rIdeWindow) +{ + // first activation + pChild = &rIdeWindow; + ArrangeWindows(); + Show(); + pChild->Activating(); +} + +void Layout::Deactivating () +{ + if (pChild) + pChild->Deactivating(); + Hide(); + pChild = 0; +} + +void Layout::ExecuteGlobal (SfxRequest&) +{ } + +void Layout::GetState (SfxItemSet&, unsigned /*nWhich*/) +{ } + +void Layout::UpdateDebug (bool bBasicStopped) +{ + static_cast<void>(bBasicStopped); +} + +// virtual +void Layout::DataChanged (DataChangedEvent const& rDCEvt) +{ + Window::DataChanged(rDCEvt); + if (rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE)) + { + bool bInvalidate = false; + Color aColor = GetSettings().GetStyleSettings().GetWindowColor(); + if (aColor != rDCEvt.GetOldSettings()->GetStyleSettings().GetWindowColor()) + { + SetBackground(Wallpaper(aColor)); + bInvalidate = true; + } + aColor = GetSettings().GetStyleSettings().GetWindowTextColor(); + if (aColor != rDCEvt.GetOldSettings()->GetStyleSettings().GetWindowTextColor()) + { + Font aFont(GetFont()); + aFont.SetColor(aColor); + SetFont(aFont); + bInvalidate = true; + } + if (bInvalidate) + Invalidate(); + } +} + +// virtual +void Layout::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) +{ } + +// This virtual function is called the first time when the Layout has nonzero size. +// The overrider can initialize the docking windows. +void Layout::OnFirstSize (int, int) +{ } + + +// +// SplittedSide +// ============ +// + +// ctor +Layout::SplittedSide::SplittedSide (Layout* pParent, Side eSide) : + rLayout(*pParent), + bFirstArrange(true), + bVertical(eSide == Left || eSide == Right), + bLower(eSide == Left || eSide == Top), + nSize(0), + nLastPos(0), + aSplitter(pParent, bVertical ? WB_HSCROLL : WB_VSCROLL) +{ + InitSplitter(aSplitter); +} + + +// Add() -- adds a new window to the side (after construction) +void Layout::SplittedSide::Add (BasicDockingWindow* pWin, Size const& rSize) +{ + int const nSize1 = (bVertical ? rSize.Width() : rSize.Height()) + nSplitThickness; + int const nSize2 = bVertical ? rSize.Height() : rSize.Width(); + // nSize + if (nSize1 > nSize) + nSize = nSize1; + // window + vWindows.push_back(pWin); + // split line + if (vWindows.size() > 1) + { + vSplitters.push_back(boost::make_shared<Splitter>( + &rLayout, bVertical ? WB_VSCROLL : WB_HSCROLL + )); + Splitter& rSplitter = *vSplitters.back(); + rSplitter.SetSplitPosPixel(nLastPos - nSplitThickness); + InitSplitter(rSplitter); + } + // nLastPos + nLastPos += nSize2 + nSplitThickness; +} + +// creating a Point or a Size object +// The coordinate order depends on bVertical (reversed if true). +inline Size Layout::SplittedSide::MakeSize (int A, int B) const +{ + return bVertical ? Size(B, A) : Size(A, B); +} +inline Point Layout::SplittedSide::MakePoint (int A, int B) const +{ + return bVertical ? Point(B, A) : Point(A, B); +} + +// IsEmpty() -- are there no windows docked in this strip? +bool Layout::SplittedSide::IsEmpty () const +{ + for (unsigned i = 0; i != vWindows.size(); ++i) + if (vWindows[i]->IsVisible() && !vWindows[i]->IsFloatingMode()) + return false; + return true; +} + +// GetSize() -- returns the width or height of the strip (depending on the direction) +int Layout::SplittedSide::GetSize () const +{ + return IsEmpty() ? 0 : nSize; +} + +// Arrange() -- arranges the docking windows +// rRect: the available space +void Layout::SplittedSide::ArrangeIn (Rectangle const& rRect) +{ + // saving the rectangle + aRect = rRect; + + // the length of the side + int const nLength = bVertical ? aRect.GetSize().Height() : aRect.GetSize().Width(); + int const nOtherSize = bVertical ? aRect.GetSize().Width() : aRect.GetSize().Height(); + // bVertical ? horizontal pozition : vertical pozition + int const nPos1 = (bVertical ? aRect.Left() : aRect.Top()) + + (bLower ? 0 : nOtherSize - (nSize - nSplitThickness)); + // bVertical ? vertical position : horizontal position + int const nPos2 = bVertical ? aRect.Top() : aRect.Left(); + + // main line + { + // shown if any of the windows is docked + if (!IsEmpty()) + { + aSplitter.Show(); + // split position + aSplitter.SetSplitPosPixel((bLower ? nSize : nPos1) - nSplitThickness); + // the actual position and size + aSplitter.SetPosSizePixel( + MakePoint(nPos2, aSplitter.GetSplitPosPixel()), + MakeSize(nLength, nSplitThickness) + ); + // dragging rectangle + aSplitter.SetDragRectPixel(aRect); + } + else + aSplitter.Hide(); + } + + // positioning separator lines and windows + bool bPrevDocked; // is the previous window docked? + int nStartPos = nPos2; // window position in the strip + for (unsigned i = 0; i != vWindows.size(); ++i) + { + // window + BasicDockingWindow& rWin = *vWindows[i]; + bool const bDocked = rWin.IsVisible() && !rWin.IsFloatingMode(); + // The window is docked between nStartPos and nEndPos along. + int const nEndPos = i == vWindows.size() - 1 ? + nPos2 + nLength : vSplitters[i]->GetSplitPosPixel(); + rWin.ResizeIfDocking( + MakePoint(nStartPos, nPos1), + MakeSize(nEndPos - nStartPos, nSize - nSplitThickness) + ); + // splitting line before the window + if (i > 0) + { + Splitter& rSplit = *vSplitters[i - 1]; + // If neither of two adjacent windows are docked, + // the splitting line is hidden. + if (bDocked || bPrevDocked) + { + rSplit.Show(); + // the actual pozition and size of the line + rSplit.SetPosSizePixel( + MakePoint(nStartPos - nSplitThickness, nPos1), + MakeSize(nSplitThickness, nSize - nSplitThickness) + ); + // the dragging rectangle + rSplit.SetDragRectPixel(Rectangle( + MakePoint(bVertical ? aRect.Top() : aRect.Left(), nPos1), + MakeSize(nLength, nSize - nSplitThickness) + )); + } + else + rSplit.Hide(); + } + // next + bPrevDocked = bDocked; + nStartPos = nEndPos + nSplitThickness; + } + + // first arrange + bFirstArrange = false; +} + +IMPL_LINK(Layout::SplittedSide, SplitHdl, Splitter*, pSplitter) +{ + // checking margins + CheckMarginsFor(pSplitter); + // nSize has to be changed? + if (pSplitter == &aSplitter) + { + if (bLower) + nSize = pSplitter->GetSplitPosPixel(); + else + nSize = (bVertical ? aRect.Right() : aRect.Bottom()) + 1 - pSplitter->GetSplitPosPixel(); + } + // arranging windows + rLayout.ArrangeWindows(); + + return 0; +} + +void Layout::SplittedSide::CheckMarginsFor (Splitter* pSplitter) +{ + // The splitter line cannot be closer to the edges than nMargin pixels. + static int const nMargin = 16; + // Checking margins: + if (int const nLength = pSplitter->IsHorizontal() ? + aRect.GetWidth() : aRect.GetHeight() + ) { + // bounds + int const nLower = (pSplitter->IsHorizontal() ? aRect.Left() : aRect.Top()) + nMargin; + int const nUpper = nLower + nLength - 2*nMargin; + // split position + int const nPos = pSplitter->GetSplitPosPixel(); + // checking bounds + if (nPos < nLower) + pSplitter->SetSplitPosPixel(nLower); + if (nPos > nUpper) + pSplitter->SetSplitPosPixel(nUpper); + } +} + +void Layout::SplittedSide::InitSplitter (Splitter& rSplitter) +{ + // link + rSplitter.SetSplitHdl(LINK(this, SplittedSide, SplitHdl)); + // color + Color aColor = rLayout.GetSettings().GetStyleSettings().GetShadowColor(); + rSplitter.SetLineColor(aColor); + rSplitter.SetFillColor(aColor); +} + + +} // namespace basctl + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/layout.hxx b/basctl/source/basicide/layout.hxx new file mode 100644 index 000000000000..eca1b985c547 --- /dev/null +++ b/basctl/source/basicide/layout.hxx @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef BASCTL_LAYOUT_HXX +#define BASCTL_LAYOUT_HXX + +#include <vcl/window.hxx> +#include <vcl/split.hxx> +#include <unotools/options.hxx> + +#include <vector> +#include <boost/shared_ptr.hpp> + +class DockingWindow; +class BasicDockingWindow; +class IDEBaseWindow; +class SfxRequest; +class SfxItemSet; + +namespace basctl +{ + +// +// Layout -- the common base of ModulLayout and DialogLayout. +// Handles the splitting lines and the dockable windows. +// +class Layout: public Window, public utl::ConfigurationListener +{ +public: + void DockaWindow (DockingWindow*); + void ArrangeWindows (); + + virtual void Activating (IDEBaseWindow&); + virtual void Deactivating (); + virtual void ExecuteGlobal (SfxRequest&); + virtual void GetState (SfxItemSet&, unsigned nWhich); + virtual void UpdateDebug (bool bBasicStopped = false); + +protected: + Layout (Window* pParent); + virtual ~Layout (); + + void AddToLeft (BasicDockingWindow* pWin, Size const& rSize) { aLeftSide.Add(pWin, rSize); } + void AddToBottom (BasicDockingWindow* pWin, Size const& rSize) { aBottomSide.Add(pWin, rSize); } + +protected: + // Window: + virtual void Resize (); + virtual void DataChanged (DataChangedEvent const& rDCEvt); + // ConfigurationListener: + virtual void ConfigurationChanged (utl::ConfigurationBroadcaster*, sal_uInt32); + // new: + virtual void OnFirstSize (int nWidth, int nHeight); + +private: + // the main child window (either ModulWindow or DialogWindow) + IDEBaseWindow* pChild; + + // when this window has at first (nonempty) size + bool bFirstSize; + + // horizontal or vertical splitted strip + class SplittedSide + { + public: + enum Side {Right, Top, Left, Bottom}; + SplittedSide (Layout*, Side); + void Add (BasicDockingWindow*, Size const&); + bool IsEmpty () const; + int GetSize () const; + void ArrangeIn (Rectangle const&); + + private: + // the layout window + Layout& rLayout; + // ArrangeIn() is called at first time? + bool bFirstArrange; + // horizontal or vertical strip? + bool bVertical; + // lower (top or left) or higher (bottom or right) strip? + bool bLower; + // rectangle to move in + Rectangle aRect; + // size (width or height) + int nSize; + // last position (between Add()s) + int nLastPos; + // the main splitting line + Splitter aSplitter; + // the dockable windows + std::vector<BasicDockingWindow*> vWindows; + // splitting lines between the docking windows (vWindows.size() - 1) + std::vector<boost::shared_ptr<Splitter> > vSplitters; + + private: + Point MakePoint (int, int) const; + Size MakeSize (int, int) const; + private: + DECL_LINK(SplitHdl, Splitter*); + void CheckMarginsFor (Splitter*); + void InitSplitter (Splitter&); + } aLeftSide, aBottomSide; +}; + +} // namespace basctl + +#endif // BASCTL_LAYOUT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/linenumberwindow.cxx b/basctl/source/basicide/linenumberwindow.cxx index b6d5223f3d8e..40093ed9e41a 100644 --- a/basctl/source/basicide/linenumberwindow.cxx +++ b/basctl/source/basicide/linenumberwindow.cxx @@ -32,9 +32,9 @@ #include <vcl/xtextedt.hxx> #include <vcl/textview.hxx> -LineNumberWindow::LineNumberWindow( Window* pParent, ModulWindow* pModulWin ) : - Window( pParent, WB_BORDER ), - m_pModulWindow(pModulWin), +LineNumberWindow::LineNumberWindow (Window* pParent, basctl::ModulWindow* pModulWindow) : + Window(pParent, WB_BORDER), + m_pModulWindow(pModulWindow), m_nCurYOffset(0) { SetBackground(Wallpaper(GetSettings().GetStyleSettings().GetFieldColor())); diff --git a/basctl/source/basicide/linenumberwindow.hxx b/basctl/source/basicide/linenumberwindow.hxx index 48c24144a38f..7c8f7171c908 100644 --- a/basctl/source/basicide/linenumberwindow.hxx +++ b/basctl/source/basicide/linenumberwindow.hxx @@ -30,12 +30,15 @@ #include <vcl/window.hxx> -class ModulWindow; +namespace basctl +{ + class ModulWindow; +} class LineNumberWindow : public Window { private: - ModulWindow* m_pModulWindow; + basctl::ModulWindow* m_pModulWindow; int m_nWidth; long m_nCurYOffset; int m_nBaseWidth; @@ -45,7 +48,7 @@ protected: virtual void Paint( const Rectangle& ); public: - LineNumberWindow( Window* pParent, ModulWindow* pModulWin ); + LineNumberWindow (Window* pParent, basctl::ModulWindow* pModulWin); ~LineNumberWindow(); void DoScroll( long nHorzScroll, long nVertScroll ); diff --git a/basctl/source/basicide/localizationmgr.cxx b/basctl/source/basicide/localizationmgr.cxx index ea439314e3e6..8df518bd3f25 100644 --- a/basctl/source/basicide/localizationmgr.cxx +++ b/basctl/source/basicide/localizationmgr.cxx @@ -17,12 +17,14 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <basidesh.hxx> -#include <baside3.hxx> -#include <basobj.hxx> -#include <iderdll.hxx> +#include "localizationmgr.hxx" + +#include "basidesh.hxx" +#include "baside3.hxx" +#include "basobj.hxx" +#include "iderdll.hxx" #include "dlged.hxx" -#include <localizationmgr.hxx> + #include <com/sun/star/resource/XStringResourceSupplier.hpp> #include <com/sun/star/frame/XLayoutManager.hpp> #include <sfx2/dispatch.hxx> @@ -33,6 +35,9 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::resource; +using basctl::DialogWindow; +using basctl::ModulWindow; + static ::rtl::OUString aDot( RTL_CONSTASCII_USTRINGPARAM( "." )); static ::rtl::OUString aEsc( RTL_CONSTASCII_USTRINGPARAM( "&" )); static ::rtl::OUString aSemi( RTL_CONSTASCII_USTRINGPARAM( ";" )); @@ -134,10 +139,9 @@ void LocalizationMgr::implEnableDisableResourceForAllLibraryDialogs( HandleResou for( sal_Int32 i = 0 ; i < nDlgCount ; i++ ) { String aDlgName = pDlgNames[ i ]; - DialogWindow* pWin = m_pIDEShell->FindDlgWin( m_aDocument, m_aLibName, aDlgName, false ); - if (DialogWindow* pDialogWin = dynamic_cast<DialogWindow*>(pWin)) + if (DialogWindow* pWin = m_pIDEShell->FindDlgWin(m_aDocument, m_aLibName, aDlgName)) { - Reference< container::XNameContainer > xDialog = pDialogWin->GetDialog(); + Reference< container::XNameContainer > xDialog = pWin->GetDialog(); if( xDialog.is() ) { // Handle dialog itself as control diff --git a/basctl/source/basicide/objdlg.cxx b/basctl/source/basicide/objdlg.cxx index 00fc82cef6e1..37800397d278 100644 --- a/basctl/source/basicide/objdlg.cxx +++ b/basctl/source/basicide/objdlg.cxx @@ -24,7 +24,7 @@ #include "iderdll.hxx" #include "iderdll2.hxx" #include "objdlg.hxx" -#include <helpid.hrc> +#include "helpid.hrc" #include <sfx2/app.hxx> #include <sfx2/dispatch.hxx> @@ -34,6 +34,9 @@ #include <vcl/msgbox.hxx> #include <vcl/taskpanelist.hxx> +namespace basctl +{ + ObjectCatalog::ObjectCatalog (Window* pParent) : BasicDockingWindow(pParent), aTitle(this), @@ -137,4 +140,7 @@ void ObjectCatalog::SetCurrentEntry (IDEBaseWindow* pCurWin) aTree.SetCurrentEntry(aDescriptor); } + +} // namespace basctl + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/basicide/objdlg.hxx b/basctl/source/basicide/objdlg.hxx index 91a4b7742ffb..d4477212448a 100644 --- a/basctl/source/basicide/objdlg.hxx +++ b/basctl/source/basicide/objdlg.hxx @@ -20,13 +20,17 @@ #ifndef BASCTL_OBJDLG_HXX #define BASCTL_OBJDLG_HXX +#include "bastype2.hxx" +#include "bastypes.hxx" + #include <svheader.hxx> #include <vcl/floatwin.hxx> #include <vcl/toolbox.hxx> #include <vcl/fixed.hxx> #include <vcl/image.hxx> -#include <bastype2.hxx> +namespace basctl +{ // // ObjectCatalog -- a docking window that contains the currently loaded macros @@ -53,6 +57,8 @@ private: void ArrangeWindows (); }; +} // namespace basctl + #endif // BASCTL_OBJDLG_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/inc/accessibledialogcontrolshape.hxx b/basctl/source/inc/accessibledialogcontrolshape.hxx index 0d5e512454a1..eae49f2a9146 100644 --- a/basctl/source/inc/accessibledialogcontrolshape.hxx +++ b/basctl/source/inc/accessibledialogcontrolshape.hxx @@ -26,9 +26,12 @@ #include <cppuhelper/implbase3.hxx> class Window; -class DialogWindow; class DlgEdObj; class VCLExternalSolarLock; +namespace basctl +{ + class DialogWindow; +} namespace utl { class AccessibleStateSetHelper; @@ -52,7 +55,7 @@ class AccessibleDialogControlShape : public AccessibleExtendedComponentHelper private: VCLExternalSolarLock* m_pExternalLock; - DialogWindow* m_pDialogWindow; + basctl::DialogWindow* m_pDialogWindow; DlgEdObj* m_pDlgEdObj; bool m_bFocused; bool m_bSelected; @@ -83,7 +86,7 @@ protected: virtual void SAL_CALL disposing(); public: - AccessibleDialogControlShape( DialogWindow* pDialogWindow, DlgEdObj* pDlgEdObj ); + AccessibleDialogControlShape (basctl::DialogWindow*, DlgEdObj*); virtual ~AccessibleDialogControlShape(); // XInterface diff --git a/basctl/source/inc/accessibledialogwindow.hxx b/basctl/source/inc/accessibledialogwindow.hxx index e3fd97365641..b763b29b9013 100644 --- a/basctl/source/inc/accessibledialogwindow.hxx +++ b/basctl/source/inc/accessibledialogwindow.hxx @@ -27,7 +27,6 @@ #include <svl/lstner.hxx> #include <tools/link.hxx> -class DialogWindow; class DlgEditor; class DlgEdModel; class DlgEdObj; @@ -35,6 +34,10 @@ class VCLExternalSolarLock; class VclSimpleEvent; class VclWindowEvent; +namespace basctl +{ + class DialogWindow; +} namespace utl { class AccessibleStateSetHelper; } @@ -77,7 +80,7 @@ private: AccessibleChildren m_aAccessibleChildren; VCLExternalSolarLock* m_pExternalLock; - DialogWindow* m_pDialogWindow; + basctl::DialogWindow* m_pDialogWindow; DlgEditor* m_pDlgEditor; DlgEdModel* m_pDlgEdModel; @@ -106,7 +109,7 @@ protected: virtual void SAL_CALL disposing(); public: - AccessibleDialogWindow( DialogWindow* pDialogWindow ); + AccessibleDialogWindow (basctl::DialogWindow*); ~AccessibleDialogWindow(); // SfxListener diff --git a/basctl/source/inc/baside3.hxx b/basctl/source/inc/baside3.hxx index f2560e38da10..f54e9adeb078 100644 --- a/basctl/source/inc/baside3.hxx +++ b/basctl/source/inc/baside3.hxx @@ -17,9 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifndef _BASIDE3_HXX -#define _BASIDE3_HXX +#ifndef BASCTL_BASIDE3_HXX +#define BASCTL_BASIDE3_HXX +#include "../basicide/layout.hxx" #include <bastypes.hxx> #include <svl/undo.hxx> #include <vcl/dialog.hxx> @@ -38,9 +39,16 @@ class DlgEdPage; class DlgEdView; class SfxUndoManager; +namespace basctl +{ + +class DialogWindowLayout; +class ObjectCatalog; + class DialogWindow: public IDEBaseWindow { private: + DialogWindowLayout& rLayout; DlgEditor* pEditor; SfxUndoManager* pUndoMgr; Link aOldNotifyUndoActionHdl; @@ -65,8 +73,7 @@ protected: public: TYPEINFO(); - DialogWindow( Window* pParent, const ScriptDocument& rDocument, ::rtl::OUString aLibName, ::rtl::OUString aName, - const com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >& xDialogModel ); + DialogWindow (DialogWindowLayout* pParent, ScriptDocument const& rDocument, rtl::OUString aLibName, rtl::OUString aName, com::sun::star::uno::Reference<com::sun::star::container::XNameContainer> const& xDialogModel); DialogWindow( DialogWindow* pCurView ); // never implemented ~DialogWindow(); @@ -97,12 +104,45 @@ public: // return number of pages to be printed virtual sal_Int32 countPages( Printer* pPrinter ); // print page - virtual void printPage( sal_Int32 nPage, Printer* pPrinter ); - virtual void Deactivating(); + virtual void printPage (sal_Int32 nPage, Printer*); + + virtual void Activating (); + virtual void Deactivating (); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); + + virtual char const* GetHid () const; + virtual BasicIDEType GetType () const; +}; + +// +// DialogWindowLayout +// +class DialogWindowLayout : public Layout +{ +public: + DialogWindowLayout (Window* pParent, ObjectCatalog&); +public: + // Layout: + virtual void Activating (IDEBaseWindow&); + virtual void Deactivating (); + virtual void GetState (SfxItemSet&, unsigned nWhich); + +protected: + // Layout: + virtual void OnFirstSize (int nWidth, int nHeight); + +private: + // child window + DialogWindow* pChild; + // dockable windows + ObjectCatalog& rObjectCatalog; + // TODO property browser }; -#endif // _BASIDE3_HXX + +} // namespace basctl + +#endif // BASCTL_BASIDE3_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/inc/basidesh.hxx b/basctl/source/inc/basidesh.hxx index 70cf66990b43..69862ce27775 100644 --- a/basctl/source/inc/basidesh.hxx +++ b/basctl/source/inc/basidesh.hxx @@ -16,17 +16,19 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifndef _BASIDESH_HXX -#define _BASIDESH_HXX +#ifndef BASCTL_BASIDESH_HXX +#define BASCTL_BASIDESH_HXX #include "doceventnotifier.hxx" #include "sbxitem.hxx" +#include "../basicide/objdlg.hxx" #include <com/sun/star/container/XContainerListener.hpp> #include <sfx2/viewsh.hxx> #include <svx/ifaceids.hxx> #include <vcl/scrbar.hxx> #include <map> +#include <boost/scoped_ptr.hpp> class SfxViewFactory; @@ -36,9 +38,14 @@ const sal_uLong BASICIDE_UI_FEATURE_SHOW_BROWSER = 0x00000001; //---------------------------------------------------------------------------- -class ModulWindow; -class ModulWindowLayout; -class DialogWindow; +namespace basctl +{ + class Layout; + class ModulWindow; + class ModulWindowLayout; + class DialogWindow; + class DialogWindowLayout; +} class SdrView; class BasicIDETabBar; class TabBar; @@ -59,15 +66,21 @@ namespace BasicIDE bool RemoveDialog( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName ); } -class BasicIDEShell :public SfxViewShell - ,public ::basctl::DocumentEventListener +class BasicIDEShell : + public SfxViewShell, + public basctl::DocumentEventListener { -friend class LocalizationMgr; + typedef basctl::DialogWindow DialogWindow; + typedef basctl::ModulWindow ModulWindow; + + friend class JavaDebuggingListenerImpl; + friend class LocalizationMgr; friend bool implImportDialog( Window* pWin, const ::rtl::OUString& rCurPath, const ScriptDocument& rDocument, const ::rtl::OUString& aLibName ); - friend bool BasicIDE::RemoveDialog( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName ); + + typedef IDEWindowTable::const_iterator WindowTableIt; IDEWindowTable aIDEWindowTable; - sal_uInt16 nCurKey; + sal_uInt16 nCurKey; IDEBaseWindow* pCurWin; ScriptDocument m_aCurDocument; ::rtl::OUString m_aCurLibName; @@ -79,11 +92,18 @@ friend class LocalizationMgr; BasicIDETabBar* pTabBar; bool bTabBarSplitted; bool bCreatingWindow; - ModulWindowLayout* pModulLayout; + // layout windows + boost::scoped_ptr<basctl::ModulWindowLayout> pModulLayout; + boost::scoped_ptr<basctl::DialogWindowLayout> pDialogLayout; + // the active layout window + basctl::Layout* pLayout; + // common object catalog window + basctl::ObjectCatalog aObjectCatalog; + bool m_bAppBasicModified; ::basctl::DocumentEventNotifier m_aNotifier; -friend class ContainerListenerImpl; + friend class ContainerListenerImpl; ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener > m_xLibListener; #if _SOLAR__PRIVATE @@ -115,13 +135,11 @@ protected: void SetCurWindow( IDEBaseWindow* pNewWin, bool bUpdateTabBar = false, bool bRememberAsCurrent = true ); void ManageToolbars(); - void RemoveWindow( IDEBaseWindow* pWindow, bool bDestroy, bool bAllowChangeCurWindow = true ); void ArrangeTabBar(); ModulWindow* CreateBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName ); DialogWindow* CreateDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName ); - ModulWindow* FindBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName, bool bCreateIfNotExist, bool bFindSuspended = false ); ModulWindow* ShowActiveModuleWindow( StarBASIC* pBasic ); virtual void SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType, @@ -133,10 +151,6 @@ protected: virtual void Move(); virtual void ShowCursor( bool bOn = true ); - void CreateModulWindowLayout(); - void DestroyModulWindowLayout(); - void UpdateModulWindowLayout( bool bBasicStopped ); - // DocumentEventListener virtual void onDocumentCreated( const ScriptDocument& _rDocument ); virtual void onDocumentOpened( const ScriptDocument& _rDocument ); @@ -178,9 +192,9 @@ public: // virtual sal_uInt16 Print( SfxProgress &rProgress, sal_Bool bIsAPI, PrintDialog *pPrintDialog = 0 ); virtual SfxPrinter* GetPrinter( sal_Bool bCreate ); - virtual sal_uInt16 SetPrinter( SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags = SFX_PRINTER_ALL, bool bIsAPI=false ); + virtual sal_uInt16 SetPrinter( SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags = SFX_PRINTER_ALL, bool bIsAPI=false ); virtual String GetSelectionText( sal_Bool bCompleteWords ); - virtual sal_Bool HasSelection( sal_Bool bText ) const; + virtual sal_Bool HasSelection( sal_Bool bText ) const; void GetState( SfxItemSet& ); void ExecuteGlobal( SfxRequest& rReq ); @@ -193,10 +207,9 @@ public: long CallBasicErrorHdl( StarBASIC* pBasic ); long CallBasicBreakHdl( StarBASIC* pBasic ); - ModulWindowLayout* GetLayoutWindow() const { return pModulLayout; } - IDEBaseWindow* FindWindow( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName = ::rtl::OUString(), const ::rtl::OUString& rName = ::rtl::OUString(), BasicIDEType nType = BASICIDE_TYPE_UNKNOWN, bool bFindSuspended = false ); - DialogWindow* FindDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rDlgName, bool bCreateIfNotExist, bool bFindSuspended = false ); + DialogWindow* FindDlgWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rName, bool bCreateIfNotExist = false, bool bFindSuspended = false ); + ModulWindow* FindBasWin( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModName, bool bCreateIfNotExist = false, bool bFindSuspended = false ); IDEBaseWindow* FindApplicationWindow(); bool NextPage( bool bPrev = false ); @@ -211,12 +224,12 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > GetCurrentDocument() const; - bool SourceLinesDisplayed(); - void UpdateObjectCatalog (); + void UpdateObjectCatalog () { aObjectCatalog.UpdateEntries(); } + void RemoveWindow (IDEBaseWindow* pWindow, bool bDestroy, bool bAllowChangeCurWindow = true); }; -#endif // _BASIDESH_HXX +#endif // BASCTL_BASIDESH_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basctl/source/inc/bastypes.hxx b/basctl/source/inc/bastypes.hxx index 90541a5faa78..ca5b49a9066f 100644 --- a/basctl/source/inc/bastypes.hxx +++ b/basctl/source/inc/bastypes.hxx @@ -16,11 +16,12 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifndef _BASTYPES_HXX -#define _BASTYPES_HXX +#ifndef BASCTL_BASTYPES_HXX +#define BASCTL_BASTYPES_HXX #include "scriptdocument.hxx" +#include <sbxitem.hxx> #include <iderid.hxx> #include <svtools/tabbar.hxx> #include <vcl/toolbox.hxx> @@ -30,6 +31,14 @@ class SbModule; class SfxItemSet; class SfxRequest; +class SvxSearchItem; + +namespace basctl +{ + class Layout; + class ModulWindow; + class DialogWindow; +} #define LINE_SEP_CR 0x0D #define LINE_SEP 0x0A @@ -58,27 +67,37 @@ struct BasicStatus class BasicDockingWindow : public DockingWindow { - Rectangle aFloatingPosAndSize; +public: + BasicDockingWindow (Window* pParent); + BasicDockingWindow (basctl::Layout* pParent); +public: + void ResizeIfDocking (Point const&, Size const&); + void SetLayoutWindow (basctl::Layout*); +public: + void Show (bool = true); + void Hide (); protected: - virtual sal_Bool Docking( const Point& rPos, Rectangle& rRect ); - virtual void EndDocking( const Rectangle& rRect, sal_Bool bFloatMode ); - virtual void ToggleFloatingMode(); - virtual sal_Bool PrepareToggleFloatingMode(); - virtual void StartDocking(); + virtual sal_Bool Docking( const Point& rPos, Rectangle& rRect ); + virtual void EndDocking( const Rectangle& rRect, sal_Bool bFloatMode ); + virtual void ToggleFloatingMode(); + virtual sal_Bool PrepareToggleFloatingMode(); + virtual void StartDocking(); -public: - BasicDockingWindow( Window* pParent ); -}; +private: + // the position and the size of the floating window + Rectangle aFloatingRect; + // the position and the size of the docking window + Rectangle aDockingRect; + // the parent layout window (only when docking) + basctl::Layout* pLayout; + // > 0: shown, <= 0: hidden, ++ by Show() and -- by Hide() + int nShowCount; -// helper class for sorting TabBar -class TabBarSortHelper -{ -public: - sal_uInt16 nPageId; - String aPageText; + static WinBits const StyleBits; - bool operator<(const TabBarSortHelper& rComp) const { return (aPageText.CompareIgnoreCaseToAscii( rComp.aPageText ) == COMPARE_LESS); } +private: + void DockThis (); }; class BasicIDETabBar : public TabBar @@ -113,6 +132,9 @@ namespace svl class IUndoManager; } +// +// IDEBaseWindow -- the base of both ModulWindow and DialogWindow. +// class IDEBaseWindow : public Window { private: @@ -126,6 +148,9 @@ private: ::rtl::OUString m_aLibName; ::rtl::OUString m_aName; + friend class basctl::ModulWindow; + friend class basctl::DialogWindow; + protected: virtual void DoScroll( ScrollBar* pCurScrollBar ); @@ -136,14 +161,16 @@ public: void Init(); virtual void DoInit(); - virtual void Deactivating(); + virtual void Activating () = 0; + virtual void Deactivating () = 0; void GrabScrollBars( ScrollBar* pHScroll, ScrollBar* pVScroll ); ScrollBar* GetHScrollBar() const { return pShellHScrollBar; } ScrollBar* GetVScrollBar() const { return pShellVScrollBar; } - virtual void ExecuteCommand( SfxRequest& rReq ); - virtual void GetState( SfxItemSet& ); + virtual void ExecuteCommand (SfxRequest&); + virtual void ExecuteGlobal (SfxRequest&); + virtual void GetState (SfxItemSet&) = 0; virtual long Notify( NotifyEvent& rNEvt ); virtual void StoreData(); @@ -172,18 +199,16 @@ public: void AddStatus(int n) { nStatus |= n; } void ClearStatus(int n) { nStatus &= ~n; } - virtual Window* GetLayoutWindow(); - virtual ::svl::IUndoManager* GetUndoManager(); virtual sal_uInt16 GetSearchOptions(); + virtual sal_uInt16 StartSearchAndReplace (SvxSearchItem const&, bool bFromStart = false); virtual void BasicStarted(); virtual void BasicStopped(); - bool IsSuspended() const - { return ( nStatus & BASWIN_SUSPENDED ) ? true : false; } + bool IsSuspended() const { return nStatus & BASWIN_SUSPENDED; } const ScriptDocument& GetDocument() const { return m_aDocument; } @@ -193,21 +218,25 @@ public: void SetLibName( const ::rtl::OUString& aLibName ) { m_aLibName = aLibName; } const ::rtl::OUString& GetName() const { return m_aName; } void SetName( const ::rtl::OUString& aName ) { m_aName = aName; } + + virtual void OnNewDocument (); + virtual char const* GetHid () const = 0; + virtual BasicIDEType GetType () const = 0; + void InsertLibInfo () const; + bool Is (ScriptDocument const&, rtl::OUString const&, rtl::OUString const&, BasicIDEType, bool bFindSuspended); + virtual bool HasActiveEditor () const; }; class LibInfoKey { private: - ScriptDocument m_aDocument; + ScriptDocument m_aDocument; ::rtl::OUString m_aLibName; public: LibInfoKey( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName ); ~LibInfoKey(); - LibInfoKey( const LibInfoKey& rKey ); - LibInfoKey& operator=( const LibInfoKey& rKey ); - bool operator==( const LibInfoKey& rKey ) const; const ScriptDocument& @@ -218,10 +247,10 @@ public: class LibInfoItem { private: - ScriptDocument m_aDocument; + ScriptDocument m_aDocument; ::rtl::OUString m_aLibName; ::rtl::OUString m_aCurrentName; - sal_uInt16 m_nCurrentType; + sal_uInt16 m_nCurrentType; public: LibInfoItem( const ScriptDocument& rDocument, const ::rtl::OUString& rLibName, const ::rtl::OUString& rCurrentName, sal_uInt16 nCurrentType ); @@ -230,11 +259,10 @@ public: LibInfoItem( const LibInfoItem& rItem ); LibInfoItem& operator=( const LibInfoItem& rItem ); - const ScriptDocument& - GetDocument() const { return m_aDocument; } - const ::rtl::OUString& GetLibName() const { return m_aLibName; } + const ScriptDocument& GetDocument() const { return m_aDocument; } + const ::rtl::OUString& GetLibName() const { return m_aLibName; } const ::rtl::OUString& GetCurrentName() const { return m_aCurrentName; } - sal_uInt16 GetCurrentType() const { return m_nCurrentType; } + sal_uInt16 GetCurrentType() const { return m_nCurrentType; } }; class LibInfos @@ -284,6 +312,7 @@ public: static void getObjectName( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rLib, const ::rtl::OUString& rModName, ::rtl::OUString& rObjName ); static sal_Int32 getModuleType( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rLib, const ::rtl::OUString& rModName ); }; -#endif // _BASTYPES_HXX + +#endif // BASCTL_BASTYPES_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |