1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #include <datastreamdlg.hxx>
12 #include <sfx2/filedlghelper.hxx>
13 #include <svtools/inettbc.hxx>
14 #include <address.hxx>
16 #include <datastream.hxx>
20 DataStreamDlg::DataStreamDlg(ScDocShell
* pDocShell
, weld::Window
* pParent
)
21 : GenericDialogController(pParent
, "modules/scalc/ui/datastreams.ui", "DataStreamDialog")
22 , m_pDocShell(pDocShell
)
23 , m_xCbUrl(new SvtURLBox(m_xBuilder
->weld_combo_box("url")))
24 , m_xBtnBrowse(m_xBuilder
->weld_button("browse"))
25 , m_xRBValuesInLine(m_xBuilder
->weld_radio_button("valuesinline"))
26 , m_xRBAddressValue(m_xBuilder
->weld_radio_button("addressvalue"))
27 , m_xCBRefreshOnEmpty(m_xBuilder
->weld_check_button("refresh_ui"))
28 , m_xRBDataDown(m_xBuilder
->weld_radio_button("datadown"))
29 , m_xRBRangeDown(m_xBuilder
->weld_radio_button("rangedown"))
30 , m_xRBNoMove(m_xBuilder
->weld_radio_button("nomove"))
31 , m_xRBMaxLimit(m_xBuilder
->weld_radio_button("maxlimit"))
32 , m_xRBUnlimited(m_xBuilder
->weld_radio_button("unlimited"))
33 , m_xEdRange(m_xBuilder
->weld_entry("range"))
34 , m_xEdLimit(m_xBuilder
->weld_entry("limit"))
35 , m_xBtnOk(m_xBuilder
->weld_button("ok"))
36 , m_xVclFrameLimit(m_xBuilder
->weld_frame("framelimit"))
37 , m_xVclFrameMove(m_xBuilder
->weld_frame("framemove"))
39 m_xCbUrl
->connect_changed(LINK(this, DataStreamDlg
, UpdateComboBoxHdl
));
40 m_xRBAddressValue
->connect_toggled(LINK(this, DataStreamDlg
, UpdateClickHdl
));
41 m_xRBAddressValue
->set_sensitive(false);
43 m_xRBValuesInLine
->connect_toggled(LINK(this, DataStreamDlg
, UpdateClickHdl
));
44 m_xEdRange
->connect_changed(LINK(this, DataStreamDlg
, UpdateHdl
));
45 m_xBtnBrowse
->connect_clicked(LINK(this, DataStreamDlg
, BrowseHdl
));
49 DataStreamDlg::~DataStreamDlg() {}
51 IMPL_LINK_NOARG(DataStreamDlg
, BrowseHdl
, weld::Button
&, void)
53 sfx2::FileDialogHelper
aFileDialog(0, FileDialogFlags::NONE
, m_xDialog
.get());
54 aFileDialog
.SetContext(sfx2::FileDialogHelper::CalcDataStream
);
55 if (aFileDialog
.Execute() != ERRCODE_NONE
)
58 m_xCbUrl
->set_entry_text(aFileDialog
.GetPath());
62 IMPL_LINK_NOARG(DataStreamDlg
, UpdateClickHdl
, weld::Toggleable
&, void) { UpdateEnable(); }
64 IMPL_LINK_NOARG(DataStreamDlg
, UpdateComboBoxHdl
, weld::ComboBox
&, void) { UpdateEnable(); }
66 IMPL_LINK_NOARG(DataStreamDlg
, UpdateHdl
, weld::Entry
&, void) { UpdateEnable(); }
68 void DataStreamDlg::UpdateEnable()
70 bool bOk
= !m_xCbUrl
->GetURL().isEmpty();
71 if (m_xRBAddressValue
->get_active())
73 m_xVclFrameLimit
->set_sensitive(false);
74 m_xVclFrameMove
->set_sensitive(false);
75 m_xEdRange
->set_sensitive(false);
79 m_xVclFrameLimit
->set_sensitive(true);
80 m_xVclFrameMove
->set_sensitive(true);
81 m_xEdRange
->set_sensitive(true);
84 // Check the given range to make sure it's valid.
85 ScRange aTest
= GetStartRange();
90 m_xBtnOk
->set_sensitive(bOk
);
91 // setOptimalLayoutSize();
94 ScRange
DataStreamDlg::GetStartRange()
96 OUString aStr
= m_xEdRange
->get_text();
97 ScDocument
& rDoc
= m_pDocShell
->GetDocument();
99 ScRefFlags nRes
= aRange
.Parse(aStr
, rDoc
, rDoc
.GetAddressConvention());
100 if (((nRes
& ScRefFlags::VALID
) == ScRefFlags::ZERO
) || !aRange
.IsValid())
107 // Make sure it's only one row tall.
108 if (aRange
.aStart
.Row() != aRange
.aEnd
.Row())
114 void DataStreamDlg::Init(const DataStream
& rStrm
)
116 m_xCbUrl
->set_entry_text(rStrm
.GetURL());
117 ScDocument
& rDoc
= m_pDocShell
->GetDocument();
119 ScRange aRange
= rStrm
.GetRange();
120 ScRange aTopRange
= aRange
;
121 aTopRange
.aEnd
.SetRow(aTopRange
.aStart
.Row());
122 OUString aStr
= aTopRange
.Format(rDoc
, ScRefFlags::RANGE_ABS_3D
, rDoc
.GetAddressConvention());
123 m_xEdRange
->set_text(aStr
);
124 SCROW nRows
= aRange
.aEnd
.Row() - aRange
.aStart
.Row() + 1;
126 if (aRange
.aEnd
.Row() == rDoc
.MaxRow())
127 m_xRBUnlimited
->set_active(true);
130 m_xRBMaxLimit
->set_active(true);
131 m_xEdLimit
->set_text(OUString::number(nRows
));
134 DataStream::MoveType eMove
= rStrm
.GetMove();
137 case DataStream::MOVE_DOWN
:
138 m_xRBDataDown
->set_active(true);
140 case DataStream::RANGE_DOWN
:
141 m_xRBRangeDown
->set_active(true);
143 case DataStream::MOVE_UP
:
144 case DataStream::NO_MOVE
:
148 m_xCBRefreshOnEmpty
->set_active(rStrm
.IsRefreshOnEmptyLine());
153 void DataStreamDlg::StartStream()
155 ScRange aStartRange
= GetStartRange();
156 if (!aStartRange
.IsValid())
157 // Don't start the stream without a valid range.
160 sal_Int32 nLimit
= 0;
161 if (m_xRBMaxLimit
->get_active())
162 nLimit
= m_xEdLimit
->get_text().toInt32();
163 OUString rURL
= m_xCbUrl
->get_active_text();
164 sal_uInt32 nSettings
= 0;
165 if (m_xRBValuesInLine
->get_active())
166 nSettings
|= DataStream::VALUES_IN_LINE
;
168 DataStream::MoveType eMove
169 = m_xRBRangeDown
->get_active() ? DataStream::RANGE_DOWN
: DataStream::MOVE_DOWN
;
171 DataStream
* pStream
= DataStream::Set(m_pDocShell
, rURL
, aStartRange
, nLimit
, eMove
, nSettings
);
172 pStream
->SetRefreshOnEmptyLine(m_xCBRefreshOnEmpty
->get_active());
173 DataStream::MakeToolbarVisible();
174 pStream
->StartImport();
178 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */