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

Generated by: LCOV version 1.10