Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : */
9 :
10 : #undef SC_DLLIMPLEMENTATION
11 :
12 : #include "datafdlg.hxx"
13 : #include "scresid.hxx"
14 : #include "viewdata.hxx"
15 : #include "docsh.hxx"
16 : #include "refundo.hxx"
17 : #include "undodat.hxx"
18 :
19 : #include <rtl/ustrbuf.hxx>
20 :
21 : #define HDL(hdl) LINK( this, ScDataFormDlg, hdl )
22 :
23 0 : ScDataFormDlg::ScDataFormDlg(vcl::Window* pParent, ScTabViewShell* pTabViewShellOri)
24 : : ModalDialog(pParent, "DataFormDialog", "modules/scalc/ui/dataform.ui")
25 : , pTabViewShell(pTabViewShellOri)
26 : , aColLength(0)
27 : , nCurrentRow(0)
28 : , nStartCol(0)
29 : , nEndCol(0)
30 : , nStartRow(0)
31 : , nEndRow(0)
32 : , nTab(0)
33 0 : , bNoSelection(false)
34 : {
35 0 : get(m_pBtnNew, "new");
36 0 : get(m_pBtnDelete, "delete");
37 0 : get(m_pBtnRestore, "restore");
38 0 : get(m_pBtnPrev, "prev");
39 0 : get(m_pBtnNext, "next");
40 0 : get(m_pBtnClose, "close");
41 0 : get(m_pFixedText, "label");
42 0 : sNewRecord = m_pFixedText->GetText();
43 0 : get(m_pSlider, "scrollbar");
44 0 : get(m_pGrid, "grid");
45 :
46 : //read header form current document, and add new controls
47 : OSL_ENSURE( pTabViewShell, "pTabViewShell is NULL! :-/" );
48 0 : ScViewData& rViewData = pTabViewShell->GetViewData();
49 :
50 0 : pDoc = rViewData.GetDocument();
51 0 : if (pDoc)
52 : {
53 0 : ScRange aRange;
54 0 : rViewData.GetSimpleArea( aRange );
55 0 : ScAddress aStart = aRange.aStart;
56 0 : ScAddress aEnd = aRange.aEnd;
57 :
58 0 : nStartCol = aStart.Col();
59 0 : nEndCol = aEnd.Col();
60 0 : nStartRow = aStart.Row();
61 0 : nEndRow = aEnd.Row();
62 :
63 0 : nTab = rViewData.GetTabNo();
64 : //if there is no selection
65 0 : if ((nStartCol == nEndCol) && (nStartRow == nEndRow))
66 0 : bNoSelection = true;
67 :
68 0 : if (bNoSelection)
69 : {
70 : //find last not blank cell in row
71 0 : for (int i=1;i<=MAX_DATAFORM_COLS;i++)
72 : {
73 0 : nEndCol++;
74 0 : OUString aColName = pDoc->GetString(nEndCol, nStartRow, nTab);
75 0 : int nColWidth = pDoc->GetColWidth( nEndCol, nTab );
76 0 : if (aColName.isEmpty() && nColWidth)
77 : {
78 0 : nEndCol--;
79 0 : break;
80 : }
81 0 : }
82 :
83 : //find first not blank cell in row
84 0 : for (int i=1;i<=MAX_DATAFORM_COLS;i++)
85 : {
86 0 : if (nStartCol <= 0)
87 0 : break;
88 0 : nStartCol--;
89 :
90 0 : OUString aColName = pDoc->GetString(nStartCol, nStartRow, nTab);
91 0 : int nColWidth = pDoc->GetColWidth( nEndCol, nTab );
92 0 : if (aColName.isEmpty() && nColWidth)
93 : {
94 0 : nStartCol++;
95 0 : break;
96 : }
97 0 : }
98 :
99 : //skip leading hide column
100 0 : for (int i=1;i<=MAX_DATAFORM_COLS;i++)
101 : {
102 0 : int nColWidth = pDoc->GetColWidth( nStartCol, nTab );
103 0 : if (nColWidth)
104 0 : break;
105 0 : nStartCol++;
106 : }
107 :
108 0 : if (nEndCol < nStartCol)
109 0 : nEndCol = nStartCol;
110 :
111 : //find last not blank cell in row
112 0 : for (int i=1;i<=MAX_DATAFORM_ROWS;i++)
113 : {
114 0 : nEndRow++;
115 0 : OUString aColName = pDoc->GetString(nStartCol, nEndRow, nTab);
116 0 : if (aColName.isEmpty())
117 : {
118 0 : nEndRow--;
119 0 : break;
120 : }
121 0 : }
122 :
123 : //find first not blank cell in row
124 0 : for (int i=1;i<=MAX_DATAFORM_ROWS;i++)
125 : {
126 0 : if (nStartRow <= 0)
127 0 : break;
128 0 : nStartRow--;
129 :
130 0 : OUString aColName = pDoc->GetString(nStartCol, nStartRow, nTab);
131 0 : if (aColName.isEmpty())
132 : {
133 0 : nStartRow++;
134 0 : break;
135 : }
136 0 : }
137 :
138 0 : if (nEndRow < nStartRow)
139 0 : nEndRow = nStartRow;
140 : }
141 :
142 0 : nCurrentRow = nStartRow + 1;
143 :
144 0 : aColLength = nEndCol - nStartCol + 1;
145 :
146 : //new the controls
147 0 : maFixedTexts.reserve(aColLength);
148 0 : maEdits.reserve(aColLength);
149 :
150 0 : sal_Int32 nGridRow = 0;
151 0 : for(sal_uInt16 nIndex = 0; nIndex < aColLength; ++nIndex)
152 : {
153 0 : OUString aFieldName = pDoc->GetString(nIndex + nStartCol, nStartRow, nTab);
154 0 : int nColWidth = pDoc->GetColWidth( nIndex + nStartCol, nTab );
155 0 : if (nColWidth)
156 : {
157 0 : maFixedTexts.push_back( VclPtr<FixedText>::Create(m_pGrid) );
158 0 : maEdits.push_back( VclPtr<Edit>::Create(m_pGrid, WB_BORDER) );
159 :
160 0 : maFixedTexts[nIndex]->set_grid_left_attach(0);
161 0 : maEdits[nIndex]->set_grid_left_attach(1);
162 0 : maFixedTexts[nIndex]->set_grid_top_attach(nGridRow);
163 0 : maEdits[nIndex]->set_grid_top_attach(nGridRow);
164 :
165 0 : maEdits[nIndex]->SetWidthInChars(32);
166 0 : maEdits[nIndex]->set_hexpand(true);
167 :
168 0 : ++nGridRow;
169 :
170 0 : maFixedTexts[nIndex]->SetText(aFieldName);
171 0 : maFixedTexts[nIndex]->Show();
172 0 : maEdits[nIndex]->Show();
173 : }
174 : else
175 : {
176 0 : maFixedTexts.push_back( NULL );
177 0 : maEdits.push_back( NULL );
178 : }
179 0 : if (maEdits[nIndex] != nullptr)
180 0 : maEdits[nIndex]->SetModifyHdl( HDL(Impl_DataModifyHdl) );
181 0 : }
182 : }
183 :
184 0 : FillCtrls(nCurrentRow);
185 :
186 0 : m_pSlider->SetPageSize( 10 );
187 0 : m_pSlider->SetVisibleSize( 1 );
188 0 : m_pSlider->SetLineSize( 1 );
189 0 : m_pSlider->SetRange( Range( 0, nEndRow - nStartRow + 1) );
190 0 : m_pSlider->Show();
191 :
192 0 : m_pBtnNew->SetClickHdl(HDL(Impl_NewHdl));
193 0 : m_pBtnPrev->SetClickHdl(HDL(Impl_PrevHdl));
194 0 : m_pBtnNext->SetClickHdl(HDL(Impl_NextHdl));
195 :
196 0 : m_pBtnRestore->SetClickHdl(HDL(Impl_RestoreHdl));
197 0 : m_pBtnDelete->SetClickHdl(HDL(Impl_DeleteHdl));
198 0 : m_pBtnClose->SetClickHdl(HDL(Impl_CloseHdl));
199 :
200 0 : m_pSlider->SetEndScrollHdl(HDL(Impl_ScrollHdl));
201 :
202 0 : SetButtonState();
203 0 : }
204 :
205 0 : ScDataFormDlg::~ScDataFormDlg()
206 : {
207 0 : disposeOnce();
208 0 : }
209 :
210 0 : void ScDataFormDlg::dispose()
211 : {
212 0 : m_pBtnNew.clear();
213 0 : m_pBtnDelete.clear();
214 0 : m_pBtnRestore.clear();
215 0 : m_pBtnPrev.clear();
216 0 : m_pBtnNext.clear();
217 0 : m_pBtnClose.clear();
218 0 : m_pSlider.clear();
219 0 : m_pGrid.clear();
220 0 : m_pFixedText.clear();
221 0 : ModalDialog::dispose();
222 0 : }
223 :
224 0 : void ScDataFormDlg::FillCtrls(SCROW /*nCurrentRow*/)
225 : {
226 0 : for (sal_uInt16 i = 0; i < aColLength; ++i)
227 : {
228 0 : if (maEdits[i] != nullptr)
229 : {
230 0 : if (nCurrentRow<=nEndRow && pDoc)
231 : {
232 0 : OUString aFieldName(pDoc->GetString(i + nStartCol, nCurrentRow, nTab));
233 0 : maEdits[i]->SetText(aFieldName);
234 : }
235 : else
236 0 : maEdits[i]->SetText(OUString());
237 : }
238 : }
239 :
240 0 : if (nCurrentRow <= nEndRow)
241 : {
242 0 : OUStringBuffer aBuf;
243 0 : aBuf.append(static_cast<sal_Int32>(nCurrentRow - nStartRow));
244 0 : aBuf.appendAscii(" / ");
245 0 : aBuf.append(static_cast<sal_Int32>(nEndRow - nStartRow));
246 0 : m_pFixedText->SetText(aBuf.makeStringAndClear());
247 : }
248 : else
249 0 : m_pFixedText->SetText(sNewRecord);
250 :
251 0 : m_pSlider->SetThumbPos(nCurrentRow-nStartRow-1);
252 0 : }
253 :
254 0 : IMPL_LINK( ScDataFormDlg, Impl_DataModifyHdl, Edit*, pEdit)
255 : {
256 0 : if ( pEdit->IsModified() )
257 0 : m_pBtnRestore->Enable( true );
258 0 : return 0;
259 : }
260 :
261 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NewHdl)
262 : {
263 0 : ScViewData& rViewData = pTabViewShell->GetViewData();
264 0 : ScDocShell* pDocSh = rViewData.GetDocShell();
265 0 : if ( pDoc )
266 : {
267 0 : bool bHasData = false;
268 0 : auto itr = maEdits.begin(), itrEnd = maEdits.end();
269 0 : for(; itr != itrEnd; ++itr)
270 0 : if ((*itr) != nullptr)
271 0 : if ( !(*itr)->GetText().isEmpty() )
272 : {
273 0 : bHasData = true;
274 0 : break;
275 : }
276 :
277 0 : if ( bHasData )
278 : {
279 0 : pTabViewShell->DataFormPutData( nCurrentRow , nStartRow , nStartCol , nEndRow , nEndCol , maEdits , aColLength );
280 0 : nCurrentRow++;
281 0 : if (nCurrentRow >= nEndRow + 2)
282 : {
283 0 : nEndRow ++ ;
284 0 : m_pSlider->SetRange( Range( 0, nEndRow - nStartRow + 1) );
285 : }
286 0 : SetButtonState();
287 0 : FillCtrls(nCurrentRow);
288 0 : pDocSh->SetDocumentModified();
289 0 : pDocSh->PostPaintGridAll();
290 : }
291 : }
292 0 : return 0;
293 : }
294 :
295 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_PrevHdl)
296 : {
297 0 : if (pDoc)
298 : {
299 0 : if ( nCurrentRow > nStartRow +1 )
300 0 : nCurrentRow--;
301 :
302 0 : SetButtonState();
303 0 : FillCtrls(nCurrentRow);
304 : }
305 0 : return 0;
306 : }
307 :
308 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NextHdl)
309 : {
310 0 : if (pDoc)
311 : {
312 0 : if ( nCurrentRow <= nEndRow)
313 0 : nCurrentRow++;
314 :
315 0 : SetButtonState();
316 0 : FillCtrls(nCurrentRow);
317 : }
318 0 : return 0;
319 : }
320 :
321 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_RestoreHdl)
322 : {
323 0 : if (pDoc)
324 : {
325 0 : FillCtrls(nCurrentRow);
326 : }
327 0 : return 0;
328 : }
329 :
330 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_DeleteHdl)
331 : {
332 0 : ScViewData& rViewData = pTabViewShell->GetViewData();
333 0 : ScDocShell* pDocSh = rViewData.GetDocShell();
334 0 : if (pDoc)
335 : {
336 0 : ScRange aRange(nStartCol, nCurrentRow, nTab, nEndCol, nCurrentRow, nTab);
337 0 : pDoc->DeleteRow(aRange);
338 0 : nEndRow--;
339 :
340 0 : SetButtonState();
341 0 : pDocSh->GetUndoManager()->Clear();
342 :
343 0 : FillCtrls(nCurrentRow);
344 0 : pDocSh->SetDocumentModified();
345 0 : pDocSh->PostPaintGridAll();
346 : }
347 0 : return 0;
348 : }
349 :
350 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_CloseHdl)
351 : {
352 0 : EndDialog( );
353 0 : return 0;
354 : }
355 :
356 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_ScrollHdl)
357 : {
358 0 : long nOffset = m_pSlider->GetThumbPos();
359 0 : nCurrentRow = nStartRow + nOffset + 1;
360 0 : SetButtonState();
361 0 : FillCtrls(nCurrentRow);
362 0 : return 0;
363 : }
364 :
365 0 : void ScDataFormDlg::SetButtonState()
366 : {
367 0 : if (nCurrentRow > nEndRow)
368 : {
369 0 : m_pBtnDelete->Enable( false );
370 0 : m_pBtnNext->Enable( false );
371 : }
372 : else
373 : {
374 0 : m_pBtnDelete->Enable( true );
375 0 : m_pBtnNext->Enable( true );
376 : }
377 :
378 0 : if (nCurrentRow == nStartRow + 1)
379 0 : m_pBtnPrev->Enable( false );
380 : else
381 0 : m_pBtnPrev->Enable( true );
382 :
383 0 : m_pBtnRestore->Enable( false );
384 0 : if ( maEdits.size()>=1 && maEdits[0] != nullptr )
385 0 : maEdits[0]->GrabFocus();
386 0 : }
387 :
388 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|