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

Generated by: LCOV version 1.11