diff options
Diffstat (limited to 'sc/source/ui/navipi')
-rw-r--r-- | sc/source/ui/navipi/content.cxx | 1526 | ||||
-rw-r--r-- | sc/source/ui/navipi/makefile.mk | 57 | ||||
-rw-r--r-- | sc/source/ui/navipi/navcitem.cxx | 127 | ||||
-rw-r--r-- | sc/source/ui/navipi/navipi.cxx | 1565 | ||||
-rw-r--r-- | sc/source/ui/navipi/navipi.hrc | 63 | ||||
-rw-r--r-- | sc/source/ui/navipi/navipi.src | 414 | ||||
-rw-r--r-- | sc/source/ui/navipi/scenwnd.cxx | 309 |
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 ); +} + + + + |