summaryrefslogtreecommitdiff
path: root/sc/source/ui/inc/datastream.hxx
blob: 793c359d868cca52141adc329f783b2f798a3a52 (plain)
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 { return meOrigMove;}
    const sal_uInt32& GetSettings() const { return mnSettings; }
    bool IsRefreshOnEmptyLine() const { return mbRefreshOnEmptyLine;}

    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;
    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;
    bool mbIsFirst;
    bool mbIsUpdate;
};

}

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */