/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #pragma once #include #include #include #include #include #include #include namespace connectivity { class OSQLParseNode; } namespace dbaui { #define BROW_FIELD_ROW 0 #define BROW_COLUMNALIAS_ROW 1 #define BROW_TABLE_ROW 2 #define BROW_ORDER_ROW 3 #define BROW_VIS_ROW 4 #define BROW_FUNCTION_ROW 5 #define BROW_CRIT1_ROW 6 #define BROW_CRIT2_ROW 7 #define BROW_CRIT3_ROW 8 #define BROW_CRIT4_ROW 9 #define BROW_CRIT5_ROW 10 #define BROW_CRIT6_ROW 11 #define BROW_ROW_CNT 12 class OQueryDesignView; class OSelectionBrowseBox final : public ::svt::EditBrowseBox { friend class OQueryDesignView; std::vector m_bVisibleRow; // at pos we find the RowId Timer m_timerInvalidate; sal_Int32 m_nSeekRow; BrowserMode m_nMode; // remember the BrowseModes VclPtr< ::svt::EditControl> m_pTextCell; VclPtr< ::svt::CheckBoxControl> m_pVisibleCell; VclPtr< ::svt::ComboBoxControl> m_pFieldCell; VclPtr< ::svt::ListBoxControl> m_pFunctionCell; VclPtr< ::svt::ListBoxControl> m_pTableCell; VclPtr< ::svt::ListBoxControl> m_pOrderCell; sal_Int32 m_nMaxColumns; // maximum number of columns in a Select-Statement OUString m_aFunctionStrings; sal_uInt16 m_nVisibleCount; // maximum number of visible rows sal_uInt32 m_nLastSortColumn; // index of last (highest) sort column bool m_bOrderByUnRelated; bool m_bGroupByUnRelated; bool m_bStopTimer; bool m_bWasEditing; bool m_bDisableErrorBox; bool m_bInUndoMode; DECL_LINK(OnInvalidateTimer, Timer*, void); public: explicit OSelectionBrowseBox( vcl::Window* pParent ); virtual ~OSelectionBrowseBox() override; virtual void dispose() override; void initialize(); OTableFieldDescRef InsertField( const OJoinExchangeData& jxdSource ); OTableFieldDescRef InsertField( const OTableFieldDescRef& rInfo, sal_uInt16 _nColumnPosition = BROWSER_INVALIDID, bool bVis=true, bool bActivate=true ); void InsertColumn( const OTableFieldDescRef& pEntry, sal_uInt16& _nColumnPosition ); void RemoveColumn( sal_uInt16 _nColumnId ); void DeleteFields( const OUString& rAliasName ); bool HasFieldByAliasName(std::u16string_view rFieldName, OTableFieldDescRef const & rInfo) const; // AddGroupBy:: inserts a field with function == grouping. If the fields already exists and uses an aggregate function, // the flag is not set void AddGroupBy( const OTableFieldDescRef& rInfo ); void AddCondition( const OTableFieldDescRef& rInfo, const OUString& rValue, const sal_uInt16 nLevel, bool _bAddOrOnOneLine ); void DuplicateConditionLevel( const sal_uInt16 nLevel); void AddOrder(const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt32 _nCurrentPos); void ClearAll(); OTableFieldDescRef const & AppendNewCol( sal_uInt16 nCnt=1 ); bool Save(); OQueryDesignView* getDesignView(); OQueryDesignView* getDesignView() const; sal_uInt16 FieldsCount(); void SetColWidth(sal_uInt16 nColId, tools::Long lNewWidth); // unlike SetColumnWidth of the base class it checks an active cell in this column OUString GetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId); void SetCellContents(sal_Int32 nCellIndex, sal_uInt16 nColId, const OUString& strNewText); // cell content (formatted as string) set/return sal_Int32 GetNoneVisibleRows() const; void SetNoneVisibleRow(sal_Int32 nRows); bool IsRowVisible(sal_uInt16 _nWhich) const; void SetRowVisible(sal_uInt16 _nWhich, bool _bVis); void SetReadOnly(bool bRO); // calculate an optimal size. Basically, this takes into account the number of visible rows. Size CalcOptimalSize( const Size& _rAvailable ); // can the current content be cut bool isPasteAllowed() const; bool isCutAllowed() const; bool isCopyAllowed() const; void cut(); void paste(); void copy(); virtual void GetFocus() override; virtual void DeactivateCell(bool bUpdate = true) override; virtual void ColumnMoved( sal_uInt16 nColId ) override { ColumnMoved(nColId,true); } void ColumnMoved( sal_uInt16 nColId, bool _bCreateUndo); void Fill(); void PreFill(); /** Disables the generation of undo actions */ void EnterUndoMode() { m_bInUndoMode = true; } /** Enables the generation of undo actions */ void LeaveUndoMode() { m_bInUndoMode = false; } /** 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 OUString GetCellText(sal_Int32 _nRow, sal_uInt16 _nColId) const override; /** returns the description of the row. @param _nRow The row number. @return The header text of the specified row. */ virtual OUString GetRowDescription( sal_Int32 _nRow ) const override; /** return the name of the specified object. @param eObjType The type to ask for @param _nPosition The position of a tablecell (index position), header bar column/row cell @return The name of the specified object. */ virtual OUString GetAccessibleObjectName( AccessibleBrowseBoxObjType eObjType,sal_Int32 _nPosition = -1) const override; // 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 css::uno::Reference< css::accessibility::XAccessible > CreateAccessibleCell( sal_Int32 nRow, sal_uInt16 nColumnId ) override; private: virtual bool SeekRow( sal_Int32 nRow ) override; virtual void PaintStatusCell(OutputDevice& rDev, const tools::Rectangle& rRect) const override; virtual void PaintCell(OutputDevice& rDev, const tools::Rectangle& rRect, sal_uInt16 nColumnId ) const override; virtual sal_Int8 AcceptDrop( const BrowserAcceptDropEvent& rEvt ) override; virtual sal_Int8 ExecuteDrop( const BrowserExecuteDropEvent& rEvt ) override; virtual void MouseButtonDown( const BrowserMouseEvent& rEvt ) override; virtual void MouseButtonUp( const BrowserMouseEvent& rEvt ) override; virtual void KeyInput( const KeyEvent& rEvt ) override; virtual void Command(const CommandEvent& rEvt) override; virtual ::svt::CellController* GetController(sal_Int32 nRow, sal_uInt16 nCol) override; virtual void InitController(::svt::CellControllerRef& rController, sal_Int32 nRow, sal_uInt16 nCol) override; virtual void CellModified() override; virtual bool SaveModified() override; virtual void Init() override; virtual void ColumnResized( sal_uInt16 nColId ) override; virtual sal_uInt32 GetTotalCellWidth(sal_Int32 nRow, sal_uInt16 nColId) override; // if you want to have an own header ... virtual VclPtr imp_CreateHeaderBar(BrowseBox* pParent) override; void stopTimer(); void startTimer(); OTableFieldDescRef FindFirstFreeCol(sal_uInt16& _rColumnPosition); // rCol contains the number (in pOTableFieldDescList) of the first column, which itself tells it is empty // if there are none, rCol is undefined and the returnvalue NULL void CheckFreeColumns(sal_uInt16& _rColumnPosition); // checks if empty columns are available, if not, a new pack is appended // rCol contains the number of the first empty column (in pOTableFieldDescList) void RemoveField( sal_uInt16 nId ); tools::Rectangle GetInvalidRect( sal_uInt16 nColId ); sal_Int32 GetRealRow(sal_Int32 nRow) const; sal_Int32 GetBrowseRow(sal_Int32 nRowId) const; bool GetFunctionName(sal_uInt32 _nFunctionTokenId, OUString& rFkt); void appendUndoAction(const OUString& _rOldValue,std::u16string_view _rNewValue,sal_Int32 _nRow, bool& _bListAction); void appendUndoAction(const OUString& _rOldValue,std::u16string_view _rNewValue,sal_Int32 _nRow); OTableFields& getFields() const; static void enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl); void setTextCellContext(const OTableFieldDescRef& _rEntry,const OUString& _sText,const OUString& _sHelpId); void invalidateUndoRedo(); OTableFieldDescRef getEntry(OTableFields::size_type _nPos); void adjustSelectionMode( bool _bClickedOntoHeader, bool _bClickedOntoHandleCol ); /** save the field change in save modified @param _sFieldName The field name inserted by the user. @param _pEntry The entry which will contain the necessary entries. @param _bListAction Will be set to when we are in a list action otherwise @return if an error occurred otherwise */ bool saveField(OUString& _sFieldName, OTableFieldDescRef const & _pEntry, bool& _bListAction); /** sets the table window at the _pEntry @param _pEntry The entry where the window should be set. @param _sTableName The table name to search for. @return if the table name was set otherwise */ bool fillEntryTable(OTableFieldDescRef const & _pEntry,const OUString& _sTableName); /** uses the parse node to fill all information into the field @param _pColumnRef The parse node used to fill the info into the field. @param _xMetaData Use to parse the node to a string. @param _pEntry The entry which will contain the necessary entries. @param _bListAction Will be set to when we are in a list action otherwise @return if an error occurred otherwise */ bool fillColumnRef( const ::connectivity::OSQLParseNode* _pColumnRef, const css::uno::Reference< css::sdbc::XConnection >& _rxConnection, OTableFieldDescRef const & _pEntry, bool& _bListAction); bool fillColumnRef( const OUString& _sColumnName, std::u16string_view _sTableRange, const css::uno::Reference< css::sdbc::XDatabaseMetaData >& _xMetaData, OTableFieldDescRef const & _pEntry, bool& _bListAction); /** append an undo action for the table field @param _sOldAlias The old table alias. @param _sAlias The new alias name. @param _bListAction Will be set to when we are in a list action otherwise */ void notifyTableFieldChanged(const OUString& _sOldAlias,std::u16string_view _sAlias, bool& _bListAction,sal_uInt16 _nColumnId); /** append an undo action for the function field @param _sOldFunctionName The old value. @param _sFunctionName The new function name. @param _bListAction Will be set to when we are in a list action otherwise */ void notifyFunctionFieldChanged(const OUString& _sOldFunctionName,std::u16string_view _sFunctionName, bool& _bListAction,sal_uInt16 _nColumnId); /** clears the function fields of the submitted entry if it doesn't match the SQL standard and append an undo action. E.q. AGGREGATE functions are only valid when the field name isn't an asterisk @param _sFieldName The field name. @param _pEntry The entry to be cleared @param _bListAction When a list action will be created. */ void clearEntryFunctionField(std::u16string_view _sFieldName,OTableFieldDescRef const & _pEntry, bool& _bListAction,sal_uInt16 _nColumnId); /** remove or insert the necessary function types @param _pEntry The currently edited entry. */ void setFunctionCell(OTableFieldDescRef const & _pEntry); using ::svt::EditBrowseBox::AcceptDrop; using ::svt::EditBrowseBox::ExecuteDrop; using ::svt::EditBrowseBox::MouseButtonDown; using ::svt::EditBrowseBox::MouseButtonUp; }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */