office-gobmx/svtools/source/control/taskbox.cxx
2010-04-19 17:46:40 +02:00

352 lines
10 KiB
C++

/*************************************************************************
*
* 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();
}