diff options
Diffstat (limited to 'svtools/source/control/taskbox.cxx')
-rw-r--r-- | svtools/source/control/taskbox.cxx | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/svtools/source/control/taskbox.cxx b/svtools/source/control/taskbox.cxx new file mode 100644 index 000000000000..8e5ff6de8def --- /dev/null +++ b/svtools/source/control/taskbox.cxx @@ -0,0 +1,352 @@ +/************************************************************************* + * + * 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_svtools.hxx" + +#define _TASKBAR_CXX + +#ifndef _TOOLS_LIST_HXX +#include <tools/list.hxx> +#endif +#include <tools/debug.hxx> +#include <vcl/image.hxx> +#include <vcl/help.hxx> + +#include <taskbar.hxx> + +// ======================================================================= + +#define TASKBOX_TASKOFF 3 + +// ======================================================================= + +struct ImplTaskItem +{ + Image maImage; + XubString maText; +}; + +DECLARE_LIST( ImplTaskItemList, ImplTaskItem* ) + +// ======================================================================= + +TaskToolBox::TaskToolBox( Window* pParent, WinBits nWinStyle ) : + ToolBox( pParent, nWinStyle | WB_SCROLL | WB_3DLOOK ) +{ + mpItemList = new ImplTaskItemList; + mnMaxTextWidth = 0; + mnActiveItemId = 0; + mnTaskItem = 0; + mnSmallItem = TOOLBOX_ITEM_NOTFOUND; + mbMinActivate = FALSE; + + SetAlign( WINDOWALIGN_BOTTOM ); + SetButtonType( BUTTON_SYMBOLTEXT ); +} + +// ----------------------------------------------------------------------- + +TaskToolBox::~TaskToolBox() +{ + ImplTaskItem* pItem = mpItemList->First(); + while ( pItem ) + { + delete pItem; + pItem = mpItemList->Next(); + } + + delete mpItemList; +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::ActivateTaskItem( USHORT nItemId, BOOL bMinActivate ) +{ + if ( nItemId ) + { + if ( nItemId != mnActiveItemId ) + { + if ( mnActiveItemId ) + CheckItem( mnActiveItemId, FALSE ); + CheckItem( nItemId ); + mnActiveItemId = nItemId; + } + else + { + if ( !bMinActivate ) + return; + + mbMinActivate = TRUE; + } + + mnTaskItem = nItemId-1; + ActivateTask(); + mnTaskItem = 0; + mbMinActivate = FALSE; + } +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::ActivateTask() +{ + maActivateTaskHdl.Call( this ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::ContextMenu() +{ + maContextMenuHdl.Call( this ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::MouseButtonDown( const MouseEvent& rMEvt ) +{ + if ( !rMEvt.IsRight() ) + ToolBox::MouseButtonDown( rMEvt ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::Resize() +{ + mnOldItemCount = mpItemList->Count(); + mnUpdatePos = (USHORT)mnOldItemCount; + mnUpdateNewPos = TOOLBOX_ITEM_NOTFOUND; + ImplFormatTaskToolBox(); + ToolBox::Resize(); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::Command( const CommandEvent& rCEvt ) +{ + if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) + { + USHORT nItemId = GetItemId( rCEvt.GetMousePosPixel() ); +// Dies machen wir nicht mehr, da es von zu vielen als stoerend empfunden wurde +// ActivateTaskItem( nItemId ); + mnTaskItem = nItemId-1; + + maContextMenuPos = rCEvt.GetMousePosPixel(); + ContextMenu(); + maContextMenuPos = Point(); + mnTaskItem = 0; + } + else + ToolBox::Command( rCEvt ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::RequestHelp( const HelpEvent& rHEvt ) +{ + if ( rHEvt.GetMode() & (HELPMODE_BALLOON | HELPMODE_QUICK) ) + { + USHORT nItemId = GetItemId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) ); + + if ( nItemId ) + { + ImplTaskItem* pItem = mpItemList->GetObject( nItemId-1 ); + if ( pItem ) + { + if ( pItem->maText != GetItemText( nItemId ) ) + { + Rectangle aItemRect = GetItemRect( nItemId ); + if ( rHEvt.GetMode() & HELPMODE_QUICK ) + Help::ShowQuickHelp( this, aItemRect, pItem->maText ); + else + Help::ShowBalloon( this, aItemRect.Center(), aItemRect, pItem->maText ); + } + else + Help::ShowQuickHelp( this, Rectangle(), String() ); + return; + } + } + } + + ToolBox::RequestHelp( rHEvt ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::Select() +{ + USHORT nItemId = GetCurItemId(); + ActivateTaskItem( nItemId, TRUE ); +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::ImplFormatTaskToolBox() +{ + if ( mnUpdateNewPos == TOOLBOX_ITEM_NOTFOUND ) + { + // Eintraege aus der Liste entfernen + while ( mpItemList->Count() > mnUpdatePos ) + delete mpItemList->Remove( (ULONG)mnUpdatePos ); + mnUpdateNewPos = mnUpdatePos; + } + + // Maximale Itemgroesse berechnen + long nOldMaxTextWidth = mnMaxTextWidth; + mnMaxTextWidth = 70; + if ( mpItemList->Count() ) + { + long nWinSize = GetOutputSizePixel().Width()-8; + long nItemSize = mpItemList->GetObject(0)->maImage.GetSizePixel().Width()+7+TASKBOX_TASKOFF+2; + nWinSize -= mpItemList->Count()*nItemSize; + if ( nWinSize > 0 ) + nWinSize /= mpItemList->Count(); + else + nWinSize = 0; + if ( nWinSize < mnMaxTextWidth ) + mnMaxTextWidth = nWinSize; + if ( (mnMaxTextWidth < nOldMaxTextWidth) || + ((mnMaxTextWidth-nOldMaxTextWidth > 3) && + (mnSmallItem != TOOLBOX_ITEM_NOTFOUND)) ) + { + mnSmallItem = TOOLBOX_ITEM_NOTFOUND; + mnUpdateNewPos = 0; + } + } + + // Eintraege aus der ToolBox entfernen, die ersetzt werden + USHORT nBtnPos = (mnUpdateNewPos*2); + while ( nBtnPos < GetItemCount() ) + RemoveItem( nBtnPos ); + if ( mnUpdateNewPos <= (mnActiveItemId-1) ) + mnActiveItemId = 0; + + // Neue Eintrage einfuegen + USHORT i = mnUpdateNewPos; + while ( i < mpItemList->Count() ) + { + ImplTaskItem* pItem = mpItemList->GetObject( i ); + + // Textlaenge berechnen + XubString aText = pItem->maText; + if ( !aText.Len() ) + aText = ' '; + long nTxtWidth = GetTextWidth( aText ); + if ( nTxtWidth > mnMaxTextWidth ) + { + if ( mnSmallItem == TOOLBOX_ITEM_NOTFOUND ) + mnSmallItem = i; + // 3 == Len of "..." + aText.AppendAscii( "..." ); + do + { + aText.Erase( aText.Len()-3-1, 1 ); + nTxtWidth = GetTextWidth( aText ); + } + while ( (nTxtWidth > mnMaxTextWidth) && (aText.Len() > 3) ); + } + + USHORT nItemId = i+1; + if ( aText.EqualsAscii( "..." ) ) + InsertItem( nItemId, pItem->maImage, TIB_LEFT ); + else + InsertItem( nItemId, pItem->maImage, aText, TIB_LEFT ); + InsertSeparator( TOOLBOX_APPEND, TASKBOX_TASKOFF ); + i++; + } + + if ( mnUpdateNewPos != 0 ) + mnMaxTextWidth = nOldMaxTextWidth; + + if ( mnNewActivePos+1 != mnActiveItemId ) + { + if ( mnActiveItemId ) + CheckItem( mnActiveItemId, FALSE ); + mnActiveItemId = mnNewActivePos+1; + CheckItem( mnActiveItemId ); + } +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::StartUpdateTask() +{ + mnOldItemCount = mpItemList->Count(); + mnUpdatePos = 0; + mnUpdateNewPos = TOOLBOX_ITEM_NOTFOUND; + mnNewActivePos = 0xFFFE; +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::UpdateTask( const Image& rImage, const String& rText, + BOOL bActive ) +{ + ImplTaskItem* pItem = mpItemList->GetObject( mnUpdatePos ); + if ( pItem ) + { + if ( (pItem->maText != rText) || (pItem->maImage != rImage) ) + { + // Eintraege aus der Liste entfernen + while ( mpItemList->Count() > mnUpdatePos ) + delete mpItemList->Remove( (ULONG)mnUpdatePos ); + pItem = NULL; + } + } + + if ( !pItem ) + { + if ( mnUpdatePos < mnUpdateNewPos ) + mnUpdateNewPos = mnUpdatePos; + + pItem = new ImplTaskItem; + pItem->maImage = rImage; + pItem->maText = rText; + mpItemList->Insert( pItem, LIST_APPEND ); + } + + if ( bActive ) + mnNewActivePos = mnUpdatePos; + + mnUpdatePos++; +} + +// ----------------------------------------------------------------------- + +void TaskToolBox::EndUpdateTask() +{ + if ( mnUpdateNewPos == TOOLBOX_ITEM_NOTFOUND ) + { + // Eintraege aus der Liste entfernen + while ( mpItemList->Count() > mnUpdatePos ) + delete mpItemList->Remove( (ULONG)mnUpdatePos ); + mnUpdateNewPos = mnUpdatePos; + } + + ImplFormatTaskToolBox(); +} + |