summaryrefslogtreecommitdiff
path: root/sc/source/ui/navipi
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/navipi')
-rw-r--r--sc/source/ui/navipi/content.cxx1526
-rw-r--r--sc/source/ui/navipi/makefile.mk57
-rw-r--r--sc/source/ui/navipi/navcitem.cxx127
-rw-r--r--sc/source/ui/navipi/navipi.cxx1565
-rw-r--r--sc/source/ui/navipi/navipi.hrc63
-rw-r--r--sc/source/ui/navipi/navipi.src414
-rw-r--r--sc/source/ui/navipi/scenwnd.cxx309
7 files changed, 4061 insertions, 0 deletions
diff --git a/sc/source/ui/navipi/content.cxx b/sc/source/ui/navipi/content.cxx
new file mode 100644
index 000000000000..a417621bb303
--- /dev/null
+++ b/sc/source/ui/navipi/content.cxx
@@ -0,0 +1,1526 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+// INCLUDE ---------------------------------------------------------------
+
+#include <svx/svditer.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdview.hxx>
+#include <svx/svdxcgv.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/help.hxx>
+#include <vcl/sound.hxx>
+#include <vcl/svapp.hxx>
+#include <tools/urlobj.hxx>
+#include <svl/urlbmk.hxx>
+#include <stdlib.h>
+
+#include "content.hxx"
+#include "navipi.hxx"
+#include "global.hxx"
+#include "docsh.hxx"
+#include "scmod.hxx"
+#include "rangenam.hxx"
+#include "dbcolect.hxx"
+#include "tablink.hxx" // fuer Loader
+#include "popmenu.hxx"
+#include "drwlayer.hxx"
+#include "transobj.hxx"
+#include "drwtrans.hxx"
+#include "lnktrans.hxx"
+#include "cell.hxx"
+#include "dociter.hxx"
+#include "scresid.hxx"
+#include "globstr.hrc"
+#include "navipi.hrc"
+#include "arealink.hxx"
+#include "navicfg.hxx"
+#include "navsett.hxx"
+#include "postit.hxx"
+#include "clipparam.hxx"
+
+using namespace com::sun::star;
+
+// Reihenfolge der Kategorien im Navigator -------------------------------------
+
+static USHORT pTypeList[SC_CONTENT_COUNT] =
+{
+ SC_CONTENT_ROOT, // ROOT (0) muss vorne stehen
+ SC_CONTENT_TABLE,
+ SC_CONTENT_RANGENAME,
+ SC_CONTENT_DBAREA,
+ SC_CONTENT_AREALINK,
+ SC_CONTENT_GRAPHIC,
+ SC_CONTENT_OLEOBJECT,
+ SC_CONTENT_NOTE,
+ SC_CONTENT_DRAWING
+};
+
+BOOL ScContentTree::bIsInDrag = FALSE;
+
+
+ScDocShell* ScContentTree::GetManualOrCurrent()
+{
+ ScDocShell* pSh = NULL;
+ if ( aManualDoc.Len() )
+ {
+ TypeId aScType = TYPE(ScDocShell);
+ SfxObjectShell* pObjSh = SfxObjectShell::GetFirst( &aScType );
+ while ( pObjSh && !pSh )
+ {
+ if ( pObjSh->GetTitle() == aManualDoc )
+ pSh = PTR_CAST( ScDocShell, pObjSh );
+ pObjSh = SfxObjectShell::GetNext( *pObjSh, &aScType );
+ }
+ }
+ else
+ {
+ // Current nur, wenn keine manuell eingestellt ist
+ // (damit erkannt wird, wenn das Dokument nicht mehr existiert)
+
+ SfxViewShell* pViewSh = SfxViewShell::Current();
+ if ( pViewSh )
+ {
+ SfxObjectShell* pObjSh = pViewSh->GetViewFrame()->GetObjectShell();
+ pSh = PTR_CAST( ScDocShell, pObjSh );
+ }
+ }
+
+ return pSh;
+}
+
+//
+// ScContentTree
+//
+
+ScContentTree::ScContentTree( Window* pParent, const ResId& rResId ) :
+ SvTreeListBox ( pParent, rResId ),
+ aEntryImages ( ScResId( RID_IMAGELIST_NAVCONT ) ),
+ aHCEntryImages ( ScResId( RID_IMAGELIST_H_NAVCONT ) ),
+ nRootType ( SC_CONTENT_ROOT ),
+ bHiddenDoc ( FALSE ),
+ pHiddenDocument ( NULL )
+{
+ USHORT i;
+ for (i=0; i<SC_CONTENT_COUNT; i++)
+ pPosList[pTypeList[i]] = i; // invers zum suchen
+
+ pParentWindow = (ScNavigatorDlg*)pParent;
+
+ pRootNodes[0] = NULL;
+ for (i=1; i<SC_CONTENT_COUNT; i++)
+ InitRoot(i);
+
+ SetNodeDefaultImages();
+
+ SetDoubleClickHdl( LINK( this, ScContentTree, ContentDoubleClickHdl ) );
+}
+
+ScContentTree::~ScContentTree()
+{
+}
+
+void ScContentTree::InitRoot( USHORT nType )
+{
+ if ( !nType )
+ return;
+
+ if ( nRootType && nRootType != nType ) // ausgeblendet ?
+ {
+ pRootNodes[nType] = NULL;
+ return;
+ }
+
+ const Image& rImage = aEntryImages.GetImage( nType );
+ String aName( ScResId( SCSTR_CONTENT_ROOT + nType ) );
+ // wieder an die richtige Position:
+ USHORT nPos = nRootType ? 0 : pPosList[nType]-1;
+ SvLBoxEntry* pNew = InsertEntry( aName, rImage, rImage, NULL, FALSE, nPos );
+
+ const Image& rHCImage = aHCEntryImages.GetImage( nType );
+ SetExpandedEntryBmp( pNew, rHCImage, BMP_COLOR_HIGHCONTRAST );
+ SetCollapsedEntryBmp( pNew, rHCImage, BMP_COLOR_HIGHCONTRAST );
+
+ pRootNodes[nType] = pNew;
+}
+
+void ScContentTree::ClearAll()
+{
+ Clear();
+ for (USHORT i=1; i<SC_CONTENT_COUNT; i++)
+ InitRoot(i);
+}
+
+void ScContentTree::ClearType(USHORT nType)
+{
+ if (!nType)
+ ClearAll();
+ else
+ {
+ SvLBoxEntry* pParent = pRootNodes[nType];
+ if ( !pParent || GetChildCount(pParent) ) // nicht, wenn ohne Children schon da
+ {
+ if (pParent)
+ GetModel()->Remove( pParent ); // mit allen Children
+ InitRoot( nType ); // ggf. neu eintragen
+ }
+ }
+}
+
+void ScContentTree::InsertContent( USHORT nType, const String& rValue )
+{
+ if (nType >= SC_CONTENT_COUNT)
+ {
+ DBG_ERROR("ScContentTree::InsertContent mit falschem Typ");
+ return;
+ }
+
+ SvLBoxEntry* pParent = pRootNodes[nType];
+ if (pParent)
+ InsertEntry( rValue, pParent );
+ else
+ {
+ DBG_ERROR("InsertContent ohne Parent");
+ }
+}
+
+void ScContentTree::GetEntryIndexes( USHORT& rnRootIndex, ULONG& rnChildIndex, SvLBoxEntry* pEntry ) const
+{
+ rnRootIndex = SC_CONTENT_ROOT;
+ rnChildIndex = SC_CONTENT_NOCHILD;
+
+ if( !pEntry )
+ return;
+
+ SvLBoxEntry* pParent = GetParent( pEntry );
+ bool bFound = false;
+ for( USHORT nRoot = 1; !bFound && (nRoot < SC_CONTENT_COUNT); ++nRoot )
+ {
+ if( pEntry == pRootNodes[ nRoot ] )
+ {
+ rnRootIndex = nRoot;
+ rnChildIndex = ~0UL;
+ bFound = true;
+ }
+ else if( pParent && (pParent == pRootNodes[ nRoot ]) )
+ {
+ rnRootIndex = nRoot;
+
+ // search the entry in all child entries of the parent
+ ULONG nEntry = 0;
+ SvLBoxEntry* pIterEntry = FirstChild( pParent );
+ while( !bFound && pIterEntry )
+ {
+ if ( pEntry == pIterEntry )
+ {
+ rnChildIndex = nEntry;
+ bFound = true; // exit the while loop
+ }
+ pIterEntry = NextSibling( pIterEntry );
+ ++nEntry;
+ }
+
+ bFound = true; // exit the for loop
+ }
+ }
+}
+
+ULONG ScContentTree::GetChildIndex( SvLBoxEntry* pEntry ) const
+{
+ USHORT nRoot;
+ ULONG nChild;
+ GetEntryIndexes( nRoot, nChild, pEntry );
+ return nChild;
+}
+
+String lcl_GetDBAreaRange( ScDocument* pDoc, const String& rDBName )
+{
+ String aRet;
+ if (pDoc)
+ {
+ ScDBCollection* pDbNames = pDoc->GetDBCollection();
+ USHORT nCount = pDbNames->GetCount();
+ for ( USHORT i=0; i<nCount; i++ )
+ {
+ ScDBData* pData = (*pDbNames)[i];
+ if ( pData->GetName() == rDBName )
+ {
+ ScRange aRange;
+ pData->GetArea(aRange);
+ aRange.Format( aRet, SCR_ABS_3D, pDoc );
+ break;
+ }
+ }
+ }
+ return aRet;
+}
+
+IMPL_LINK( ScContentTree, ContentDoubleClickHdl, ScContentTree *, EMPTYARG )
+{
+ USHORT nType;
+ ULONG nChild;
+ SvLBoxEntry* pEntry = GetCurEntry();
+ GetEntryIndexes( nType, nChild, pEntry );
+
+ if( pEntry && (nType != SC_CONTENT_ROOT) && (nChild != SC_CONTENT_NOCHILD) )
+ {
+ if ( bHiddenDoc )
+ return 0; //! spaeter...
+
+ String aText( GetEntryText( pEntry ) );
+
+ if ( aManualDoc.Len() )
+ pParentWindow->SetCurrentDoc( aManualDoc );
+
+ switch( nType )
+ {
+ case SC_CONTENT_TABLE:
+ pParentWindow->SetCurrentTableStr( aText );
+ break;
+
+ case SC_CONTENT_RANGENAME:
+ pParentWindow->SetCurrentCellStr( aText );
+ break;
+
+ case SC_CONTENT_DBAREA:
+ {
+ // #47905# Wenn gleiche Bereichs- und DB-Namen existieren, wird
+ // bei SID_CURRENTCELL der Bereichsname genommen.
+ // DB-Bereiche darum direkt ueber die Adresse anspringen.
+
+ String aRangeStr = lcl_GetDBAreaRange( GetSourceDocument(), aText );
+ if (aRangeStr.Len())
+ pParentWindow->SetCurrentCellStr( aRangeStr );
+ }
+ break;
+
+ case SC_CONTENT_OLEOBJECT:
+ case SC_CONTENT_GRAPHIC:
+ case SC_CONTENT_DRAWING:
+ pParentWindow->SetCurrentObject( aText );
+ break;
+
+ case SC_CONTENT_NOTE:
+ {
+ ScAddress aPos = GetNotePos( nChild );
+ pParentWindow->SetCurrentTable( aPos.Tab() );
+ pParentWindow->SetCurrentCell( aPos.Col(), aPos.Row() );
+ }
+ break;
+
+ case SC_CONTENT_AREALINK:
+ {
+ const ScAreaLink* pLink = GetLink( nChild );
+ if( pLink )
+ {
+ ScRange aRange = pLink->GetDestArea();
+ String aRangeStr;
+ ScDocument* pSrcDoc = GetSourceDocument();
+ aRange.Format( aRangeStr, SCR_ABS_3D, pSrcDoc, pSrcDoc->GetAddressConvention() );
+ pParentWindow->SetCurrentCellStr( aRangeStr );
+ }
+ }
+ break;
+ }
+
+ ScNavigatorDlg::ReleaseFocus(); // set focus into document
+ }
+
+ return 0;
+}
+
+void ScContentTree::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ SvTreeListBox::MouseButtonDown( rMEvt );
+ StoreSettings();
+}
+
+void ScContentTree::KeyInput( const KeyEvent& rKEvt )
+{
+ BOOL bUsed = FALSE;
+
+ const KeyCode aCode = rKEvt.GetKeyCode();
+ if (aCode.GetCode() == KEY_RETURN)
+ {
+ switch (aCode.GetModifier())
+ {
+ case KEY_MOD1:
+ ToggleRoot(); // toggle root mode (as in Writer)
+ bUsed = TRUE;
+ break;
+ case 0:
+ {
+ SvLBoxEntry* pEntry = GetCurEntry();
+ if( pEntry )
+ {
+ USHORT nType;
+ ULONG nChild;
+ GetEntryIndexes( nType, nChild, pEntry );
+
+ if( (nType != SC_CONTENT_ROOT) && (nChild == SC_CONTENT_NOCHILD) )
+ {
+ String aText( GetEntryText( pEntry ) );
+ if ( IsExpanded( pEntry ) )
+ Collapse( pEntry );
+ else
+ Expand( pEntry );
+ }
+ else
+ ContentDoubleClickHdl(0); // select content as if double clicked
+ }
+
+ bUsed = TRUE;
+ }
+ break;
+ }
+ }
+ StoreSettings();
+
+ if( !bUsed )
+ SvTreeListBox::KeyInput(rKEvt);
+}
+
+//BOOL __EXPORT ScContentTree::Drop( const DropEvent& rEvt )
+//{
+// return pParentWindow->Drop(rEvt); // Drop auf Navigator
+//}
+
+//BOOL __EXPORT ScContentTree::QueryDrop( DropEvent& rEvt )
+//{
+// return pParentWindow->QueryDrop(rEvt); // Drop auf Navigator
+//}
+
+sal_Int8 ScContentTree::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
+{
+ return DND_ACTION_NONE;
+}
+
+sal_Int8 ScContentTree::ExecuteDrop( const ExecuteDropEvent& /* rEvt */ )
+{
+ return DND_ACTION_NONE;
+}
+
+void ScContentTree::StartDrag( sal_Int8 /* nAction */, const Point& /* rPosPixel */ )
+{
+ DoDrag();
+}
+
+void ScContentTree::DragFinished( sal_Int8 /* nAction */ )
+{
+}
+
+void __EXPORT ScContentTree::Command( const CommandEvent& rCEvt )
+{
+ BOOL bDone = FALSE;
+
+ switch ( rCEvt.GetCommand() )
+ {
+ case COMMAND_STARTDRAG:
+ // Aus dem ExecuteDrag heraus kann der Navigator geloescht werden
+ // (beim Umschalten auf einen anderen Dokument-Typ), das wuerde aber
+ // den StarView MouseMove-Handler, der Command() aufruft, umbringen.
+ // Deshalb Drag&Drop asynchron:
+
+// DoDrag();
+
+ Application::PostUserEvent( STATIC_LINK( this, ScContentTree, ExecDragHdl ) );
+
+ bDone = TRUE;
+ break;
+
+ case COMMAND_CONTEXTMENU:
+ {
+ // Drag-Drop Modus
+
+ PopupMenu aPop;
+ ScPopupMenu aDropMenu( ScResId( RID_POPUP_DROPMODE ) );
+ aDropMenu.CheckItem( RID_DROPMODE_URL + pParentWindow->GetDropMode() );
+ aPop.InsertItem( 1, pParentWindow->GetStrDragMode() );
+ aPop.SetPopupMenu( 1, &aDropMenu );
+
+ // angezeigtes Dokument
+
+ ScPopupMenu aDocMenu;
+ aDocMenu.SetMenuFlags( aDocMenu.GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
+ USHORT i=0;
+ USHORT nPos=0;
+ // geladene Dokumente
+ ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
+ SfxObjectShell* pSh = SfxObjectShell::GetFirst();
+ while ( pSh )
+ {
+ if ( pSh->ISA(ScDocShell) )
+ {
+ String aName = pSh->GetTitle();
+ String aEntry = aName;
+ if ( pSh == pCurrentSh )
+ aEntry += pParentWindow->aStrActive;
+ else
+ aEntry += pParentWindow->aStrNotActive;
+ aDocMenu.InsertItem( ++i, aEntry );
+ if ( !bHiddenDoc && aName == aManualDoc )
+ nPos = i;
+ }
+ pSh = SfxObjectShell::GetNext( *pSh );
+ }
+ // "aktives Fenster"
+ aDocMenu.InsertItem( ++i, pParentWindow->aStrActiveWin );
+ if (!bHiddenDoc && !aManualDoc.Len())
+ nPos = i;
+ // verstecktes Dokument
+ if ( aHiddenTitle.Len() )
+ {
+ String aEntry = aHiddenTitle;
+ aEntry += pParentWindow->aStrHidden;
+ aDocMenu.InsertItem( ++i, aEntry );
+ if (bHiddenDoc)
+ nPos = i;
+ }
+ aDocMenu.CheckItem( nPos );
+ aPop.InsertItem( 2, pParentWindow->GetStrDisplay() );
+ aPop.SetPopupMenu( 2, &aDocMenu );
+
+ // ausfuehren
+
+ aPop.Execute( this, rCEvt.GetMousePosPixel() );
+
+ if ( aDropMenu.WasHit() ) // Drag-Drop Modus
+ {
+ USHORT nId = aDropMenu.GetSelected();
+ if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
+ pParentWindow->SetDropMode( nId - RID_DROPMODE_URL );
+ }
+ else if ( aDocMenu.WasHit() ) // angezeigtes Dokument
+ {
+ USHORT nId = aDocMenu.GetSelected();
+ String aName = aDocMenu.GetItemText(nId);
+ SelectDoc( aName );
+ }
+ }
+ break;
+ }
+
+ if (!bDone)
+ SvTreeListBox::Command(rCEvt);
+}
+
+void __EXPORT ScContentTree::RequestHelp( const HelpEvent& rHEvt )
+{
+ BOOL bDone = FALSE;
+ if( rHEvt.GetMode() & HELPMODE_QUICK )
+ {
+ Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
+ SvLBoxEntry* pEntry = GetEntry( aPos );
+ if ( pEntry )
+ {
+ BOOL bRet = FALSE;
+ String aHelpText;
+ SvLBoxEntry* pParent = GetParent(pEntry);
+ if ( !pParent ) // Top-Level ?
+ {
+ aHelpText = String::CreateFromInt32( GetChildCount(pEntry) );
+ aHelpText += ' ';
+ aHelpText += GetEntryText(pEntry);
+ bRet = TRUE;
+ }
+ else if ( pParent == pRootNodes[SC_CONTENT_NOTE] )
+ {
+ aHelpText = GetEntryText(pEntry); // Notizen als Help-Text
+ bRet = TRUE;
+ }
+ else if ( pParent == pRootNodes[SC_CONTENT_AREALINK] )
+ {
+ ULONG nIndex = GetChildIndex(pEntry);
+ if( nIndex != SC_CONTENT_NOCHILD )
+ {
+ const ScAreaLink* pLink = GetLink(nIndex);
+ if (pLink)
+ {
+ aHelpText = pLink->GetFile(); // Source-Datei als Help-Text
+ bRet = TRUE;
+ }
+ }
+ }
+
+ if (bRet)
+ {
+ SvLBoxTab* pTab;
+ SvLBoxString* pItem = (SvLBoxString*)(GetItem( pEntry, aPos.X(), &pTab ));
+ if( pItem )
+ {
+ aPos = GetEntryPosition( pEntry );
+ aPos.X() = GetTabPos( pEntry, pTab );
+ aPos = OutputToScreenPixel(aPos);
+ Size aSize( pItem->GetSize( this, pEntry ) );
+
+ Rectangle aItemRect( aPos, aSize );
+ Help::ShowQuickHelp( this, aItemRect, aHelpText );
+ bDone = TRUE;
+ }
+ }
+ }
+ }
+ if (!bDone)
+ Window::RequestHelp( rHEvt );
+}
+
+ScDocument* ScContentTree::GetSourceDocument()
+{
+ if (bHiddenDoc)
+ return pHiddenDocument;
+ else
+ {
+ ScDocShell* pSh = GetManualOrCurrent();
+ if (pSh)
+ return pSh->GetDocument();
+
+ }
+ return NULL;
+}
+
+void ScContentTree::Refresh( USHORT nType )
+{
+ if ( bHiddenDoc && !pHiddenDocument )
+ return; // anderes Dokument angezeigt
+
+ // wenn sich nichts geaendert hat, gleich abbrechen (gegen Geflacker)
+
+ if ( nType == SC_CONTENT_NOTE )
+ if (!NoteStringsChanged())
+ return;
+ if ( nType == SC_CONTENT_GRAPHIC )
+ if (!DrawNamesChanged(SC_CONTENT_GRAPHIC))
+ return;
+ if ( nType == SC_CONTENT_OLEOBJECT )
+ if (!DrawNamesChanged(SC_CONTENT_OLEOBJECT))
+ return;
+ if ( nType == SC_CONTENT_DRAWING )
+ if (!DrawNamesChanged(SC_CONTENT_DRAWING))
+ return;
+
+ SetUpdateMode(FALSE);
+
+ ClearType( nType );
+
+ if ( !nType || nType == SC_CONTENT_TABLE )
+ GetTableNames();
+ if ( !nType || nType == SC_CONTENT_RANGENAME )
+ GetAreaNames();
+ if ( !nType || nType == SC_CONTENT_DBAREA )
+ GetDbNames();
+ if ( !nType || nType == SC_CONTENT_GRAPHIC )
+ GetGraphicNames();
+ if ( !nType || nType == SC_CONTENT_OLEOBJECT )
+ GetOleNames();
+ if ( !nType || nType == SC_CONTENT_DRAWING )
+ GetDrawingNames();
+ if ( !nType || nType == SC_CONTENT_NOTE )
+ GetNoteStrings();
+ if ( !nType || nType == SC_CONTENT_AREALINK )
+ GetLinkNames();
+
+ ApplySettings();
+ SetUpdateMode(TRUE);
+}
+
+void ScContentTree::GetTableNames()
+{
+ if ( nRootType && nRootType != SC_CONTENT_TABLE ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ String aName;
+ SCTAB nCount = pDoc->GetTableCount();
+ for ( SCTAB i=0; i<nCount; i++ )
+ {
+ pDoc->GetName( i, aName );
+ InsertContent( SC_CONTENT_TABLE, aName );
+ }
+}
+
+void ScContentTree::GetAreaNames()
+{
+ if ( nRootType && nRootType != SC_CONTENT_RANGENAME ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ ScRangeName* pRangeNames = pDoc->GetRangeName();
+ USHORT nCount = pRangeNames->GetCount();
+ if ( nCount > 0 )
+ {
+ USHORT nValidCount = 0;
+ ScRange aDummy;
+ USHORT i;
+ for ( i=0; i<nCount; i++ )
+ {
+ ScRangeData* pData = (*pRangeNames)[i];
+ if (pData->IsValidReference(aDummy))
+ nValidCount++;
+ }
+ if ( nValidCount )
+ {
+ ScRangeData** ppSortArray = new ScRangeData* [ nValidCount ];
+ USHORT j;
+ for ( i=0, j=0; i<nCount; i++ )
+ {
+ ScRangeData* pData = (*pRangeNames)[i];
+ if (pData->IsValidReference(aDummy))
+ ppSortArray[j++] = pData;
+ }
+#ifndef ICC
+ qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*),
+ &ScRangeData_QsortNameCompare );
+#else
+ qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*),
+ ICCQsortNameCompare );
+#endif
+ for ( j=0; j<nValidCount; j++ )
+ InsertContent( SC_CONTENT_RANGENAME, ppSortArray[j]->GetName() );
+ delete [] ppSortArray;
+ }
+ }
+}
+
+void ScContentTree::GetDbNames()
+{
+ if ( nRootType && nRootType != SC_CONTENT_DBAREA ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ ScDBCollection* pDbNames = pDoc->GetDBCollection();
+ USHORT nCount = pDbNames->GetCount();
+ if ( nCount > 0 )
+ {
+ String aStrNoName( ScGlobal::GetRscString(STR_DB_NONAME) );
+ for ( USHORT i=0; i<nCount; i++ )
+ {
+ ScDBData* pData = (*pDbNames)[i];
+ String aStrName = pData->GetName();
+ if ( aStrName != aStrNoName )
+ InsertContent( SC_CONTENT_DBAREA, aStrName );
+ }
+ }
+}
+
+bool ScContentTree::IsPartOfType( USHORT nContentType, USHORT nObjIdentifier ) // static
+{
+ bool bRet = false;
+ switch ( nContentType )
+ {
+ case SC_CONTENT_GRAPHIC:
+ bRet = ( nObjIdentifier == OBJ_GRAF );
+ break;
+ case SC_CONTENT_OLEOBJECT:
+ bRet = ( nObjIdentifier == OBJ_OLE2 );
+ break;
+ case SC_CONTENT_DRAWING:
+ bRet = ( nObjIdentifier != OBJ_GRAF && nObjIdentifier != OBJ_OLE2 ); // everything else
+ break;
+ default:
+ DBG_ERROR("unknown content type");
+ }
+ return bRet;
+}
+
+void ScContentTree::GetDrawNames( USHORT nType )
+{
+ if ( nRootType && nRootType != nType ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ // iterate in flat mode for groups
+ SdrIterMode eIter = ( nType == SC_CONTENT_DRAWING ) ? IM_FLAT : IM_DEEPNOGROUPS;
+
+ ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
+ if (pDrawLayer && pShell)
+ {
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, eIter );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if ( IsPartOfType( nType, pObject->GetObjIdentifier() ) )
+ {
+ String aName = ScDrawLayer::GetVisibleName( pObject );
+ if (aName.Len())
+ InsertContent( nType, aName );
+ }
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+ }
+}
+
+void ScContentTree::GetGraphicNames()
+{
+ GetDrawNames( SC_CONTENT_GRAPHIC );
+}
+
+void ScContentTree::GetOleNames()
+{
+ GetDrawNames( SC_CONTENT_OLEOBJECT );
+}
+
+void ScContentTree::GetDrawingNames()
+{
+ GetDrawNames( SC_CONTENT_DRAWING );
+}
+
+void ScContentTree::GetLinkNames()
+{
+ if ( nRootType && nRootType != SC_CONTENT_AREALINK ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
+ DBG_ASSERT(pLinkManager, "kein LinkManager am Dokument?");
+ const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
+ USHORT nCount = rLinks.Count();
+ for (USHORT i=0; i<nCount; i++)
+ {
+ ::sfx2::SvBaseLink* pBase = *rLinks[i];
+ if (pBase->ISA(ScAreaLink))
+ InsertContent( SC_CONTENT_AREALINK, ((ScAreaLink*)pBase)->GetSource() );
+
+ // in der Liste die Namen der Quellbereiche
+ }
+}
+
+const ScAreaLink* ScContentTree::GetLink( ULONG nIndex )
+{
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return NULL;
+
+ ULONG nFound = 0;
+ sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
+ DBG_ASSERT(pLinkManager, "kein LinkManager am Dokument?");
+ const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
+ USHORT nCount = rLinks.Count();
+ for (USHORT i=0; i<nCount; i++)
+ {
+ ::sfx2::SvBaseLink* pBase = *rLinks[i];
+ if (pBase->ISA(ScAreaLink))
+ {
+ if (nFound == nIndex)
+ return (const ScAreaLink*) pBase;
+ ++nFound;
+ }
+ }
+
+ DBG_ERROR("Link nicht gefunden");
+ return NULL;
+}
+
+String lcl_NoteString( const ScPostIt& rNote )
+{
+ String aText = rNote.GetText();
+ xub_StrLen nAt;
+ while ( (nAt = aText.Search( '\n' )) != STRING_NOTFOUND )
+ aText.SetChar( nAt, ' ' );
+ return aText;
+}
+
+void ScContentTree::GetNoteStrings()
+{
+ if ( nRootType && nRootType != SC_CONTENT_NOTE ) // ausgeblendet ?
+ return;
+
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return;
+
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ {
+ ScCellIterator aIter( pDoc, 0,0,nTab, MAXCOL,MAXROW,nTab );
+ for( ScBaseCell* pCell = aIter.GetFirst(); pCell; pCell = aIter.GetNext() )
+ if( const ScPostIt* pNote = pCell->GetNote() )
+ InsertContent( SC_CONTENT_NOTE, lcl_NoteString( *pNote ) );
+ }
+}
+
+ScAddress ScContentTree::GetNotePos( ULONG nIndex )
+{
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return ScAddress();
+
+ ULONG nFound = 0;
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ {
+ ScCellIterator aIter( pDoc, 0,0,nTab, MAXCOL,MAXROW,nTab );
+ ScBaseCell* pCell = aIter.GetFirst();
+ while (pCell)
+ {
+ if( pCell->HasNote() )
+ {
+ if (nFound == nIndex)
+ return ScAddress( aIter.GetCol(), aIter.GetRow(), nTab ); // gefunden
+ ++nFound;
+ }
+ pCell = aIter.GetNext();
+ }
+ }
+
+ DBG_ERROR("Notiz nicht gefunden");
+ return ScAddress();
+}
+
+BOOL ScContentTree::NoteStringsChanged()
+{
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return FALSE;
+
+ SvLBoxEntry* pParent = pRootNodes[SC_CONTENT_NOTE];
+ if (!pParent)
+ return FALSE;
+
+ SvLBoxEntry* pEntry = FirstChild( pParent );
+
+ BOOL bEqual = TRUE;
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount && bEqual; nTab++)
+ {
+ ScCellIterator aIter( pDoc, 0,0,nTab, MAXCOL,MAXROW,nTab );
+ ScBaseCell* pCell = aIter.GetFirst();
+ while (pCell && bEqual)
+ {
+ if( const ScPostIt* pNote = pCell->GetNote() )
+ {
+ if ( !pEntry )
+ bEqual = FALSE;
+ else
+ {
+ if ( lcl_NoteString( *pNote ) != GetEntryText(pEntry) )
+ bEqual = FALSE;
+
+ pEntry = NextSibling( pEntry );
+ }
+ }
+ pCell = aIter.GetNext();
+ }
+ }
+
+ if ( pEntry )
+ bEqual = FALSE; // kommt noch was
+
+ return !bEqual;
+}
+
+BOOL ScContentTree::DrawNamesChanged( USHORT nType )
+{
+ ScDocument* pDoc = GetSourceDocument();
+ if (!pDoc)
+ return FALSE;
+
+ SvLBoxEntry* pParent = pRootNodes[nType];
+ if (!pParent)
+ return FALSE;
+
+ SvLBoxEntry* pEntry = FirstChild( pParent );
+
+ // iterate in flat mode for groups
+ SdrIterMode eIter = ( nType == SC_CONTENT_DRAWING ) ? IM_FLAT : IM_DEEPNOGROUPS;
+
+ BOOL bEqual = TRUE;
+ ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
+ if (pDrawLayer && pShell)
+ {
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount && bEqual; nTab++)
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, eIter );
+ SdrObject* pObject = aIter.Next();
+ while (pObject && bEqual)
+ {
+ if ( IsPartOfType( nType, pObject->GetObjIdentifier() ) )
+ {
+ if ( !pEntry )
+ bEqual = FALSE;
+ else
+ {
+ if ( ScDrawLayer::GetVisibleName( pObject ) != GetEntryText(pEntry) )
+ bEqual = FALSE;
+
+ pEntry = NextSibling( pEntry );
+ }
+ }
+ pObject = aIter.Next();
+ }
+ }
+ }
+ }
+
+ if ( pEntry )
+ bEqual = FALSE; // kommt noch was
+
+ return !bEqual;
+}
+
+BOOL lcl_GetRange( ScDocument* pDoc, USHORT nType, const String& rName, ScRange& rRange )
+{
+ BOOL bFound = FALSE;
+ USHORT nPos;
+
+ if ( nType == SC_CONTENT_RANGENAME )
+ {
+ ScRangeName* pList = pDoc->GetRangeName();
+ if (pList)
+ if (pList->SearchName( rName, nPos ))
+ if ( (*pList)[nPos]->IsValidReference( rRange ) )
+ bFound = TRUE;
+ }
+ else if ( nType == SC_CONTENT_DBAREA )
+ {
+ ScDBCollection* pList = pDoc->GetDBCollection();
+ if (pList)
+ if (pList->SearchName( rName, nPos ))
+ {
+ SCTAB nTab;
+ SCCOL nCol1, nCol2;
+ SCROW nRow1, nRow2;
+ (*pList)[nPos]->GetArea(nTab,nCol1,nRow1,nCol2,nRow2);
+ rRange = ScRange( nCol1,nRow1,nTab, nCol2,nRow2,nTab );
+ bFound = TRUE;
+ }
+ }
+
+ return bFound;
+}
+
+void lcl_DoDragObject( ScDocShell* pSrcShell, const String& rName, USHORT nType, Window* pWin )
+{
+ ScDocument* pSrcDoc = pSrcShell->GetDocument();
+ ScDrawLayer* pModel = pSrcDoc->GetDrawLayer();
+ if (pModel)
+ {
+ BOOL bOle = ( nType == SC_CONTENT_OLEOBJECT );
+ BOOL bGraf = ( nType == SC_CONTENT_GRAPHIC );
+ USHORT nDrawId = sal::static_int_cast<USHORT>( bOle ? OBJ_OLE2 : ( bGraf ? OBJ_GRAF : OBJ_GRUP ) );
+ SCTAB nTab = 0;
+ SdrObject* pObject = pModel->GetNamedObject( rName, nDrawId, nTab );
+ if (pObject)
+ {
+ SdrView aEditView( pModel );
+ aEditView.ShowSdrPage(aEditView.GetModel()->GetPage(nTab));
+ SdrPageView* pPV = aEditView.GetSdrPageView();
+ aEditView.MarkObj(pObject, pPV);
+
+ SdrModel* pDragModel = aEditView.GetAllMarkedModel();
+
+ TransferableObjectDescriptor aObjDesc;
+ pSrcShell->FillTransferableObjectDescriptor( aObjDesc );
+ aObjDesc.maDisplayName = pSrcShell->GetMedium()->GetURLObject().GetURLNoPass();
+ // maSize is set in ScDrawTransferObj ctor
+
+ ScDrawTransferObj* pTransferObj = new ScDrawTransferObj( pDragModel, pSrcShell, aObjDesc );
+ uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
+
+ pTransferObj->SetDragSourceObj( pObject, nTab );
+ pTransferObj->SetDragSourceFlags( SC_DROP_NAVIGATOR );
+
+ SC_MOD()->SetDragObject( NULL, pTransferObj );
+ pWin->ReleaseMouse();
+ pTransferObj->StartDrag( pWin, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
+ }
+ }
+}
+
+void lcl_DoDragCells( ScDocShell* pSrcShell, const ScRange& rRange, USHORT nFlags, Window* pWin )
+{
+ ScMarkData aMark;
+ aMark.SelectTable( rRange.aStart.Tab(), TRUE );
+ aMark.SetMarkArea( rRange );
+
+ ScDocument* pSrcDoc = pSrcShell->GetDocument();
+ if ( !pSrcDoc->HasSelectedBlockMatrixFragment( rRange.aStart.Col(), rRange.aStart.Row(),
+ rRange.aEnd.Col(), rRange.aEnd.Row(),
+ aMark ) )
+ {
+ ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
+ ScClipParam aClipParam(rRange, false);
+ pSrcDoc->CopyToClip(aClipParam, pClipDoc, &aMark);
+ // pClipDoc->ExtendMerge( rRange, TRUE );
+
+ TransferableObjectDescriptor aObjDesc;
+ pSrcShell->FillTransferableObjectDescriptor( aObjDesc );
+ aObjDesc.maDisplayName = pSrcShell->GetMedium()->GetURLObject().GetURLNoPass();
+ // maSize is set in ScTransferObj ctor
+
+ ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
+ uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
+
+ pTransferObj->SetDragSource( pSrcShell, aMark );
+ pTransferObj->SetDragSourceFlags( nFlags );
+
+ SC_MOD()->SetDragObject( pTransferObj, NULL ); // for internal D&D
+ pWin->ReleaseMouse();
+ pTransferObj->StartDrag( pWin, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
+ }
+}
+
+void ScContentTree::DoDrag()
+{
+ ScDocumentLoader* pDocLoader = NULL;
+ bIsInDrag = TRUE;
+
+ ScModule* pScMod = SC_MOD();
+
+ USHORT nType;
+ ULONG nChild;
+ SvLBoxEntry* pEntry = GetCurEntry();
+ GetEntryIndexes( nType, nChild, pEntry );
+
+ if( pEntry &&
+ (nChild != SC_CONTENT_NOCHILD) &&
+ (nType != SC_CONTENT_ROOT) &&
+ (nType != SC_CONTENT_NOTE) &&
+ (nType != SC_CONTENT_AREALINK) )
+ {
+ String aText( GetEntryText( pEntry ) );
+
+ ScDocument* pLocalDoc = NULL; // fuer URL-Drop
+ String aDocName;
+ if (bHiddenDoc)
+ aDocName = aHiddenName;
+ else
+ {
+ ScDocShell* pDocSh = GetManualOrCurrent();
+ if (pDocSh)
+ {
+ if (pDocSh->HasName())
+ aDocName = pDocSh->GetMedium()->GetName();
+ else
+ pLocalDoc = pDocSh->GetDocument(); // Drop nur in dieses Dokument
+ }
+ }
+
+ BOOL bDoLinkTrans = FALSE; // use ScLinkTransferObj
+ String aLinkURL; // for ScLinkTransferObj
+ String aLinkText;
+
+ USHORT nDropMode = pParentWindow->GetDropMode();
+ switch ( nDropMode )
+ {
+ case SC_DROPMODE_URL:
+ {
+ String aUrl = aDocName;
+ aUrl += '#';
+ aUrl += aText;
+
+ pScMod->SetDragJump( pLocalDoc, aUrl, aText );
+
+ if (aDocName.Len())
+ {
+ // provide URL to outside only if the document has a name
+ // (without name, only internal D&D via SetDragJump)
+
+ aLinkURL = aUrl;
+ aLinkText = aText;
+ }
+ bDoLinkTrans = TRUE;
+ }
+ break;
+ case SC_DROPMODE_LINK:
+ {
+ if ( aDocName.Len() ) // link only to named documents
+ {
+ // for internal D&D, set flag to insert a link
+
+ switch ( nType )
+ {
+ case SC_CONTENT_TABLE:
+ pScMod->SetDragLink( aDocName, aText, EMPTY_STRING );
+ bDoLinkTrans = TRUE;
+ break;
+ case SC_CONTENT_RANGENAME:
+ case SC_CONTENT_DBAREA:
+ pScMod->SetDragLink( aDocName, EMPTY_STRING, aText );
+ bDoLinkTrans = TRUE;
+ break;
+
+ // other types cannot be linked
+ }
+ }
+ }
+ break;
+ case SC_DROPMODE_COPY:
+ {
+ ScDocShell* pSrcShell = NULL;
+ if ( bHiddenDoc )
+ {
+ String aFilter, aOptions;
+ pDocLoader = new ScDocumentLoader( aHiddenName, aFilter, aOptions );
+ if (!pDocLoader->IsError())
+ pSrcShell = pDocLoader->GetDocShell();
+ }
+ else
+ pSrcShell = GetManualOrCurrent();
+
+ if ( pSrcShell )
+ {
+ ScDocument* pSrcDoc = pSrcShell->GetDocument();
+ if ( nType == SC_CONTENT_RANGENAME || nType == SC_CONTENT_DBAREA )
+ {
+ ScRange aRange;
+ if ( lcl_GetRange( pSrcDoc, nType, aText, aRange ) )
+ {
+ lcl_DoDragCells( pSrcShell, aRange, SC_DROP_NAVIGATOR, this );
+ }
+ }
+ else if ( nType == SC_CONTENT_TABLE )
+ {
+ SCTAB nTab;
+ if ( pSrcDoc->GetTable( aText, nTab ) )
+ {
+ ScRange aRange( 0,0,nTab, MAXCOL,MAXROW,nTab );
+ lcl_DoDragCells( pSrcShell, aRange, SC_DROP_NAVIGATOR | SC_DROP_TABLE, this );
+ }
+ }
+ else if ( nType == SC_CONTENT_GRAPHIC || nType == SC_CONTENT_OLEOBJECT ||
+ nType == SC_CONTENT_DRAWING )
+ {
+ lcl_DoDragObject( pSrcShell, aText, nType, this );
+
+ // in ExecuteDrag kann der Navigator geloescht worden sein
+ // -> nicht mehr auf Member zugreifen !!!
+ }
+ }
+ }
+ break;
+ }
+
+ if (bDoLinkTrans)
+ {
+ ScLinkTransferObj* pTransferObj = new ScLinkTransferObj;
+ uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
+
+ if ( aLinkURL.Len() )
+ pTransferObj->SetLinkURL( aLinkURL, aLinkText );
+
+ // SetDragJump / SetDragLink has been done above
+
+ ReleaseMouse();
+ pTransferObj->StartDrag( this, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
+ }
+ }
+
+ bIsInDrag = FALSE; // static Member
+
+ delete pDocLoader; // falls Dokument zum Draggen geladen wurde
+}
+
+IMPL_STATIC_LINK(ScContentTree, ExecDragHdl, void*, EMPTYARG)
+{
+ // als Link, damit asynchron ohne ImpMouseMoveMsg auf dem Stack auch der
+ // Navigator geloescht werden darf
+
+ pThis->DoDrag();
+ return 0;
+}
+
+//UNUSED2008-05 void ScContentTree::AdjustTitle()
+//UNUSED2008-05 {
+//UNUSED2008-05 String aTitle = pParentWindow->aTitleBase;
+//UNUSED2008-05 if (bHiddenDoc)
+//UNUSED2008-05 {
+//UNUSED2008-05 aTitle.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " - " ));
+//UNUSED2008-05 aTitle += aHiddenTitle;
+//UNUSED2008-05 }
+//UNUSED2008-05 pParentWindow->SetText(aTitle);
+//UNUSED2008-05 }
+
+BOOL ScContentTree::LoadFile( const String& rUrl )
+{
+ String aDocName = rUrl;
+ xub_StrLen nPos = aDocName.Search('#');
+ if ( nPos != STRING_NOTFOUND )
+ aDocName.Erase(nPos); // nur der Name, ohne #...
+
+ BOOL bReturn = FALSE;
+ String aFilter, aOptions;
+ ScDocumentLoader aLoader( aDocName, aFilter, aOptions );
+ if ( !aLoader.IsError() )
+ {
+ bHiddenDoc = TRUE;
+ aHiddenName = aDocName;
+ aHiddenTitle = aLoader.GetTitle();
+ pHiddenDocument = aLoader.GetDocument();
+
+ Refresh(); // Inhalte aus geladenem Dokument holen
+
+ pHiddenDocument = NULL;
+// AdjustTitle();
+
+ pParentWindow->GetDocNames( &aHiddenTitle ); // Liste fuellen
+ }
+ else
+ Sound::Beep(); // Fehler beim Laden
+
+ // Dokument wird im dtor von ScDocumentLoader wieder geschlossen
+
+ return bReturn;
+}
+
+void ScContentTree::InitWindowBits( BOOL bButtons )
+{
+ WinBits nFlags = WB_CLIPCHILDREN|WB_HSCROLL;
+ if (bButtons)
+ nFlags |= WB_HASBUTTONS|WB_HASBUTTONSATROOT;
+
+ SetWindowBits( nFlags );
+}
+
+void ScContentTree::SetRootType( USHORT nNew )
+{
+ if ( nNew != nRootType )
+ {
+ nRootType = nNew;
+ InitWindowBits( nNew == 0 );
+ Refresh();
+
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ rCfg.SetRootType( nRootType );
+ }
+}
+
+void ScContentTree::ToggleRoot() // nach Selektion
+{
+ USHORT nNew = SC_CONTENT_ROOT;
+ if ( nRootType == SC_CONTENT_ROOT )
+ {
+ SvLBoxEntry* pEntry = GetCurEntry();
+ if (pEntry)
+ {
+ SvLBoxEntry* pParent = GetParent(pEntry);
+ for (USHORT i=1; i<SC_CONTENT_COUNT; i++)
+ if ( pEntry == pRootNodes[i] || pParent == pRootNodes[i] )
+ nNew = i;
+ }
+ }
+
+ SetRootType( nNew );
+}
+
+void ScContentTree::ResetManualDoc()
+{
+ aManualDoc.Erase();
+ bHiddenDoc = FALSE;
+
+ ActiveDocChanged();
+}
+
+void ScContentTree::ActiveDocChanged()
+{
+ if ( !bHiddenDoc && !aManualDoc.Len() )
+ Refresh(); // Inhalte nur wenn automatisch
+
+ // Listbox muss immer geupdated werden, wegen aktiv-Flag
+
+ String aCurrent;
+ if ( bHiddenDoc )
+ aCurrent = aHiddenTitle;
+ else
+ {
+ ScDocShell* pSh = GetManualOrCurrent();
+ if (pSh)
+ aCurrent = pSh->GetTitle();
+ else
+ {
+ // eingestelltes Dokument existiert nicht mehr
+
+ aManualDoc.Erase(); // wieder automatisch
+ Refresh();
+ pSh = GetManualOrCurrent(); // sollte jetzt aktives sein
+ if (pSh)
+ aCurrent = pSh->GetTitle();
+ }
+ }
+ pParentWindow->GetDocNames( &aCurrent ); // selektieren
+}
+
+void ScContentTree::SetManualDoc(const String& rName)
+{
+ aManualDoc = rName;
+ if (!bHiddenDoc)
+ {
+ Refresh();
+ pParentWindow->GetDocNames( &aManualDoc ); // selektieren
+ }
+}
+
+void ScContentTree::SelectDoc(const String& rName) // rName wie im Menue/Listbox angezeigt
+{
+ if ( rName == pParentWindow->aStrActiveWin )
+ {
+ ResetManualDoc();
+ return;
+ }
+
+ // "aktiv" oder "inaktiv" weglassen
+
+ String aRealName = rName;
+ xub_StrLen nLen = rName.Len();
+ xub_StrLen nActiveStart = nLen - pParentWindow->aStrActive.Len();
+ if ( rName.Copy( nActiveStart ) == pParentWindow->aStrActive )
+ aRealName = rName.Copy( 0, nActiveStart );
+ xub_StrLen nNotActiveStart = nLen - pParentWindow->aStrNotActive.Len();
+ if ( rName.Copy( nNotActiveStart ) == pParentWindow->aStrNotActive )
+ aRealName = rName.Copy( 0, nNotActiveStart );
+
+ //
+
+ BOOL bLoaded = FALSE;
+
+ // ist es ein normal geladenes Doc ?
+
+ SfxObjectShell* pSh = SfxObjectShell::GetFirst();
+ while ( pSh && !bLoaded )
+ {
+ if ( pSh->ISA(ScDocShell) )
+ if ( pSh->GetTitle() == aRealName )
+ bLoaded = TRUE;
+ pSh = SfxObjectShell::GetNext( *pSh );
+ }
+
+ if (bLoaded)
+ {
+ bHiddenDoc = FALSE;
+ SetManualDoc(aRealName);
+ }
+ else if (aHiddenTitle.Len()) // verstecktes ausgewaehlt
+ {
+ if (!bHiddenDoc)
+ LoadFile(aHiddenName);
+ }
+ else
+ {
+ DBG_ERROR("SelectDoc: nicht gefunden");
+ }
+}
+
+void ScContentTree::ApplySettings()
+{
+ const ScNavigatorSettings* pSettings = pParentWindow->GetNavigatorSettings();
+ if( pSettings )
+ {
+ USHORT nRootSel = pSettings->GetRootSelected();
+ ULONG nChildSel = pSettings->GetChildSelected();
+
+ for( USHORT nEntry = 1; nEntry < SC_CONTENT_COUNT; ++nEntry )
+ {
+ if( pRootNodes[ nEntry ] )
+ {
+ // expand
+ BOOL bExp = pSettings->IsExpanded( nEntry );
+ if( bExp != IsExpanded( pRootNodes[ nEntry ] ) )
+ {
+ if( bExp )
+ Expand( pRootNodes[ nEntry ] );
+ else
+ Collapse( pRootNodes[ nEntry ] );
+ }
+
+ // select
+ if( nRootSel == nEntry )
+ {
+ SvLBoxEntry* pEntry = NULL;
+ if( bExp && (nChildSel != SC_CONTENT_NOCHILD) )
+ pEntry = GetEntry( pRootNodes[ nEntry ], nChildSel );
+ Select( pEntry ? pEntry : pRootNodes[ nEntry ] );
+ }
+ }
+ }
+ }
+}
+
+void ScContentTree::StoreSettings() const
+{
+ ScNavigatorSettings* pSettings = pParentWindow->GetNavigatorSettings();
+ if( pSettings )
+ {
+ for( USHORT nEntry = 1; nEntry < SC_CONTENT_COUNT; ++nEntry )
+ {
+ BOOL bExp = pRootNodes[ nEntry ] && IsExpanded( pRootNodes[ nEntry ] );
+ pSettings->SetExpanded( nEntry, bExp );
+ }
+ USHORT nRoot;
+ ULONG nChild;
+ GetEntryIndexes( nRoot, nChild, GetCurEntry() );
+ pSettings->SetRootSelected( nRoot );
+ pSettings->SetChildSelected( nChild );
+ }
+}
+
+
+//
+//------------------------------------------------------------------------
+//
+
+
+
+
+
diff --git a/sc/source/ui/navipi/makefile.mk b/sc/source/ui/navipi/makefile.mk
new file mode 100644
index 000000000000..9c0de073dd8c
--- /dev/null
+++ b/sc/source/ui/navipi/makefile.mk
@@ -0,0 +1,57 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sc
+TARGET=navipi
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : scpre.mk
+.INCLUDE : settings.mk
+.INCLUDE : sc.mk
+.INCLUDE : $(PRJ)$/util$/makefile.pmk
+
+# --- Files --------------------------------------------------------
+
+SLOFILES = \
+ $(SLO)$/navipi.obj \
+ $(SLO)$/navcitem.obj \
+ $(SLO)$/scenwnd.obj \
+ $(SLO)$/content.obj
+
+EXCEPTIONSFILES = \
+ $(SLO)$/scenwnd.obj
+
+SRS1NAME=$(TARGET)
+SRC1FILES = navipi.src
+
+# --- Tagets -------------------------------------------------------
+
+.INCLUDE : target.mk
+
diff --git a/sc/source/ui/navipi/navcitem.cxx b/sc/source/ui/navipi/navcitem.cxx
new file mode 100644
index 000000000000..e5002c44c60e
--- /dev/null
+++ b/sc/source/ui/navipi/navcitem.cxx
@@ -0,0 +1,127 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+
+
+// INCLUDE ---------------------------------------------------------------
+
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+
+#include "navcitem.hxx"
+#include "global.hxx"
+#include "navipi.hxx"
+#include "sc.hrc" // -> Item-IDs
+
+// STATIC DATA -----------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+
+ScNavigatorControllerItem::ScNavigatorControllerItem( USHORT nIdP,
+ ScNavigatorDlg& rDlg,
+ SfxBindings& rBindings )
+ : SfxControllerItem ( nIdP, rBindings ),
+ rNavigatorDlg ( rDlg )
+{
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorControllerItem::StateChanged( USHORT /* nSID */, SfxItemState /* eState */,
+ const SfxPoolItem* pItem )
+{
+ switch( GetId() )
+ {
+ case SID_CURRENTCELL:
+ if ( pItem )
+ {
+// const SfxPointItem* pCellPosItem = PTR_CAST(SfxPointItem, pItem);
+ const SfxStringItem* pCellPosItem = PTR_CAST(SfxStringItem, pItem);
+
+ DBG_ASSERT( pCellPosItem, "SfxStringItem expected!" );
+
+ if ( pCellPosItem )
+ {
+ String aAddress( pCellPosItem->GetValue() );
+ ScAddress aScAddress;
+ aScAddress.Parse( aAddress );
+
+ SCCOL nCol = aScAddress.Col()+1;
+ SCROW nRow = aScAddress.Row()+1;
+
+// SCCOL nCol = (USHORT)pCellPosItem->GetValue().X()+1;
+// SCROW nRow = (USHORT)pCellPosItem->GetValue().Y()+1;
+
+ rNavigatorDlg.UpdateColumn( &nCol );
+ rNavigatorDlg.UpdateRow ( &nRow );
+ rNavigatorDlg.CursorPosChanged();
+ }
+ }
+ break;
+
+ case SID_CURRENTTAB:
+ if ( pItem )
+ {
+ const SfxUInt16Item* pTabItem = PTR_CAST(SfxUInt16Item, pItem);
+
+ DBG_ASSERT( pTabItem, "SfxUInt16Item expected!" );
+
+ // Tabelle fuer Basic ist 1-basiert
+ if ( pTabItem && pTabItem->GetValue() )
+ {
+ SCTAB nTab = pTabItem->GetValue() - 1;
+
+ rNavigatorDlg.UpdateTable( &nTab );
+ rNavigatorDlg.UpdateColumn();
+ rNavigatorDlg.UpdateRow();
+ rNavigatorDlg.CursorPosChanged();
+ }
+ }
+ break;
+
+ case SID_CURRENTDOC:
+ //
+ // gar nix mehr, wird ueber SFX_HINT_DOCCHANGED erledigt
+ //
+ break;
+
+
+ case SID_SELECT_SCENARIO:
+ rNavigatorDlg.aWndScenarios.NotifyState( pItem );
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+
diff --git a/sc/source/ui/navipi/navipi.cxx b/sc/source/ui/navipi/navipi.cxx
new file mode 100644
index 000000000000..846e2ce53310
--- /dev/null
+++ b/sc/source/ui/navipi/navipi.cxx
@@ -0,0 +1,1565 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+//------------------------------------------------------------------
+
+// #include <math.h>
+#include <rangelst.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/event.hxx>
+#include <sfx2/imgmgr.hxx>
+#include <sfx2/navigat.hxx>
+#include <svl/stritem.hxx>
+#include <svl/urlbmk.hxx>
+#include <vcl/sound.hxx>
+#include <unotools/charclass.hxx>
+#include <stdlib.h>
+
+#include "viewdata.hxx"
+#include "tabvwsh.hxx"
+#include "docsh.hxx"
+#include "document.hxx"
+#include "dbcolect.hxx"
+#include "rangenam.hxx"
+#include "rangeutl.hxx"
+#include "popmenu.hxx"
+#include "scresid.hxx"
+#include "scmod.hxx"
+#include "navicfg.hxx"
+#include "navcitem.hxx"
+#include "navipi.hrc"
+#include "navipi.hxx"
+#include "navsett.hxx"
+
+// Timeout, um Notizen zu suchen
+#define SC_CONTENT_TIMEOUT 1000
+
+// Toleranz, wieviel ueber der eingeklappten Groesse noch klein ist
+#define SCNAV_MINTOL 5
+
+// maximum values for UI
+#define SCNAV_MAXCOL (MAXCOLCOUNT)
+// macro is sufficient since only used in ctor
+#define SCNAV_COLDIGITS (static_cast<xub_StrLen>( floor( log10( static_cast<double>(SCNAV_MAXCOL)))) + 1) // 1...256...18278
+// precomputed constant because it is used in every change of spin button field
+static const xub_StrLen SCNAV_COLLETTERS = ::ScColToAlpha(SCNAV_MAXCOL).Len(); // A...IV...ZZZ
+
+#define SCNAV_MAXROW (MAXROWCOUNT)
+
+//------------------------------------------------------------------------
+
+// static
+void ScNavigatorDlg::ReleaseFocus()
+{
+ SfxViewShell* pCurSh = SfxViewShell::Current();
+
+ if ( pCurSh )
+ {
+ Window* pShellWnd = pCurSh->GetWindow();
+ if ( pShellWnd )
+ pShellWnd->GrabFocus();
+ }
+}
+
+//==================================================================
+// class ColumnEdit
+//==================================================================
+
+ColumnEdit::ColumnEdit( ScNavigatorDlg* pParent, const ResId& rResId )
+ : SpinField ( pParent, rResId ),
+ rDlg ( *pParent ),
+ nCol ( 0 ),
+ nKeyGroup ( KEYGROUP_ALPHA )
+{
+ SetMaxTextLen( SCNAV_COLDIGITS ); // 1...256...18278 or A...IV...ZZZ
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ColumnEdit::~ColumnEdit()
+{
+}
+
+//------------------------------------------------------------------------
+
+long __EXPORT ColumnEdit::Notify( NotifyEvent& rNEvt )
+{
+ long nHandled = SpinField::Notify( rNEvt );
+
+ USHORT nType = rNEvt.GetType();
+ if ( nType == EVENT_KEYINPUT )
+ {
+ const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
+ KeyCode aCode = pKEvt->GetKeyCode();
+
+ if ( !aCode.IsMod1() && !aCode.IsMod2() )
+ {
+ //! Eingabeueberpruefung (nur Zahlen oder nur Buchstaben, max 2 bzw 3 Stellen)
+ //! war vor VCL per nicht weitergeleitetem KeyInput
+ //! dafuer was neues ausdenken!!!
+
+ if ( aCode.GetCode() == KEY_RETURN )
+ {
+ ScNavigatorDlg::ReleaseFocus();
+ ExecuteCol();
+ nHandled = 1;
+ }
+ }
+ }
+ else if ( nType == EVENT_LOSEFOCUS ) // LoseFocus wird bei VCL nicht gerufen
+ EvalText(); // nCol setzen
+
+ return nHandled;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::LoseFocus()
+{
+ EvalText();
+}
+
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Up()
+{
+ nCol++;
+
+#ifdef OS2
+ if ( nCol > SCNAV_MAXCOL )
+ nCol = 1;
+#endif
+
+ if ( nCol <= SCNAV_MAXCOL )
+ SetCol( nCol );
+ else
+ nCol--;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Down()
+{
+ if ( nCol>1 )
+ SetCol( nCol-1 );
+#ifdef OS2
+ else
+ SetCol( SCNAV_MAXCOL );
+#endif
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::First()
+{
+ nCol = 1;
+ SetText( 'A' );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Last()
+{
+ String aStr;
+ nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
+ SetText( aStr );
+}
+
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::EvalText()
+{
+ String aStrCol = GetText();
+
+ if ( aStrCol.Len() > 0 )
+ {
+ // nKeyGroup wird bei VCL mangels KeyInput nicht mehr gesetzt
+
+ if ( CharClass::isAsciiNumeric(aStrCol) )
+ nCol = NumStrToAlpha( aStrCol );
+ else
+ nCol = AlphaToNum( aStrCol );
+ }
+ else
+ nCol = 0;
+
+ SetText( aStrCol );
+ nKeyGroup = KEYGROUP_ALPHA;
+}
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::ExecuteCol()
+{
+ SCROW nRow = rDlg.aEdRow.GetRow();
+
+ EvalText(); // setzt nCol
+
+ if ( (nCol > 0) && (nRow > 0) )
+ rDlg.SetCurrentCell( nCol-1, nRow-1 );
+}
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::SetCol( SCCOL nColNo )
+{
+ String aStr;
+
+ if ( nColNo == 0 )
+ {
+ nCol = 0;
+ SetText( aStr );
+ }
+ else
+ {
+ nColNo = NumToAlpha( nColNo, aStr );
+ nCol = nColNo;
+ SetText( aStr );
+ }
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::AlphaToNum( String& rStr )
+{
+ SCCOL nColumn = 0;
+
+ if ( CharClass::isAsciiAlpha( rStr) )
+ {
+ rStr.ToUpperAscii();
+
+ if (::AlphaToCol( nColumn, rStr))
+ ++nColumn;
+
+ if ( (rStr.Len() > SCNAV_COLLETTERS) || (nColumn > SCNAV_MAXCOL) )
+ {
+ nColumn = SCNAV_MAXCOL;
+ NumToAlpha( nColumn, rStr );
+ }
+ }
+ else
+ rStr.Erase();
+
+ return nColumn;
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::NumStrToAlpha( String& rStr )
+{
+ SCCOL nColumn = 0;
+
+ if ( CharClass::isAsciiNumeric(rStr) )
+ nColumn = NumToAlpha( (SCCOL)rStr.ToInt32(), rStr );
+ else
+ rStr.Erase();
+
+ return nColumn;
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::NumToAlpha( SCCOL nColNo, String& rStr )
+{
+ if ( nColNo > SCNAV_MAXCOL )
+ nColNo = SCNAV_MAXCOL;
+ else if ( nColNo < 1 )
+ nColNo = 1;
+
+ ::ScColToAlpha( rStr, nColNo - 1);
+
+ return nColNo;
+}
+
+//==================================================================
+// class RowEdit
+//==================================================================
+
+RowEdit::RowEdit( ScNavigatorDlg* pParent, const ResId& rResId )
+ : NumericField( pParent, rResId ),
+ rDlg ( *pParent )
+{
+ SetMax( SCNAV_MAXROW);
+ SetLast( SCNAV_MAXROW);
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT RowEdit::~RowEdit()
+{
+}
+
+//------------------------------------------------------------------------
+
+long __EXPORT RowEdit::Notify( NotifyEvent& rNEvt )
+{
+ long nHandled = NumericField::Notify( rNEvt );
+
+ if ( rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
+ KeyCode aCode = pKEvt->GetKeyCode();
+ if ( aCode.GetCode() == KEY_RETURN && !aCode.IsMod1() && !aCode.IsMod2() )
+ {
+ ScNavigatorDlg::ReleaseFocus();
+ ExecuteRow();
+ nHandled = 1;
+ }
+ }
+
+ return nHandled;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT RowEdit::LoseFocus()
+{
+}
+
+//------------------------------------------------------------------------
+
+void RowEdit::ExecuteRow()
+{
+ SCCOL nCol = rDlg.aEdCol.GetCol();
+ SCROW nRow = (SCROW)GetValue();
+
+ if ( (nCol > 0) && (nRow > 0) )
+ rDlg.SetCurrentCell( nCol-1, nRow-1 );
+}
+
+//==================================================================
+// class ScDocListBox
+//==================================================================
+
+ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
+ : ListBox ( pParent, rResId ),
+ rDlg ( *pParent )
+{
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ScDocListBox::~ScDocListBox()
+{
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScDocListBox::Select()
+{
+ ScNavigatorDlg::ReleaseFocus();
+
+ String aDocName = GetSelectEntry();
+ rDlg.aLbEntries.SelectDoc( aDocName );
+}
+
+//==================================================================
+// class CommandToolBox
+//==================================================================
+
+CommandToolBox::CommandToolBox( ScNavigatorDlg* pParent, const ResId& rResId )
+ : ToolBox ( pParent, rResId ),
+ rDlg ( *pParent )
+{
+ InitImageList(); // ImageList members of ScNavigatorDlg must be initialized before!
+
+ SetSizePixel( CalcWindowSizePixel() );
+ SetDropdownClickHdl( LINK(this, CommandToolBox, ToolBoxDropdownClickHdl) );
+ SetItemBits( IID_DROPMODE, GetItemBits( IID_DROPMODE ) | TIB_DROPDOWNONLY );
+// EnableItem( IID_UP, FALSE );
+// EnableItem( IID_DOWN, FALSE );
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT CommandToolBox::~CommandToolBox()
+{
+}
+
+//------------------------------------------------------------------------
+
+void CommandToolBox::Select( USHORT nSelId )
+{
+ // Modus umschalten ?
+
+ if ( nSelId == IID_ZOOMOUT || nSelId == IID_SCENARIOS )
+ {
+ NavListMode eOldMode = rDlg.eListMode;
+ NavListMode eNewMode = eOldMode;
+
+ if ( nSelId == IID_SCENARIOS ) // auf Szenario
+ {
+ if ( eOldMode == NAV_LMODE_SCENARIOS )
+ eNewMode = NAV_LMODE_AREAS;
+ else
+ eNewMode = NAV_LMODE_SCENARIOS;
+ }
+ else // ein/aus
+ {
+ if ( eOldMode == NAV_LMODE_NONE )
+ eNewMode = NAV_LMODE_AREAS;
+ else
+ eNewMode = NAV_LMODE_NONE;
+ }
+ rDlg.SetListMode( eNewMode );
+ UpdateButtons();
+ }
+ else
+ switch ( nSelId )
+ {
+ case IID_DATA:
+ rDlg.MarkDataArea();
+ break;
+ case IID_UP:
+ rDlg.StartOfDataArea();
+ break;
+ case IID_DOWN:
+ rDlg.EndOfDataArea();
+ break;
+ // IID_DROPMODE ist in Click
+ case IID_CHANGEROOT:
+ rDlg.aLbEntries.ToggleRoot();
+ UpdateButtons();
+ break;
+ }
+}
+
+void __EXPORT CommandToolBox::Select()
+{
+ Select( GetCurItemId() );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT CommandToolBox::Click()
+{
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( CommandToolBox, ToolBoxDropdownClickHdl, ToolBox*, EMPTYARG )
+{
+ // Das Popupmenue fuer den Dropmodus muss im Click (Button Down)
+ // statt im Select (Button Up) aufgerufen werden.
+
+ if ( GetCurItemId() == IID_DROPMODE )
+ {
+ ScPopupMenu aPop( ScResId( RID_POPUP_DROPMODE ) );
+ aPop.CheckItem( RID_DROPMODE_URL + rDlg.GetDropMode() );
+ aPop.Execute( this, GetItemRect(IID_DROPMODE), POPUPMENU_EXECUTE_DOWN );
+ USHORT nId = aPop.GetSelected();
+
+ EndSelection(); // vor SetDropMode (SetDropMode ruft SetItemImage)
+
+ if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
+ rDlg.SetDropMode( nId - RID_DROPMODE_URL );
+
+ // #49956# den gehighlighteten Button aufheben
+ Point aPoint;
+ MouseEvent aLeave( aPoint, 0, MOUSE_LEAVEWINDOW | MOUSE_SYNTHETIC );
+ MouseMove( aLeave );
+ }
+
+ return 1;
+}
+
+//------------------------------------------------------------------------
+
+void CommandToolBox::UpdateButtons()
+{
+ NavListMode eMode = rDlg.eListMode;
+ CheckItem( IID_SCENARIOS, eMode == NAV_LMODE_SCENARIOS );
+ CheckItem( IID_ZOOMOUT, eMode != NAV_LMODE_NONE );
+
+ // Umschalten-Button:
+ if ( eMode == NAV_LMODE_SCENARIOS || eMode == NAV_LMODE_NONE )
+ {
+ EnableItem( IID_CHANGEROOT, FALSE );
+ CheckItem( IID_CHANGEROOT, FALSE );
+ }
+ else
+ {
+ EnableItem( IID_CHANGEROOT, TRUE );
+ BOOL bRootSet = rDlg.aLbEntries.GetRootType() != SC_CONTENT_ROOT;
+ CheckItem( IID_CHANGEROOT, bRootSet );
+ }
+
+ BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ USHORT nImageId = 0;
+ switch ( rDlg.nDropMode )
+ {
+ case SC_DROPMODE_URL: nImageId = bHC ? RID_IMG_H_DROP_URL : RID_IMG_DROP_URL; break;
+ case SC_DROPMODE_LINK: nImageId = bHC ? RID_IMG_H_DROP_LINK : RID_IMG_DROP_LINK; break;
+ case SC_DROPMODE_COPY: nImageId = bHC ? RID_IMG_H_DROP_COPY : RID_IMG_DROP_COPY; break;
+ }
+ SetItemImage( IID_DROPMODE, Image(ScResId(nImageId)) );
+}
+
+void CommandToolBox::InitImageList()
+{
+ BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ ImageList& rImgLst = bHC ? rDlg.aCmdImageListH : rDlg.aCmdImageList;
+
+ USHORT nCount = GetItemCount();
+ for (USHORT i = 0; i < nCount; i++)
+ {
+ USHORT nId = GetItemId(i);
+ SetItemImage( nId, rImgLst.GetImage( nId ) );
+ }
+}
+
+void CommandToolBox::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
+ {
+ // update item images
+
+ InitImageList();
+ UpdateButtons(); // drop mode
+ }
+
+ ToolBox::DataChanged( rDCEvt );
+}
+
+//==================================================================
+// class ScNavigatorSettings
+//==================================================================
+
+ScNavigatorSettings::ScNavigatorSettings() :
+ maExpandedVec( SC_CONTENT_COUNT, FALSE ),
+ mnRootSelected( SC_CONTENT_ROOT ),
+ mnChildSelected( SC_CONTENT_NOCHILD )
+{
+}
+
+//==================================================================
+// class ScNavigatorDlgWrapper
+//==================================================================
+
+SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
+
+#define IS_MODE(bit)(((nFlags)&(bit))==(bit))
+
+ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(
+ Window* pParent,
+ USHORT nId,
+ SfxBindings* pBind,
+ SfxChildWinInfo* /* pInfo */ ) :
+ SfxChildWindowContext( nId )
+{
+ pNavigator = new ScNavigatorDlg( pBind, this, pParent );
+ SetWindow( pNavigator );
+
+ // Einstellungen muessen anderswo gemerkt werden,
+ // pInfo geht uns (ausser der Groesse) nichts mehr an
+
+ Size aInfoSize = pParent->GetOutputSizePixel(); // von aussen vorgegebene Groesse
+ Size aNavSize = pNavigator->GetOutputSizePixel(); // Default-Groesse
+
+ aNavSize.Width() = Max( aInfoSize.Width(), aNavSize.Width() );
+ aNavSize.Height() = Max( aInfoSize.Height(), aNavSize.Height() );
+ pNavigator->nListModeHeight = Max( aNavSize.Height(), pNavigator->nListModeHeight );
+
+ // Die Groesse kann in einem anderen Modul geaendert worden sein,
+ // deshalb muessen in Abhaengigkeit von der momentanen Groesse die
+ // Inhalte eingeblendet werden oder nicht
+
+ BOOL bSmall = ( aInfoSize.Height() <= pNavigator->aInitSize.Height() + SCNAV_MINTOL );
+ NavListMode eNavMode = NAV_LMODE_NONE;
+ if (!bSmall)
+ {
+ // wenn Szenario aktiv war, wieder einschalten
+
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
+ if ( eLastMode == NAV_LMODE_SCENARIOS )
+ eNavMode = NAV_LMODE_SCENARIOS;
+ else
+ eNavMode = NAV_LMODE_AREAS;
+ }
+
+ // Die Groesse des Floats nicht neu setzen (FALSE bei SetListMode), damit der
+ // Navigator nicht aufgeklappt wird, wenn er minimiert war (#38872#).
+
+ pNavigator->SetListMode( eNavMode, FALSE ); // FALSE: Groesse des Float nicht setzen
+
+ USHORT nCmdId;
+ switch (eNavMode)
+ {
+ case NAV_LMODE_DOCS: nCmdId = IID_DOCS; break;
+ case NAV_LMODE_AREAS: nCmdId = IID_AREAS; break;
+ case NAV_LMODE_DBAREAS: nCmdId = IID_DBAREAS; break;
+ case NAV_LMODE_SCENARIOS: nCmdId = IID_SCENARIOS; break;
+ default: nCmdId = 0;
+ }
+ if (nCmdId)
+ {
+ pNavigator->aTbxCmd.CheckItem( nCmdId );
+ pNavigator->DoResize();
+ }
+
+ pNavigator->bFirstBig = ( nCmdId == 0 ); // dann spaeter
+
+/*???
+ FloatingWindow* pFloat = GetFloatingWindow();
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( pNavigator->GetMinOutputSizePixel() );
+*/
+
+//!? pNavigator->Show();
+}
+
+void __EXPORT ScNavigatorDialogWrapper::Resizing( Size& rSize )
+{
+ ((ScNavigatorDlg*)GetWindow())->Resizing(rSize);
+}
+
+//========================================================================
+// class ScNavigatorPI
+//========================================================================
+
+#define CTRL_ITEMS 4
+
+#define REGISTER_SLOT(i,id) \
+ ppBoundItems[i]=new ScNavigatorControllerItem(id,*this,rBindings);
+
+ScNavigatorDlg::ScNavigatorDlg( SfxBindings* pB, SfxChildWindowContext* pCW, Window* pParent ) :
+ Window( pParent, ScResId(RID_SCDLG_NAVIGATOR) ),
+ rBindings ( *pB ), // is used in CommandToolBox ctor
+ aCmdImageList( ScResId( IL_CMD ) ),
+ aCmdImageListH( ScResId( ILH_CMD ) ),
+ aFtCol ( this, ScResId( FT_COL ) ),
+ aEdCol ( this, ScResId( ED_COL ) ),
+ aFtRow ( this, ScResId( FT_ROW ) ),
+ aEdRow ( this, ScResId( ED_ROW ) ),
+ aTbxCmd ( this, ScResId( TBX_CMD ) ),
+ aLbEntries ( this, ScResId( LB_ENTRIES ) ),
+ aWndScenarios( this,ScResId( STR_QHLP_SCEN_LISTBOX), ScResId(STR_QHLP_SCEN_COMMENT)),
+ aLbDocuments( this, ScResId( LB_DOCUMENTS ) ),
+ aStrDragMode ( ScResId( STR_DRAGMODE ) ),
+ aStrDisplay ( ScResId( STR_DISPLAY ) ),
+ aStrActiveWin( ScResId( STR_ACTIVEWIN ) ),
+ pContextWin ( pCW ),
+ pMarkArea ( NULL ),
+ pViewData ( NULL ),
+ nListModeHeight( 0 ),
+ nInitListHeight( 0 ),
+ eListMode ( NAV_LMODE_NONE ),
+ nDropMode ( SC_DROPMODE_URL ),
+ nCurCol ( 0 ),
+ nCurRow ( 0 ),
+ nCurTab ( 0 ),
+ bFirstBig ( FALSE )
+{
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ nDropMode = rCfg.GetDragMode();
+ // eListMode wird von aussen gesetzt, Root weiter unten
+
+ aLbDocuments.SetDropDownLineCount(9);
+ String aOpen = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
+ aStrActive = aOpen;
+ aStrActive += String( ScResId( STR_ACTIVE ) );
+ aStrActive += ')'; // " (aktiv)"
+ aStrNotActive = aOpen;
+ aStrNotActive += String( ScResId( STR_NOTACTIVE ) );
+ aStrNotActive += ')'; // " (inaktiv)"
+ aStrHidden = aOpen;
+ aStrHidden += String( ScResId( STR_HIDDEN ) );
+ aStrHidden += ')'; // " (versteckt)"
+
+ aTitleBase = GetText();
+
+ long nListboxYPos = aTbxCmd.GetPosPixel().Y() + aTbxCmd.GetSizePixel().Height() + 4;
+ aLbEntries.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y);
+
+ nBorderOffset = aLbEntries.GetPosPixel().X();
+
+ aInitSize.Width() = aTbxCmd.GetPosPixel().X()
+ + aTbxCmd.GetSizePixel().Width()
+ + nBorderOffset;
+ aInitSize.Height() = aLbEntries.GetPosPixel().Y();
+
+ nInitListHeight = aLbEntries.GetSizePixel().Height();
+ nListModeHeight = aInitSize.Height()
+ + nInitListHeight;
+
+ // kein Resize, eh der ganze Kontext-Kram initialisiert ist!
+// SetOutputSizePixel( aInitSize ); //???
+/*! FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat)
+ pFloat->SetMinOutputSizePixel( aInitSize );
+*/
+ ppBoundItems = new ScNavigatorControllerItem* [CTRL_ITEMS];
+
+ rBindings.ENTERREGISTRATIONS();
+ //-----------------------------
+ REGISTER_SLOT( 0, SID_CURRENTCELL );
+ REGISTER_SLOT( 1, SID_CURRENTTAB );
+ REGISTER_SLOT( 2, SID_CURRENTDOC );
+ REGISTER_SLOT( 3, SID_SELECT_SCENARIO );
+ //-----------------------------
+ rBindings.LEAVEREGISTRATIONS();
+
+ StartListening( *(SFX_APP()) );
+ StartListening( rBindings );
+
+ aLbDocuments.Hide(); // bei NAV_LMODE_NONE gibts die nicht
+
+ aLbEntries.InitWindowBits(TRUE);
+
+ aLbEntries.SetSpaceBetweenEntries(0);
+ aLbEntries.SetSelectionMode( SINGLE_SELECTION );
+ aLbEntries.SetDragDropMode( SV_DRAGDROP_CTRL_MOVE |
+ SV_DRAGDROP_CTRL_COPY |
+ SV_DRAGDROP_ENABLE_TOP );
+
+ // war eine Kategorie als Root ausgewaehlt?
+ USHORT nLastRoot = rCfg.GetRootType();
+ if ( nLastRoot )
+ aLbEntries.SetRootType( nLastRoot );
+
+ aLbEntries.Refresh();
+ GetDocNames();
+
+ aTbxCmd.UpdateButtons();
+
+ UpdateColumn();
+ UpdateRow();
+ UpdateTable();
+ aLbEntries.Hide();
+ aWndScenarios.Hide();
+ aWndScenarios.SetPosPixel( aLbEntries.GetPosPixel() );
+
+ aContentTimer.SetTimeoutHdl( LINK( this, ScNavigatorDlg, TimeHdl ) );
+ aContentTimer.SetTimeout( SC_CONTENT_TIMEOUT );
+
+ FreeResource();
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ScNavigatorDlg::~ScNavigatorDlg()
+{
+ aContentTimer.Stop();
+
+ USHORT i;
+ for ( i=0; i<CTRL_ITEMS; i++ )
+ delete ppBoundItems[i];
+
+ delete [] ppBoundItems;
+ delete pMarkArea;
+
+ EndListening( *(SFX_APP()) );
+ EndListening( rBindings );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Resizing( Size& rNewSize ) // Size = Outputsize?
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat )
+ {
+ Size aMinOut = pFloat->GetMinOutputSizePixel();
+
+ if ( rNewSize.Width() < aMinOut.Width() )
+ rNewSize.Width() = aMinOut.Width();
+
+ if ( eListMode == NAV_LMODE_NONE )
+ rNewSize.Height() = aInitSize.Height();
+ else
+ {
+ if ( rNewSize.Height() < aMinOut.Height() )
+ rNewSize.Height() = aMinOut.Height();
+ }
+ }
+// else
+// SfxDockingWindow::Resizing(rNewSize);
+}
+
+
+
+void ScNavigatorDlg::Paint( const Rectangle& rRec )
+{
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetFaceColor();
+ Wallpaper aBack( aBgColor );
+
+ SetBackground( aBack );
+ aFtCol.SetBackground( aBack );
+ aFtRow.SetBackground( aBack );
+
+ Window::Paint( rRec );
+}
+
+void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
+ {
+ // toolbox images are exchanged in CommandToolBox::DataChanged
+ Invalidate();
+ }
+
+ Window::DataChanged( rDCEvt );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Resize()
+{
+ DoResize();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::DoResize()
+{
+ Size aNewSize = GetOutputSizePixel();
+ long nTotalHeight = aNewSize.Height();
+
+ // #41403# bei angedocktem Navigator wird das Fenster evtl. erst klein erzeugt,
+ // dann kommt ein Resize auf die wirkliche Groesse -> dann Inhalte einschalten
+
+ BOOL bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
+ if ( !bSmall && bFirstBig )
+ {
+ // Inhalte laut Config wieder einschalten
+
+ bFirstBig = FALSE;
+ NavListMode eNavMode = NAV_LMODE_AREAS;
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
+ if ( eLastMode == NAV_LMODE_SCENARIOS )
+ eNavMode = NAV_LMODE_SCENARIOS;
+ SetListMode( eNavMode, FALSE ); // FALSE: Groesse des Float nicht setzen
+ }
+
+ // auch wenn die Inhalte nicht sichtbar sind, die Groessen anpassen,
+ // damit die Breite stimmt
+
+ //@@ 03.11.97 changes begin
+ Point aEntryPos = aLbEntries.GetPosPixel();
+ Point aListPos = aLbDocuments.GetPosPixel();
+ aNewSize.Width() -= 2*nBorderOffset;
+ Size aDocSize = aLbDocuments.GetSizePixel();
+ aDocSize.Width() = aNewSize.Width();
+
+ if(!bSmall)
+ {
+
+ long nListHeight = aLbDocuments.GetSizePixel().Height();
+ aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
+ if(aNewSize.Height()<0) aNewSize.Height()=0;
+
+ aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
+
+ if(aListPos.Y() > aLbEntries.GetPosPixel().Y())
+ aLbDocuments.SetPosPixel( aListPos );
+
+ }
+ aLbEntries.SetSizePixel( aNewSize );
+ aWndScenarios.SetSizePixel( aNewSize );
+ aLbDocuments.SetSizePixel( aDocSize );
+
+ //@@ 03.11.97 end
+
+ BOOL bListMode = (eListMode != NAV_LMODE_NONE);
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat && bListMode )
+ nListModeHeight = nTotalHeight;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
+{
+ if ( rHint.ISA(SfxSimpleHint) )
+ {
+ ULONG nHintId = ((SfxSimpleHint&)rHint).GetId();
+
+ if ( nHintId == SC_HINT_DOCNAME_CHANGED )
+ {
+ aLbEntries.ActiveDocChanged();
+ }
+ else if ( NAV_LMODE_NONE == eListMode )
+ {
+ // Tabellen hier nicht mehr
+ }
+ else
+ {
+ switch ( nHintId )
+ {
+ case SC_HINT_TABLES_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_TABLE );
+ break;
+
+ case SC_HINT_DBAREAS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_DBAREA );
+ break;
+
+ case SC_HINT_AREAS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_RANGENAME );
+ break;
+
+ case SC_HINT_DRAW_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_GRAPHIC );
+ aLbEntries.Refresh( SC_CONTENT_OLEOBJECT );
+ aLbEntries.Refresh( SC_CONTENT_DRAWING );
+ break;
+
+ case SC_HINT_AREALINKS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_AREALINK );
+ break;
+
+ // SFX_HINT_DOCCHANGED kommt nicht nur bei Dokument-Wechsel
+
+ case SC_HINT_NAVIGATOR_UPDATEALL:
+ UpdateAll();
+ break;
+
+ case FID_DATACHANGED:
+ case FID_ANYDATACHANGED:
+ aContentTimer.Start(); // Notizen nicht sofort suchen
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else if ( rHint.ISA(SfxEventHint) )
+ {
+ ULONG nEventId = ((SfxEventHint&)rHint).GetEventId();
+ if ( nEventId == SFX_EVENT_ACTIVATEDOC )
+ {
+ aLbEntries.ActiveDocChanged();
+ UpdateAll();
+ }
+ }
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( ScNavigatorDlg, TimeHdl, Timer*, pTimer )
+{
+ if ( pTimer != &aContentTimer )
+ return 0;
+
+ aLbEntries.Refresh( SC_CONTENT_NOTE );
+ return 0;
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetDropMode(USHORT nNew)
+{
+ nDropMode = nNew;
+ aTbxCmd.UpdateButtons();
+
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ rCfg.SetDragMode(nDropMode);
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::CursorPosChanged()
+{
+ //! Eintraege selektieren ???
+
+// if ( GetDBAtCursor( aStrDbName ) )
+// if ( GetAreaAtCursor( aStrAreaName ) )
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
+{
+ if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
+ {
+ // SID_CURRENTCELL == Item #0 Cache leeren, damit das Setzen der
+ // aktuellen Zelle auch in zusammengefassten Bereichen funktioniert.
+ ppBoundItems[0]->ClearCache();
+
+ ScAddress aScAddress( nColNo, nRowNo, 0 );
+ String aAddr;
+ aScAddress.Format( aAddr, SCA_ABS );
+
+ BOOL bUnmark = FALSE;
+ if ( GetViewData() )
+ bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
+
+ SfxStringItem aPosItem( SID_CURRENTCELL, aAddr );
+ SfxBoolItem aUnmarkItem( FN_PARAM_1, bUnmark ); // ggf. Selektion aufheben
+
+ rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aPosItem, &aUnmarkItem, 0L );
+ }
+}
+
+void ScNavigatorDlg::SetCurrentCellStr( const String rName )
+{
+ ppBoundItems[0]->ClearCache();
+ SfxStringItem aNameItem( SID_CURRENTCELL, rName );
+
+ rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aNameItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
+{
+ if ( nTabNo != nCurTab )
+ {
+ // Tabelle fuer Basic ist 1-basiert
+ SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aTabItem, 0L );
+ }
+}
+
+void ScNavigatorDlg::SetCurrentTableStr( const String rName )
+{
+ if (!GetViewData()) return;
+
+ ScDocument* pDoc = pViewData->GetDocument();
+ SCTAB nCount = pDoc->GetTableCount();
+ String aTabName;
+
+ for ( SCTAB i=0; i<nCount; i++ )
+ {
+ pDoc->GetName( i, aTabName );
+ if ( aTabName == rName )
+ {
+ SetCurrentTable( i );
+ return;
+ }
+ }
+
+ Sound::Beep(); // Tabelle nicht gefunden
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentObject( const String rName )
+{
+ SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aNameItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentDoc( const String& rDocName ) // aktivieren
+{
+ SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aDocItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+ScTabViewShell* ScNavigatorDlg::GetTabViewShell() const
+{
+ return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
+}
+
+//------------------------------------------------------------------------
+
+ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
+{
+ // #95791# Don't store the settings pointer here, because the settings belong to
+ // the view, and the view may be closed while the navigator is open (reload).
+ // If the pointer is cached here again later for performance reasons, it has to
+ // be forgotten when the view is closed.
+
+ ScTabViewShell* pViewSh = GetTabViewShell();
+ return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
+}
+
+//------------------------------------------------------------------------
+
+BOOL ScNavigatorDlg::GetViewData()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+ pViewData = pViewSh ? pViewSh->GetViewData() : NULL;
+
+ return ( pViewData != NULL );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
+{
+ if ( pCol )
+ nCurCol = *pCol;
+ else if ( GetViewData() )
+ nCurCol = pViewData->GetCurX() + 1;
+
+ aEdCol.SetCol( nCurCol );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
+{
+ if ( pRow )
+ nCurRow = *pRow;
+ else if ( GetViewData() )
+ nCurRow = pViewData->GetCurY() + 1;
+
+ aEdRow.SetRow( nCurRow );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
+{
+ if ( pTab )
+ nCurTab = *pTab;
+ else if ( GetViewData() )
+ nCurTab = pViewData->GetTabNo();
+
+// aLbTables.SetTab( nCurTab );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateAll()
+{
+ switch ( eListMode )
+ {
+ case NAV_LMODE_DOCS:
+ case NAV_LMODE_DBAREAS:
+ case NAV_LMODE_AREAS:
+ aLbEntries.Refresh();
+ break;
+
+ case NAV_LMODE_NONE:
+ //! ???
+ break;
+
+ default:
+ break;
+ }
+
+ aContentTimer.Stop(); // dann nicht nochmal
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetListMode( NavListMode eMode, BOOL bSetSize )
+{
+ if ( eMode != eListMode )
+ {
+ if ( eMode != NAV_LMODE_NONE )
+ bFirstBig = FALSE; // nicht mehr automatisch umschalten
+
+ eListMode = eMode;
+
+ switch ( eMode )
+ {
+ case NAV_LMODE_NONE:
+ ShowList( FALSE, bSetSize );
+ break;
+
+ case NAV_LMODE_AREAS:
+ case NAV_LMODE_DBAREAS:
+ case NAV_LMODE_DOCS:
+ aLbEntries.Refresh();
+ ShowList( TRUE, bSetSize );
+ break;
+
+ case NAV_LMODE_SCENARIOS:
+ ShowScenarios( TRUE, bSetSize );
+ break;
+ }
+
+ aTbxCmd.UpdateButtons();
+
+ if ( eMode != NAV_LMODE_NONE )
+ {
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ rCfg.SetListMode( (USHORT) eMode );
+ }
+ }
+
+ if ( pMarkArea )
+ UnmarkDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::ShowList( BOOL bShow, BOOL bSetSize )
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ Size aSize = GetParent()->GetOutputSizePixel();
+
+ if ( bShow )
+ {
+ Size aMinSize = aInitSize;
+
+ aMinSize.Height() += nInitListHeight;
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( aMinSize );
+ aSize.Height() = nListModeHeight;
+ aLbEntries.Show();
+ aLbDocuments.Show();
+ }
+ else
+ {
+ if ( pFloat )
+ {
+ pFloat->SetMinOutputSizePixel( aInitSize );
+ nListModeHeight = aSize.Height();
+ }
+ aSize.Height() = aInitSize.Height();
+ aLbEntries.Hide();
+ aLbDocuments.Hide();
+ }
+ aWndScenarios.Hide();
+
+ if ( pFloat )
+ {
+ if ( bSetSize )
+ pFloat->SetOutputSizePixel( aSize );
+ }
+ else
+ {
+ SfxNavigator* pNav = (SfxNavigator*)GetParent();
+ Size aFloating = pNav->GetFloatingSize();
+ aFloating.Height() = aSize.Height();
+ pNav->SetFloatingSize( aFloating );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::ShowScenarios( BOOL bShow, BOOL bSetSize )
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ Size aSize = GetParent()->GetOutputSizePixel();
+
+ if ( bShow )
+ {
+ Size aMinSize = aInitSize;
+ aMinSize.Height() += nInitListHeight;
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( aMinSize );
+ aSize.Height() = nListModeHeight;
+
+ rBindings.Invalidate( SID_SELECT_SCENARIO );
+ rBindings.Update( SID_SELECT_SCENARIO );
+
+ aWndScenarios.Show();
+ aLbDocuments.Show();
+ }
+ else
+ {
+ if ( pFloat )
+ {
+ pFloat->SetMinOutputSizePixel( aInitSize );
+ nListModeHeight = aSize.Height();
+ }
+ aSize.Height() = aInitSize.Height();
+ aWndScenarios.Hide();
+ aLbDocuments.Hide();
+ }
+ aLbEntries.Hide();
+
+ if ( pFloat )
+ {
+ if ( bSetSize )
+ pFloat->SetOutputSizePixel( aSize );
+ }
+ else
+ {
+ SfxNavigator* pNav = (SfxNavigator*)GetParent();
+ Size aFloating = pNav->GetFloatingSize();
+ aFloating.Height() = aSize.Height();
+ pNav->SetFloatingSize( aFloating );
+ }
+}
+
+
+//------------------------------------------------------------------------
+//
+// Dokumente fuer Dropdown-Listbox
+//
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::GetDocNames( const String* pManualSel )
+{
+ aLbDocuments.Clear();
+ aLbDocuments.SetUpdateMode( FALSE );
+
+ ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
+
+ String aSelEntry;
+ SfxObjectShell* pSh = SfxObjectShell::GetFirst();
+ while ( pSh )
+ {
+ if ( pSh->ISA(ScDocShell) )
+ {
+ String aName = pSh->GetTitle();
+ String aEntry = aName;
+ if (pSh == pCurrentSh)
+ aEntry += aStrActive;
+ else
+ aEntry += aStrNotActive;
+ aLbDocuments.InsertEntry( aEntry );
+
+ if ( pManualSel ? ( aName == *pManualSel )
+ : ( pSh == pCurrentSh ) )
+ aSelEntry = aEntry; // kompletter Eintrag zum Selektieren
+ }
+
+ pSh = SfxObjectShell::GetNext( *pSh );
+ }
+
+ aLbDocuments.InsertEntry( aStrActiveWin );
+
+ String aHidden = aLbEntries.GetHiddenTitle();
+ if (aHidden.Len())
+ {
+ String aEntry = aHidden;
+ aEntry += aStrHidden;
+ aLbDocuments.InsertEntry( aEntry );
+
+ if ( pManualSel && aHidden == *pManualSel )
+ aSelEntry = aEntry;
+ }
+
+ aLbDocuments.SetUpdateMode( TRUE );
+
+ aLbDocuments.SelectEntry( aSelEntry );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::MarkDataArea()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+
+ if ( pViewSh )
+ {
+ if ( !pMarkArea )
+ pMarkArea = new ScArea;
+
+ pViewSh->MarkDataArea();
+ ScRange aMarkRange;
+ pViewSh->GetViewData()->GetMarkData().GetMarkArea(aMarkRange);
+ pMarkArea->nColStart = aMarkRange.aStart.Col();
+ pMarkArea->nRowStart = aMarkRange.aStart.Row();
+ pMarkArea->nColEnd = aMarkRange.aEnd.Col();
+ pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
+ pMarkArea->nTab = aMarkRange.aStart.Tab();
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UnmarkDataArea()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+
+ if ( pViewSh )
+ {
+ pViewSh->Unmark();
+ DELETEZ( pMarkArea );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::CheckDataArea()
+{
+ if ( aTbxCmd.IsItemChecked( IID_DATA ) && pMarkArea )
+ {
+ if ( nCurTab != pMarkArea->nTab
+ || nCurCol < pMarkArea->nColStart+1
+ || nCurCol > pMarkArea->nColEnd+1
+ || nCurRow < pMarkArea->nRowStart+1
+ || nCurRow > pMarkArea->nRowEnd+1 )
+ {
+ aTbxCmd.SetItemState( IID_DATA, TriState(STATE_CHECK) );
+ aTbxCmd.Select( IID_DATA );
+ }
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::StartOfDataArea()
+{
+ // pMarkArea auswerten ???
+
+ if ( GetViewData() )
+ {
+ ScMarkData& rMark = pViewData->GetMarkData();
+ ScRange aMarkRange;
+ rMark.GetMarkArea( aMarkRange );
+
+ SCCOL nCol = aMarkRange.aStart.Col();
+ SCROW nRow = aMarkRange.aStart.Row();
+
+ if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
+ SetCurrentCell( nCol, nRow );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::EndOfDataArea()
+{
+ // pMarkArea auswerten ???
+
+ if ( GetViewData() )
+ {
+ ScMarkData& rMark = pViewData->GetMarkData();
+ ScRange aMarkRange;
+ rMark.GetMarkArea( aMarkRange );
+
+ SCCOL nCol = aMarkRange.aEnd.Col();
+ SCROW nRow = aMarkRange.aEnd.Row();
+
+ if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
+ SetCurrentCell( nCol, nRow );
+ }
+}
+
+//------------------------------------------------------------------------
+
+SfxChildAlignment __EXPORT ScNavigatorDlg::CheckAlignment(
+ SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
+{
+ SfxChildAlignment eRetAlign;
+
+ //! kein Andocken, wenn Listbox nicht da ???
+
+ switch (eAlign)
+ {
+ case SFX_ALIGN_TOP:
+ case SFX_ALIGN_HIGHESTTOP:
+ case SFX_ALIGN_LOWESTTOP:
+ case SFX_ALIGN_BOTTOM:
+ case SFX_ALIGN_LOWESTBOTTOM:
+ case SFX_ALIGN_HIGHESTBOTTOM:
+ eRetAlign = eActAlign; // nicht erlaubt
+ break;
+
+ case SFX_ALIGN_LEFT:
+ case SFX_ALIGN_RIGHT:
+ case SFX_ALIGN_FIRSTLEFT:
+ case SFX_ALIGN_LASTLEFT:
+ case SFX_ALIGN_FIRSTRIGHT:
+ case SFX_ALIGN_LASTRIGHT:
+ eRetAlign = eAlign; // erlaubt
+ break;
+
+ default:
+ eRetAlign = eAlign;
+ break;
+ }
+ return eRetAlign;
+}
+
+//------------------------------------------------------------------------
+//
+// Drop auf den Navigator - andere Datei laden (File oder Bookmark)
+//
+//------------------------------------------------------------------------
+
+#if 0
+BOOL __EXPORT ScNavigatorDlg::Drop( const DropEvent& rEvt )
+{
+ BOOL bReturn = FALSE;
+
+ if ( !aLbEntries.IsInDrag() ) // kein Verschieben innerhalb der TreeListBox
+ {
+ String aFileName;
+
+ SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
+
+ ULONG nFormat = INetBookmark::HasFormat(*pObject);
+ INetBookmark aBookmark;
+ if (aBookmark.Paste(*pObject,nFormat))
+ aFileName = aBookmark.GetURL();
+ else
+ {
+ // FORMAT_FILE direkt aus DragServer
+
+ USHORT nCount = DragServer::GetItemCount();
+ for ( USHORT i = 0; i < nCount && !aFileName.Len(); ++i )
+ if (DragServer::HasFormat( i, FORMAT_FILE ))
+ aFileName = DragServer::PasteFile( i );
+ }
+
+ if ( aFileName.Len() )
+ bReturn = aLbEntries.LoadFile( aFileName );
+ }
+ return bReturn;
+}
+
+BOOL __EXPORT ScNavigatorDlg::QueryDrop( DropEvent& rEvt )
+{
+ BOOL bReturn = FALSE;
+
+ if ( !aLbEntries.IsInDrag() ) // kein Verschieben innerhalb der TreeListBox
+ {
+ SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
+ if ( pObject->HasFormat(FORMAT_FILE)
+ || INetBookmark::HasFormat(*pObject) )
+ {
+ rEvt.SetAction(DROP_COPY); // Kopier-Cursor anzeigen
+ bReturn = TRUE;
+ }
+ }
+
+ return bReturn;
+}
+#endif
+
+
+
diff --git a/sc/source/ui/navipi/navipi.hrc b/sc/source/ui/navipi/navipi.hrc
new file mode 100644
index 000000000000..0adb65a5a042
--- /dev/null
+++ b/sc/source/ui/navipi/navipi.hrc
@@ -0,0 +1,63 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "sc.hrc"
+
+//#define RID_SCDLG_NAVIGATOR 256
+
+#define FT_ROW 1
+#define ED_ROW 2
+#define FT_COL 3
+#define ED_COL 4
+#define LB_DOCUMENTS 5
+#define LB_ENTRIES 6
+#define TBX_CMD 7
+#define STR_DRAGMODE 8
+#define STR_DISPLAY 9
+#define STR_ACTIVE 10
+#define STR_NOTACTIVE 11
+#define STR_HIDDEN 12
+#define STR_ACTIVEWIN 13
+//#define IMG_ENTRIES 14
+#define STR_QHLP_SCEN_LISTBOX 15
+#define STR_QHLP_SCEN_COMMENT 16
+#define IL_CMD 17
+#define ILH_CMD 18
+
+
+
+#define IID_AREAS 1
+#define IID_DBAREAS 2
+#define IID_DATA 3
+#define IID_DOCS 4
+#define IID_UP 5
+#define IID_DOWN 6
+#define IID_SCENARIOS 7
+#define IID_DROPMODE 9
+#define IID_CHANGEROOT 10
+#define IID_ZOOMOUT 11
+
+
diff --git a/sc/source/ui/navipi/navipi.src b/sc/source/ui/navipi/navipi.src
new file mode 100644
index 000000000000..c2e9ecb6a4e6
--- /dev/null
+++ b/sc/source/ui/navipi/navipi.src
@@ -0,0 +1,414 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "navipi.hrc"
+
+#define SC_NAVI_CMD_IDLIST \
+ IdList = \
+ { \
+ IID_DATA ; \
+ IID_UP ; \
+ IID_DOWN ; \
+ IID_SCENARIOS ; \
+ IID_DROPMODE ; \
+ IID_CHANGEROOT ; \
+ IID_ZOOMOUT ; \
+ }; \
+ IdCount = { 8 ; };
+
+// SC_CONTENT_...
+#define SC_NAVI_CONT_IDLIST \
+ IdList = \
+ { \
+ 1 ; \
+ 2 ; \
+ 3 ; \
+ 4 ; \
+ 5 ; \
+ 6 ; \
+ 7 ; \
+ 8 ; \
+ }; \
+ IdCount = { 8 ; };
+
+Window RID_SCDLG_NAVIGATOR
+{
+ SVLook = TRUE ;
+ HelpId = HID_SC_NAVIGATOR ;
+ //? Pos = MAP_APPFONT( 0, 0 );
+ Size = MAP_APPFONT ( 115 , 116 ) ;
+ OutputSize = TRUE ;
+ DialogControl = TRUE ;
+ Hide = TRUE ;
+ Text [ en-US ] = "Navigator" ;
+ // Closeable = TRUE ;
+ // Moveable = TRUE ;
+ // Zoomable = TRUE ;
+ // Sizeable = TRUE ;
+ // EnableResizing = TRUE ;
+ // HideWhenDeactivate = TRUE ;
+ // Border = TRUE ;
+ // Dockable = TRUE ;
+ FixedText FT_ROW
+ {
+ // Pos = MAP_APPFONT( 2, 20 );
+ Pos = MAP_APPFONT ( 2 , 19 ) ;
+ // an kleinere Toolbox-Bitmaps angepasst
+ Size = MAP_APPFONT ( 19 , 10 ) ;
+ Text [ en-US ] = "Row" ;
+ };
+ NumericField ED_ROW
+ {
+ HelpId = HID_SC_NAVIPI_ROW ;
+ Border = TRUE ;
+ // Pos = MAP_APPFONT( 31, 19 );
+ Pos = MAP_APPFONT ( 31 , 18 ) ;
+ // an kleinere Toolbox-Bitmaps angepasst
+ Size = MAP_APPFONT ( 30 , 12 ) ;
+ Right = TRUE ;
+ Repeat = TRUE ;
+ Spin = TRUE ;
+ SpinSize = 1 ;
+ Minimum = 1 ;
+ First = 1 ;
+ QuickHelpText [ en-US ] = "Row" ;
+ };
+ FixedText FT_COL
+ {
+ Pos = MAP_APPFONT ( 2 , 5 ) ;
+ Size = MAP_APPFONT ( 23 , 10 ) ;
+ Text [ en-US ] = "Column" ;
+ };
+ SpinField ED_COL
+ {
+ HelpId = HID_SC_NAVIPI_COL ;
+ Border = TRUE ;
+ Pos = MAP_APPFONT ( 31 , 4 ) ;
+ Size = MAP_APPFONT ( 30 , 12 ) ;
+ Right = TRUE ;
+ Repeat = TRUE ;
+ Spin = TRUE ;
+ QuickHelpText [ en-US ] = "Column" ;
+ };
+ Control LB_ENTRIES
+ {
+ // "Control" braucht immer eigene HelpId
+ HelpId = HID_SC_NAVIPI_ENTRIES ;
+ Border = TRUE ;
+ // Pos = MAP_APPFONT( 2, 52 );
+ Pos = MAP_APPFONT ( 2 , 35 ) ;
+ Size = MAP_APPFONT ( 110 , 100 ) ;
+ TabStop = TRUE ;
+ };
+ ListBox LB_DOCUMENTS
+ {
+ HelpId = HID_SC_NAVIPI_DOC ;
+ Border = TRUE ;
+ // Pos = MAP_APPFONT( 2, 35 );
+ Pos = MAP_APPFONT ( 2 , 89 ) ;
+ Size = MAP_APPFONT ( 82 , 50 ) ;
+ TabStop = TRUE ;
+ DropDown = TRUE ;
+ QuickHelpText [ en-US ] = "Document" ;
+ };
+ ImageList IL_CMD
+ {
+ Prefix = "na";
+ MaskColor = STD_MASKCOLOR ;
+ SC_NAVI_CMD_IDLIST
+ };
+ ImageList ILH_CMD
+ {
+ Prefix = "nah";
+ MaskColor = SC_HC_MASKCOLOR ;
+ SC_NAVI_CMD_IDLIST
+ };
+ ToolBox TBX_CMD
+ {
+ Pos = MAP_APPFONT ( 66 , 3 ) ;
+ HelpId = HID_SC_NAVIPI_TOOLBOX ;
+ SVLook = TRUE ;
+ Border = FALSE ;
+ LineCount = 2 ;
+ ItemList =
+ {
+ ToolBoxItem
+ {
+ Identifier = IID_DATA ;
+ HelpId = HID_SC_NAVIPI_DATA ;
+ Text [ en-US ] = "Data Range" ;
+ };
+ ToolBoxItem
+ {
+ Identifier = IID_UP ;
+ HelpId = HID_SC_NAVIPI_UP ;
+ Text [ en-US ] = "Start" ;
+ };
+ ToolBoxItem
+ {
+ Identifier = IID_DOWN ;
+ HelpId = HID_SC_NAVIPI_DOWN ;
+ Text [ en-US ] = "End" ;
+ };
+ //--------------------------------------------
+ // ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR; };
+ //--------------------------------------------
+ //----------------------------------------
+ ToolBoxItem { Type = TOOLBOXITEM_BREAK ; };
+ //----------------------------------------
+ ToolBoxItem
+ {
+ Identifier = IID_ZOOMOUT ;
+ HelpId = HID_SC_NAVIPI_ZOOM ;
+ Text [ en-US ] = "Contents" ;
+ };
+ ToolBoxItem
+ {
+ Identifier = IID_CHANGEROOT ;
+ HelpId = HID_SC_NAVIPI_ROOT ;
+ Text [ en-US ] = "Toggle" ;
+ };
+ ToolBoxItem
+ {
+ Identifier = IID_SCENARIOS ;
+ HelpId = HID_SC_NAVIPI_SCEN ;
+ Text [ en-US ] = "Scenarios" ;
+ };
+ ToolBoxItem
+ {
+ Identifier = IID_DROPMODE ;
+ HelpId = HID_SC_NAVIPI_DROP ;
+ DropDown = TRUE ;
+ Text [ en-US ] = "Drag Mode" ;
+ };
+ };
+ };
+ String STR_DRAGMODE
+ {
+ Text [ en-US ] = "Drag Mode" ;
+ };
+ String STR_DISPLAY
+ {
+ Text [ en-US ] = "Display" ;
+ };
+ String STR_ACTIVE
+ {
+ Text [ en-US ] = "active" ;
+ };
+ String STR_NOTACTIVE
+ {
+ Text [ en-US ] = "inactive" ;
+ };
+ String STR_HIDDEN
+ {
+ Text [ en-US ] = "hidden" ;
+ };
+ String STR_ACTIVEWIN
+ {
+ Text [ en-US ] = "Active Window" ;
+ };
+
+ String STR_QHLP_SCEN_LISTBOX
+ {
+ Text [ en-US ] = "Scenario Name";
+ };
+
+ String STR_QHLP_SCEN_COMMENT
+ {
+ Text [ en-US ] = "Comment";
+ };
+
+};
+
+
+ImageList RID_IMAGELIST_NAVCONT
+{
+ Prefix = "nc";
+ MaskColor = STD_MASKCOLOR ;
+ SC_NAVI_CONT_IDLIST
+};
+ImageList RID_IMAGELIST_H_NAVCONT
+{
+ Prefix = "nch";
+ MaskColor = SC_HC_MASKCOLOR ;
+ SC_NAVI_CONT_IDLIST
+};
+
+Image RID_IMG_DROP_URL
+{
+ ImageBitmap = Bitmap { File = "dropurl.bmp" ; };
+ MaskColor = STD_MASKCOLOR ;
+};
+Image RID_IMG_DROP_LINK
+{
+ ImageBitmap = Bitmap { File = "droplink.bmp" ; };
+ MaskColor = STD_MASKCOLOR ;
+};
+Image RID_IMG_DROP_COPY
+{
+ ImageBitmap = Bitmap { File = "dropcopy.bmp" ; };
+ MaskColor = STD_MASKCOLOR ;
+};
+Image RID_IMG_H_DROP_URL
+{
+ ImageBitmap = Bitmap { File = "dropurl_h.bmp" ; };
+ MaskColor = SC_HC_MASKCOLOR ;
+};
+Image RID_IMG_H_DROP_LINK
+{
+ ImageBitmap = Bitmap { File = "droplink_h.bmp" ; };
+ MaskColor = SC_HC_MASKCOLOR ;
+};
+Image RID_IMG_H_DROP_COPY
+{
+ ImageBitmap = Bitmap { File = "dropcopy_h.bmp" ; };
+ MaskColor = SC_HC_MASKCOLOR ;
+};
+
+// content description strings are also used in ScLinkTargetsObj
+
+String SCSTR_CONTENT_ROOT
+{
+ Text [ en-US ] = "Contents" ;
+};
+String SCSTR_CONTENT_TABLE
+{
+ Text [ en-US ] = "Sheets" ;
+};
+String SCSTR_CONTENT_RANGENAME
+{
+ Text [ en-US ] = "Range names" ;
+};
+String SCSTR_CONTENT_DBAREA
+{
+ Text [ en-US ] = "Database Ranges" ;
+};
+String SCSTR_CONTENT_GRAPHIC
+{
+ Text [ en-US ] = "Graphics" ;
+};
+String SCSTR_CONTENT_OLEOBJECT
+{
+ Text [ en-US ] = "OLE objects" ;
+};
+String SCSTR_CONTENT_NOTE
+{
+ Text [ en-US ] = "Comments" ;
+};
+String SCSTR_CONTENT_AREALINK
+{
+ Text [ en-US ] = "Linked areas" ;
+};
+String SCSTR_CONTENT_DRAWING
+{
+ Text [ en-US ] = "Drawing objects";
+};
+ // PopupMenu -------------------------------------------------------------
+Menu RID_POPUP_DROPMODE
+{
+ ItemList =
+ {
+ MenuItem
+ {
+ Identifier = RID_DROPMODE_URL ;
+ HelpId = HID_SC_DROPMODE_URL ;
+ Text [ en-US ] = "Insert as Hyperlink" ;
+ };
+ MenuItem
+ {
+ Identifier = RID_DROPMODE_LINK ;
+ HelpId = HID_SC_DROPMODE_LINK ;
+ Text [ en-US ] = "Insert as Link" ;
+ };
+ MenuItem
+ {
+ Identifier = RID_DROPMODE_COPY ;
+ HelpId = HID_SC_DROPMODE_COPY ;
+ Text [ en-US ] = "Insert as Copy" ;
+ };
+ };
+};
+Menu RID_POPUP_NAVIPI_SCENARIO
+{
+ ItemList =
+ {
+ MenuItem
+ {
+ Identifier = RID_NAVIPI_SCENARIO_DELETE ;
+ HelpId = HID_SC_SCENARIO_DELETE ;
+ Text [ en-US ] = "Delete" ;
+ };
+ MenuItem
+ {
+ Identifier = RID_NAVIPI_SCENARIO_EDIT ;
+ HelpId = HID_SC_SCENARIO_EDIT ;
+ Text [ en-US ] = "Properties..." ;
+ };
+ };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sc/source/ui/navipi/scenwnd.cxx b/sc/source/ui/navipi/scenwnd.cxx
new file mode 100644
index 000000000000..e7dff0bf37c7
--- /dev/null
+++ b/sc/source/ui/navipi/scenwnd.cxx
@@ -0,0 +1,309 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+
+
+//------------------------------------------------------------------
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/slstitm.hxx>
+#include <svl/stritem.hxx>
+#include <vcl/msgbox.hxx>
+#include <vcl/svapp.hxx>
+#include "navipi.hxx"
+#include "popmenu.hxx"
+#include "scresid.hxx"
+#include "sc.hrc"
+#include "globstr.hrc"
+
+//========================================================================
+// class ScScenarioWindow ------------------------------------------------
+//========================================================================
+
+ScScenarioListBox::ScScenarioListBox( ScScenarioWindow& rParent ) :
+ ListBox( &rParent, WB_BORDER | WB_TABSTOP ),
+ mrParent( rParent )
+{
+ Font aFont( GetFont() );
+ aFont.SetTransparent( TRUE );
+ aFont.SetWeight( WEIGHT_LIGHT );
+ SetFont( aFont );
+}
+
+ScScenarioListBox::~ScScenarioListBox()
+{
+}
+
+void ScScenarioListBox::UpdateEntries( List* pNewEntryList )
+{
+ Clear();
+ maEntries.clear();
+
+ if( !pNewEntryList )
+ return;
+
+ switch( pNewEntryList->Count() )
+ {
+ case 0:
+ // no scenarios in current sheet
+ mrParent.SetComment( EMPTY_STRING );
+ break;
+
+ case 1:
+ // sheet is a scenario container, comment only
+ mrParent.SetComment( *static_cast< String* >( pNewEntryList->First() ) );
+ break;
+
+ default:
+ {
+ // sheet contains scenarios
+ DBG_ASSERT( pNewEntryList->Count() % 3 == 0, "ScScenarioListBox::UpdateEntries - wrong list size" );
+ SetUpdateMode( FALSE );
+ String* pEntry = static_cast< String* >( pNewEntryList->First() );
+ while( pEntry )
+ {
+ ScenarioEntry aEntry;
+
+ // first entry of a triple is the scenario name
+ aEntry.maName = *pEntry;
+ // second entry of a triple is the scenario comment
+ if( (pEntry = static_cast< String* >( pNewEntryList->Next() )) != 0 )
+ aEntry.maComment = *pEntry;
+ // third entry of a triple is the protection ("0" = not protected, "1" = protected)
+ if( (pEntry = static_cast< String* >( pNewEntryList->Next() )) != 0 )
+ aEntry.mbProtected = (pEntry->Len() > 0) && (pEntry->GetChar( 0 ) != '0');
+
+ maEntries.push_back( aEntry );
+ InsertEntry( aEntry.maName, LISTBOX_APPEND );
+ pEntry = static_cast< String* >( pNewEntryList->Next() );
+ }
+ SetUpdateMode( TRUE );
+ SetNoSelection();
+ mrParent.SetComment( EMPTY_STRING );
+ }
+ }
+}
+
+void ScScenarioListBox::Select()
+{
+ if( const ScenarioEntry* pEntry = GetSelectedEntry() )
+ mrParent.SetComment( pEntry->maComment );
+}
+
+void ScScenarioListBox::DoubleClick()
+{
+ SelectScenario();
+}
+
+long ScScenarioListBox::Notify( NotifyEvent& rNEvt )
+{
+ bool bHandled = false;
+
+ if( rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ KeyCode aCode = rNEvt.GetKeyEvent()->GetKeyCode();
+ switch( aCode.GetCode() )
+ {
+ case KEY_RETURN:
+ SelectScenario();
+ bHandled = true;
+ break;
+ case KEY_DELETE:
+ DeleteScenario( true );
+ bHandled = true;
+ break;
+ }
+ }
+ else if ( rNEvt.GetType() == EVENT_COMMAND && GetSelectEntryCount() )
+ {
+ const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
+ if ( pCEvt && pCEvt->GetCommand() == COMMAND_CONTEXTMENU )
+ {
+ if( const ScenarioEntry* pEntry = GetSelectedEntry() )
+ {
+ if( !pEntry->mbProtected )
+ {
+ ScPopupMenu aPopup( ScResId( RID_POPUP_NAVIPI_SCENARIO ) );
+ aPopup.Execute( this, pCEvt->GetMousePosPixel() );
+ if (aPopup.WasHit())
+ {
+ switch( aPopup.GetSelected() )
+ {
+ case RID_NAVIPI_SCENARIO_DELETE:
+ DeleteScenario( true );
+ break;
+ case RID_NAVIPI_SCENARIO_EDIT:
+ EditScenario();
+ break;
+ }
+ }
+ }
+ }
+ bHandled = true;
+ }
+ }
+
+ return bHandled ? 1 : ListBox::Notify( rNEvt );
+}
+
+const ScScenarioListBox::ScenarioEntry* ScScenarioListBox::GetSelectedEntry() const
+{
+ size_t nPos = GetSelectEntryPos();
+ return (nPos < maEntries.size()) ? &maEntries[ nPos ] : 0;
+}
+
+void ScScenarioListBox::ExecuteScenarioSlot( USHORT nSlotId )
+{
+ if( SfxViewFrame* pViewFrm = SfxViewFrame::Current() )
+ {
+ SfxStringItem aStringItem( nSlotId, GetSelectEntry() );
+ pViewFrm->GetDispatcher()->Execute( nSlotId, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aStringItem, 0L, 0L );
+ }
+}
+
+void ScScenarioListBox::SelectScenario()
+{
+ if( GetSelectEntryCount() > 0 )
+ ExecuteScenarioSlot( SID_SELECT_SCENARIO );
+}
+
+void ScScenarioListBox::EditScenario()
+{
+ if( GetSelectEntryCount() > 0 )
+ ExecuteScenarioSlot( SID_EDIT_SCENARIO );
+}
+
+void ScScenarioListBox::DeleteScenario( bool bQueryBox )
+{
+ if( GetSelectEntryCount() > 0 )
+ if( !bQueryBox || (::QueryBox( 0, WinBits( WB_YES_NO | WB_DEF_YES ), ScGlobal::GetRscString( STR_QUERY_DELSCENARIO ) ).Execute() == RET_YES) )
+ ExecuteScenarioSlot( SID_DELETE_SCENARIO );
+}
+
+//========================================================================
+// class ScScenarioWindow ------------------------------------------------
+//========================================================================
+
+ScScenarioWindow::ScScenarioWindow( Window* pParent,const String& aQH_List,
+ const String& aQH_Comment)
+ : Window ( pParent, WB_TABSTOP | WB_DIALOGCONTROL ),
+ aLbScenario ( *this ),
+ aEdComment ( this, WB_BORDER | WB_LEFT | WB_READONLY | WB_VSCROLL | WB_TABSTOP )
+{
+ Font aFont( GetFont() );
+ aFont.SetTransparent( TRUE );
+ aFont.SetWeight( WEIGHT_LIGHT );
+ aEdComment.SetFont( aFont );
+ aEdComment.SetMaxTextLen( 512 );
+ aLbScenario.SetPosPixel( Point(0,0) );
+ aLbScenario.SetHelpId(HID_SC_SCENWIN_TOP);
+ aEdComment.SetHelpId(HID_SC_SCENWIN_BOTTOM);
+ aLbScenario.Show();
+ aEdComment.Show();
+
+ aLbScenario.SetQuickHelpText(aQH_List);
+ aEdComment.SetQuickHelpText(aQH_Comment);
+ aEdComment.SetBackground( Color( COL_LIGHTGRAY ) );
+
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ if (pViewFrm)
+ {
+ SfxBindings& rBindings = pViewFrm->GetBindings();
+ rBindings.Invalidate( SID_SELECT_SCENARIO );
+ rBindings.Update( SID_SELECT_SCENARIO );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+ScScenarioWindow::~ScScenarioWindow()
+{
+}
+
+void ScScenarioWindow::Paint( const Rectangle& rRec )
+{
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetFaceColor();
+
+ SetBackground( aBgColor );
+
+ Window::Paint( rRec );
+}
+
+// -----------------------------------------------------------------------
+
+void ScScenarioWindow::NotifyState( const SfxPoolItem* pState )
+{
+ if( pState )
+ {
+ aLbScenario.Enable();
+
+ if ( pState->ISA(SfxStringItem) )
+ {
+ String aNewEntry( ((const SfxStringItem*)pState)->GetValue() );
+
+ if ( aNewEntry.Len() > 0 )
+ aLbScenario.SelectEntry( aNewEntry );
+ else
+ aLbScenario.SetNoSelection();
+ }
+ else if ( pState->ISA(SfxStringListItem) )
+ {
+ aLbScenario.UpdateEntries( ((SfxStringListItem*)pState)->GetList() );
+ }
+ }
+ else
+ {
+ aLbScenario.Disable();
+ aLbScenario.SetNoSelection();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void ScScenarioWindow::SetSizePixel( const Size& rNewSize )
+{
+ Size aSize( rNewSize );
+ long nHeight = aSize.Height() / 2;
+
+ Window::SetSizePixel( aSize );
+
+ aSize.Height() = nHeight;
+ aLbScenario.SetSizePixel( aSize );
+
+ aSize.Height() -= 4;
+ aEdComment.SetPosSizePixel( Point( 0, nHeight+4 ), aSize );
+}
+
+
+
+