| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svtools.hxx" |
| |
| #define _TASKBAR_CXX |
| |
| #include <tools/list.hxx> |
| #include <tools/debug.hxx> |
| #include <vcl/floatwin.hxx> |
| |
| #include <svtools/taskbar.hxx> |
| |
| // ======================================================================= |
| |
| class ImplTaskBarFloat : public FloatingWindow |
| { |
| public: |
| TaskBar* mpTaskBar; |
| |
| public: |
| ImplTaskBarFloat( TaskBar* pTaskBar ); |
| }; |
| |
| // ----------------------------------------------------------------------- |
| |
| ImplTaskBarFloat::ImplTaskBarFloat( TaskBar* pTaskBar ) : |
| FloatingWindow( pTaskBar, 0 ) |
| { |
| mpTaskBar = pTaskBar; |
| } |
| |
| // ======================================================================= |
| |
| #define TASKBAR_BORDER 2 |
| #define TASKBAR_OFFSIZE 3 |
| #define TASKBAR_OFFX 2 |
| #define TASKBAR_OFFY 1 |
| #define TASKBAR_BUTTONOFF 5 |
| #define TASKBAR_AUTOHIDE_HEIGHT 2 |
| |
| // ======================================================================= |
| |
| TaskBar::TaskBar( Window* pParent, WinBits nWinStyle ) : |
| Window( pParent, WB_3DLOOK ) |
| { |
| mpButtonBar = NULL; |
| mpTaskToolBox = NULL; |
| mpStatusBar = NULL; |
| mnStatusWidth = 0; |
| mnOldStatusWidth = 0; |
| mnLines = 1; |
| mnWinBits = nWinStyle; |
| mbStatusText = sal_False; |
| mbShowItems = sal_False; |
| mbAutoHide = sal_False; |
| |
| ImplInitSettings(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskBar::~TaskBar() |
| { |
| if ( mpButtonBar ) |
| delete mpButtonBar; |
| if ( mpTaskToolBox ) |
| delete mpTaskToolBox; |
| if ( mpStatusBar ) |
| delete mpStatusBar; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::ImplInitSettings() |
| { |
| const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); |
| |
| Color aColor; |
| if ( IsControlBackground() ) |
| aColor = GetControlBackground(); |
| else if ( Window::GetStyle() & WB_3DLOOK ) |
| aColor = rStyleSettings.GetFaceColor(); |
| else |
| aColor = rStyleSettings.GetWindowColor(); |
| SetBackground( aColor ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::ImplNewHeight( long nNewHeight ) |
| { |
| long nOldHeight = GetSizePixel().Height(); |
| if ( nNewHeight != nOldHeight ) |
| { |
| long nY = GetPosPixel().Y()-(nNewHeight-nOldHeight); |
| SetPosSizePixel( 0, nY, 0, nNewHeight, |
| WINDOW_POSSIZE_Y | WINDOW_POSSIZE_HEIGHT ); |
| TaskResize(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::TaskResize() |
| { |
| maTaskResizeHdl.Call( this ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskButtonBar* TaskBar::CreateButtonBar() |
| { |
| return new TaskButtonBar( this ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskToolBox* TaskBar::CreateTaskToolBox() |
| { |
| return new TaskToolBox( this ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskStatusBar* TaskBar::CreateTaskStatusBar() |
| { |
| return new TaskStatusBar( this ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::MouseMove( const MouseEvent& rMEvt ) |
| { |
| if ( mnWinBits & WB_SIZEABLE ) |
| { |
| TaskToolBox* pTempTaskToolBox = GetTaskToolBox(); |
| TaskStatusBar* pTempStatusBar = GetStatusBar(); |
| |
| if ( pTempTaskToolBox && pTempStatusBar ) |
| { |
| long nStatusX = pTempStatusBar->GetPosPixel().X()-TASKBAR_OFFSIZE-2; |
| long nMouseX = rMEvt.GetPosPixel().X(); |
| PointerStyle ePtrStyle; |
| if ( (nMouseX >= nStatusX-1) && (nMouseX <= nStatusX+3) ) |
| ePtrStyle = POINTER_HSIZEBAR; |
| else |
| ePtrStyle = POINTER_ARROW; |
| Pointer aPtr( ePtrStyle ); |
| SetPointer( aPtr ); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::MouseButtonDown( const MouseEvent& rMEvt ) |
| { |
| if ( rMEvt.IsLeft() && (mnWinBits & WB_SIZEABLE) ) |
| { |
| TaskToolBox* pTempTaskToolBox = GetTaskToolBox(); |
| TaskStatusBar* pTempStatusBar = GetStatusBar(); |
| |
| if ( pTempTaskToolBox && pTempStatusBar ) |
| { |
| long nStatusX = pTempStatusBar->GetPosPixel().X()-TASKBAR_OFFSIZE-2; |
| long nMouseX = rMEvt.GetPosPixel().X(); |
| if ( (nMouseX >= nStatusX-1) && (nMouseX <= nStatusX+3) ) |
| { |
| if ( rMEvt.GetClicks() == 2 ) |
| { |
| if ( mnStatusWidth ) |
| { |
| mnStatusWidth = 0; |
| Resize(); |
| } |
| } |
| else |
| { |
| StartTracking(); |
| mnOldStatusWidth = mnStatusWidth; |
| mnMouseOff = nMouseX-nStatusX; |
| } |
| } |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::Tracking( const TrackingEvent& rTEvt ) |
| { |
| if ( rTEvt.IsTrackingEnded() ) |
| { |
| if ( rTEvt.IsTrackingCanceled() ) |
| { |
| mnStatusWidth = mnOldStatusWidth; |
| Resize(); |
| Update(); |
| } |
| } |
| else |
| { |
| Size aSize = GetOutputSizePixel(); |
| |
| long nMouseX = rTEvt.GetMouseEvent().GetPosPixel().X()-mnMouseOff; |
| if ( nMouseX < 0 ) |
| nMouseX = 0; |
| long nMaxX = aSize.Width()-TASKBAR_OFFX-TASKBAR_OFFSIZE-1; |
| if ( nMouseX > nMaxX ) |
| nMouseX = nMaxX; |
| mnStatusWidth = aSize.Width()-nMouseX-TASKBAR_OFFX-TASKBAR_OFFSIZE; |
| Resize(); |
| Update(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::Paint( const Rectangle& rRect ) |
| { |
| if ( mnWinBits & (WB_BORDER | WB_SIZEABLE) ) |
| { |
| const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); |
| Size aSize = GetOutputSizePixel(); |
| long nY = 0; |
| |
| if ( mnWinBits & WB_BORDER ) |
| { |
| SetLineColor( rStyleSettings.GetShadowColor() ); |
| DrawLine( Point( 0, 0 ), Point( aSize.Width()-1, 0 ) ); |
| SetLineColor( rStyleSettings.GetLightColor() ); |
| DrawLine( Point( 0, 1 ), Point( aSize.Width()-1, 1 ) ); |
| nY += 2; |
| } |
| |
| if ( (mnWinBits & WB_SIZEABLE) ) |
| { |
| //TaskButtonBar* pTempButtonBar = GetButtonBar(); |
| TaskToolBox* pTempTaskToolBox = GetTaskToolBox(); |
| TaskStatusBar* pTempStatusBar = GetStatusBar(); |
| |
| if ( pTempTaskToolBox && pTempStatusBar ) |
| { |
| long nStatusX = pTempStatusBar->GetPosPixel().X()-TASKBAR_OFFSIZE-2; |
| if ( nStatusX > 0 ) |
| { |
| SetLineColor( rStyleSettings.GetShadowColor() ); |
| DrawLine( Point( nStatusX, nY ), Point( nStatusX, aSize.Height()-1 ) ); |
| nStatusX++; |
| SetLineColor( rStyleSettings.GetLightColor() ); |
| DrawLine( Point( nStatusX, nY ), Point( nStatusX, aSize.Height()-1 ) ); |
| } |
| } |
| } |
| } |
| |
| Window::Paint( rRect ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::Resize() |
| { |
| if ( !IsReallyShown() ) |
| return; |
| |
| TaskButtonBar* pTempButtonBar = GetButtonBar(); |
| TaskToolBox* pTempTaskToolBox = GetTaskToolBox(); |
| TaskStatusBar* pTempStatusBar = GetStatusBar(); |
| Point aToolPos( TASKBAR_OFFX, 0 ); |
| Size aSize = GetOutputSizePixel(); |
| Size aStatusSize; |
| Size aToolSize( aSize.Width()-(TASKBAR_OFFX*2), 0 ); |
| long nOldStatusX = -1; |
| long nNewStatusX = -1; |
| long nTaskHeight = aSize.Height() - (TASKBAR_OFFY*2); |
| |
| if ( mnWinBits & WB_BORDER ) |
| { |
| nTaskHeight -= TASKBAR_BORDER; |
| aToolPos.Y() += TASKBAR_BORDER; |
| } |
| |
| if ( pTempButtonBar ) |
| { |
| sal_uInt16 i = 0; |
| sal_Bool bVisibleItems = sal_False; |
| while ( i < pTempButtonBar->GetItemCount() ) |
| { |
| if ( pTempButtonBar->IsItemVisible( pTempButtonBar->GetItemId( i ) ) ) |
| { |
| bVisibleItems = sal_True; |
| break; |
| } |
| i++; |
| } |
| if ( mbStatusText || !bVisibleItems ) |
| pTempButtonBar->Hide(); |
| else |
| { |
| Size aButtonBarSize = pTempButtonBar->CalcWindowSizePixel(); |
| if ( pTempButtonBar->GetItemCount() ) |
| nTaskHeight = aButtonBarSize.Height(); |
| else |
| aButtonBarSize.Height() = nTaskHeight; |
| Point aTempPos = aToolPos; |
| aTempPos.Y() += (aSize.Height()-aButtonBarSize.Height()-aTempPos.Y())/2; |
| pTempButtonBar->SetPosSizePixel( aTempPos, aButtonBarSize ); |
| pTempButtonBar->Show(); |
| aToolPos.X() += aButtonBarSize.Width()+TASKBAR_BUTTONOFF; |
| } |
| } |
| |
| if ( pTempStatusBar ) |
| { |
| aStatusSize = pTempStatusBar->CalcWindowSizePixel(); |
| if ( mnStatusWidth ) |
| aStatusSize.Width() = mnStatusWidth; |
| if ( !pTempTaskToolBox || mbStatusText ) |
| aStatusSize.Width() = aSize.Width(); |
| long nMaxHeight = aSize.Height()-(TASKBAR_OFFY*2); |
| if ( mnWinBits & WB_BORDER ) |
| nMaxHeight -= TASKBAR_BORDER; |
| if ( nMaxHeight+2 > aStatusSize.Height() ) |
| aStatusSize.Height() = nMaxHeight; |
| Point aPos( aSize.Width()-aStatusSize.Width(), 0 ); |
| if ( pTempTaskToolBox && (mnWinBits & WB_SIZEABLE) && !mbStatusText ) |
| { |
| long nMinToolWidth = aToolPos.X()+50; |
| if ( aPos.X() < nMinToolWidth ) |
| { |
| aStatusSize.Width() -= nMinToolWidth-aPos.X(); |
| aPos.X() = nMinToolWidth; |
| } |
| } |
| if ( aPos.X() < 0 ) |
| { |
| aStatusSize.Width() = aSize.Width(); |
| aPos.X() = 0; |
| } |
| if ( mnWinBits & WB_BORDER ) |
| aPos.Y() += TASKBAR_BORDER; |
| aPos.Y() += (aSize.Height()-aStatusSize.Height()-aPos.Y())/2; |
| if ( mnWinBits & WB_SIZEABLE ) |
| { |
| if ( pTempTaskToolBox ) |
| { |
| nOldStatusX = pTempStatusBar->GetPosPixel().X()-TASKBAR_OFFSIZE-2; |
| nNewStatusX = aPos.X()-TASKBAR_OFFSIZE-2; |
| } |
| } |
| pTempStatusBar->SetPosSizePixel( aPos, aStatusSize ); |
| pTempStatusBar->Show(); |
| aToolSize.Width() = aPos.X()-aToolPos.X()-TASKBAR_OFFX; |
| if ( mnWinBits & WB_SIZEABLE ) |
| aToolSize.Width() -= (TASKBAR_OFFSIZE*2)-2; |
| } |
| |
| if ( pTempTaskToolBox ) |
| { |
| if ( aToolSize.Width() <= 24 ) |
| pTempTaskToolBox->Hide(); |
| else |
| { |
| aToolSize.Height() = pTempTaskToolBox->CalcWindowSizePixel().Height(); |
| if ( pTempTaskToolBox->GetItemCount() ) |
| nTaskHeight = aToolSize.Height(); |
| else |
| aToolSize.Height() = nTaskHeight; |
| aToolPos.Y() += (aSize.Height()-aToolSize.Height()-aToolPos.Y())/2; |
| pTempTaskToolBox->SetPosSizePixel( aToolPos, aToolSize ); |
| pTempTaskToolBox->Show(); |
| } |
| } |
| |
| if ( nOldStatusX != nNewStatusX ) |
| { |
| if ( nOldStatusX > 0 ) |
| { |
| Rectangle aRect( nOldStatusX, 0, nOldStatusX+2, aSize.Height()-1 ); |
| Invalidate( aRect ); |
| } |
| if ( nNewStatusX > 0 ) |
| { |
| Rectangle aRect( nNewStatusX, 0, nNewStatusX+2, aSize.Height()-1 ); |
| Invalidate( aRect ); |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::StateChanged( StateChangedType nType ) |
| { |
| Window::StateChanged( nType ); |
| |
| if ( nType == STATE_CHANGE_INITSHOW ) |
| Format(); |
| else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) |
| { |
| ImplInitSettings(); |
| Invalidate(); |
| } |
| else if ( nType == STATE_CHANGE_FORMAT ) |
| { |
| ImplInitSettings(); |
| ImplNewHeight( CalcWindowSizePixel().Height() ); |
| Format(); |
| Invalidate(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::DataChanged( const DataChangedEvent& rDCEvt ) |
| { |
| Window::DataChanged( rDCEvt ); |
| |
| if ( (rDCEvt.GetType() == DATACHANGED_FONTS) || |
| (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) || |
| ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && |
| (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) |
| { |
| // Asyncronen StateChanged ausloesen, damit sich die |
| // TaskBar an die neuen Groessen der Child-Fenster |
| // orientieren kann |
| PostStateChanged( STATE_CHANGE_FORMAT ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::Format() |
| { |
| ImplNewHeight( CalcWindowSizePixel().Height() ); |
| Resize(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::SetLines( sal_uInt16 nLines ) |
| { |
| mnLines = nLines; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::EnableAutoHide( sal_Bool bAutoHide ) |
| { |
| mbAutoHide = bAutoHide; |
| |
| if ( mbAutoHide ) |
| { |
| ImplNewHeight( TASKBAR_AUTOHIDE_HEIGHT ); |
| } |
| else |
| { |
| ImplNewHeight( CalcWindowSizePixel().Height() ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::ShowStatusText( const String& rText ) |
| { |
| if ( mpStatusBar ) |
| { |
| if ( !mbStatusText ) |
| { |
| mbStatusText = sal_True; |
| if ( mpStatusBar->AreItemsVisible() ) |
| { |
| mbShowItems = sal_True; |
| mpStatusBar->HideItems(); |
| } |
| else |
| mbShowItems = sal_True; |
| maOldText = mpStatusBar->GetText(); |
| Resize(); |
| mpStatusBar->SetText( rText ); |
| Update(); |
| mpStatusBar->Update(); |
| } |
| else |
| mpStatusBar->SetText( rText ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void TaskBar::HideStatusText() |
| { |
| if ( mbStatusText && mpStatusBar ) |
| { |
| mbStatusText = sal_False; |
| mpStatusBar->SetText( maOldText ); |
| Resize(); |
| if ( mbShowItems ) |
| mpStatusBar->ShowItems(); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Size TaskBar::CalcWindowSizePixel() const |
| { |
| TaskButtonBar* pTempButtonBar = GetButtonBar(); |
| TaskToolBox* pTempTaskToolBox = GetTaskToolBox(); |
| TaskStatusBar* pTempStatusBar = GetStatusBar(); |
| Size aSize; |
| long nTempHeight; |
| |
| if ( pTempButtonBar && pTempButtonBar->GetItemCount() ) |
| aSize.Height() = pTempButtonBar->CalcWindowSizePixel().Height()+(TASKBAR_OFFY*2); |
| if ( pTempTaskToolBox && pTempTaskToolBox->GetItemCount() ) |
| { |
| nTempHeight = pTempTaskToolBox->CalcWindowSizePixel().Height()+(TASKBAR_OFFY*2); |
| if ( nTempHeight > aSize.Height() ) |
| aSize.Height() = nTempHeight; |
| } |
| if ( pTempStatusBar ) |
| { |
| nTempHeight = pTempStatusBar->GetSizePixel().Height(); |
| if ( nTempHeight > aSize.Height() ) |
| aSize.Height() = nTempHeight; |
| } |
| |
| if ( mnWinBits & WB_BORDER ) |
| aSize.Height() += TASKBAR_BORDER; |
| |
| return aSize; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskButtonBar* TaskBar::GetButtonBar() const |
| { |
| if ( !mpButtonBar ) |
| ((TaskBar*)this)->mpButtonBar = ((TaskBar*)this)->CreateButtonBar(); |
| return mpButtonBar; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskToolBox* TaskBar::GetTaskToolBox() const |
| { |
| if ( !mpTaskToolBox ) |
| ((TaskBar*)this)->mpTaskToolBox = ((TaskBar*)this)->CreateTaskToolBox(); |
| return mpTaskToolBox; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| TaskStatusBar* TaskBar::GetStatusBar() const |
| { |
| if ( !mpStatusBar ) |
| { |
| ((TaskBar*)this)->mpStatusBar = ((TaskBar*)this)->CreateTaskStatusBar(); |
| if ( mpStatusBar ) |
| mpStatusBar->mpNotifyTaskBar = (TaskBar*)this; |
| } |
| return mpStatusBar; |
| } |