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( new FixedText(m_pGrid) );
158 0 : maEdits.push_back( new Edit(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.is_null(nIndex))
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 :
208 0 : }
209 :
210 0 : void ScDataFormDlg::FillCtrls(SCROW /*nCurrentRow*/)
211 : {
212 0 : for (sal_uInt16 i = 0; i < aColLength; ++i)
213 : {
214 0 : if (!maEdits.is_null(i))
215 : {
216 0 : if (nCurrentRow<=nEndRow && pDoc)
217 : {
218 0 : OUString aFieldName(pDoc->GetString(i + nStartCol, nCurrentRow, nTab));
219 0 : maEdits[i].SetText(aFieldName);
220 : }
221 : else
222 0 : maEdits[i].SetText(OUString());
223 : }
224 : }
225 :
226 0 : if (nCurrentRow <= nEndRow)
227 : {
228 0 : OUStringBuffer aBuf;
229 0 : aBuf.append(static_cast<sal_Int32>(nCurrentRow - nStartRow));
230 0 : aBuf.appendAscii(" / ");
231 0 : aBuf.append(static_cast<sal_Int32>(nEndRow - nStartRow));
232 0 : m_pFixedText->SetText(aBuf.makeStringAndClear());
233 : }
234 : else
235 0 : m_pFixedText->SetText(sNewRecord);
236 :
237 0 : m_pSlider->SetThumbPos(nCurrentRow-nStartRow-1);
238 0 : }
239 :
240 0 : IMPL_LINK( ScDataFormDlg, Impl_DataModifyHdl, Edit*, pEdit)
241 : {
242 0 : if ( pEdit->IsModified() )
243 0 : m_pBtnRestore->Enable( true );
244 0 : return 0;
245 : }
246 :
247 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NewHdl)
248 : {
249 0 : ScViewData& rViewData = pTabViewShell->GetViewData();
250 0 : ScDocShell* pDocSh = rViewData.GetDocShell();
251 0 : if ( pDoc )
252 : {
253 0 : bool bHasData = false;
254 0 : boost::ptr_vector<Edit>::iterator itr = maEdits.begin(), itrEnd = maEdits.end();
255 0 : for(; itr != itrEnd; ++itr)
256 0 : if (!boost::is_null(itr))
257 0 : if ( !(*itr).GetText().isEmpty() )
258 : {
259 0 : bHasData = true;
260 0 : break;
261 : }
262 :
263 0 : if ( bHasData )
264 : {
265 0 : pTabViewShell->DataFormPutData( nCurrentRow , nStartRow , nStartCol , nEndRow , nEndCol , maEdits , aColLength );
266 0 : nCurrentRow++;
267 0 : if (nCurrentRow >= nEndRow + 2)
268 : {
269 0 : nEndRow ++ ;
270 0 : m_pSlider->SetRange( Range( 0, nEndRow - nStartRow + 1) );
271 : }
272 0 : SetButtonState();
273 0 : FillCtrls(nCurrentRow);
274 0 : pDocSh->SetDocumentModified();
275 0 : pDocSh->PostPaintGridAll();
276 : }
277 : }
278 0 : return 0;
279 : }
280 :
281 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_PrevHdl)
282 : {
283 0 : if (pDoc)
284 : {
285 0 : if ( nCurrentRow > nStartRow +1 )
286 0 : nCurrentRow--;
287 :
288 0 : SetButtonState();
289 0 : FillCtrls(nCurrentRow);
290 : }
291 0 : return 0;
292 : }
293 :
294 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_NextHdl)
295 : {
296 0 : if (pDoc)
297 : {
298 0 : if ( nCurrentRow <= nEndRow)
299 0 : nCurrentRow++;
300 :
301 0 : SetButtonState();
302 0 : FillCtrls(nCurrentRow);
303 : }
304 0 : return 0;
305 : }
306 :
307 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_RestoreHdl)
308 : {
309 0 : if (pDoc)
310 : {
311 0 : FillCtrls(nCurrentRow);
312 : }
313 0 : return 0;
314 : }
315 :
316 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_DeleteHdl)
317 : {
318 0 : ScViewData& rViewData = pTabViewShell->GetViewData();
319 0 : ScDocShell* pDocSh = rViewData.GetDocShell();
320 0 : if (pDoc)
321 : {
322 0 : ScRange aRange(nStartCol, nCurrentRow, nTab, nEndCol, nCurrentRow, nTab);
323 0 : pDoc->DeleteRow(aRange);
324 0 : nEndRow--;
325 :
326 0 : SetButtonState();
327 0 : pDocSh->GetUndoManager()->Clear();
328 :
329 0 : FillCtrls(nCurrentRow);
330 0 : pDocSh->SetDocumentModified();
331 0 : pDocSh->PostPaintGridAll();
332 : }
333 0 : return 0;
334 : }
335 :
336 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_CloseHdl)
337 : {
338 0 : EndDialog( );
339 0 : return 0;
340 : }
341 :
342 0 : IMPL_LINK_NOARG(ScDataFormDlg, Impl_ScrollHdl)
343 : {
344 0 : long nOffset = m_pSlider->GetThumbPos();
345 0 : nCurrentRow = nStartRow + nOffset + 1;
346 0 : SetButtonState();
347 0 : FillCtrls(nCurrentRow);
348 0 : return 0;
349 : }
350 :
351 0 : void ScDataFormDlg::SetButtonState()
352 : {
353 0 : if (nCurrentRow > nEndRow)
354 : {
355 0 : m_pBtnDelete->Enable( false );
356 0 : m_pBtnNext->Enable( false );
357 : }
358 : else
359 : {
360 0 : m_pBtnDelete->Enable( true );
361 0 : m_pBtnNext->Enable( true );
362 : }
363 :
364 0 : if (nCurrentRow == nStartRow + 1)
365 0 : m_pBtnPrev->Enable( false );
366 : else
367 0 : m_pBtnPrev->Enable( true );
368 :
369 0 : m_pBtnRestore->Enable( false );
370 0 : if ( maEdits.size()>=1 && !maEdits.is_null(0) )
371 0 : maEdits[0].GrabFocus();
372 0 : }
373 :
374 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|