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