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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #undef SC_DLLIMPLEMENTATION
21 :
22 : #include <sfx2/app.hxx>
23 : #include <sfx2/docfile.hxx>
24 : #include <sfx2/docinsert.hxx>
25 : #include <sfx2/filedlghelper.hxx>
26 : #include <svtools/ehdl.hxx>
27 : #include <svtools/sfxecode.hxx>
28 : #include <vcl/msgbox.hxx>
29 :
30 : #include "global.hxx"
31 : #include "docsh.hxx"
32 : #include "viewdata.hxx"
33 : #include "scresid.hxx"
34 : #include "globstr.hrc"
35 : #include "instbdlg.hxx"
36 :
37 0 : ScInsertTableDlg::ScInsertTableDlg( vcl::Window* pParent, ScViewData& rData, SCTAB nTabCount, bool bFromFile )
38 : : ModalDialog(pParent, "InsertSheetDialog", "modules/scalc/ui/insertsheet.ui")
39 : , rViewData(rData)
40 0 : , rDoc(*rData.GetDocument())
41 : , pDocShTables(NULL)
42 : , pDocInserter(NULL)
43 : , bMustClose(false)
44 : , nSelTabIndex(0)
45 0 : , nTableCount(nTabCount)
46 : {
47 0 : get(m_pBtnBefore, "before");
48 0 : get(m_pBtnBehind, "after");
49 0 : get(m_pBtnNew, "new");
50 0 : get(m_pBtnFromFile, "fromfile");
51 0 : get(m_pFtCount, "countft");
52 0 : get(m_pNfCount, "countnf");
53 0 : get(m_pFtName, "nameft");
54 0 : get(m_pEdName, "nameed");
55 0 : m_sSheetDotDotDot = m_pEdName->GetText();
56 0 : get(m_pLbTables, "tables");
57 0 : m_pLbTables->SetDropDownLineCount(8);
58 0 : get(m_pFtPath, "path");
59 0 : get(m_pBtnBrowse, "browse");
60 0 : get(m_pBtnLink, "link");
61 0 : get(m_pBtnOk, "ok");
62 0 : Init_Impl( bFromFile );
63 0 : }
64 :
65 0 : ScInsertTableDlg::~ScInsertTableDlg()
66 : {
67 0 : if (pDocShTables)
68 0 : pDocShTables->DoClose();
69 0 : delete pDocInserter;
70 0 : }
71 :
72 0 : void ScInsertTableDlg::Init_Impl( bool bFromFile )
73 : {
74 0 : m_pLbTables->EnableMultiSelection(true);
75 0 : m_pBtnBrowse->SetClickHdl( LINK( this, ScInsertTableDlg, BrowseHdl_Impl ) );
76 0 : m_pBtnNew->SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
77 0 : m_pBtnFromFile->SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
78 0 : m_pLbTables->SetSelectHdl( LINK( this, ScInsertTableDlg, SelectHdl_Impl ) );
79 0 : m_pNfCount->SetModifyHdl( LINK( this, ScInsertTableDlg, CountHdl_Impl));
80 0 : m_pBtnOk->SetClickHdl( LINK( this, ScInsertTableDlg, DoEnterHdl ));
81 0 : m_pBtnBefore->Check();
82 :
83 0 : m_pNfCount->SetText( OUString::number(nTableCount) );
84 0 : m_pNfCount->SetMax( MAXTAB - rDoc.GetTableCount() + 1 );
85 :
86 0 : if(nTableCount==1)
87 : {
88 0 : OUString aName;
89 0 : rDoc.CreateValidTabName( aName );
90 0 : m_pEdName->SetText( aName );
91 : }
92 : else
93 : {
94 0 : m_pEdName->SetText(m_sSheetDotDotDot);
95 0 : m_pFtName->Disable();
96 0 : m_pEdName->Disable();
97 : }
98 :
99 0 : bool bShared = rViewData.GetDocShell() && rViewData.GetDocShell()->IsDocShared();
100 :
101 0 : if ( !bFromFile || bShared )
102 : {
103 0 : m_pBtnNew->Check();
104 0 : SetNewTable_Impl();
105 0 : if ( bShared )
106 : {
107 0 : m_pBtnFromFile->Disable();
108 : }
109 : }
110 : else
111 : {
112 0 : m_pBtnFromFile->Check();
113 0 : SetFromTo_Impl();
114 :
115 0 : aBrowseTimer.SetTimeoutHdl( LINK( this, ScInsertTableDlg, BrowseTimeoutHdl ) );
116 0 : aBrowseTimer.SetTimeout( 200 );
117 : }
118 0 : }
119 :
120 0 : short ScInsertTableDlg::Execute()
121 : {
122 : // set Parent of DocumentInserter and Doc-Manager
123 0 : vcl::Window* pOldDefParent = Application::GetDefDialogParent();
124 0 : Application::SetDefDialogParent( this );
125 :
126 0 : if ( m_pBtnFromFile->IsChecked() )
127 0 : aBrowseTimer.Start();
128 :
129 0 : short nRet = ModalDialog::Execute();
130 0 : Application::SetDefDialogParent( pOldDefParent );
131 0 : return nRet;
132 : }
133 :
134 0 : void ScInsertTableDlg::SetNewTable_Impl()
135 : {
136 0 : if (m_pBtnNew->IsChecked() )
137 : {
138 0 : m_pNfCount->Enable();
139 0 : m_pFtCount->Enable();
140 0 : m_pLbTables->Disable();
141 0 : m_pFtPath->Disable();
142 0 : m_pBtnBrowse->Disable();
143 0 : m_pBtnLink->Disable();
144 :
145 0 : if(nTableCount==1)
146 : {
147 0 : m_pEdName->Enable();
148 0 : m_pFtName->Enable();
149 : }
150 : }
151 0 : }
152 :
153 0 : void ScInsertTableDlg::SetFromTo_Impl()
154 : {
155 0 : if (m_pBtnFromFile->IsChecked() )
156 : {
157 0 : m_pEdName->Disable();
158 0 : m_pFtName->Disable();
159 0 : m_pFtCount->Disable();
160 0 : m_pNfCount->Disable();
161 0 : m_pLbTables->Enable();
162 0 : m_pFtPath->Enable();
163 0 : m_pBtnBrowse->Enable();
164 0 : m_pBtnLink->Enable();
165 : }
166 0 : }
167 :
168 0 : void ScInsertTableDlg::FillTables_Impl( ScDocument* pSrcDoc )
169 : {
170 0 : m_pLbTables->SetUpdateMode( false );
171 0 : m_pLbTables->Clear();
172 :
173 0 : if ( pSrcDoc )
174 : {
175 0 : SCTAB nCount = pSrcDoc->GetTableCount();
176 0 : OUString aName;
177 :
178 0 : for ( SCTAB i=0; i<nCount; i++ )
179 : {
180 0 : pSrcDoc->GetName( i, aName );
181 0 : m_pLbTables->InsertEntry( aName );
182 0 : }
183 : }
184 :
185 0 : m_pLbTables->SetUpdateMode( true );
186 :
187 0 : if(m_pLbTables->GetEntryCount()==1)
188 0 : m_pLbTables->SelectEntryPos(0);
189 0 : }
190 :
191 0 : const OUString* ScInsertTableDlg::GetFirstTable( sal_uInt16* pN )
192 : {
193 0 : const OUString* pStr = NULL;
194 :
195 0 : if ( m_pBtnNew->IsChecked() )
196 : {
197 0 : aStrCurSelTable = m_pEdName->GetText();
198 0 : pStr = &aStrCurSelTable;
199 : }
200 0 : else if ( nSelTabIndex < m_pLbTables->GetSelectEntryCount() )
201 : {
202 0 : aStrCurSelTable = m_pLbTables->GetSelectEntry( 0 );
203 0 : pStr = &aStrCurSelTable;
204 0 : if ( pN )
205 0 : *pN = m_pLbTables->GetSelectEntryPos( 0 );
206 0 : nSelTabIndex = 1;
207 : }
208 :
209 0 : return pStr;
210 : }
211 :
212 0 : const OUString* ScInsertTableDlg::GetNextTable( sal_uInt16* pN )
213 : {
214 0 : const OUString* pStr = NULL;
215 :
216 0 : if ( !m_pBtnNew->IsChecked() && nSelTabIndex < m_pLbTables->GetSelectEntryCount() )
217 : {
218 0 : aStrCurSelTable = m_pLbTables->GetSelectEntry( nSelTabIndex );
219 0 : pStr = &aStrCurSelTable;
220 0 : if ( pN )
221 0 : *pN = m_pLbTables->GetSelectEntryPos( nSelTabIndex );
222 0 : nSelTabIndex++;
223 : }
224 :
225 0 : return pStr;
226 : }
227 :
228 : // Handler:
229 :
230 0 : IMPL_LINK_NOARG(ScInsertTableDlg, CountHdl_Impl)
231 : {
232 0 : nTableCount = static_cast<SCTAB>(m_pNfCount->GetValue());
233 0 : if ( nTableCount==1)
234 : {
235 0 : OUString aName;
236 0 : rDoc.CreateValidTabName( aName );
237 0 : m_pEdName->SetText( aName );
238 0 : m_pFtName->Enable();
239 0 : m_pEdName->Enable();
240 : }
241 : else
242 : {
243 0 : m_pEdName->SetText(m_sSheetDotDotDot);
244 0 : m_pFtName->Disable();
245 0 : m_pEdName->Disable();
246 : }
247 :
248 0 : DoEnable_Impl();
249 0 : return 0;
250 : }
251 :
252 0 : IMPL_LINK_NOARG(ScInsertTableDlg, ChoiceHdl_Impl)
253 : {
254 0 : if ( m_pBtnNew->IsChecked() )
255 0 : SetNewTable_Impl();
256 : else
257 0 : SetFromTo_Impl();
258 :
259 0 : DoEnable_Impl();
260 0 : return 0;
261 : }
262 :
263 0 : IMPL_LINK_NOARG(ScInsertTableDlg, BrowseHdl_Impl)
264 : {
265 0 : if ( pDocInserter )
266 0 : delete pDocInserter;
267 : pDocInserter = new ::sfx2::DocumentInserter(
268 0 : OUString::createFromAscii( ScDocShell::Factory().GetShortName() ) );
269 0 : pDocInserter->StartExecuteModal( LINK( this, ScInsertTableDlg, DialogClosedHdl ) );
270 0 : return 0;
271 : }
272 :
273 0 : IMPL_LINK_NOARG(ScInsertTableDlg, SelectHdl_Impl)
274 : {
275 0 : DoEnable_Impl();
276 0 : return 0;
277 : }
278 :
279 0 : void ScInsertTableDlg::DoEnable_Impl()
280 : {
281 0 : if ( m_pBtnNew->IsChecked() || ( pDocShTables && m_pLbTables->GetSelectEntryCount() ) )
282 0 : m_pBtnOk->Enable();
283 : else
284 0 : m_pBtnOk->Disable();
285 0 : }
286 :
287 0 : IMPL_LINK_NOARG(ScInsertTableDlg, DoEnterHdl)
288 : {
289 0 : if(nTableCount > 1 || ScDocument::ValidTabName(m_pEdName->GetText()))
290 : {
291 0 : EndDialog(RET_OK);
292 : }
293 : else
294 : {
295 0 : OUString aErrMsg ( ScGlobal::GetRscString( STR_INVALIDTABNAME ) );
296 0 : (void)MessageDialog(this, aErrMsg).Execute();
297 : }
298 0 : return 0;
299 : }
300 :
301 0 : IMPL_LINK_NOARG(ScInsertTableDlg, BrowseTimeoutHdl)
302 : {
303 0 : bMustClose = true;
304 0 : BrowseHdl_Impl(m_pBtnBrowse);
305 0 : return 0;
306 : }
307 :
308 0 : IMPL_LINK( ScInsertTableDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
309 : {
310 0 : if ( ERRCODE_NONE == _pFileDlg->GetError() )
311 : {
312 0 : SfxMedium* pMed = pDocInserter->CreateMedium();
313 0 : if ( pMed )
314 : {
315 : // ERRCTX_SFX_OPENDOC -> "Error loading document"
316 0 : SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
317 :
318 0 : if ( pDocShTables )
319 0 : pDocShTables->DoClose(); // deletion is done when assigning to the reference
320 :
321 0 : pMed->UseInteractionHandler( true ); // to enable the filter options dialog
322 :
323 0 : pDocShTables = new ScDocShell;
324 0 : aDocShTablesRef = pDocShTables;
325 :
326 0 : Pointer aOldPtr( GetPointer() );
327 0 : SetPointer( Pointer( POINTER_WAIT ) );
328 0 : pDocShTables->DoLoad( pMed );
329 0 : SetPointer( aOldPtr );
330 :
331 0 : sal_uLong nErr = pDocShTables->GetErrorCode();
332 0 : if ( nErr )
333 0 : ErrorHandler::HandleError( nErr ); // warnings, too
334 :
335 0 : if ( !pDocShTables->GetError() ) // errors only
336 : {
337 0 : FillTables_Impl( &pDocShTables->GetDocument() );
338 0 : m_pFtPath->SetText( pDocShTables->GetTitle( SFX_TITLE_FULLNAME ) );
339 : }
340 : else
341 : {
342 0 : pDocShTables->DoClose();
343 0 : aDocShTablesRef.Clear();
344 0 : pDocShTables = NULL;
345 :
346 0 : FillTables_Impl( NULL );
347 0 : m_pFtPath->SetText( EMPTY_OUSTRING );
348 0 : }
349 : }
350 :
351 0 : DoEnable_Impl();
352 : }
353 0 : else if ( bMustClose )
354 : // execute slot FID_INS_TABLE_EXT and cancel file dialog
355 0 : EndDialog( RET_CANCEL );
356 :
357 0 : return 0;
358 0 : }
359 :
360 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|