1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/* -*- 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/.
*/
#ifndef INCLUDED_SC_SOURCE_UI_INC_DATASTREAM_HXX
#define INCLUDED_SC_SOURCE_UI_INC_DATASTREAM_HXX
#include <sal/config.h>
#include <rtl/ref.hxx>
#include <rtl/ustring.hxx>
#include <vcl/timer.hxx>
#include <address.hxx>
#include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
#include <vector>
#include <documentstreamaccess.hxx>
class ScDocShell;
class ScDocument;
class Window;
namespace sc {
namespace datastreams {
class CallerThread;
class ReaderThread;
}
class DataStream : boost::noncopyable
{
public:
struct Cell
{
struct Str
{
size_t Pos;
size_t Size;
};
union
{
Str maStr;
double mfValue;
};
bool mbValue;
Cell();
Cell( const Cell& r );
};
struct Line
{
OString maLine;
std::vector<Cell> maCells;
};
typedef std::vector<Line> LinesType;
enum MoveType { NO_MOVE, RANGE_DOWN, MOVE_DOWN, MOVE_UP };
enum { SCRIPT_STREAM = 1, VALUES_IN_LINE = 2 };
static void MakeToolbarVisible();
static DataStream* Set(ScDocShell *pShell, const OUString& rURL, const ScRange& rRange,
sal_Int32 nLimit, MoveType eMove, sal_uInt32 nSettings);
DataStream(
ScDocShell *pShell, const OUString& rURL, const ScRange& rRange,
sal_Int32 nLimit, MoveType eMove, sal_uInt32 nSettings);
~DataStream();
ScRange GetRange() const;
const OUString& GetURL() const { return msURL; }
const sal_Int32& GetLimit() const { return mnLimit; }
MoveType GetMove() const;
const sal_uInt32& GetSettings() const { return mnSettings; }
bool IsRefreshOnEmptyLine() const;
void Decode(
const OUString& rURL, const ScRange& rRange, sal_Int32 nLimit,
MoveType eMove, const sal_uInt32 nSettings);
bool ImportData();
void StartImport();
void StopImport();
void SetRefreshOnEmptyLine( bool bVal );
private:
Line ConsumeLine();
void MoveData();
void Text2Doc();
void Refresh();
DECL_LINK( ImportTimerHdl, void* );
private:
ScDocShell* mpDocShell;
ScDocument* mpDoc;
DocumentStreamAccess maDocAccess;
OUString msURL;
sal_Int32 mnLimit;
sal_uInt32 mnSettings;
MoveType meOrigMove; // Initial move setting. This one gets saved to file.
MoveType meMove; // move setting during streaming, which may change in the middle.
bool mbRunning;
bool mbValuesInLine;
bool mbRefreshOnEmptyLine;
LinesType* mpLines;
size_t mnLinesCount;
size_t mnLinesSinceRefresh;
double mfLastRefreshTime;
SCROW mnCurRow;
ScRange maStartRange;
ScRange maEndRange;
Timer maImportTimer;
rtl::Reference<datastreams::ReaderThread> mxReaderThread;
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|