blob: 2e58103ce6ca57f8dff0f50536f166f57bb4b5d9 [file] [log] [blame]
/**************************************************************
*
* 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"
#include "svtools/table/tablecontrol.hxx"
#include "tabledatawindow.hxx"
#include "tablecontrol_impl.hxx"
#include "tablegeometry.hxx"
#include <vcl/help.hxx>
//......................................................................................................................
namespace svt { namespace table
{
//......................................................................................................................
/** === begin UNO using === **/
using ::com::sun::star::uno::Any;
/** === end UNO using === **/
//==================================================================================================================
//= TableDataWindow
//==================================================================================================================
//------------------------------------------------------------------------------------------------------------------
TableDataWindow::TableDataWindow( TableControl_Impl& _rTableControl )
:Window( &_rTableControl.getAntiImpl() )
,m_rTableControl( _rTableControl )
,m_nTipWindowHandle( 0 )
{
// by default, use the background as determined by the style settings
const Color aWindowColor( GetSettings().GetStyleSettings().GetFieldColor() );
SetBackground( Wallpaper( aWindowColor ) );
SetFillColor( aWindowColor );
}
//------------------------------------------------------------------------------------------------------------------
TableDataWindow::~TableDataWindow()
{
impl_hideTipWindow();
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::Paint( const Rectangle& rUpdateRect )
{
m_rTableControl.doPaintContent( rUpdateRect );
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::SetBackground( const Wallpaper& rColor )
{
Window::SetBackground( rColor );
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::SetControlBackground( const Color& rColor )
{
Window::SetControlBackground( rColor );
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::SetBackground()
{
Window::SetBackground();
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::SetControlBackground()
{
Window::SetControlBackground();
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::RequestHelp( const HelpEvent& rHEvt )
{
sal_uInt16 const nHelpMode = rHEvt.GetMode();
if ( ( IsMouseCaptured() )
|| ( ( nHelpMode & HELPMODE_QUICK ) == 0 )
)
{
Window::RequestHelp( rHEvt );
return;
}
::rtl::OUString sHelpText;
sal_uInt16 nHelpStyle = 0;
Point const aMousePos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
RowPos const hitRow = m_rTableControl.getRowAtPoint( aMousePos );
ColPos const hitCol = m_rTableControl.getColAtPoint( aMousePos );
PTableModel const pTableModel( m_rTableControl.getModel() );
if ( ( hitCol >= 0 ) && ( hitCol < pTableModel->getColumnCount() ) )
{
if ( hitRow == ROW_COL_HEADERS )
{
sHelpText = pTableModel->getColumnModel( hitCol )->getHelpText();
}
else if ( ( hitRow >= 0 ) && ( hitRow < pTableModel->getRowCount() ) )
{
Any aCellToolTip;
pTableModel->getCellToolTip( hitCol, hitRow, aCellToolTip );
if ( !aCellToolTip.hasValue() )
{
// use the cell content
pTableModel->getCellContent( hitCol, hitRow, aCellToolTip );
// use the cell content as tool tip only if it doesn't fit into the cell.
bool const activeCell = ( hitRow == m_rTableControl.getCurrentRow() ) && ( hitCol == m_rTableControl.getCurrentColumn() );
bool const selectedCell = m_rTableControl.isRowSelected( hitRow );
Rectangle const aWindowRect( Point( 0, 0 ), GetOutputSizePixel() );
TableCellGeometry const aCell( m_rTableControl, aWindowRect, hitCol, hitRow );
Rectangle const aCellRect( aCell.getRect() );
PTableRenderer const pRenderer = pTableModel->getRenderer();
if ( pRenderer->FitsIntoCell( aCellToolTip, hitCol, hitRow, activeCell, selectedCell, *this, aCellRect ) )
aCellToolTip.clear();
}
pTableModel->getRenderer()->GetFormattedCellString( aCellToolTip, hitCol, hitRow, sHelpText );
if ( sHelpText.indexOf( '\n' ) >= 0 )
nHelpStyle = QUICKHELP_TIP_STYLE_BALLOON;
}
}
if ( sHelpText.getLength() )
{
// hide the standard (singleton) help window, so we do not have two help windows open at the same time
Help::HideBalloonAndQuickHelp();
Rectangle const aControlScreenRect(
OutputToScreenPixel( Point( 0, 0 ) ),
GetOutputSizePixel()
);
if ( m_nTipWindowHandle )
{
Help::UpdateTip( m_nTipWindowHandle, this, aControlScreenRect, sHelpText );
}
else
m_nTipWindowHandle = Help::ShowTip( this, aControlScreenRect, sHelpText, nHelpStyle );
}
else
{
impl_hideTipWindow();
Window::RequestHelp( rHEvt );
}
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::impl_hideTipWindow()
{
if ( m_nTipWindowHandle != 0 )
{
Help::HideTip( m_nTipWindowHandle );
m_nTipWindowHandle = 0;
}
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::MouseMove( const MouseEvent& rMEvt )
{
if ( rMEvt.IsLeaveWindow() )
impl_hideTipWindow();
if ( !m_rTableControl.getInputHandler()->MouseMove( m_rTableControl, rMEvt ) )
{
Window::MouseMove( rMEvt );
}
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::MouseButtonDown( const MouseEvent& rMEvt )
{
impl_hideTipWindow();
Point const aPoint = rMEvt.GetPosPixel();
RowPos const hitRow = m_rTableControl.getRowAtPoint( aPoint );
bool const wasRowSelected = m_rTableControl.isRowSelected( hitRow );
size_t const nPrevSelRowCount = m_rTableControl.getSelectedRowCount();
if ( !m_rTableControl.getInputHandler()->MouseButtonDown( m_rTableControl, rMEvt ) )
{
Window::MouseButtonDown( rMEvt );
return;
}
bool const isRowSelected = m_rTableControl.isRowSelected( hitRow );
size_t const nCurSelRowCount = m_rTableControl.getSelectedRowCount();
if ( isRowSelected != wasRowSelected || nCurSelRowCount != nPrevSelRowCount )
{
m_aSelectHdl.Call( NULL );
}
}
//------------------------------------------------------------------------------------------------------------------
void TableDataWindow::MouseButtonUp( const MouseEvent& rMEvt )
{
if ( !m_rTableControl.getInputHandler()->MouseButtonUp( m_rTableControl, rMEvt ) )
Window::MouseButtonUp( rMEvt );
m_rTableControl.getAntiImpl().GrabFocus();
}
//------------------------------------------------------------------------------------------------------------------
long TableDataWindow::Notify(NotifyEvent& rNEvt )
{
long nDone = 0;
if ( rNEvt.GetType() == EVENT_COMMAND )
{
const CommandEvent& rCEvt = *rNEvt.GetCommandEvent();
if ( rCEvt.GetCommand() == COMMAND_WHEEL )
{
const CommandWheelData* pData = rCEvt.GetWheelData();
if( !pData->GetModifier() && ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) )
{
nDone = HandleScrollCommand( rCEvt, m_rTableControl.getHorzScrollbar(), m_rTableControl.getVertScrollbar() );
}
}
}
return nDone ? nDone : Window::Notify( rNEvt );
}
//......................................................................................................................
} } // namespace svt::table
//......................................................................................................................