summaryrefslogtreecommitdiff
path: root/svx/inc/svx/gridctrl.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/inc/svx/gridctrl.hxx')
-rw-r--r--svx/inc/svx/gridctrl.hxx613
1 files changed, 613 insertions, 0 deletions
diff --git a/svx/inc/svx/gridctrl.hxx b/svx/inc/svx/gridctrl.hxx
new file mode 100644
index 000000000000..6334137bc221
--- /dev/null
+++ b/svx/inc/svx/gridctrl.hxx
@@ -0,0 +1,613 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _SVX_GRIDCTRL_HXX
+#define _SVX_GRIDCTRL_HXX
+
+#include <tools/list.hxx>
+#include <com/sun/star/sdbc/XRowSet.hpp>
+#include <com/sun/star/beans/PropertyChangeEvent.hpp>
+#include <com/sun/star/util/XNumberFormatter.hpp>
+#include <com/sun/star/util/Date.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <vcl/fixed.hxx>
+#include <vcl/field.hxx>
+
+#ifndef _SV_BUTTON_HXX //autogen
+#include <vcl/button.hxx>
+#endif
+#include <tools/date.hxx>
+#include <tools/ref.hxx>
+#include <svtools/editbrowsebox.hxx>
+#include <vos/mutex.hxx>
+#include <comphelper/propmultiplex.hxx>
+#include <svtools/transfer.hxx>
+#include "svx/svxdllapi.h"
+
+class DbGridControl;
+class CursorWrapper;
+
+sal_Bool CompareBookmark(const ::com::sun::star::uno::Any& aLeft, const ::com::sun::star::uno::Any& aRight);
+
+namespace svxform
+{
+ class DataColumn;
+}
+DECLARE_LIST(DbDataColumns, ::svxform::DataColumn*)
+
+enum GridRowStatus
+{
+ GRS_CLEAN,
+ GRS_MODIFIED,
+ GRS_DELETED,
+ GRS_INVALID
+};
+
+//==================================================================
+// DbGridRow, Zeilenbeschreibung
+//==================================================================
+
+class DbGridRow : public SvRefBase
+{
+ ::com::sun::star::uno::Any m_aBookmark; // ::com::sun::star::text::Bookmark der Zeile, kann gesetzt sein
+ DbDataColumns m_aVariants;
+ GridRowStatus m_eStatus;
+ sal_Bool m_bIsNew;
+ // Zeile ist nicht mehr gueltig,
+ // wird bei der naechsten positionierung entfernt
+public:
+ DbGridRow():m_eStatus(GRS_CLEAN), m_bIsNew(sal_True) { }
+ DbGridRow(CursorWrapper* pCur, sal_Bool bPaintCursor);
+ void SetState(CursorWrapper* pCur, sal_Bool bPaintCursor);
+
+ ~DbGridRow();
+
+ // da GetField auf Geschwindigkeit getuned ist vorher immer noch hasField verwenden
+ sal_Bool HasField(sal_uInt32 nPos) const {return nPos < m_aVariants.Count();}
+ const ::svxform::DataColumn& GetField(sal_uInt32 nPos) const { return *m_aVariants.GetObject(nPos); }
+
+ void SetStatus(GridRowStatus _eStat) { m_eStatus = _eStat; }
+ GridRowStatus GetStatus() const { return m_eStatus; }
+ void SetNew(sal_Bool _bNew) { m_bIsNew = _bNew; }
+ sal_Bool IsNew() const { return m_bIsNew; }
+
+ const ::com::sun::star::uno::Any& GetBookmark() const { return m_aBookmark; }
+
+ sal_Bool IsValid() const { return m_eStatus == GRS_CLEAN || m_eStatus == GRS_MODIFIED; }
+ sal_Bool IsModified() const { return m_eStatus == GRS_MODIFIED; }
+};
+
+SV_DECL_REF(DbGridRow)
+
+//==================================================================
+// DbGridControl
+//==================================================================
+class DbGridColumn;
+DECLARE_LIST(DbGridColumns, DbGridColumn*)
+
+//==================================================================
+class FmGridListener
+{
+public:
+ virtual void selectionChanged() = 0;
+ virtual void columnChanged() = 0;
+};
+
+#define GRID_COLUMN_NOT_FOUND ((sal_uInt16)-1)
+
+//==================================================================
+// InitWindowFacet, describing which aspect of a column's Window to (re-)initialize
+//==================================================================
+enum InitWindowFacet
+{
+ InitFont = 0x01,
+ InitForeground = 0x02,
+ InitBackground = 0x04,
+ InitWritingMode = 0x08,
+ InitAll = 0xFF
+};
+
+//==================================================================
+class FmXGridSourcePropListener;
+class DisposeListenerGridBridge;
+typedef ::svt::EditBrowseBox DbGridControl_Base;
+class SVX_DLLPUBLIC DbGridControl : public DbGridControl_Base
+{
+ friend class FmXGridSourcePropListener;
+ friend class GridFieldValueListener;
+ friend class DisposeListenerGridBridge;
+
+public:
+ //==================================================================
+ // NavigationBar
+ //==================================================================
+ class NavigationBar: public Control
+ {
+ class AbsolutePos : public NumericField
+ {
+ public:
+ AbsolutePos(Window* pParent, WinBits nStyle = 0);
+
+ virtual void KeyInput(const KeyEvent& rEvt);
+ virtual void LoseFocus();
+ };
+
+ friend class NavigationBar::AbsolutePos;
+
+ // zusaetzliche Controls
+ FixedText m_aRecordText;
+ AbsolutePos m_aAbsolute; // AbsolutePositionierung
+ FixedText m_aRecordOf;
+ FixedText m_aRecordCount;
+
+ ImageButton m_aFirstBtn; // ImageButton fuer 'gehe zum ersten Datensatz'
+ ImageButton m_aPrevBtn; // ImageButton fuer 'gehe zum vorhergehenden Datensatz'
+ ImageButton m_aNextBtn; // ImageButton fuer 'gehe zum naechsten Datensatz'
+ ImageButton m_aLastBtn; // ImageButton fuer 'gehe zum letzten Datensatz'
+ ImageButton m_aNewBtn; // ImageButton fuer 'gehe zum neuen Datensatz'
+ sal_uInt16 m_nDefaultWidth;
+ sal_Int32 m_nCurrentPos;
+
+ sal_Bool m_bPositioning; // protect PositionDataSource against recursion
+
+ public:
+ // StatusIds fuer Controls der Bar
+ // wichtig fuers Invalidieren
+ enum State
+ {
+ RECORD_TEXT = 1,
+ RECORD_ABSOLUTE,
+ RECORD_OF,
+ RECORD_COUNT,
+ RECORD_FIRST,
+ RECORD_NEXT,
+ RECORD_PREV,
+ RECORD_LAST,
+ RECORD_NEW
+ };
+
+ NavigationBar(Window* pParent, WinBits nStyle = 0);
+
+ // Status Methoden fuer Controls
+ void InvalidateAll(sal_Int32 nCurrentPos = -1, sal_Bool bAll = sal_False);
+ void InvalidateState(sal_uInt16 nWhich) {SetState(nWhich);}
+ void SetState(sal_uInt16 nWhich);
+ sal_Bool GetState(sal_uInt16 nWhich) const;
+ sal_uInt16 GetDefaultWidth() const {return m_nDefaultWidth;}
+
+ protected:
+ virtual void Resize();
+ virtual void Paint(const Rectangle& rRect);
+ virtual void StateChanged( StateChangedType nType );
+
+ private:
+ DECL_LINK(OnClick, Button*);
+ sal_uInt16 ArrangeControls();
+
+ void PositionDataSource(sal_Int32 nRecord);
+ };
+
+ friend class DbGridControl::NavigationBar;
+
+public:
+ // diese Optionen werden verodert und geben an, welche der einzelnen feature
+ // freigegeben werden koennen, default ist readonly also 0
+ enum Option
+ {
+ OPT_READONLY = 0x00,
+ OPT_INSERT = 0x01,
+ OPT_UPDATE = 0x02,
+ OPT_DELETE = 0x04
+ };
+
+private:
+ Font m_aDefaultFont;
+ Link m_aMasterStateProvider;
+ Link m_aMasterSlotExecutor;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > m_xFormatter;
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceFactory;
+
+ DbGridColumns m_aColumns; // Spaltenbeschreibung
+ NavigationBar m_aBar;
+ DbGridRowRef m_xDataRow; // Zeile die modifiziert werden kann
+ // kommt vom DatenCursor
+ DbGridRowRef m_xSeekRow, // Zeile die von Iterator gesetzt wird
+ // kommt vom DatenCursor
+
+ m_xEmptyRow; // Datensatz zum einfuegen
+
+ sal_uInt32 m_nAsynAdjustEvent;
+
+ // if we modify the row for the new record, we automatically insert a "new new row".
+ // But if somebody else inserts a new record into the data source, we have to do the same.
+ // For that reason we have to listen to some properties of our data source.
+ ::comphelper::OPropertyChangeMultiplexer* m_pDataSourcePropMultiplexer;
+ FmXGridSourcePropListener* m_pDataSourcePropListener;
+
+ void* m_pFieldListeners;
+ // property listeners for field values
+
+ DisposeListenerGridBridge* m_pCursorDisposeListener;
+ // need to know about the diposing of the seek cursor
+ // construct analogous to the data source proplistener/multiplexer above :
+ // DisposeListenerGridBridge is a bridge from FmXDisposeListener which I don't want to be derived from
+
+ FmGridListener* m_pGridListener;
+
+protected:
+ CursorWrapper* m_pDataCursor; // Cursor fuer Updates
+ CursorWrapper* m_pSeekCursor; // Cursor zum Seeken
+
+private:
+ // dieses sind Laufvariablen
+ DbGridRowRef m_xCurrentRow; // Row an der aktuellen Zeile
+ DbGridRowRef m_xPaintRow; // Row die gerade drgestellt werden soll
+ sal_Int32 m_nSeekPos; // Position des SeekCursors
+ sal_Int32 m_nTotalCount; // wird gesetzt, wenn der DatenCursor mit dem Zählen der
+ // Datensätze fertig ist
+ // initial Wert ist -1
+ osl::Mutex m_aDestructionSafety;
+ osl::Mutex m_aAdjustSafety;
+
+ com::sun::star::util::Date
+ m_aNullDate; // NullDate of the Numberformatter;
+
+ BrowserMode m_nMode;
+ sal_Int32 m_nCurrentPos; // Aktuelle Position;
+ sal_uInt32 m_nDeleteEvent; // EventId fuer asychrone Loeschen von Zeilen
+ sal_uInt16 m_nOptions; // Was kann das Control (Insert, Update, Delete)
+ // default readonly
+ sal_uInt16 m_nOptionMask; // the mask of options to be enabled in setDataSource
+ // (with respect to the data source capabilities)
+ // defaults to (insert | update | delete)
+ USHORT m_nLastColId;
+ long m_nLastRowId;
+
+ sal_Bool m_bDesignMode : 1; // default = sal_False
+ sal_Bool m_bRecordCountFinal : 1;
+ sal_Bool m_bMultiSelection : 1;
+ sal_Bool m_bNavigationBar : 1;
+
+ sal_Bool m_bSynchDisplay : 1;
+ sal_Bool m_bForceROController : 1;
+ sal_Bool m_bHandle : 1;
+ sal_Bool m_bFilterMode : 1;
+ sal_Bool m_bWantDestruction : 1;
+ sal_Bool m_bInAdjustDataSource : 1;
+ sal_Bool m_bPendingAdjustRows : 1; // if an async adjust is pending, is it for AdjustRows or AdjustDataSource ?
+ sal_Bool m_bHideScrollbars : 1;
+
+protected:
+ sal_Bool m_bUpdating : 1; // werden gerade updates durchgefuehrt
+
+protected:
+ virtual sal_Bool SeekRow(long nRow);
+ virtual void VisibleRowsChanged( long nNewTopRow, sal_uInt16 nNumRows);
+ virtual void PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const;
+ virtual void PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId) const;
+ virtual RowStatus GetRowStatus(long nRow) const;
+ virtual sal_Bool CursorMoving(long nNewRow, sal_uInt16 nNewCol);
+ virtual void CursorMoved();
+ virtual void ArrangeControls(sal_uInt16& nX, sal_uInt16 nY);
+ virtual sal_uInt32 GetTotalCellWidth(long nRow, sal_uInt16 nColId);
+ virtual void Command(const CommandEvent& rEvt);
+ virtual long PreNotify(NotifyEvent& rEvt);
+ virtual void KeyInput(const KeyEvent& rEvt);
+ virtual void StateChanged( StateChangedType nType );
+ virtual void DataChanged( const DataChangedEvent& rDCEvt );
+ virtual void Select();
+
+ virtual ::svt::CellController* GetController(long nRow, sal_uInt16 nCol);
+
+ virtual void CellModified();
+ virtual sal_Bool SaveModified();
+ virtual sal_Bool IsModified() const;
+
+ virtual sal_uInt16 AppendColumn(const String& rName, sal_uInt16 nWidth = 0, sal_uInt16 nPos = HEADERBAR_APPEND, sal_uInt16 nId = (sal_uInt16)-1);
+ virtual void RemoveColumn(sal_uInt16 nId);
+ virtual DbGridColumn* CreateColumn(sal_uInt16 nId) const;
+ virtual void ColumnMoved(sal_uInt16 nId);
+ virtual sal_Bool SaveRow();
+ virtual sal_Bool IsTabAllowed(sal_Bool bForward) const;
+
+ /// hide a column
+ virtual void HideColumn(sal_uInt16 nId);
+ /// show a column
+ virtual void ShowColumn(sal_uInt16 nId);
+
+ /** This is called before executing a context menu for a row. rMenu contains the initial entries
+ handled by this base class' method (which always has to be called).
+ Derived classes may alter the menu in any way and handle any additional entries in
+ PostExecuteColumnContextMenu.
+ All disabled entries will be removed before executing the menu, so be careful with separators
+ near entries you probably wish to disable ...
+ */
+ virtual void PreExecuteRowContextMenu(sal_uInt16 nRow, PopupMenu& rMenu);
+ /** After executing the context menu for a row this method is called.
+ */
+ virtual void PostExecuteRowContextMenu(sal_uInt16 nRow, const PopupMenu& rMenu, sal_uInt16 nExecutionResult);
+
+ virtual void DataSourcePropertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException);
+
+ virtual void FieldValueChanged(sal_uInt16 _nId, const ::com::sun::star::beans::PropertyChangeEvent& _evt);
+ virtual void FieldListenerDisposing(sal_uInt16 _nId);
+
+ virtual void disposing(sal_uInt16 _nId, const ::com::sun::star::lang::EventObject& _rEvt);
+
+ // own overridables
+ /// called when the current row changed
+ virtual void onRowChange();
+ /// called when the current column changed
+ virtual void onColumnChange();
+
+ // DragSourceHelper overridables
+ virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel );
+
+ void executeRowContextMenu( long _nRow, const Point& _rPreferredPos );
+
+public:
+ DbGridControl(
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >,
+ Window* pParent,
+ WinBits nBits = WB_BORDER);
+
+ virtual ~DbGridControl();
+
+ virtual void Init();
+ virtual void InitColumnsByFields(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >& xFields) = 0;
+ virtual void RemoveRows();
+
+ /** GetCellText returns the text at the given position
+ @param _nRow
+ the number of the row
+ @param _nColId
+ the ID of the column
+ @return
+ the text out of the cell
+ */
+ virtual String GetCellText(long _nRow, USHORT _nColId) const;
+
+ void RemoveRows(sal_Bool bNewCursor);
+
+ void InvalidateStatus();
+
+ const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& getNumberFormatter() const {return m_xFormatter;}
+
+ // die Datenquelle
+ // die Optionen koennen die Updatefaehigkeiten noch einschraenken, nicht erweitern
+ virtual void setDataSource(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& rCursor,
+ sal_uInt16 nOpts = OPT_INSERT | OPT_UPDATE | OPT_DELETE);
+ virtual void Dispatch(sal_uInt16 nId);
+
+ CursorWrapper* getDataSource() const {return m_pDataCursor;}
+ const DbGridColumns& GetColumns() const {return m_aColumns;}
+
+ void EnableHandle(sal_Bool bEnable);
+ sal_Bool HasHandle() const {return m_bHandle;}
+ void InsertHandleColumn();
+
+ /// welche Position hat die Spalte mit der Id in der ::com::sun::star::sdbcx::View, die Handle-Column zahelt nicht mit
+ sal_uInt16 GetViewColumnPos( sal_uInt16 nId ) const { sal_uInt16 nPos = GetColumnPos(nId); return (nPos==(sal_uInt16)-1) ? GRID_COLUMN_NOT_FOUND : nPos-1; }
+
+ /** welche Position hat die Spalte mit der Id in m_aColumns, also dem von GetColumns gelieferten ::com::sun::star::sdbcx::Container ?
+ (unterscheidet sich u.U. von der von GetViewColumnPos gelieferten, wenn es versteckt Spalten gibt)
+ */
+ sal_uInt16 GetModelColumnPos( sal_uInt16 nId ) const;
+
+ /// Anzahl der Spalten im Model
+ sal_uInt16 GetViewColCount() const { return ColCount() - 1; }
+ sal_uInt16 GetModelColCount() const { return (sal_uInt16)m_aColumns.Count(); }
+ /// umgekehrt zu GetViewColumnPos : Id zu Position, die erste Nicht-Handle-Column hat die Position 0
+ sal_uInt16 GetColumnIdFromViewPos( sal_uInt16 nPos ) const { return GetColumnId(nPos + 1); }
+ sal_uInt16 GetColumnIdFromModelPos( sal_uInt16 nPos ) const;
+
+ virtual void SetDesignMode(sal_Bool bMode);
+ sal_Bool IsDesignMode() const {return m_bDesignMode;}
+ sal_Bool IsOpen() const {return m_pSeekCursor != NULL;}
+
+ virtual void SetFilterMode(sal_Bool bMode);
+ sal_Bool IsFilterMode() const {return m_bFilterMode;}
+ sal_Bool IsFilterRow(long nRow) const {return m_bFilterMode && nRow == 0;}
+
+ void EnableNavigationBar(sal_Bool bEnable);
+ sal_Bool HasNavigationBar() const {return m_bNavigationBar;}
+
+ sal_uInt16 GetOptions() const {return m_nOptions;}
+ NavigationBar& GetNavigationBar() {return m_aBar;}
+ sal_uInt16 SetOptions(sal_uInt16 nOpt);
+ // The new options are interpreted with respect to the current data source. If it is unable
+ // to update, to insert or to restore, the according options are ignored. If the grid isn't
+ // connected to a data source, all options except OPT_READONLY are ignored.
+
+ void SetMultiSelection(sal_Bool bMulti);
+ sal_Bool GetMultiSelection() const {return m_bMultiSelection;}
+
+ const com::sun::star::util::Date& getNullDate() const {return m_aNullDate;}
+
+ // Positionierung
+ void MoveToPosition(sal_uInt32 nPos);
+ void MoveToFirst();
+ void MoveToNext();
+ void MoveToPrev();
+ void MoveToLast();
+ void AppendNew();
+
+ // Abgleich der Cursor falls von außen der DatenCursor verschoben wurde
+ // Flag bedeutet ob ein Abgleich es Rowcounts vorgenommen werden soll
+ void AdjustDataSource(sal_Bool bFull = sal_False);
+ void Undo();
+
+ virtual void BeginCursorAction();
+ virtual void EndCursorAction();
+
+ // wird die aktuelle Zeile neu gesetzt
+ sal_Bool IsUpdating() const {return m_bUpdating;}
+
+ virtual void RowRemoved( long nRow, long nNumRows = 1, sal_Bool bDoPaint = sal_True );
+ virtual void RowInserted( long nRow, long nNumRows = 1, sal_Bool bDoPaint = sal_True, sal_Bool bKeepSelection = sal_False );
+ virtual void RowModified( long nRow, sal_uInt16 nColId = USHRT_MAX );
+
+ void resetCurrentRow();
+
+ sal_Bool getDisplaySynchron() const { return m_bSynchDisplay; }
+ void setDisplaySynchron(sal_Bool bSync);
+ void forceSyncDisplay();
+ // wenn das auf sal_False gesetzt wird, laeuft die Anzeige nicht mehr mit der aktuellen Cursor-Position synchron
+ // (soll heissen, in AdjustDataSource wird nicht in die zur CursorPosition gehoerenden Zeile gesprungen)
+ // wer das benutzt, sollte bitte wissen, was er tut, da zum Beispiel die Eingabe von Daten in einer Zeile auf der Anzeige,
+ // die gar nicht mit der Position des Cursors synchron ist, ziemlich kritisch sein koennte
+
+ sal_Bool isForcedROController() const { return m_bForceROController; }
+ void forceROController(sal_Bool bForce);
+ // Setzt man das auf sal_True, hat das GridControl immer einen ::com::sun::star::frame::Controller, der allerdings read-only ist. Ausserdem
+ // wird die Edit-Zeile des Controllers so eingestellt, dass sie ihre Selektion bei Fokus-Verlust weiterhin anzeigt.
+
+ const DbGridRowRef& GetCurrentRow() const {return m_xCurrentRow;}
+
+ void SetStateProvider(const Link& rProvider) { m_aMasterStateProvider = rProvider; }
+ // if this link is set the given provider will be asked for the state of my items.
+ // the return values are interpreted as follows :
+ // <0 -> not specified (use default mechanism to determine the state)
+ // ==0 -> the item is disabled
+ // >0 -> the item is enabled
+ void SetSlotExecutor(const Link& rExecutor) { m_aMasterSlotExecutor = rExecutor; }
+ // analogous : if this link is set, all nav-bar slots will be routed through it when executed
+ // if the handler returns nonzero, no further handling of the slot occurs
+
+ void EnablePermanentCursor(sal_Bool bEnable);
+ sal_Bool IsPermanentCursorEnabled() const;
+
+ /** forces both scrollbars to be hidden
+
+ For the horizontal srollbar, this is overruled by enabling the navigation bar: A navigation
+ bar <b>always</b> implies a horizontal scroll bar
+ @seealso EnableNavigationBar
+ */
+ void ForceHideScrollbars( sal_Bool _bForce );
+ sal_Bool IsForceHideScrollbars() const;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ getServiceManager() const { return m_xServiceFactory; }
+
+ /// returns <TRUE/> if the text of the given cell can be copied into the clipboard
+ sal_Bool canCopyCellText(sal_Int32 _nRow, sal_Int16 _nColId);
+ /// copies the text of the given cell into the clipboard
+ void copyCellText(sal_Int32 _nRow, sal_Int16 _nColId);
+
+ // selectin listener handling
+ FmGridListener* getGridListener() const { return m_pGridListener; }
+ void setGridListener( FmGridListener* _pListener ) { m_pGridListener = _pListener; }
+
+ // helper class to grant access to selected methods from within the DbCellControl class
+ struct GrantCellControlAccess
+ {
+ friend class DbCellControl;
+ protected:
+ GrantCellControlAccess() { }
+ };
+
+ /// called when a controller needs to be re-initialized
+ void refreshController(sal_uInt16 _nColId, GrantCellControlAccess _aAccess);
+
+ /**
+ @return
+ The count of additional controls of the control area.
+ */
+ virtual sal_Int32 GetAccessibleControlCount() const;
+
+ /** Creates the accessible object of an additional control.
+ @param _nIndex
+ The 0-based index of the control.
+ @return
+ The XAccessible interface of the specified control.
+ */
+ virtual ::com::sun::star::uno::Reference<
+ ::com::sun::star::accessibility::XAccessible >
+ CreateAccessibleControl( sal_Int32 _nIndex );
+
+ // IAccessibleTableProvider
+ /** Creates the accessible object of a data table cell.
+ @param nRow The row index of the cell.
+ @param nColumnId The column ID of the cell.
+ @return The XAccessible interface of the specified cell. */
+ virtual ::com::sun::star::uno::Reference<
+ ::com::sun::star::accessibility::XAccessible >
+ CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnId );
+
+protected:
+ void RecalcRows(long nNewTopRow, sal_uInt16 nLinesOnScreen, sal_Bool bUpdateCursor);
+ sal_Bool SeekCursor(long nRow, sal_Bool bAbsolute = sal_False);
+ void RemoveColumns(); // aufraeumen eigener strukturen
+ void AdjustRows();
+ sal_Int32 AlignSeekCursor();
+ sal_Bool SetCurrent(long nNewRow);
+
+ String GetCurrentRowCellText(DbGridColumn* pCol,const DbGridRowRef& _rRow) const;
+ virtual void DeleteSelectedRows();
+ sal_Bool IsValid(const DbGridRowRef& _xRow) const {return _xRow && _xRow->IsValid();}
+
+ // Zeile an der gerade eingefuegt wird
+ sal_Bool IsCurrentAppending() const;
+
+ // Leerzeile zum Einfuegen
+ sal_Bool IsInsertionRow(long nRow) const;
+
+ void SetSeekPos(sal_Int32 nPos) {m_nSeekPos = nPos;}
+ sal_Int32 GetCurrentPos() const {return m_nCurrentPos;}
+ sal_Int32 GetSeekPos() const {return m_nSeekPos;}
+ sal_Int32 GetTotalCount() const {return m_nTotalCount;}
+
+ const DbGridRowRef& GetEmptyRow() const { return m_xEmptyRow; }
+ const DbGridRowRef& GetSeekRow() const { return m_xSeekRow; }
+ const DbGridRowRef& GetPaintRow() const { return m_xPaintRow; }
+ CursorWrapper* GetSeekCursor() const { return m_pSeekCursor; }
+
+ void ConnectToFields();
+ void DisconnectFromFields();
+
+ void implAdjustInSolarThread(sal_Bool _bRows);
+ // calls AdjustRows or AdjustDataSource, synchron if the caller is running in the solar thread, else asynchron
+
+protected:
+ virtual void InitController(::svt::CellControllerRef& rController, long nRow, sal_uInt16 nCol);
+ void Construct();
+ void ImplInitWindow( const InitWindowFacet _eInitWhat );
+ DECL_LINK(OnDelete, void*);
+
+ DECL_LINK(OnAsyncAdjust, void*);
+ // if the param is != NULL, AdjustRows will be called, else AdjustDataSource
+
+private:
+ using BrowseBox::InsertHandleColumn;
+};
+
+
+SV_IMPL_REF(DbGridRow);
+
+
+#endif // _SVX_GRIDCTRL_HXX
+