1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "svtools/table/tablecontrol.hxx" 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #include "tabledatawindow.hxx" 30*b1cdbd2cSJim Jagielski #include "tablecontrol_impl.hxx" 31*b1cdbd2cSJim Jagielski #include "tablegeometry.hxx" 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski #include <vcl/help.hxx> 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski //...................................................................................................................... 36*b1cdbd2cSJim Jagielski namespace svt { namespace table 37*b1cdbd2cSJim Jagielski { 38*b1cdbd2cSJim Jagielski //...................................................................................................................... 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 41*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 42*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //================================================================================================================== 45*b1cdbd2cSJim Jagielski //= TableDataWindow 46*b1cdbd2cSJim Jagielski //================================================================================================================== 47*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ TableDataWindow(TableControl_Impl & _rTableControl)48*b1cdbd2cSJim Jagielski TableDataWindow::TableDataWindow( TableControl_Impl& _rTableControl ) 49*b1cdbd2cSJim Jagielski :Window( &_rTableControl.getAntiImpl() ) 50*b1cdbd2cSJim Jagielski ,m_rTableControl( _rTableControl ) 51*b1cdbd2cSJim Jagielski ,m_nTipWindowHandle( 0 ) 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski // by default, use the background as determined by the style settings 54*b1cdbd2cSJim Jagielski const Color aWindowColor( GetSettings().GetStyleSettings().GetFieldColor() ); 55*b1cdbd2cSJim Jagielski SetBackground( Wallpaper( aWindowColor ) ); 56*b1cdbd2cSJim Jagielski SetFillColor( aWindowColor ); 57*b1cdbd2cSJim Jagielski } 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ ~TableDataWindow()60*b1cdbd2cSJim Jagielski TableDataWindow::~TableDataWindow() 61*b1cdbd2cSJim Jagielski { 62*b1cdbd2cSJim Jagielski impl_hideTipWindow(); 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ Paint(const Rectangle & rUpdateRect)66*b1cdbd2cSJim Jagielski void TableDataWindow::Paint( const Rectangle& rUpdateRect ) 67*b1cdbd2cSJim Jagielski { 68*b1cdbd2cSJim Jagielski m_rTableControl.doPaintContent( rUpdateRect ); 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ SetBackground(const Wallpaper & rColor)71*b1cdbd2cSJim Jagielski void TableDataWindow::SetBackground( const Wallpaper& rColor ) 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski Window::SetBackground( rColor ); 74*b1cdbd2cSJim Jagielski } 75*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ SetControlBackground(const Color & rColor)76*b1cdbd2cSJim Jagielski void TableDataWindow::SetControlBackground( const Color& rColor ) 77*b1cdbd2cSJim Jagielski { 78*b1cdbd2cSJim Jagielski Window::SetControlBackground( rColor ); 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ SetBackground()81*b1cdbd2cSJim Jagielski void TableDataWindow::SetBackground() 82*b1cdbd2cSJim Jagielski { 83*b1cdbd2cSJim Jagielski Window::SetBackground(); 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ SetControlBackground()86*b1cdbd2cSJim Jagielski void TableDataWindow::SetControlBackground() 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski Window::SetControlBackground(); 89*b1cdbd2cSJim Jagielski } 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ RequestHelp(const HelpEvent & rHEvt)92*b1cdbd2cSJim Jagielski void TableDataWindow::RequestHelp( const HelpEvent& rHEvt ) 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski sal_uInt16 const nHelpMode = rHEvt.GetMode(); 95*b1cdbd2cSJim Jagielski if ( ( IsMouseCaptured() ) 96*b1cdbd2cSJim Jagielski || ( ( nHelpMode & HELPMODE_QUICK ) == 0 ) 97*b1cdbd2cSJim Jagielski ) 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski Window::RequestHelp( rHEvt ); 100*b1cdbd2cSJim Jagielski return; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski ::rtl::OUString sHelpText; 104*b1cdbd2cSJim Jagielski sal_uInt16 nHelpStyle = 0; 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski Point const aMousePos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) ); 107*b1cdbd2cSJim Jagielski RowPos const hitRow = m_rTableControl.getRowAtPoint( aMousePos ); 108*b1cdbd2cSJim Jagielski ColPos const hitCol = m_rTableControl.getColAtPoint( aMousePos ); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski PTableModel const pTableModel( m_rTableControl.getModel() ); 111*b1cdbd2cSJim Jagielski if ( ( hitCol >= 0 ) && ( hitCol < pTableModel->getColumnCount() ) ) 112*b1cdbd2cSJim Jagielski { 113*b1cdbd2cSJim Jagielski if ( hitRow == ROW_COL_HEADERS ) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski sHelpText = pTableModel->getColumnModel( hitCol )->getHelpText(); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski else if ( ( hitRow >= 0 ) && ( hitRow < pTableModel->getRowCount() ) ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski Any aCellToolTip; 120*b1cdbd2cSJim Jagielski pTableModel->getCellToolTip( hitCol, hitRow, aCellToolTip ); 121*b1cdbd2cSJim Jagielski if ( !aCellToolTip.hasValue() ) 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski // use the cell content 124*b1cdbd2cSJim Jagielski pTableModel->getCellContent( hitCol, hitRow, aCellToolTip ); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski // use the cell content as tool tip only if it doesn't fit into the cell. 127*b1cdbd2cSJim Jagielski bool const activeCell = ( hitRow == m_rTableControl.getCurrentRow() ) && ( hitCol == m_rTableControl.getCurrentColumn() ); 128*b1cdbd2cSJim Jagielski bool const selectedCell = m_rTableControl.isRowSelected( hitRow ); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski Rectangle const aWindowRect( Point( 0, 0 ), GetOutputSizePixel() ); 131*b1cdbd2cSJim Jagielski TableCellGeometry const aCell( m_rTableControl, aWindowRect, hitCol, hitRow ); 132*b1cdbd2cSJim Jagielski Rectangle const aCellRect( aCell.getRect() ); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski PTableRenderer const pRenderer = pTableModel->getRenderer(); 135*b1cdbd2cSJim Jagielski if ( pRenderer->FitsIntoCell( aCellToolTip, hitCol, hitRow, activeCell, selectedCell, *this, aCellRect ) ) 136*b1cdbd2cSJim Jagielski aCellToolTip.clear(); 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski pTableModel->getRenderer()->GetFormattedCellString( aCellToolTip, hitCol, hitRow, sHelpText ); 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski if ( sHelpText.indexOf( '\n' ) >= 0 ) 142*b1cdbd2cSJim Jagielski nHelpStyle = QUICKHELP_TIP_STYLE_BALLOON; 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski if ( sHelpText.getLength() ) 147*b1cdbd2cSJim Jagielski { 148*b1cdbd2cSJim Jagielski // hide the standard (singleton) help window, so we do not have two help windows open at the same time 149*b1cdbd2cSJim Jagielski Help::HideBalloonAndQuickHelp(); 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski Rectangle const aControlScreenRect( 152*b1cdbd2cSJim Jagielski OutputToScreenPixel( Point( 0, 0 ) ), 153*b1cdbd2cSJim Jagielski GetOutputSizePixel() 154*b1cdbd2cSJim Jagielski ); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski if ( m_nTipWindowHandle ) 157*b1cdbd2cSJim Jagielski { 158*b1cdbd2cSJim Jagielski Help::UpdateTip( m_nTipWindowHandle, this, aControlScreenRect, sHelpText ); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski else 161*b1cdbd2cSJim Jagielski m_nTipWindowHandle = Help::ShowTip( this, aControlScreenRect, sHelpText, nHelpStyle ); 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski else 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski impl_hideTipWindow(); 166*b1cdbd2cSJim Jagielski Window::RequestHelp( rHEvt ); 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski } 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ impl_hideTipWindow()171*b1cdbd2cSJim Jagielski void TableDataWindow::impl_hideTipWindow() 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski if ( m_nTipWindowHandle != 0 ) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski Help::HideTip( m_nTipWindowHandle ); 176*b1cdbd2cSJim Jagielski m_nTipWindowHandle = 0; 177*b1cdbd2cSJim Jagielski } 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ MouseMove(const MouseEvent & rMEvt)181*b1cdbd2cSJim Jagielski void TableDataWindow::MouseMove( const MouseEvent& rMEvt ) 182*b1cdbd2cSJim Jagielski { 183*b1cdbd2cSJim Jagielski if ( rMEvt.IsLeaveWindow() ) 184*b1cdbd2cSJim Jagielski impl_hideTipWindow(); 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski if ( !m_rTableControl.getInputHandler()->MouseMove( m_rTableControl, rMEvt ) ) 187*b1cdbd2cSJim Jagielski { 188*b1cdbd2cSJim Jagielski Window::MouseMove( rMEvt ); 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ MouseButtonDown(const MouseEvent & rMEvt)192*b1cdbd2cSJim Jagielski void TableDataWindow::MouseButtonDown( const MouseEvent& rMEvt ) 193*b1cdbd2cSJim Jagielski { 194*b1cdbd2cSJim Jagielski impl_hideTipWindow(); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski Point const aPoint = rMEvt.GetPosPixel(); 197*b1cdbd2cSJim Jagielski RowPos const hitRow = m_rTableControl.getRowAtPoint( aPoint ); 198*b1cdbd2cSJim Jagielski bool const wasRowSelected = m_rTableControl.isRowSelected( hitRow ); 199*b1cdbd2cSJim Jagielski size_t const nPrevSelRowCount = m_rTableControl.getSelectedRowCount(); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski if ( !m_rTableControl.getInputHandler()->MouseButtonDown( m_rTableControl, rMEvt ) ) 202*b1cdbd2cSJim Jagielski { 203*b1cdbd2cSJim Jagielski Window::MouseButtonDown( rMEvt ); 204*b1cdbd2cSJim Jagielski return; 205*b1cdbd2cSJim Jagielski } 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski bool const isRowSelected = m_rTableControl.isRowSelected( hitRow ); 208*b1cdbd2cSJim Jagielski size_t const nCurSelRowCount = m_rTableControl.getSelectedRowCount(); 209*b1cdbd2cSJim Jagielski if ( isRowSelected != wasRowSelected || nCurSelRowCount != nPrevSelRowCount ) 210*b1cdbd2cSJim Jagielski { 211*b1cdbd2cSJim Jagielski m_aSelectHdl.Call( NULL ); 212*b1cdbd2cSJim Jagielski } 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ MouseButtonUp(const MouseEvent & rMEvt)216*b1cdbd2cSJim Jagielski void TableDataWindow::MouseButtonUp( const MouseEvent& rMEvt ) 217*b1cdbd2cSJim Jagielski { 218*b1cdbd2cSJim Jagielski if ( !m_rTableControl.getInputHandler()->MouseButtonUp( m_rTableControl, rMEvt ) ) 219*b1cdbd2cSJim Jagielski Window::MouseButtonUp( rMEvt ); 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski m_rTableControl.getAntiImpl().GrabFocus(); 222*b1cdbd2cSJim Jagielski } 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------------------------------------------ Notify(NotifyEvent & rNEvt)225*b1cdbd2cSJim Jagielski long TableDataWindow::Notify(NotifyEvent& rNEvt ) 226*b1cdbd2cSJim Jagielski { 227*b1cdbd2cSJim Jagielski long nDone = 0; 228*b1cdbd2cSJim Jagielski if ( rNEvt.GetType() == EVENT_COMMAND ) 229*b1cdbd2cSJim Jagielski { 230*b1cdbd2cSJim Jagielski const CommandEvent& rCEvt = *rNEvt.GetCommandEvent(); 231*b1cdbd2cSJim Jagielski if ( rCEvt.GetCommand() == COMMAND_WHEEL ) 232*b1cdbd2cSJim Jagielski { 233*b1cdbd2cSJim Jagielski const CommandWheelData* pData = rCEvt.GetWheelData(); 234*b1cdbd2cSJim Jagielski if( !pData->GetModifier() && ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) ) 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski nDone = HandleScrollCommand( rCEvt, m_rTableControl.getHorzScrollbar(), m_rTableControl.getVertScrollbar() ); 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski } 239*b1cdbd2cSJim Jagielski } 240*b1cdbd2cSJim Jagielski return nDone ? nDone : Window::Notify( rNEvt ); 241*b1cdbd2cSJim Jagielski } 242*b1cdbd2cSJim Jagielski //...................................................................................................................... 243*b1cdbd2cSJim Jagielski } } // namespace svt::table 244*b1cdbd2cSJim Jagielski //...................................................................................................................... 245