1
0
Fork 0
libreoffice/sc/source/ui/inc/csvgrid.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

315 lines
16 KiB
C++

/* -*- 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 <vcl/virdev.hxx>
#include <unotools/options.hxx>
#include <vector>
#include <memory>
#include <scdllapi.h>
#include <editutil.hxx>
#include "csvcontrol.hxx"
#include "csvsplits.hxx"
namespace svtools { class ColorConfig; }
class EditEngine;
class ScAsciiOptions;
class ScAccessibleCsvControl;
class ScCsvTableBox;
const sal_uInt32 CSV_COLUMN_INVALID = CSV_VEC_NOTFOUND;
/** This struct contains the state of one table column. */
struct ScCsvColState
{
sal_Int32 mnType; /// Data type.
bool mbColumnSelected;
explicit ScCsvColState( sal_Int32 nType = CSV_TYPE_DEFAULT ) :
mnType( nType ), mbColumnSelected( false ) {}
bool IsSelected() const { return mbColumnSelected; }
void Select( bool bSel ) { mbColumnSelected = bSel; }
};
typedef ::std::vector< ScCsvColState > ScCsvColStateVec;
/** A data grid control for the CSV import dialog. The design of this control
simulates a Calc spreadsheet with row and column headers. */
class SAL_DLLPUBLIC_RTTI ScCsvGrid : public ScCsvControl, public utl::ConfigurationListener
{
private:
ScCsvTableBox* mpTableBox; /// Grid Parent
VclPtr<VirtualDevice> mpBackgrDev; /// Grid background, headers, cell texts.
VclPtr<VirtualDevice> mpGridDev; /// Data grid with selection and cursor.
std::unique_ptr<weld::Menu> mxPopup; /// Popup menu for column types.
::svtools::ColorConfig* mpColorConfig; /// Application color configuration.
Color maBackColor; /// Cell background color.
Color maGridColor; /// Table grid color.
Color maGridPBColor; /// Grid color for "first imported line" delimiter.
Color maAppBackColor; /// Background color for unused area.
Color maTextColor; /// Text color for data area.
Color maHeaderBackColor; /// Background color for headers.
Color maHeaderGridColor; /// Grid color for headers.
Color maHeaderTextColor; /// Text color for headers.
Color maSelectColor; /// Header color of selected columns.
std::unique_ptr< ScEditEngineDefaulter >
mpEditEngine; /// For drawing cell texts.
vcl::Font maHeaderFont; /// Font for column and row headers.
vcl::Font maMonoFont; /// Monospace font for data cells.
Size maWinSize; /// Size of the control.
Size maEdEngSize; /// Paper size for edit engine.
ScCsvSplits maSplits; /// Vector with split positions.
ScCsvColStateVec maColStates; /// State of each column.
std::vector<OUString> maTypeNames; /// UI names of data types.
std::vector< std::vector<OUString> > maTexts; /// 2D-vector for cell texts.
sal_Int32 mnFirstImpLine; /// First imported line (0-based).
sal_uInt32 mnRecentSelCol; /// Index of most recently selected column.
sal_uInt32 mnMTCurrCol; /// Current column of mouse tracking.
bool mbTracking; /// True if Mouse tracking
bool mbMTSelecting; /// Mouse tracking mode: true = select, false = deselect.
public:
explicit ScCsvGrid(const ScCsvLayoutData& rData, std::unique_ptr<weld::Menu> xPopup, ScCsvTableBox* pTableBox);
virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
ScCsvTableBox* GetTableBox() { return mpTableBox; }
virtual ~ScCsvGrid() override;
/** Finishes initialization. Must be called after constructing a new object. */
void Init();
// common grid handling ---------------------------------------------------
public:
/** Updates layout data dependent from the control's state. */
void UpdateLayoutData();
/** Updates X coordinate of first visible position dependent from line numbers. */
void UpdateOffsetX();
/** Apply current layout data to the grid control. */
void ApplyLayout( const ScCsvLayoutData& rOldData );
/** Sets the number of the first imported line (for visual feedback). nLine is 0-based! */
void SetFirstImportedLine( sal_Int32 nLine );
/** Finds a column position nearest to nPos which does not cause scrolling the visible area. */
sal_Int32 GetNoScrollCol( sal_Int32 nPos ) const;
private:
/** Reads colors from system settings. */
void InitColors();
/** Initializes all font settings. */
void InitFonts();
/** Initializes all data dependent from the control's size. */
void InitSizeData();
// split handling ---------------------------------------------------------
public:
/** Inserts a split. */
void InsertSplit( sal_Int32 nPos );
/** Removes a split. */
void RemoveSplit( sal_Int32 nPos );
/** Inserts a new or removes an existing split. */
void MoveSplit( sal_Int32 nPos, sal_Int32 nNewPos );
/** Removes all splits. */
void RemoveAllSplits();
/** Removes all splits and inserts the splits from rSplits. */
void SetSplits( const ScCsvSplits& rSplits );
private:
/** Inserts a split and adjusts column data. */
bool ImplInsertSplit( sal_Int32 nPos );
/** Removes a split and adjusts column data. */
bool ImplRemoveSplit( sal_Int32 nPos );
/** Clears the split array and re-inserts boundary splits. */
void ImplClearSplits();
// columns/column types ---------------------------------------------------
public:
/** Returns the number of columns. */
sal_uInt32 GetColumnCount() const { return maColStates.size(); }
/** Returns the index of the first visible column. */
sal_uInt32 GetFirstVisColumn() const;
/** Returns the index of the last visible column. */
sal_uInt32 GetLastVisColumn() const;
/** Returns true, if nColIndex points to an existing column. */
bool IsValidColumn( sal_uInt32 nColIndex ) const;
/** Returns true, if column with index nColIndex is (at least partly) visible. */
bool IsVisibleColumn( sal_uInt32 nColIndex ) const;
/** Returns X coordinate of the specified column. */
sal_Int32 GetColumnX( sal_uInt32 nColIndex ) const;
/** Returns column index from output coordinate. */
sal_uInt32 GetColumnFromX( sal_Int32 nX ) const;
/** Returns start position of the column with the specified index. */
sal_Int32 GetColumnPos( sal_uInt32 nColIndex ) const { return maSplits[ nColIndex ]; }
/** Returns column index from position. A split counts to its following column. */
sal_uInt32 GetColumnFromPos( sal_Int32 nPos ) const;
/** Returns the character width of the column with the specified index. */
sal_Int32 GetColumnWidth( sal_uInt32 nColIndex ) const;
/** Returns the vector with the states of all columns. */
const ScCsvColStateVec& GetColumnStates() const { return maColStates; }
/** Sets all column states to the values in the passed vector. */
void SetColumnStates( ScCsvColStateVec&& rColStates );
/** Returns the data type of the selected columns. */
SC_DLLPUBLIC sal_Int32 GetSelColumnType() const;
/** Changes the data type of all selected columns. */
void SetSelColumnType( sal_Int32 nType );
/** Sets new UI data type names. */
void SetTypeNames( std::vector<OUString>&& rTypeNames );
/** Returns the UI type name of the specified column. */
OUString GetColumnTypeName( sal_uInt32 nColIndex ) const;
/** Fills the options object with column data for separators mode. */
void FillColumnDataSep( ScAsciiOptions& rOptions ) const;
/** Fills the options object with column data for fixed width mode. */
void FillColumnDataFix( ScAsciiOptions& rOptions ) const;
private:
/** Returns the data type of the specified column. */
sal_Int32 GetColumnType( sal_uInt32 nColIndex ) const;
/** Sets the data type of the specified column. */
void SetColumnType( sal_uInt32 nColIndex, sal_Int32 nColType );
/** Scrolls data grid vertically. */
void ScrollVertRel( ScMoveMode eDir );
/** Executes the data type popup menu. */
void ExecutePopup( const Point& rPos );
// selection handling -----------------------------------------------------
public:
/** Returns true, if the specified column is selected. */
bool IsSelected( sal_uInt32 nColIndex ) const;
/** Returns index of the first selected column. */
sal_uInt32 GetFirstSelected() const;
/** Returns index of the first selected column really after nFromIndex. */
sal_uInt32 GetNextSelected( sal_uInt32 nFromIndex ) const;
/** Selects or deselects the specified column. */
void Select( sal_uInt32 nColIndex, bool bSelect = true );
/** Toggles selection of the specified column. */
void ToggleSelect( sal_uInt32 nColIndex );
/** Selects or deselects the specified column range. */
void SelectRange( sal_uInt32 nColIndex1, sal_uInt32 nColIndex2, bool bSelect = true );
/** Selects or deselects all columns. */
void SelectAll( bool bSelect = true );
/** Returns index of the focused column. */
sal_uInt32 GetFocusColumn() const { return GetColumnFromPos( GetGridCursorPos() ); }
private:
/** Moves column cursor to a new position. */
void MoveCursor( sal_uInt32 nColIndex );
/** Moves column cursor to the given direction. */
void MoveCursorRel( ScMoveMode eDir );
/** Clears the entire selection without notify. */
void ImplClearSelection();
/** Executes selection action for a specific column. */
void DoSelectAction( sal_uInt32 nColIndex, sal_uInt16 nModifier );
// cell contents ----------------------------------------------------------
public:
/** Fills all cells of a line with the passed text (separators mode). */
void ImplSetTextLineSep(
sal_Int32 nLine, const OUString& rTextLine,
const OUString& rSepChars, sal_Unicode cTextSep, bool bMergeSep, bool bRemoveSpace = false );
/** Fills all cells of a line with the passed text (fixed width mode). */
void ImplSetTextLineFix( sal_Int32 nLine, std::u16string_view rTextLine );
/** Returns the text of the specified cell. */
OUString GetCellText( sal_uInt32 nColIndex, sal_Int32 nLine ) const;
// event handling ---------------------------------------------------------
protected:
virtual void Resize() override;
virtual void GetFocus() override;
virtual void LoseFocus() override;
virtual bool MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual bool MouseMove( const MouseEvent& rMEvt ) override;
virtual bool MouseButtonUp( const MouseEvent& rMEvt ) override;
virtual bool KeyInput( const KeyEvent& rKEvt ) override;
virtual bool Command( const CommandEvent& rCEvt ) override;
virtual tools::Rectangle GetFocusRect() override;
virtual void StyleUpdated() override;
virtual void ConfigurationChanged( ::utl::ConfigurationBroadcaster*, ConfigurationHints ) override;
// painting ---------------------------------------------------------------
protected:
virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override;
public:
/** Redraws the entire data grid. */
void ImplRedraw(vcl::RenderContext& rRenderContext);
/** Returns a pointer to the used edit engine. */
EditEngine* GetEditEngine();
private:
/** Returns the width of the control. */
sal_Int32 GetWidth() const { return maWinSize.Width(); }
/** Returns the height of the control. */
sal_Int32 GetHeight() const { return maWinSize.Height(); }
/** Sets a clip region in the specified output device for the specified column. */
void ImplSetColumnClipRegion( OutputDevice& rOutDev, sal_uInt32 nColIndex );
/** Draws the header of the specified column to the specified output device. */
void ImplDrawColumnHeader( OutputDevice& rOutDev, sal_uInt32 nColIndex, Color aFillColor );
/** Draws the text at the specified position to maBackgrDev. */
void ImplDrawCellText( const Point& rPos, const OUString& rText );
/** Draws the "first imported line" separator to maBackgrDev (or erases, if bSet is false). */
void ImplDrawFirstLineSep( bool bSet );
/** Draws the column with index nColIndex to maBackgrDev. */
void ImplDrawColumnBackgr( sal_uInt32 nColIndex );
/** Draws the row headers column to maBackgrDev. */
void ImplDrawRowHeaders();
/** Draws all columns and the row headers column to maBackgrDev. */
void ImplDrawBackgrDev();
/** Draws the column with index nColIndex with its selection state to maGridDev. */
void ImplDrawColumnSelection( sal_uInt32 nColIndex );
/** Draws all columns with selection and cursor to maGridDev. */
void ImplDrawGridDev();
/** Redraws the entire column (background and selection). */
void ImplDrawColumn( sal_uInt32 nColIndex );
/** Optimized drawing: Scrolls horizontally and redraws only missing parts. */
void ImplDrawHorzScrolled( sal_Int32 nOldPos );
/** Inverts the cursor bar at the specified position in maGridDev. */
void ImplInvertCursor( sal_Int32 nPos );
// accessibility ----------------------------------------------------------
protected:
/** Creates a new accessible object. */
virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */