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

Generated by: LCOV version 1.10