blob: 1da0526796535fcf26c586a30a9c700cd2dd4726 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the Collabora Office 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/.
*/
#pragma once
#include "SheetViewTypes.hxx"
#include "SheetView.hxx"
#include "types.hxx"
#include "scdllapi.h"
#include <o3tl/safeint.hxx>
#include <vector>
#include <memory>
#include <iterator>
class ScTable;
namespace sc
{
/** Captured sort data for a default view.*/
struct SC_DLLPUBLIC DefaultViewSortData
{
SortOrderReverser maSortOrder;
/// Per sheet view sort data - only populated in captured snapshots.
std::vector<std::pair<SheetViewID, std::shared_ptr<SheetViewSortData>>> maSheetViewSortData;
};
/** Manager and the holder of the sheet views for a sheet. */
class SC_DLLPUBLIC SheetViewManager
{
private:
std::vector<std::shared_ptr<SheetView>> maViews;
size_t mnSheetViewCount = 0;
sal_Int32 maNameCounter = 0;
/** Sort data for a default view. Null when no sort. */
std::shared_ptr<DefaultViewSortData> mpSortData;
/** Ensure sort data is allocated. */
DefaultViewSortData& ensureSortData();
bool isValidSheetViewID(SheetViewID nID) const
{
return nID >= 0 && o3tl::make_unsigned(nID) < maViews.size();
}
OUString generateName();
/** Forward iterator over valid (non-null) sheet views only. */
class SheetViewIterator
{
private:
using VectorIterator = std::vector<std::shared_ptr<SheetView>>::const_iterator;
VectorIterator maCurrentIt;
VectorIterator maEndIt;
void skipEmpty()
{
while (maCurrentIt != maEndIt && !(*maCurrentIt))
{
maCurrentIt++;
}
}
public:
SheetViewIterator(VectorIterator aBegin, VectorIterator aEnd)
: maCurrentIt(aBegin)
, maEndIt(aEnd)
{
skipEmpty();
}
SheetView& operator*() const { return **maCurrentIt; }
SheetViewIterator& operator++()
{
maCurrentIt++;
skipEmpty();
return *this;
}
bool operator==(SheetViewIterator const& rOther) const
{
return maCurrentIt == rOther.maCurrentIt;
}
};
/** Wrapper for SheetViewIterator so it is possible to use it with range-for loops. */
class SheetViewRange
{
std::vector<std::shared_ptr<SheetView>> const& mrViews;
public:
SheetViewRange(std::vector<std::shared_ptr<SheetView>> const& rViews)
: mrViews(rViews)
{
}
SheetViewIterator begin() const
{
return SheetViewIterator(mrViews.begin(), mrViews.end());
}
SheetViewIterator end() const { return SheetViewIterator(mrViews.end(), mrViews.end()); }
};
public:
SheetViewManager();
/** Creates a new sheet view. */
SheetViewID create(ScTable* pSheetViewTable);
/** Returns a sheet view for the ID. */
std::shared_ptr<SheetView> get(SheetViewID nID) const;
/** True if there are no sheet views. */
bool isEmpty() const { return mnSheetViewCount == 0; }
/** Number of sheet views. */
size_t size() const { return mnSheetViewCount; }
/** Remove the sheet view with the ID. True if successful. */
bool remove(SheetViewID nID);
/** Remove all sheet views. */
void removeAll();
/** Returns a range that iterates only over valid (non-null) sheet views. */
SheetViewRange iterateValidSheetViews() const { return SheetViewRange(maViews); }
static OUString defaultViewName();
SortOrderReverser const* getSortOrder() const;
void addOrderIndices(SortOrderInfo const& rSortInfo);
void mergeReorderParameters(ReorderParam const& rReorderParameters);
/** Update when rows are inserted. */
void insertedRows(SCROW nStartRow, SCROW nRowCount);
/** Update when rows are deleted. */
void deletedRows(SCROW nStartRow, SCROW nRowCount);
/** Update when columns are inserted. */
void insertedColumns(SCCOL nStartCol, SCCOL nColCount);
/** Update when columns are deleted. */
void deletedColumns(SCCOL nStartCol, SCCOL nColCount);
/** Capture sort data (deep copy).*/
std::shared_ptr<DefaultViewSortData> captureSortData() const;
/** Restore sort data from a previous capture. */
void restoreSortData(std::shared_ptr<DefaultViewSortData> const& pData);
};
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */