LCOV - code coverage report
Current view: top level - svtools/source/brwbox - editbrowsebox.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 251 672 37.4 %
Date: 2014-11-03 Functions: 33 84 39.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svtools/editbrowsebox.hxx>
      21             : 
      22             : #include "editbrowsebox.hrc"
      23             : 
      24             : #include <vcl/svapp.hxx>
      25             : #include <tools/debug.hxx>
      26             : #include <vcl/window.hxx>
      27             : 
      28             : #include <vcl/edit.hxx>
      29             : #include <tools/resid.hxx>
      30             : #include <vcl/spinfld.hxx>
      31             : #include <vcl/settings.hxx>
      32             : #include <svtools/svtresid.hxx>
      33             : 
      34             : #include <svtools/svtools.hrc>
      35             : 
      36             : #include <algorithm>
      37             : #include <tools/multisel.hxx>
      38             : #include "editbrowseboximpl.hxx"
      39             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      40             : #include <com/sun/star/accessibility/XAccessible.hpp>
      41             : #include <comphelper/types.hxx>
      42             : 
      43             : 
      44             : namespace svt
      45             : {
      46             : 
      47             :     namespace
      48             :     {
      49             : 
      50           0 :         sal_uInt16 getRealGetFocusFlags( vcl::Window* _pWindow )
      51             :         {
      52           0 :             sal_uInt16 nFlags = 0;
      53           0 :             while ( _pWindow && !nFlags )
      54             :             {
      55           0 :                 nFlags = _pWindow->GetGetFocusFlags( );
      56           0 :                 _pWindow = _pWindow->GetParent();
      57             :             }
      58           0 :             return nFlags;
      59             :         }
      60             :     }
      61             : 
      62             :     using namespace ::com::sun::star::uno;
      63             :     using namespace com::sun::star::accessibility::AccessibleEventId;
      64             :     using  com::sun::star::accessibility::XAccessible;
      65             : 
      66             : 
      67         124 :     IEditImplementation::~IEditImplementation()
      68             :     {
      69         124 :     }
      70             : 
      71             : 
      72             :     //= EditBrowserHeader
      73             : 
      74             : 
      75           0 :     void EditBrowserHeader::DoubleClick()
      76             :     {
      77           0 :         sal_uInt16 nColId = GetCurItemId();
      78           0 :         if (nColId)
      79             :         {
      80           0 :             sal_uInt32 nAutoWidth = static_cast<EditBrowseBox*>(GetParent())->GetAutoColumnWidth(nColId);
      81           0 :             if (nAutoWidth != static_cast<EditBrowseBox*>(GetParent())->GetColumnWidth(nColId))
      82             :             {
      83           0 :                 static_cast<EditBrowseBox*>(GetParent())->SetColumnWidth(nColId, nAutoWidth);
      84           0 :                 static_cast<EditBrowseBox*>(GetParent())->ColumnResized(nColId);
      85             :             }
      86             :         }
      87           0 :     }
      88             : 
      89             : 
      90             : 
      91             :     //= EditBrowseBox
      92             : 
      93             : 
      94          41 :     void EditBrowseBox::BrowserMouseEventPtr::Clear()
      95             :     {
      96          41 :         DELETEZ(pEvent);
      97          41 :     }
      98             : 
      99             : 
     100           0 :     void EditBrowseBox::BrowserMouseEventPtr::Set(const BrowserMouseEvent* pEvt, bool bIsDown)
     101             :     {
     102           0 :         if (pEvt == pEvent)
     103             :         {
     104           0 :             bDown = bIsDown;
     105           0 :             return;
     106             :         }
     107           0 :         Clear();
     108           0 :         if (pEvt)
     109             :         {
     110           0 :             pEvent = new BrowserMouseEvent(pEvt->GetWindow(),
     111             :                                            *pEvt,
     112           0 :                                            pEvt->GetRow(),
     113           0 :                                            pEvt->GetColumn(),
     114           0 :                                            pEvt->GetColumnId(),
     115           0 :                                            pEvt->GetRect());
     116           0 :             bDown = bIsDown;
     117             :         }
     118             :     }
     119             : 
     120             : 
     121          41 :     void EditBrowseBox::impl_construct()
     122             :     {
     123          41 :         m_aImpl.reset(new EditBrowseBoxImpl());
     124             : 
     125          41 :         SetCompoundControl(true);
     126          41 :         SetGridLineColor( Color( COL_LIGHTGRAY ) );
     127             : 
     128          41 :         ImplInitSettings(true, true, true);
     129             : 
     130          41 :         pCheckBoxPaint = new CheckBoxControl(&GetDataWindow());
     131          41 :         pCheckBoxPaint->SetPaintTransparent( true );
     132          41 :         pCheckBoxPaint->SetBackground();
     133          41 :     }
     134             : 
     135             : 
     136           0 :     EditBrowseBox::EditBrowseBox(vcl::Window* pParent, const ResId& rId, sal_Int32 nBrowserFlags, BrowserMode _nMode )
     137             :                   :BrowseBox( pParent, rId, _nMode )
     138             :                   ,nStartEvent(0)
     139             :                   ,nEndEvent(0)
     140             :                   ,nCellModifiedEvent(0)
     141             :                   ,m_pFocusWhileRequest(0)
     142             :                   ,nPaintRow(-1)
     143             :                   ,nEditRow(-1)
     144             :                   ,nOldEditRow(-1)
     145             :                   ,nEditCol(0)
     146             :                   ,nOldEditCol(0)
     147             :                   ,bHasFocus(false)
     148             :                   ,bPaintStatus(true)
     149             :                   ,bActiveBeforeTracking( false )
     150             :                   ,m_nBrowserFlags(nBrowserFlags)
     151           0 :                   ,pHeader(NULL)
     152             :     {
     153           0 :         impl_construct();
     154           0 :     }
     155             : 
     156             : 
     157          41 :     EditBrowseBox::EditBrowseBox( vcl::Window* pParent, sal_Int32 nBrowserFlags, WinBits nBits, BrowserMode _nMode )
     158             :                   :BrowseBox( pParent, nBits, _nMode )
     159             :                   ,nStartEvent(0)
     160             :                   ,nEndEvent(0)
     161             :                   ,nCellModifiedEvent(0)
     162             :                   ,m_pFocusWhileRequest(0)
     163             :                   ,nPaintRow(-1)
     164             :                   ,nEditRow(-1)
     165             :                   ,nOldEditRow(-1)
     166             :                   ,nEditCol(0)
     167             :                   ,nOldEditCol(0)
     168             :                   ,bHasFocus(false)
     169             :                   ,bPaintStatus(true)
     170             :                   ,bActiveBeforeTracking( false )
     171             :                   ,m_nBrowserFlags(nBrowserFlags)
     172          41 :                   ,pHeader(NULL)
     173             :     {
     174          41 :         impl_construct();
     175          41 :     }
     176             : 
     177             : 
     178           0 :     void EditBrowseBox::Init()
     179             :     {
     180             :         // late construction
     181           0 :     }
     182             : 
     183             : 
     184          82 :     EditBrowseBox::~EditBrowseBox()
     185             :     {
     186          41 :         if (nStartEvent)
     187           0 :             Application::RemoveUserEvent(nStartEvent);
     188          41 :         if (nEndEvent)
     189           2 :             Application::RemoveUserEvent(nEndEvent);
     190          41 :         if (nCellModifiedEvent)
     191           0 :             Application::RemoveUserEvent(nCellModifiedEvent);
     192             : 
     193          41 :         delete pCheckBoxPaint;
     194             : 
     195          41 :     }
     196             : 
     197             : 
     198           4 :     void EditBrowseBox::RemoveRows()
     199             :     {
     200           4 :         BrowseBox::Clear();
     201           4 :         nOldEditRow = nEditRow = nPaintRow = -1;
     202           4 :         nEditCol = nOldEditCol = 0;
     203           4 :     }
     204             : 
     205             : 
     206          41 :     BrowserHeader* EditBrowseBox::CreateHeaderBar(BrowseBox* pParent)
     207             :     {
     208          41 :         pHeader = imp_CreateHeaderBar(pParent);
     209          41 :         if (!IsUpdateMode())
     210           0 :             pHeader->SetUpdateMode(false);
     211          41 :         return pHeader;
     212             :     }
     213             : 
     214             : 
     215           0 :     BrowserHeader* EditBrowseBox::imp_CreateHeaderBar(BrowseBox* pParent)
     216             :     {
     217           0 :         return new EditBrowserHeader(pParent);
     218             :     }
     219             : 
     220             : 
     221           0 :     void EditBrowseBox::LoseFocus()
     222             :     {
     223           0 :         BrowseBox::LoseFocus();
     224           0 :         DetermineFocus( 0 );
     225           0 :     }
     226             : 
     227             : 
     228           0 :     void EditBrowseBox::GetFocus()
     229             :     {
     230           0 :         BrowseBox::GetFocus();
     231             : 
     232             :         // This should handle the case that the BrowseBox (or one of its children)
     233             :         // gets the focus from outside by pressing Tab
     234           0 :         if (IsEditing() && Controller()->GetWindow().IsVisible())
     235           0 :             Controller()->GetWindow().GrabFocus();
     236             : 
     237           0 :         DetermineFocus( getRealGetFocusFlags( this ) );
     238           0 :     }
     239             : 
     240             : 
     241          16 :     bool EditBrowseBox::SeekRow(long nRow)
     242             :     {
     243          16 :         nPaintRow = nRow;
     244          16 :         return true;
     245             :     }
     246             : 
     247             : 
     248           0 :     IMPL_LINK_NOARG(EditBrowseBox, StartEditHdl)
     249             :     {
     250           0 :         nStartEvent = 0;
     251           0 :         if (IsEditing())
     252             :         {
     253           0 :             EnableAndShow();
     254           0 :             if (!aController->GetWindow().HasFocus() && (m_pFocusWhileRequest == Application::GetFocusWindow()))
     255           0 :                 aController->GetWindow().GrabFocus();
     256             :         }
     257           0 :         return 0;
     258             :     }
     259             : 
     260             : 
     261          96 :     void EditBrowseBox::PaintField( OutputDevice& rDev, const Rectangle& rRect,
     262             :                                     sal_uInt16 nColumnId ) const
     263             :     {
     264          96 :         if (nColumnId == HandleColumnId)
     265             :         {
     266          16 :              if (bPaintStatus)
     267          16 :                 PaintStatusCell(rDev, rRect);
     268             :         }
     269             :         else
     270             :         {
     271             :             // don't paint the current cell
     272          80 :             if (&rDev == &GetDataWindow())
     273             :                 // but only if we're painting onto our data win (which is the usual painting)
     274          80 :                 if (nPaintRow == nEditRow)
     275             :                 {
     276          10 :                     if (IsEditing() && nEditCol == nColumnId && aController->GetWindow().IsVisible())
     277          98 :                         return;
     278             :                 }
     279          78 :             PaintCell(rDev, rRect, nColumnId);
     280             :         }
     281             :     }
     282             : 
     283             : 
     284          43 :     Image EditBrowseBox::GetImage(RowStatus eStatus) const
     285             :     {
     286          43 :         if ( !m_aStatusImages.GetImageCount() )
     287             :         {
     288          41 :             const_cast<EditBrowseBox*>(this)->m_aStatusImages = ImageList( SvtResId( RID_SVTOOLS_IMAGELIST_EDITBROWSEBOX ) );
     289             :         }
     290             : 
     291          43 :         Image aImage;
     292          43 :         bool bNeedMirror = IsRTLEnabled();
     293          43 :         switch (eStatus)
     294             :         {
     295             :             case CURRENT:
     296           2 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_CURRENT);
     297           2 :                 break;
     298             :             case CURRENTNEW:
     299           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_CURRENTNEW);
     300           0 :                 break;
     301             :             case MODIFIED:
     302           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_MODIFIED);
     303           0 :                 bNeedMirror = false;    // the pen is not mirrored
     304           0 :                 break;
     305             :             case NEW:
     306          41 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_NEW);
     307          41 :                 break;
     308             :             case DELETED:
     309           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_DELETED);
     310           0 :                 break;
     311             :             case PRIMARYKEY:
     312           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_PRIMARYKEY);
     313           0 :                 break;
     314             :             case CURRENT_PRIMARYKEY:
     315           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_CURRENT_PRIMARYKEY);
     316           0 :                 break;
     317             :             case FILTER:
     318           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_FILTER);
     319           0 :                 break;
     320             :             case HEADERFOOTER:
     321           0 :                 aImage = m_aStatusImages.GetImage(IMG_EBB_HEADERFOOTER);
     322           0 :                 break;
     323             :             case CLEAN:
     324           0 :                 break;
     325             :         }
     326          43 :         if ( bNeedMirror )
     327             :         {
     328           0 :             BitmapEx aBitmap( aImage.GetBitmapEx() );
     329           0 :             aBitmap.Mirror( BMP_MIRROR_HORZ );
     330           0 :             aImage = Image( aBitmap );
     331             :         }
     332          43 :         return aImage;
     333             :     }
     334             : 
     335             : 
     336          16 :     void EditBrowseBox::PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const
     337             :     {
     338          16 :         if (nPaintRow < 0)
     339           0 :             return;
     340             : 
     341          16 :         RowStatus eStatus = GetRowStatus( nPaintRow );
     342          16 :         sal_Int32 nBrowserFlags = GetBrowserFlags();
     343             : 
     344          16 :         if (nBrowserFlags & EBBF_NO_HANDLE_COLUMN_CONTENT)
     345           0 :             return;
     346             : 
     347             :         // draw the text of the header column
     348          16 :         if (nBrowserFlags & EBBF_HANDLE_COLUMN_TEXT )
     349             :         {
     350           0 :             rDev.DrawText( rRect, GetCellText( nPaintRow, 0 ),
     351           0 :                            TEXT_DRAW_CENTER | TEXT_DRAW_VCENTER | TEXT_DRAW_CLIP );
     352             :         }
     353             :         // draw an image
     354          16 :         else if (eStatus != CLEAN && rDev.GetOutDevType() == OUTDEV_WINDOW)
     355             :         {
     356           2 :             Image aImage(GetImage(eStatus));
     357             :             // calc the image position
     358           2 :             Size aImageSize(aImage.GetSizePixel());
     359           2 :             aImageSize.Width() = CalcZoom(aImageSize.Width());
     360           2 :             aImageSize.Height() = CalcZoom(aImageSize.Height());
     361           2 :             Point aPos( rRect.TopLeft() );
     362             : 
     363           2 :             if ( ( aImageSize.Width() > rRect.GetWidth() ) || ( aImageSize.Height() > rRect.GetHeight() ) )
     364           0 :                 rDev.SetClipRegion(vcl::Region(rRect));
     365             : 
     366           2 :             if ( aImageSize.Width() < rRect.GetWidth() )
     367           2 :                 aPos.X() += ( rRect.GetWidth() - aImageSize.Width() ) / 2;
     368             : 
     369           2 :             if ( aImageSize.Height() < rRect.GetHeight() )
     370           2 :                 aPos.Y() += ( rRect.GetHeight() - aImageSize.Height() ) / 2;
     371             : 
     372           2 :             if ( IsZoom() )
     373           0 :                 rDev.DrawImage( aPos, aImageSize, aImage, 0 );
     374             :             else
     375           2 :                 rDev.DrawImage( aPos, aImage, 0 );
     376             : 
     377           2 :             if (rDev.IsClipRegion())
     378           0 :                 rDev.SetClipRegion();
     379             :         }
     380             :     }
     381             : 
     382             : 
     383           0 :     void EditBrowseBox::ImplStartTracking()
     384             :     {
     385           0 :         bActiveBeforeTracking = IsEditing();
     386           0 :         if ( bActiveBeforeTracking )
     387             :         {
     388           0 :             DeactivateCell();
     389           0 :             Update();
     390             :         }
     391             : 
     392           0 :         BrowseBox::ImplStartTracking();
     393           0 :     }
     394             : 
     395             : 
     396           0 :     void EditBrowseBox::ImplTracking()
     397             :     {
     398           0 :         BrowseBox::ImplTracking();
     399           0 :     }
     400             : 
     401             : 
     402           0 :     void EditBrowseBox::ImplEndTracking()
     403             :     {
     404           0 :         if ( bActiveBeforeTracking )
     405           0 :             ActivateCell();
     406           0 :         bActiveBeforeTracking = false;
     407             : 
     408           0 :         BrowseBox::ImplEndTracking();
     409           0 :     }
     410             : 
     411             : 
     412           0 :     void EditBrowseBox::RowHeightChanged()
     413             :     {
     414           0 :         if ( IsEditing() )
     415             :         {
     416           0 :             Rectangle aRect( GetCellRect( nEditRow, nEditCol, false ) );
     417           0 :             CellControllerRef aCellController( Controller() );
     418           0 :             ResizeController( aCellController, aRect );
     419           0 :             aCellController->GetWindow().GrabFocus();
     420             :         }
     421             : 
     422           0 :         BrowseBox::RowHeightChanged();
     423           0 :     }
     424             : 
     425             : 
     426           0 :     EditBrowseBox::RowStatus EditBrowseBox::GetRowStatus(long) const
     427             :     {
     428           0 :         return CLEAN;
     429             :     }
     430             : 
     431             : 
     432           0 :     void EditBrowseBox::KeyInput( const KeyEvent& rEvt )
     433             :     {
     434           0 :         sal_uInt16 nCode = rEvt.GetKeyCode().GetCode();
     435           0 :         bool   bShift = rEvt.GetKeyCode().IsShift();
     436           0 :         bool   bCtrl = rEvt.GetKeyCode().IsMod1();
     437             : 
     438           0 :         switch (nCode)
     439             :         {
     440             :             case KEY_RETURN:
     441           0 :                 if (!bCtrl && !bShift && IsTabAllowed(true))
     442             :                 {
     443           0 :                     Dispatch(BROWSER_CURSORRIGHT);
     444             :                 }
     445             :                 else
     446           0 :                     BrowseBox::KeyInput(rEvt);
     447           0 :                 return;
     448             :             case KEY_TAB:
     449           0 :                 if (!bCtrl && !bShift)
     450             :                 {
     451           0 :                     if (IsTabAllowed(true))
     452           0 :                         Dispatch(BROWSER_CURSORRIGHT);
     453             :                     else
     454             :                         // do NOT call BrowseBox::KeyInput : this would handle the tab, but we already now
     455             :                         // that tab isn't allowed here. So give the Control class a chance
     456           0 :                         Control::KeyInput(rEvt);
     457           0 :                     return;
     458             :                 }
     459           0 :                 else if (!bCtrl && bShift)
     460             :                 {
     461           0 :                     if (IsTabAllowed(false))
     462           0 :                         Dispatch(BROWSER_CURSORLEFT);
     463             :                     else
     464             :                         // do NOT call BrowseBox::KeyInput : this would handle the tab, but we already now
     465             :                         // that tab isn't allowed here. So give the Control class a chance
     466           0 :                         Control::KeyInput(rEvt);
     467           0 :                     return;
     468             :                 }
     469             :                 // fall-through
     470             :             default:
     471           0 :                 BrowseBox::KeyInput(rEvt);
     472             :         }
     473             :     }
     474             : 
     475             : 
     476           0 :     void EditBrowseBox::MouseButtonDown(const BrowserMouseEvent& rEvt)
     477             :     {
     478           0 :         sal_uInt16  nColPos = GetColumnPos( rEvt.GetColumnId() );
     479           0 :         long    nRow    = rEvt.GetRow();
     480             : 
     481             :         // absorb double clicks
     482           0 :         if (rEvt.GetClicks() > 1 && rEvt.GetRow() >= 0)
     483           0 :             return;
     484             : 
     485             :         // change to a new position
     486           0 :         if (IsEditing() && (nColPos != nEditCol || nRow != nEditRow) && (nColPos != BROWSER_INVALIDID) && (nRow < GetRowCount()))
     487             :         {
     488           0 :             CellControllerRef aCellController(Controller());
     489           0 :             HideAndDisable(aCellController);
     490             :         }
     491             : 
     492             :         // we are about to leave the current cell. If there is a "this cell has been modified" notification
     493             :         // pending (asynchronously), this may be deadly -> do it synchronously
     494           0 :         if ( nCellModifiedEvent )
     495             :         {
     496           0 :             Application::RemoveUserEvent( nCellModifiedEvent );
     497           0 :             nCellModifiedEvent = 0;
     498           0 :             LINK( this, EditBrowseBox, CellModifiedHdl ).Call( NULL );
     499             :         }
     500             : 
     501           0 :         if (rEvt.GetColumnId() == HandleColumnId)
     502             :         {   // it was the handle column. save the current cell content if necessary
     503             :             // (clicking on the handle column results in selecting the current row)
     504           0 :             if (IsEditing() && aController->IsModified())
     505           0 :                 SaveModified();
     506             :         }
     507             : 
     508           0 :         aMouseEvent.Set(&rEvt,true);
     509           0 :         BrowseBox::MouseButtonDown(rEvt);
     510           0 :         aMouseEvent.Clear();
     511             : 
     512           0 :         if (0 != (m_nBrowserFlags & EBBF_ACTIVATE_ON_BUTTONDOWN))
     513             :         {
     514             :             // the base class does not travel upon MouseButtonDown, but implActivateCellOnMouseEvent assumes we traveled ...
     515           0 :             GoToRowColumnId( rEvt.GetRow(), rEvt.GetColumnId() );
     516           0 :             if (rEvt.GetRow() >= 0)
     517           0 :                 implActivateCellOnMouseEvent(rEvt, false);
     518             :         }
     519             :     }
     520             : 
     521             : 
     522           0 :     void EditBrowseBox::MouseButtonUp( const BrowserMouseEvent& rEvt )
     523             :     {
     524             :         // absorb double clicks
     525           0 :         if (rEvt.GetClicks() > 1 && rEvt.GetRow() >= 0)
     526           0 :             return;
     527             : 
     528           0 :         aMouseEvent.Set(&rEvt,false);
     529           0 :         BrowseBox::MouseButtonUp(rEvt);
     530           0 :         aMouseEvent.Clear();
     531             : 
     532           0 :         if (0 == (m_nBrowserFlags & EBBF_ACTIVATE_ON_BUTTONDOWN))
     533           0 :             if (rEvt.GetRow() >= 0)
     534           0 :                 implActivateCellOnMouseEvent(rEvt, true);
     535             :     }
     536             : 
     537             : 
     538           0 :     void EditBrowseBox::implActivateCellOnMouseEvent(const BrowserMouseEvent& _rEvt, bool _bUp)
     539             :     {
     540           0 :         if (!IsEditing())
     541           0 :             ActivateCell();
     542           0 :         else if (IsEditing() && !aController->GetWindow().IsEnabled())
     543           0 :             DeactivateCell();
     544           0 :         else if (IsEditing() && !aController->GetWindow().HasChildPathFocus())
     545           0 :             AsynchGetFocus();
     546             : 
     547           0 :         if (IsEditing() && aController->GetWindow().IsEnabled() && aController->WantMouseEvent())
     548             :         {   // forwards the event to the control
     549             : 
     550             :             // If the field has been moved previously, we have to adjust the position
     551             : 
     552           0 :             aController->GetWindow().GrabFocus();
     553             : 
     554             :             // the position of the event relative to the controller's window
     555           0 :             Point aPos = _rEvt.GetPosPixel() - _rEvt.GetRect().TopLeft();
     556             :             // the (child) window which should really get the event
     557           0 :             vcl::Window* pRealHandler = aController->GetWindow().FindWindow(aPos);
     558           0 :             if (pRealHandler)
     559             :                 // the coords relative to this real handler
     560           0 :                 aPos -= pRealHandler->GetPosPixel();
     561             :             else
     562           0 :                 pRealHandler = &aController->GetWindow();
     563             : 
     564             :             // the faked event
     565           0 :             MouseEvent aEvent(aPos, _rEvt.GetClicks(), _rEvt.GetMode(),
     566           0 :                               _rEvt.GetButtons(),
     567           0 :                               _rEvt.GetModifier());
     568             : 
     569           0 :             pRealHandler->MouseButtonDown(aEvent);
     570           0 :             if (_bUp)
     571           0 :                 pRealHandler->MouseButtonUp(aEvent);
     572             : 
     573           0 :             vcl::Window *pWin = &aController->GetWindow();
     574           0 :             if (!pWin->IsTracking())
     575             :             {
     576           0 :                 for (pWin = pWin->GetWindow(WINDOW_FIRSTCHILD);
     577           0 :                      pWin && !pWin->IsTracking();
     578             :                      pWin = pWin->GetWindow(WINDOW_NEXT))
     579             :                 {
     580             :                 }
     581             :             }
     582           0 :             if (pWin && pWin->IsTracking())
     583           0 :                 pWin->EndTracking();
     584             :         }
     585           0 :     }
     586             : 
     587             : 
     588           0 :     void EditBrowseBox::Dispatch( sal_uInt16 _nId )
     589             :     {
     590           0 :         if ( _nId == BROWSER_ENHANCESELECTION )
     591             :         {   // this is a workaround for the bug in the base class:
     592             :             // if the row selection is to be extended (which is what BROWSER_ENHANCESELECTION tells us)
     593             :             // then the base class does not revert any column selections, while, for doing a "simple"
     594             :             // selection (BROWSER_SELECT), it does. In fact, it does not only revert the col selection then,
     595             :             // but also any current row selections.
     596             :             // This clearly tells me that the both ids are for row selection only - there this behaviour does
     597             :             // make sense.
     598             :             // But here, where we have column selection, too, we take care of this ourself.
     599           0 :             if ( GetSelectColumnCount( ) )
     600             :             {
     601           0 :                 while ( GetSelectColumnCount( ) )
     602             :                     SelectColumnPos(
     603           0 :                         sal::static_int_cast< sal_uInt16 >(FirstSelectedColumn()),
     604           0 :                         false );
     605           0 :                 Select();
     606             :             }
     607             :         }
     608           0 :         BrowseBox::Dispatch( _nId );
     609           0 :     }
     610             : 
     611             : 
     612           0 :     bool EditBrowseBox::PreNotify(NotifyEvent& rEvt)
     613             :     {
     614           0 :         switch (rEvt.GetType())
     615             :         {
     616             :             case EVENT_KEYINPUT:
     617           0 :                 if  (   (IsEditing() && Controller()->GetWindow().HasChildPathFocus())
     618           0 :                     ||  rEvt.GetWindow() == &GetDataWindow()
     619           0 :                     ||  (!IsEditing() && HasChildPathFocus())
     620             :                     )
     621             :                 {
     622           0 :                     const KeyEvent* pKeyEvent = rEvt.GetKeyEvent();
     623           0 :                     sal_uInt16 nCode  = pKeyEvent->GetKeyCode().GetCode();
     624           0 :                     bool       bShift = pKeyEvent->GetKeyCode().IsShift();
     625           0 :                     bool       bCtrl  = pKeyEvent->GetKeyCode().IsMod1();
     626           0 :                     bool       bAlt =   pKeyEvent->GetKeyCode().IsMod2();
     627           0 :                     bool       bLocalSelect = false;
     628           0 :                     bool       bNonEditOnly = false;
     629           0 :                     sal_uInt16 nId = BROWSER_NONE;
     630             : 
     631           0 :                     if (!bAlt && !bCtrl && !bShift )
     632           0 :                         switch ( nCode )
     633             :                         {
     634           0 :                             case KEY_DOWN:          nId = BROWSER_CURSORDOWN; break;
     635           0 :                             case KEY_UP:            nId = BROWSER_CURSORUP; break;
     636           0 :                             case KEY_PAGEDOWN:      nId = BROWSER_CURSORPAGEDOWN; break;
     637           0 :                             case KEY_PAGEUP:        nId = BROWSER_CURSORPAGEUP; break;
     638           0 :                             case KEY_HOME:          nId = BROWSER_CURSORHOME; break;
     639           0 :                             case KEY_END:           nId = BROWSER_CURSOREND; break;
     640             : 
     641             :                             case KEY_TAB:
     642             :                                 // ask if traveling to the next cell is allowed
     643           0 :                                 if (IsTabAllowed(true))
     644           0 :                                     nId = BROWSER_CURSORRIGHT;
     645           0 :                                 break;
     646             : 
     647             :                             case KEY_RETURN:
     648             :                                 // save the cell content (if necessary)
     649           0 :                                 if (IsEditing() && aController->IsModified() && !((EditBrowseBox *) this)->SaveModified())
     650             :                                 {
     651             :                                     // maybe we're not visible ...
     652           0 :                                     EnableAndShow();
     653           0 :                                     aController->GetWindow().GrabFocus();
     654           0 :                                     return true;
     655             :                                 }
     656             :                                 // ask if traveling to the next cell is allowed
     657           0 :                                 if (IsTabAllowed(true))
     658           0 :                                     nId = BROWSER_CURSORRIGHT;
     659             : 
     660           0 :                                 break;
     661           0 :                             case KEY_RIGHT:         nId = BROWSER_CURSORRIGHT; break;
     662           0 :                             case KEY_LEFT:          nId = BROWSER_CURSORLEFT; break;
     663           0 :                             case KEY_SPACE:         nId = BROWSER_SELECT; bNonEditOnly = bLocalSelect = true; break;
     664             :                         }
     665             : 
     666           0 :                     if ( !bAlt && !bCtrl && bShift )
     667           0 :                         switch ( nCode )
     668             :                         {
     669           0 :                             case KEY_DOWN:          nId = BROWSER_SELECTDOWN; bLocalSelect = true; break;
     670           0 :                             case KEY_UP:            nId = BROWSER_SELECTUP; bLocalSelect = true; break;
     671           0 :                             case KEY_HOME:          nId = BROWSER_SELECTHOME; bLocalSelect = true; break;
     672           0 :                             case KEY_END:           nId = BROWSER_SELECTEND; bLocalSelect = true; break;
     673             :                             case KEY_TAB:
     674           0 :                                 if (IsTabAllowed(false))
     675           0 :                                     nId = BROWSER_CURSORLEFT;
     676           0 :                                 break;
     677             :                         }
     678             : 
     679           0 :                     if ( !bAlt && bCtrl && bShift )
     680           0 :                         switch ( nCode )
     681             :                         {
     682           0 :                             case KEY_SPACE:         nId = BROWSER_SELECTCOLUMN; bLocalSelect = true; break;
     683             :                         }
     684             : 
     685             : 
     686           0 :                     if ( !bAlt && bCtrl && !bShift )
     687           0 :                         switch ( nCode )
     688             :                         {
     689           0 :                             case KEY_DOWN:          nId = BROWSER_SCROLLUP; break;
     690           0 :                             case KEY_UP:            nId = BROWSER_SCROLLDOWN; break;
     691           0 :                             case KEY_PAGEDOWN:      nId = BROWSER_CURSORENDOFFILE; break;
     692           0 :                             case KEY_PAGEUP:        nId = BROWSER_CURSORTOPOFFILE; break;
     693           0 :                             case KEY_HOME:          nId = BROWSER_CURSORTOPOFSCREEN; break;
     694           0 :                             case KEY_END:           nId = BROWSER_CURSORENDOFSCREEN; break;
     695           0 :                             case KEY_SPACE:         nId = BROWSER_ENHANCESELECTION; bLocalSelect = true; break;
     696             :                         }
     697             : 
     698             : 
     699           0 :                     if  (   ( nId != BROWSER_NONE )
     700           0 :                         &&  (   !IsEditing()
     701           0 :                             ||  (   !bNonEditOnly
     702           0 :                                 &&  aController->MoveAllowed( *pKeyEvent )
     703             :                                 )
     704             :                             )
     705             :                         )
     706             :                     {
     707           0 :                         if (nId == BROWSER_SELECT || BROWSER_SELECTCOLUMN == nId )
     708             :                         {
     709             :                             // save the cell content (if necessary)
     710           0 :                             if (IsEditing() && aController->IsModified() && !((EditBrowseBox *) this)->SaveModified())
     711             :                             {
     712             :                                 // maybe we're not visible ...
     713           0 :                                 EnableAndShow();
     714           0 :                                 aController->GetWindow().GrabFocus();
     715           0 :                                 return true;
     716             :                             }
     717             :                         }
     718             : 
     719           0 :                         Dispatch(nId);
     720             : 
     721           0 :                         if (bLocalSelect && (GetSelectRowCount() || GetSelection() != NULL))
     722           0 :                             DeactivateCell();
     723           0 :                         return true;
     724             :                     }
     725             :                 }
     726             :         }
     727           0 :         return BrowseBox::PreNotify(rEvt);
     728             :     }
     729             : 
     730             : 
     731           0 :     bool EditBrowseBox::IsTabAllowed(bool) const
     732             :     {
     733           0 :         return true;
     734             :     }
     735             : 
     736             : 
     737         818 :     bool EditBrowseBox::Notify(NotifyEvent& rEvt)
     738             :     {
     739         818 :         switch (rEvt.GetType())
     740             :         {
     741             :             case EVENT_GETFOCUS:
     742           0 :                 DetermineFocus( getRealGetFocusFlags( this ) );
     743           0 :                 break;
     744             : 
     745             :             case EVENT_LOSEFOCUS:
     746           0 :                 DetermineFocus( 0 );
     747           0 :                 break;
     748             :         }
     749         818 :         return BrowseBox::Notify(rEvt);
     750             :     }
     751             : 
     752             : 
     753         501 :     void EditBrowseBox::StateChanged( StateChangedType nType )
     754             :     {
     755         501 :         BrowseBox::StateChanged( nType );
     756             : 
     757         501 :         bool bNeedCellReActivation = false;
     758         501 :         if ( nType == StateChangedType::MIRRORING )
     759             :         {
     760         100 :             bNeedCellReActivation = true;
     761             :         }
     762         401 :         else if ( nType == StateChangedType::ZOOM )
     763             :         {
     764           0 :             ImplInitSettings( true, false, false );
     765           0 :             bNeedCellReActivation = true;
     766             :         }
     767         401 :         else if ( nType == StateChangedType::CONTROLFONT )
     768             :         {
     769          77 :             ImplInitSettings( true, false, false );
     770          77 :             Invalidate();
     771             :         }
     772         324 :         else if ( nType == StateChangedType::CONTROLFOREGROUND )
     773             :         {
     774           0 :             ImplInitSettings( false, true, false );
     775           0 :             Invalidate();
     776             :         }
     777         324 :         else if ( nType == StateChangedType::CONTROLBACKGROUND )
     778             :         {
     779           0 :             ImplInitSettings( false, false, true );
     780           0 :             Invalidate();
     781             :         }
     782         324 :         else if (nType == StateChangedType::STYLE)
     783             :         {
     784          82 :             WinBits nStyle = GetStyle();
     785          82 :             if (!(nStyle & WB_NOTABSTOP) )
     786          82 :                 nStyle |= WB_TABSTOP;
     787             : 
     788          82 :             SetStyle(nStyle);
     789             :         }
     790         501 :         if ( bNeedCellReActivation )
     791             :         {
     792         100 :             if ( IsEditing() )
     793             :             {
     794           0 :                 DeactivateCell();
     795           0 :                 ActivateCell();
     796             :             }
     797             :         }
     798         501 :     }
     799             : 
     800             : 
     801          42 :     void EditBrowseBox::DataChanged( const DataChangedEvent& rDCEvt )
     802             :     {
     803          42 :         BrowseBox::DataChanged( rDCEvt );
     804             : 
     805          84 :         if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS )   ||
     806          84 :             ( rDCEvt.GetType() == DATACHANGED_DISPLAY   ))  &&
     807          42 :             ( rDCEvt.GetFlags() & SETTINGS_STYLE        ))
     808             :         {
     809          42 :             ImplInitSettings( true, true, true );
     810          42 :             Invalidate();
     811             :         }
     812          42 :     }
     813             : 
     814             : 
     815         160 :     void EditBrowseBox::ImplInitSettings( bool bFont, bool bForeground, bool bBackground )
     816             :     {
     817         160 :         const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
     818             : 
     819         160 :         if (bFont)
     820             :         {
     821         160 :             vcl::Font aFont = rStyleSettings.GetFieldFont();
     822         160 :             if (IsControlFont())
     823             :             {
     824         117 :                 GetDataWindow().SetControlFont(GetControlFont());
     825         117 :                 aFont.Merge(GetControlFont());
     826             :             }
     827             :             else
     828          43 :                 GetDataWindow().SetControlFont();
     829             : 
     830         160 :             GetDataWindow().SetZoomedPointFont(aFont);
     831             :         }
     832             : 
     833         160 :         if ( bFont || bForeground )
     834             :         {
     835         160 :             Color aTextColor = rStyleSettings.GetFieldTextColor();
     836         160 :             if (IsControlForeground())
     837             :             {
     838           0 :                 aTextColor = GetControlForeground();
     839           0 :                 GetDataWindow().SetControlForeground(aTextColor);
     840             :             }
     841             :             else
     842         160 :                 GetDataWindow().SetControlForeground();
     843             : 
     844         160 :             GetDataWindow().SetTextColor( aTextColor );
     845             :         }
     846             : 
     847         160 :         if ( bBackground )
     848             :         {
     849          83 :             if (GetDataWindow().IsControlBackground())
     850             :             {
     851           0 :                 GetDataWindow().SetControlBackground(GetControlBackground());
     852           0 :                 GetDataWindow().SetBackground(GetDataWindow().GetControlBackground());
     853           0 :                 GetDataWindow().SetFillColor(GetDataWindow().GetControlBackground());
     854             :             }
     855             :             else
     856             :             {
     857          83 :                 GetDataWindow().SetControlBackground();
     858          83 :                 GetDataWindow().SetBackground( rStyleSettings.GetFieldColor() );
     859          83 :                 GetDataWindow().SetFillColor( rStyleSettings.GetFieldColor() );
     860             :             }
     861             :         }
     862         160 :     }
     863             : 
     864             : 
     865           4 :     bool EditBrowseBox::IsCursorMoveAllowed(long nNewRow, sal_uInt16 nNewColId) const
     866             :     {
     867           4 :         sal_uInt16 nInfo = 0;
     868             : 
     869           4 :         if (GetSelectColumnCount() || (aMouseEvent.Is() && aMouseEvent->GetRow() < 0))
     870           0 :             nInfo |= COLSELECT;
     871           8 :         if ((GetSelection() != NULL && GetSelectRowCount()) ||
     872           4 :             (aMouseEvent.Is() && aMouseEvent->GetColumnId() == HandleColumnId))
     873           0 :             nInfo |= ROWSELECT;
     874           4 :         if (!nInfo && nNewRow != nEditRow)
     875           2 :             nInfo |= ROWCHANGE;
     876           4 :         if (!nInfo && nNewColId != nEditCol)
     877           2 :             nInfo |= COLCHANGE;
     878             : 
     879           4 :         if (nInfo == 0)   // nothing happened
     880           0 :             return true;
     881             : 
     882             :         // save the cell content
     883           4 :         if (IsEditing() && aController->IsModified() && !((EditBrowseBox *) this)->SaveModified())
     884             :         {
     885             :             // maybe we're not visible ...
     886           0 :             EnableAndShow();
     887           0 :             aController->GetWindow().GrabFocus();
     888           0 :             return false;
     889             :         }
     890             : 
     891           4 :         EditBrowseBox * pTHIS = const_cast<EditBrowseBox *> (this);
     892             : 
     893             :         // save the cell content if
     894             :         // a) a selection is being made
     895             :         // b) the row is changing
     896           4 :         if (IsModified() && (nInfo & (ROWCHANGE | COLSELECT | ROWSELECT)) &&
     897           0 :             !pTHIS->SaveRow())
     898             :         {
     899           0 :             if (nInfo & COLSELECT ||
     900           0 :                 nInfo & ROWSELECT)
     901             :             {
     902             :                 // cancel selected
     903           0 :                 pTHIS->SetNoSelection();
     904             :             }
     905             : 
     906           0 :             if (IsEditing())
     907             :             {
     908           0 :                 if (!Controller()->GetWindow().IsVisible())
     909             :                 {
     910           0 :                     EnableAndShow();
     911             :                 }
     912           0 :                 aController->GetWindow().GrabFocus();
     913             :             }
     914           0 :             return false;
     915             :         }
     916             : 
     917           4 :         if (nNewRow != nEditRow)
     918             :         {
     919           2 :             vcl::Window& rWindow = GetDataWindow();
     920           2 :             if ((nEditRow >= 0) && (GetBrowserFlags() & EBBF_NO_HANDLE_COLUMN_CONTENT) == 0)
     921             :             {
     922           0 :                 Rectangle aRect = GetFieldRectPixel(nEditRow, 0, false );
     923             :                 // status cell should be painted if and only if text is displayed
     924             :                 // note: bPaintStatus is mutable, but Solaris has problems with assigning
     925             :                 // probably because it is part of a bitfield
     926           0 :                 pTHIS->bPaintStatus = ( GetBrowserFlags() & EBBF_HANDLE_COLUMN_TEXT ) == EBBF_HANDLE_COLUMN_TEXT;
     927           0 :                 rWindow.Invalidate(aRect);
     928           0 :                 pTHIS->bPaintStatus = true;
     929             :             }
     930             : 
     931             :             // don't paint during row change
     932           2 :             rWindow.EnablePaint(false);
     933             : 
     934             :             // the last veto chance for derived classes
     935           2 :             if (!pTHIS->CursorMoving(nNewRow, nNewColId))
     936             :             {
     937           0 :                 pTHIS->InvalidateStatusCell(nEditRow);
     938           0 :                 rWindow.EnablePaint(true);
     939           0 :                 return false;
     940             :             }
     941             :             else
     942             :             {
     943           2 :                 rWindow.EnablePaint(true);
     944           2 :                 return true;
     945             :             }
     946             :         }
     947             :         else
     948           2 :             return pTHIS->CursorMoving(nNewRow, nNewColId);
     949             :     }
     950             : 
     951             : 
     952           0 :     void EditBrowseBox::ColumnMoved(sal_uInt16 nId)
     953             :     {
     954           0 :         BrowseBox::ColumnMoved(nId);
     955           0 :         if (IsEditing())
     956             :         {
     957           0 :             Rectangle aRect( GetCellRect(nEditRow, nEditCol, false));
     958           0 :             CellControllerRef aControllerRef = Controller();
     959           0 :             ResizeController(aControllerRef, aRect);
     960           0 :             Controller()->GetWindow().GrabFocus();
     961             :         }
     962           0 :     }
     963             : 
     964             : 
     965           0 :     bool EditBrowseBox::SaveRow()
     966             :     {
     967           0 :         return true;
     968             :     }
     969             : 
     970             : 
     971           4 :     bool EditBrowseBox::CursorMoving(long, sal_uInt16)
     972             :     {
     973           4 :         ((EditBrowseBox *) this)->DeactivateCell(false);
     974           4 :         return true;
     975             :     }
     976             : 
     977             : 
     978          73 :     void EditBrowseBox::CursorMoved()
     979             :     {
     980          73 :         long nNewRow = GetCurRow();
     981          73 :         if (nEditRow != nNewRow)
     982             :         {
     983           4 :             if ((GetBrowserFlags() & EBBF_NO_HANDLE_COLUMN_CONTENT) == 0)
     984           4 :                 InvalidateStatusCell(nNewRow);
     985           4 :             nEditRow = nNewRow;
     986             :         }
     987          73 :         ActivateCell();
     988          73 :         GetDataWindow().EnablePaint(true);
     989             :         // should not be called here because the descant event is not needed here
     990             :         //BrowseBox::CursorMoved();
     991          73 :     }
     992             : 
     993             : 
     994           0 :     void EditBrowseBox::EndScroll()
     995             :     {
     996           0 :         if (IsEditing())
     997             :         {
     998           0 :             Rectangle aRect = GetCellRect(nEditRow, nEditCol, false);
     999           0 :             ResizeController(aController,aRect);
    1000           0 :             AsynchGetFocus();
    1001             :         }
    1002           0 :         BrowseBox::EndScroll();
    1003           0 :     }
    1004             : 
    1005             : 
    1006          73 :     void EditBrowseBox::ActivateCell(long nRow, sal_uInt16 nCol, bool bCellFocus)
    1007             :     {
    1008          73 :         if (IsEditing())
    1009           2 :             return;
    1010             : 
    1011          71 :         nEditCol = nCol;
    1012             : 
    1013         142 :         if ((GetSelectRowCount() && GetSelection() != NULL) || GetSelectColumnCount() ||
    1014          71 :             (aMouseEvent.Is() && (aMouseEvent.IsDown() || aMouseEvent->GetClicks() > 1))) // nothing happens on MouseDown
    1015             :         {
    1016           0 :             return;
    1017             :         }
    1018             : 
    1019          71 :         if (nEditRow >= 0 && nEditCol > HandleColumnId)
    1020             :         {
    1021           2 :             aController = GetController(nRow, nCol);
    1022           2 :             if (aController.Is())
    1023             :             {
    1024           2 :                 Rectangle aRect( GetCellRect(nEditRow, nEditCol, false));
    1025           2 :                 ResizeController(aController, aRect);
    1026             : 
    1027           2 :                 InitController(aController, nEditRow, nEditCol);
    1028             : 
    1029           2 :                 aController->ClearModified();
    1030           2 :                 aController->SetModifyHdl(LINK(this,EditBrowseBox,ModifyHdl));
    1031           2 :                 EnableAndShow();
    1032             : 
    1033           2 :                 if ( isAccessibleAlive() )
    1034           0 :                     implCreateActiveAccessible();
    1035             : 
    1036             :                 // activate the cell only of the browser has the focus
    1037           2 :                 if ( bHasFocus && bCellFocus )
    1038           0 :                     AsynchGetFocus();
    1039             :             }
    1040             :             else
    1041             :             {
    1042             :                 // no controller -> we have a new "active descendant"
    1043           0 :                 if ( isAccessibleAlive() && HasFocus() )
    1044             :                 {
    1045             :                     commitTableEvent(
    1046             :                         ACTIVE_DESCENDANT_CHANGED,
    1047           0 :                         makeAny( CreateAccessibleCell( nRow, GetColumnPos( nCol -1) ) ),
    1048             :                         Any()
    1049           0 :                     );
    1050             :                 }
    1051             :             }
    1052             :         }
    1053             :     }
    1054             : 
    1055             : 
    1056          33 :     void EditBrowseBox::DeactivateCell(bool bUpdate)
    1057             :     {
    1058          33 :         if (IsEditing())
    1059             :         {
    1060           2 :             if ( isAccessibleAlive() )
    1061             :             {
    1062           0 :                 commitBrowseBoxEvent( CHILD, Any(), makeAny( m_aImpl->m_xActiveCell ) );
    1063           0 :                 m_aImpl->clearActiveCell();
    1064             :             }
    1065             : 
    1066           2 :             aOldController = aController;
    1067           2 :             aController.Clear();
    1068             : 
    1069             :             // reset the modify handler
    1070           2 :             aOldController->SetModifyHdl(Link());
    1071             : 
    1072           2 :             if (bHasFocus)
    1073           0 :                 GrabFocus(); // ensure that we have (and keep) the focus
    1074             : 
    1075           2 :             HideAndDisable(aOldController);
    1076             : 
    1077             :             // update if requested
    1078           2 :             if (bUpdate)
    1079           2 :                 Update();
    1080             : 
    1081           2 :             nOldEditCol = nEditCol;
    1082           2 :             nOldEditRow = nEditRow;
    1083             : 
    1084             :             // release the controller (asynchronously)
    1085           2 :             if (nEndEvent)
    1086           0 :                 Application::RemoveUserEvent(nEndEvent);
    1087           2 :             nEndEvent = Application::PostUserEvent(LINK(this,EditBrowseBox,EndEditHdl));
    1088             :         }
    1089          33 :     }
    1090             : 
    1091             : 
    1092           2 :     Rectangle EditBrowseBox::GetCellRect(long nRow, sal_uInt16 nColId, bool bRel) const
    1093             :     {
    1094           2 :         Rectangle aRect( GetFieldRectPixel(nRow, nColId, bRel));
    1095           2 :         if ((GetMode()  & BROWSER_CURSOR_WO_FOCUS) == BROWSER_CURSOR_WO_FOCUS)
    1096             :         {
    1097           0 :             aRect.Top() += 1;
    1098           0 :             aRect.Bottom() -= 1;
    1099             :         }
    1100           2 :         return aRect;
    1101             :     }
    1102             : 
    1103             : 
    1104           0 :     IMPL_LINK_NOARG(EditBrowseBox, EndEditHdl)
    1105             :     {
    1106           0 :         nEndEvent = 0;
    1107           0 :         ReleaseController(aOldController, nOldEditRow, nOldEditCol);
    1108             : 
    1109           0 :         aOldController  = CellControllerRef();
    1110           0 :         nOldEditRow     = -1;
    1111           0 :         nOldEditCol     =  0;
    1112             : 
    1113           0 :         return 0;
    1114             :     }
    1115             : 
    1116             : 
    1117           0 :     IMPL_LINK_NOARG(EditBrowseBox, ModifyHdl)
    1118             :     {
    1119           0 :         if (nCellModifiedEvent)
    1120           0 :             Application::RemoveUserEvent(nCellModifiedEvent);
    1121           0 :         nCellModifiedEvent = Application::PostUserEvent(LINK(this,EditBrowseBox,CellModifiedHdl));
    1122           0 :         return 0;
    1123             :     }
    1124             : 
    1125             : 
    1126           0 :     IMPL_LINK_NOARG(EditBrowseBox, CellModifiedHdl)
    1127             :     {
    1128           0 :         nCellModifiedEvent = 0;
    1129           0 :         CellModified();
    1130           0 :         return 0;
    1131             :     }
    1132             : 
    1133             : 
    1134           0 :     void EditBrowseBox::ColumnResized( sal_uInt16 )
    1135             :     {
    1136           0 :         if (IsEditing())
    1137             :         {
    1138           0 :             Rectangle aRect( GetCellRect(nEditRow, nEditCol, false));
    1139           0 :             CellControllerRef aControllerRef = Controller();
    1140           0 :             ResizeController(aControllerRef, aRect);
    1141           0 :             Controller()->GetWindow().GrabFocus();
    1142             :         }
    1143           0 :     }
    1144             : 
    1145             : 
    1146         140 :     sal_uInt16 EditBrowseBox::AppendColumn(const OUString& rName, sal_uInt16 nWidth, sal_uInt16 nPos, sal_uInt16 nId)
    1147             :     {
    1148         140 :         if (nId == BROWSER_INVALIDID)
    1149             :         {
    1150             :             // look for the next free id
    1151           0 :             for (nId = ColCount(); nId > 0 && GetColumnPos(nId) != BROWSER_INVALIDID; nId--)
    1152             :                 ;
    1153             : 
    1154           0 :             if (!nId)
    1155             :             {
    1156             :                 // if there is no handle column
    1157             :                 // increment the id
    1158           0 :                 if ( ColCount() == 0 || GetColumnId(0) != HandleColumnId )
    1159           0 :                     nId = ColCount() + 1;
    1160             :             }
    1161             :         }
    1162             : 
    1163             :         DBG_ASSERT(nId, "EditBrowseBox::AppendColumn: invalid id!");
    1164             : 
    1165         140 :         long w = nWidth;
    1166         140 :         if (!w)
    1167         120 :             w = GetDefaultColumnWidth(rName);
    1168             : 
    1169         140 :         InsertDataColumn(nId, rName, w, (HIB_CENTER | HIB_VCENTER | HIB_CLICKABLE), nPos);
    1170         140 :         return nId;
    1171             :     }
    1172             : 
    1173             : 
    1174         472 :     void EditBrowseBox::Resize()
    1175             :     {
    1176         472 :         BrowseBox::Resize();
    1177             : 
    1178             :         // if the window is smaller than "title line height" + "control area",
    1179             :         // do nothing
    1180        1416 :         if (GetOutputSizePixel().Height() <
    1181         944 :            (GetControlArea().GetHeight() + GetDataWindow().GetPosPixel().Y()))
    1182         681 :             return;
    1183             : 
    1184             :         // the size of the control area
    1185         263 :         Point aPoint(GetControlArea().TopLeft());
    1186         263 :         sal_uInt16 nX = (sal_uInt16)aPoint.X();
    1187             : 
    1188         263 :         ArrangeControls(nX, (sal_uInt16)aPoint.Y());
    1189             : 
    1190         263 :         if (!nX)
    1191         121 :             nX = USHRT_MAX;
    1192         263 :         ReserveControlArea((sal_uInt16)nX);
    1193             :     }
    1194             : 
    1195             : 
    1196           0 :     void EditBrowseBox::ArrangeControls(sal_uInt16&, sal_uInt16)
    1197             :     {
    1198           0 :     }
    1199             : 
    1200             : 
    1201           0 :     CellController* EditBrowseBox::GetController(long, sal_uInt16)
    1202             :     {
    1203           0 :         return NULL;
    1204             :     }
    1205             : 
    1206             : 
    1207           2 :     void EditBrowseBox::ResizeController(CellControllerRef& rController, const Rectangle& rRect)
    1208             :     {
    1209           2 :         rController->GetWindow().SetPosSizePixel(rRect.TopLeft(), rRect.GetSize());
    1210           2 :     }
    1211             : 
    1212             : 
    1213           0 :     void EditBrowseBox::InitController(CellControllerRef&, long, sal_uInt16)
    1214             :     {
    1215           0 :     }
    1216             : 
    1217             : 
    1218           0 :     void EditBrowseBox::ReleaseController(CellControllerRef&, long, sal_uInt16)
    1219             :     {
    1220           0 :     }
    1221             : 
    1222             : 
    1223           0 :     void EditBrowseBox::CellModified()
    1224             :     {
    1225           0 :     }
    1226             : 
    1227             : 
    1228             : 
    1229           0 :     bool EditBrowseBox::SaveModified()
    1230             :     {
    1231           0 :         return true;
    1232             :     }
    1233             : 
    1234             : 
    1235           0 :     void EditBrowseBox::DoubleClick(const BrowserMouseEvent& rEvt)
    1236             :     {
    1237             :         // when double clicking on the column, the optimum size will be calculated
    1238           0 :         sal_uInt16 nColId = rEvt.GetColumnId();
    1239           0 :         if (nColId != HandleColumnId)
    1240           0 :             SetColumnWidth(nColId, GetAutoColumnWidth(nColId));
    1241           0 :     }
    1242             : 
    1243             : 
    1244           0 :     sal_uInt32 EditBrowseBox::GetAutoColumnWidth(sal_uInt16 nColId)
    1245             :     {
    1246           0 :         sal_uInt32 nCurColWidth  = GetColumnWidth(nColId);
    1247           0 :         sal_uInt32 nMinColWidth = CalcZoom(20); // minimum
    1248           0 :         sal_uInt32 nNewColWidth = nMinColWidth;
    1249           0 :         long nMaxRows      = std::min(long(GetVisibleRows()), GetRowCount());
    1250           0 :         long nLastVisRow   = GetTopRow() + nMaxRows - 1;
    1251             : 
    1252           0 :         if (GetTopRow() <= nLastVisRow) // calc the column with using the cell contents
    1253             :         {
    1254           0 :             for (long i = GetTopRow(); i <= nLastVisRow; ++i)
    1255           0 :                 nNewColWidth = std::max(nNewColWidth,GetTotalCellWidth(i,nColId) + 12);
    1256             : 
    1257           0 :             if (nNewColWidth == nCurColWidth)   // size has not changed
    1258           0 :                 nNewColWidth = GetDefaultColumnWidth(GetColumnTitle(nColId));
    1259             :         }
    1260             :         else
    1261           0 :             nNewColWidth = GetDefaultColumnWidth(GetColumnTitle(nColId));
    1262           0 :         return nNewColWidth;
    1263             :     }
    1264             : 
    1265             : 
    1266           0 :     sal_uInt32 EditBrowseBox::GetTotalCellWidth(long, sal_uInt16)
    1267             :     {
    1268           0 :         return 0;
    1269             :     }
    1270             : 
    1271             : 
    1272           0 :     void EditBrowseBox::InvalidateHandleColumn()
    1273             :     {
    1274           0 :         Rectangle aHdlFieldRect( GetFieldRectPixel( 0, 0 ));
    1275           0 :         Rectangle aInvalidRect( Point(0,0), GetOutputSizePixel() );
    1276           0 :         aInvalidRect.Right() = aHdlFieldRect.Right();
    1277           0 :         Invalidate( aInvalidRect );
    1278           0 :     }
    1279             : 
    1280             : 
    1281           0 :     void EditBrowseBox::PaintTristate(OutputDevice&, const Rectangle& rRect, const TriState& eState, bool _bEnabled) const
    1282             :     {
    1283           0 :         pCheckBoxPaint->GetBox().SetState(eState);
    1284           0 :         pCheckBoxPaint->SetPosSizePixel(rRect.TopLeft(), rRect.GetSize());
    1285             : 
    1286             :         // First update the parent, preventing that while painting this window
    1287             :         // an update for the parent is done (because it's in the queue already)
    1288             :         // which may lead to hiding this window immediately
    1289             : // #95598# comment out OJ
    1290             : /*      if (pCheckBoxPaint->GetParent())
    1291             :             pCheckBoxPaint->GetParent()->Update();
    1292             : */
    1293           0 :         pCheckBoxPaint->GetBox().Enable(_bEnabled);
    1294           0 :         pCheckBoxPaint->Show();
    1295           0 :         pCheckBoxPaint->SetParentUpdateMode( false );
    1296           0 :         pCheckBoxPaint->Update();
    1297           0 :         pCheckBoxPaint->Hide();
    1298           0 :         pCheckBoxPaint->SetParentUpdateMode( true );
    1299           0 :     }
    1300             : 
    1301             : 
    1302           0 :     void EditBrowseBox::AsynchGetFocus()
    1303             :     {
    1304           0 :         if (nStartEvent)
    1305           0 :             Application::RemoveUserEvent(nStartEvent);
    1306             : 
    1307           0 :         m_pFocusWhileRequest = Application::GetFocusWindow();
    1308           0 :         nStartEvent = Application::PostUserEvent(LINK(this,EditBrowseBox,StartEditHdl));
    1309           0 :     }
    1310             : 
    1311             : 
    1312          42 :     void EditBrowseBox::SetBrowserFlags(sal_Int32 nFlags)
    1313             :     {
    1314          42 :         if (m_nBrowserFlags == nFlags)
    1315          42 :             return;
    1316             : 
    1317          42 :         bool RowPicturesChanges = ((m_nBrowserFlags & EBBF_NO_HANDLE_COLUMN_CONTENT) !=
    1318          42 :                                        (nFlags & EBBF_NO_HANDLE_COLUMN_CONTENT));
    1319          42 :         m_nBrowserFlags = nFlags;
    1320             : 
    1321          42 :         if (RowPicturesChanges)
    1322          42 :             InvalidateStatusCell(GetCurRow());
    1323             :     }
    1324             : 
    1325           2 :     inline void EditBrowseBox::HideAndDisable(CellControllerRef& rController)
    1326             :     {
    1327           2 :         rController->suspend();
    1328           2 :     }
    1329             : 
    1330           2 :     inline void EditBrowseBox::EnableAndShow() const
    1331             :     {
    1332           2 :         Controller()->resume();
    1333           2 :     }
    1334             : 
    1335             : 
    1336             : 
    1337          62 :     CellController::CellController(Control* pW)
    1338             :                    :pWindow( pW )
    1339          62 :                    ,bSuspended( true )
    1340             :     {
    1341             : 
    1342             :         DBG_ASSERT(pWindow, "CellController::CellController: missing the window!");
    1343             :         DBG_ASSERT(!pWindow->IsVisible(), "CellController::CellController: window should not be visible!");
    1344          62 :     }
    1345             : 
    1346             : 
    1347          62 :     CellController::~CellController()
    1348             :     {
    1349             : 
    1350          62 :     }
    1351             : 
    1352             : 
    1353           2 :     void CellController::suspend( )
    1354             :     {
    1355             :         DBG_ASSERT( bSuspended == !GetWindow().IsVisible(), "CellController::suspend: inconsistence!" );
    1356           2 :         if ( !isSuspended( ) )
    1357             :         {
    1358           2 :             CommitModifications();
    1359           2 :             GetWindow().Hide( );
    1360           2 :             GetWindow().Disable( );
    1361           2 :             bSuspended = true;
    1362             :         }
    1363           2 :     }
    1364             : 
    1365             : 
    1366           2 :     void CellController::resume( )
    1367             :     {
    1368             :         DBG_ASSERT( bSuspended == !GetWindow().IsVisible(), "CellController::resume: inconsistence!" );
    1369           2 :         if ( isSuspended( ) )
    1370             :         {
    1371           2 :             GetWindow().Enable( );
    1372           2 :             GetWindow().Show( );
    1373           2 :             bSuspended = false;
    1374             :         }
    1375           2 :     }
    1376             : 
    1377             : 
    1378           0 :     void CellController::CommitModifications()
    1379             :     {
    1380             :         // nothing to do in this base class
    1381           0 :     }
    1382             : 
    1383             : 
    1384           0 :     bool CellController::WantMouseEvent() const
    1385             :     {
    1386           0 :         return false;
    1387             :     }
    1388             : 
    1389             : 
    1390           0 :     void CellController::SetModified()
    1391             :     {
    1392           0 :     }
    1393             : 
    1394             : 
    1395           0 :     bool CellController::MoveAllowed(const KeyEvent&) const
    1396             :     {
    1397           0 :         return true;
    1398             :     }
    1399             : 
    1400        1227 : }   // namespace svt
    1401             : 
    1402             : 
    1403             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10