|  | /************************************************************** | 
|  | * | 
|  | * 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_framework.hxx" | 
|  |  | 
|  | #include <uielement/genericstatusbarcontroller.hxx> | 
|  | #include <uielement/statusbarmerger.hxx> | 
|  |  | 
|  | #include <vos/mutex.hxx> | 
|  | #include <vcl/svapp.hxx> | 
|  | #include <vcl/status.hxx> | 
|  | #include <vcl/image.hxx> | 
|  | #include <toolkit/helper/vclunohelper.hxx> | 
|  | #include <toolkit/helper/convert.hxx> | 
|  |  | 
|  | #include <com/sun/star/ui/ItemStyle.hpp> | 
|  | #include <com/sun/star/beans/XPropertySet.hpp> | 
|  | #include <com/sun/star/awt/ImageDrawMode.hpp> | 
|  | #include <com/sun/star/graphic/GraphicType.hpp> | 
|  |  | 
|  | using ::rtl::OUString; | 
|  |  | 
|  | using namespace ::cppu; | 
|  | using namespace ::com::sun::star; | 
|  | using namespace ::com::sun::star::uno; | 
|  | using namespace ::com::sun::star::lang; | 
|  | using namespace ::com::sun::star::frame; | 
|  |  | 
|  | namespace framework | 
|  | { | 
|  |  | 
|  | GenericStatusbarController::GenericStatusbarController( | 
|  | const Reference< XMultiServiceFactory >& rxServiceManager, | 
|  | const Reference< XFrame >& rxFrame, | 
|  | const Reference< ui::XStatusbarItem >& rxItem, | 
|  | AddonStatusbarItemData *pItemData ) | 
|  | : svt::StatusbarController( rxServiceManager, rxFrame, OUString(), 0 ) | 
|  | , m_bEnabled( sal_False ) | 
|  | , m_bOwnerDraw( sal_False ) | 
|  | , m_pItemData( pItemData ) | 
|  | , m_xGraphic() | 
|  | { | 
|  | m_xStatusbarItem = rxItem; | 
|  | if ( m_xStatusbarItem.is() ) | 
|  | { | 
|  | m_aCommandURL = m_xStatusbarItem->getCommand(); | 
|  | m_nID = m_xStatusbarItem->getItemId(); | 
|  | m_bOwnerDraw = ( m_xStatusbarItem->getStyle() & ui::ItemStyle::OWNER_DRAW ) == ui::ItemStyle::OWNER_DRAW; | 
|  | if ( !m_bOwnerDraw && m_pItemData && m_pItemData->aLabel.getLength() ) | 
|  | m_xStatusbarItem->setText( m_pItemData->aLabel ); | 
|  | } | 
|  | } | 
|  |  | 
|  | GenericStatusbarController::~GenericStatusbarController() | 
|  | { | 
|  | } | 
|  |  | 
|  | void SAL_CALL GenericStatusbarController::dispose() | 
|  | throw ( RuntimeException ) | 
|  | { | 
|  | svt::StatusbarController::dispose(); | 
|  |  | 
|  | vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); | 
|  | m_pItemData = NULL; | 
|  | m_xGraphic.clear(); | 
|  | m_xStatusbarItem.clear(); | 
|  |  | 
|  | } | 
|  |  | 
|  | void SAL_CALL GenericStatusbarController::statusChanged( | 
|  | const FeatureStateEvent& rEvent) | 
|  | throw ( RuntimeException ) | 
|  | { | 
|  | vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); | 
|  |  | 
|  | if ( m_bDisposed || !m_xStatusbarItem.is() ) | 
|  | return; | 
|  |  | 
|  | m_bEnabled = rEvent.IsEnabled; | 
|  |  | 
|  | rtl::OUString aStrValue; | 
|  | Reference< graphic::XGraphic > aGraphic; | 
|  |  | 
|  | if ( rEvent.State >>= aStrValue ) | 
|  | { | 
|  | if ( !m_bOwnerDraw ) | 
|  | m_xStatusbarItem->setText( aStrValue ); | 
|  | else | 
|  | { | 
|  | if ( aStrValue.getLength() ) | 
|  | { | 
|  | m_xStatusbarItem->setQuickHelpText( aStrValue ); | 
|  | } | 
|  | } | 
|  | } | 
|  | else if ( ( rEvent.State >>= aGraphic ) && m_bOwnerDraw ) | 
|  | { | 
|  | m_xGraphic = aGraphic; | 
|  | } | 
|  |  | 
|  | // when the status is updated, and the controller is responsible for | 
|  | // painting the statusbar item content, we must trigger a repaint | 
|  | if ( m_bOwnerDraw && m_xStatusbarItem->getVisible() ) | 
|  | { | 
|  | m_xStatusbarItem->repaint(); | 
|  | } | 
|  | } | 
|  |  | 
|  | void SAL_CALL GenericStatusbarController::paint( | 
|  | const Reference< awt::XGraphics >& xGraphics, | 
|  | const awt::Rectangle& rOutputRectangle, | 
|  | ::sal_Int32 /*nStyle*/ ) | 
|  | throw ( RuntimeException ) | 
|  | { | 
|  | OSL_TRACE("framework::GenericStatusbarController::paint"); | 
|  | ::vos::OGuard aGuard( Application::GetSolarMutex() ); | 
|  |  | 
|  | if ( !m_xStatusbarItem.is() || !xGraphics.is() ) | 
|  | return; | 
|  |  | 
|  | Reference< beans::XPropertySet > xGraphicProps( m_xGraphic, UNO_QUERY ); | 
|  |  | 
|  | if ( xGraphicProps.is() && m_xGraphic->getType() != graphic::GraphicType::EMPTY ) | 
|  | { | 
|  | awt::Size aGraphicSize; | 
|  | xGraphicProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("SizePixel") ) ) >>= aGraphicSize; | 
|  | OSL_ENSURE( aGraphicSize.Height > 0 && aGraphicSize.Width > 0, "Empty status bar graphic!" ); | 
|  |  | 
|  | sal_Int32 nOffset = m_xStatusbarItem->getOffset( ); | 
|  | awt::Point aPos; | 
|  | aPos.X = ( rOutputRectangle.Width + nOffset ) / 2 - aGraphicSize.Width / 2; | 
|  | aPos.Y = rOutputRectangle.Height / 2 - aGraphicSize.Height / 2; | 
|  |  | 
|  | xGraphics->drawImage( rOutputRectangle.X + aPos.X, | 
|  | rOutputRectangle.Y + aPos.Y, | 
|  | aGraphicSize.Width, | 
|  | aGraphicSize.Height, | 
|  | m_bEnabled ? awt::ImageDrawMode::NONE : awt::ImageDrawMode::DISABLE, | 
|  | m_xGraphic ); | 
|  | } | 
|  | else | 
|  | { | 
|  | xGraphics->clear( rOutputRectangle ); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | } |