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 :
21 : #undef SC_DLLIMPLEMENTATION
22 :
23 :
24 :
25 : //------------------------------------------------------------------
26 :
27 : #include <sfx2/app.hxx>
28 : #include <sfx2/docfile.hxx>
29 : #include <sfx2/docinsert.hxx>
30 : #include <sfx2/filedlghelper.hxx>
31 : #include <svtools/ehdl.hxx>
32 : #include <svtools/sfxecode.hxx>
33 : #include <vcl/msgbox.hxx>
34 :
35 : #include "global.hxx"
36 : #include "docsh.hxx"
37 : #include "viewdata.hxx"
38 : #include "scresid.hxx"
39 : #include "instbdlg.hrc"
40 : #include "globstr.hrc"
41 :
42 : #define SC_INSTBDLG_CXX
43 : #include "instbdlg.hxx"
44 :
45 : //==================================================================
46 :
47 0 : ScInsertTableDlg::ScInsertTableDlg( Window* pParent, ScViewData& rData, SCTAB nTabCount, bool bFromFile )
48 :
49 : : ModalDialog ( pParent, ScResId( RID_SCDLG_INSERT_TABLE ) ),
50 : //
51 : aFlPos ( this, ScResId( FL_POSITION ) ),
52 : aBtnBefore ( this, ScResId( RB_BEFORE ) ),
53 : aBtnBehind ( this, ScResId( RB_BEHIND ) ),
54 : aFlTable ( this, ScResId( FL_TABLE ) ),
55 : aBtnNew ( this, ScResId( RB_NEW ) ),
56 : aBtnFromFile ( this, ScResId( RB_FROMFILE ) ),
57 : aFtCount ( this, ScResId( FT_COUNT ) ),
58 : aNfCount ( this, ScResId( NF_COUNT ) ),
59 : aFtName ( this, ScResId( FT_NAME ) ),
60 : aEdName ( this, ScResId( ED_TABNAME ) ),
61 : aLbTables ( this, ScResId( LB_TABLES ) ),
62 : aFtPath ( this, ScResId( FT_PATH ) ),
63 : aBtnBrowse ( this, ScResId( BTN_BROWSE ) ),
64 : aBtnLink ( this, ScResId( CB_LINK ) ),
65 : aBtnOk ( this, ScResId( BTN_OK ) ),
66 : aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
67 : aBtnHelp ( this, ScResId( BTN_HELP ) ),
68 : rViewData ( rData ),
69 0 : rDoc ( *rData.GetDocument() ),
70 : pDocShTables ( NULL ),
71 : pDocInserter ( NULL ),
72 : bMustClose ( false ),
73 : nSelTabIndex ( 0 ),
74 0 : nTableCount (nTabCount)
75 : {
76 0 : Init_Impl( bFromFile );
77 0 : FreeResource();
78 0 : aLbTables.SetAccessibleName(aBtnFromFile.GetText());
79 0 : }
80 :
81 : //------------------------------------------------------------------------
82 :
83 0 : ScInsertTableDlg::~ScInsertTableDlg()
84 : {
85 0 : if (pDocShTables)
86 0 : pDocShTables->DoClose();
87 0 : delete pDocInserter;
88 0 : }
89 :
90 : //------------------------------------------------------------------------
91 :
92 0 : void ScInsertTableDlg::Init_Impl( bool bFromFile )
93 : {
94 0 : aBtnBrowse .SetClickHdl( LINK( this, ScInsertTableDlg, BrowseHdl_Impl ) );
95 0 : aBtnNew .SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
96 0 : aBtnFromFile .SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
97 0 : aLbTables .SetSelectHdl( LINK( this, ScInsertTableDlg, SelectHdl_Impl ) );
98 0 : aNfCount .SetModifyHdl( LINK( this, ScInsertTableDlg, CountHdl_Impl));
99 0 : aBtnOk .SetClickHdl( LINK( this, ScInsertTableDlg, DoEnterHdl ));
100 0 : aBtnBefore.Check();
101 :
102 0 : aNfCount.SetText( String::CreateFromInt32(nTableCount) );
103 0 : aNfCount.SetMax( MAXTAB - rDoc.GetTableCount() + 1 );
104 :
105 0 : if(nTableCount==1)
106 : {
107 0 : rtl::OUString aName;
108 0 : rDoc.CreateValidTabName( aName );
109 0 : aEdName.SetText( aName );
110 : }
111 : else
112 : {
113 0 : String aName=aFlTable.GetText();
114 0 : aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM("..."));
115 0 : aEdName.SetText( aName );
116 0 : aFtName.Disable();
117 0 : aEdName.Disable();
118 : }
119 :
120 0 : bool bShared = ( rViewData.GetDocShell() ? rViewData.GetDocShell()->IsDocShared() : false );
121 :
122 0 : if ( !bFromFile || bShared )
123 : {
124 0 : aBtnNew.Check();
125 0 : SetNewTable_Impl();
126 0 : if ( bShared )
127 : {
128 0 : aBtnFromFile.Disable();
129 : }
130 : }
131 : else
132 : {
133 0 : aBtnFromFile.Check();
134 0 : SetFromTo_Impl();
135 :
136 0 : aBrowseTimer.SetTimeoutHdl( LINK( this, ScInsertTableDlg, BrowseTimeoutHdl ) );
137 0 : aBrowseTimer.SetTimeout( 200 );
138 : }
139 0 : }
140 :
141 : //------------------------------------------------------------------------
142 :
143 0 : short ScInsertTableDlg::Execute()
144 : {
145 : // set Parent of DocumentInserter and Doc-Manager
146 0 : Window* pOldDefParent = Application::GetDefDialogParent();
147 0 : Application::SetDefDialogParent( this );
148 :
149 0 : if ( aBtnFromFile.IsChecked() )
150 0 : aBrowseTimer.Start();
151 :
152 0 : short nRet = ModalDialog::Execute();
153 0 : Application::SetDefDialogParent( pOldDefParent );
154 0 : return nRet;
155 : }
156 :
157 : //------------------------------------------------------------------------
158 :
159 0 : void ScInsertTableDlg::SetNewTable_Impl()
160 : {
161 0 : if (aBtnNew.IsChecked() )
162 : {
163 0 : aNfCount .Enable();
164 0 : aFtCount .Enable();
165 0 : aLbTables .Disable();
166 0 : aFtPath .Disable();
167 0 : aBtnBrowse .Disable();
168 0 : aBtnLink .Disable();
169 :
170 0 : if(nTableCount==1)
171 : {
172 0 : aEdName.Enable();
173 0 : aFtName.Enable();
174 : }
175 : }
176 0 : }
177 :
178 : //------------------------------------------------------------------------
179 :
180 0 : void ScInsertTableDlg::SetFromTo_Impl()
181 : {
182 0 : if (aBtnFromFile.IsChecked() )
183 : {
184 0 : aEdName .Disable();
185 0 : aFtName .Disable();
186 0 : aFtCount .Disable();
187 0 : aNfCount .Disable();
188 0 : aLbTables .Enable();
189 0 : aFtPath .Enable();
190 0 : aBtnBrowse .Enable();
191 0 : aBtnLink .Enable();
192 : }
193 0 : }
194 :
195 : //------------------------------------------------------------------------
196 :
197 0 : void ScInsertTableDlg::FillTables_Impl( ScDocument* pSrcDoc )
198 : {
199 0 : aLbTables.SetUpdateMode( false );
200 0 : aLbTables.Clear();
201 :
202 0 : if ( pSrcDoc )
203 : {
204 0 : SCTAB nCount = pSrcDoc->GetTableCount();
205 0 : rtl::OUString aName;
206 :
207 0 : for ( SCTAB i=0; i<nCount; i++ )
208 : {
209 0 : pSrcDoc->GetName( i, aName );
210 0 : aLbTables.InsertEntry( aName );
211 0 : }
212 : }
213 :
214 0 : aLbTables.SetUpdateMode( sal_True );
215 :
216 0 : if(aLbTables.GetEntryCount()==1)
217 0 : aLbTables.SelectEntryPos(0);
218 0 : }
219 :
220 : //------------------------------------------------------------------------
221 :
222 0 : const String* ScInsertTableDlg::GetFirstTable( sal_uInt16* pN )
223 : {
224 0 : const String* pStr = NULL;
225 :
226 0 : if ( aBtnNew.IsChecked() )
227 : {
228 0 : aStrCurSelTable = aEdName.GetText();
229 0 : pStr = &aStrCurSelTable;
230 : }
231 0 : else if ( nSelTabIndex < aLbTables.GetSelectEntryCount() )
232 : {
233 0 : aStrCurSelTable = aLbTables.GetSelectEntry( 0 );
234 0 : pStr = &aStrCurSelTable;
235 0 : if ( pN )
236 0 : *pN = aLbTables.GetSelectEntryPos( 0 );
237 0 : nSelTabIndex = 1;
238 : }
239 :
240 0 : return pStr;
241 : }
242 :
243 : //------------------------------------------------------------------------
244 :
245 0 : const String* ScInsertTableDlg::GetNextTable( sal_uInt16* pN )
246 : {
247 0 : const String* pStr = NULL;
248 :
249 0 : if ( !aBtnNew.IsChecked() && nSelTabIndex < aLbTables.GetSelectEntryCount() )
250 : {
251 0 : aStrCurSelTable = aLbTables.GetSelectEntry( nSelTabIndex );
252 0 : pStr = &aStrCurSelTable;
253 0 : if ( pN )
254 0 : *pN = aLbTables.GetSelectEntryPos( nSelTabIndex );
255 0 : nSelTabIndex++;
256 : }
257 :
258 0 : return pStr;
259 : }
260 :
261 :
262 : //------------------------------------------------------------------------
263 : // Handler:
264 : //------------------------------------------------------------------------
265 :
266 0 : IMPL_LINK_NOARG(ScInsertTableDlg, CountHdl_Impl)
267 : {
268 0 : nTableCount = static_cast<SCTAB>(aNfCount.GetValue());
269 0 : if ( nTableCount==1)
270 : {
271 0 : rtl::OUString aName;
272 0 : rDoc.CreateValidTabName( aName );
273 0 : aEdName.SetText( aName );
274 0 : aFtName.Enable();
275 0 : aEdName.Enable();
276 : }
277 : else
278 : {
279 0 : String aName=aFlTable.GetText();
280 0 : aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM("..."));
281 0 : aEdName.SetText( aName );
282 0 : aFtName.Disable();
283 0 : aEdName.Disable();
284 : }
285 :
286 0 : DoEnable_Impl();
287 0 : return 0;
288 : }
289 :
290 : //------------------------------------------------------------------------
291 0 : IMPL_LINK_NOARG(ScInsertTableDlg, ChoiceHdl_Impl)
292 : {
293 0 : if ( aBtnNew.IsChecked() )
294 0 : SetNewTable_Impl();
295 : else
296 0 : SetFromTo_Impl();
297 :
298 0 : DoEnable_Impl();
299 0 : return 0;
300 : }
301 :
302 : //------------------------------------------------------------------------
303 :
304 0 : IMPL_LINK_NOARG(ScInsertTableDlg, BrowseHdl_Impl)
305 : {
306 0 : if ( pDocInserter )
307 0 : delete pDocInserter;
308 : pDocInserter = new ::sfx2::DocumentInserter(
309 0 : rtl::OUString::createFromAscii( ScDocShell::Factory().GetShortName() ) );
310 0 : pDocInserter->StartExecuteModal( LINK( this, ScInsertTableDlg, DialogClosedHdl ) );
311 0 : return 0;
312 : }
313 :
314 : //------------------------------------------------------------------------
315 :
316 0 : IMPL_LINK_NOARG(ScInsertTableDlg, SelectHdl_Impl)
317 : {
318 0 : DoEnable_Impl();
319 0 : return 0;
320 : }
321 :
322 : //------------------------------------------------------------------------
323 :
324 0 : void ScInsertTableDlg::DoEnable_Impl()
325 : {
326 0 : if ( aBtnNew.IsChecked() || ( pDocShTables && aLbTables.GetSelectEntryCount() ) )
327 0 : aBtnOk.Enable();
328 : else
329 0 : aBtnOk.Disable();
330 0 : }
331 :
332 0 : IMPL_LINK_NOARG(ScInsertTableDlg, DoEnterHdl)
333 : {
334 0 : if(nTableCount > 1 || rDoc.ValidTabName(aEdName.GetText()))
335 : {
336 0 : EndDialog(RET_OK);
337 : }
338 : else
339 : {
340 0 : String aErrMsg ( ScGlobal::GetRscString( STR_INVALIDTABNAME ) );
341 0 : (void)ErrorBox( this,WinBits( WB_OK | WB_DEF_OK ),aErrMsg).Execute();
342 : }
343 0 : return 0;
344 : }
345 :
346 0 : IMPL_LINK_NOARG(ScInsertTableDlg, BrowseTimeoutHdl)
347 : {
348 0 : bMustClose = true;
349 0 : BrowseHdl_Impl( &aBtnBrowse );
350 0 : return 0;
351 : }
352 :
353 0 : IMPL_LINK( ScInsertTableDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
354 : {
355 0 : if ( ERRCODE_NONE == _pFileDlg->GetError() )
356 : {
357 0 : SfxMedium* pMed = pDocInserter->CreateMedium();
358 0 : if ( pMed )
359 : {
360 : // ERRCTX_SFX_OPENDOC -> "Fehler beim Laden des Dokumentes"
361 0 : SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
362 :
363 0 : if ( pDocShTables )
364 0 : pDocShTables->DoClose(); // delete passiert beim Zuweisen auf die Ref
365 :
366 0 : pMed->UseInteractionHandler( sal_True ); // to enable the filter options dialog
367 :
368 0 : pDocShTables = new ScDocShell;
369 0 : aDocShTablesRef = pDocShTables;
370 :
371 0 : Pointer aOldPtr( GetPointer() );
372 0 : SetPointer( Pointer( POINTER_WAIT ) );
373 0 : pDocShTables->DoLoad( pMed );
374 0 : SetPointer( aOldPtr );
375 :
376 0 : sal_uLong nErr = pDocShTables->GetErrorCode();
377 0 : if ( nErr )
378 0 : ErrorHandler::HandleError( nErr ); // auch Warnings
379 :
380 0 : if ( !pDocShTables->GetError() ) // nur Errors
381 : {
382 0 : FillTables_Impl( pDocShTables->GetDocument() );
383 0 : aFtPath.SetText( pDocShTables->GetTitle( SFX_TITLE_FULLNAME ) );
384 : }
385 : else
386 : {
387 0 : pDocShTables->DoClose();
388 0 : aDocShTablesRef.Clear();
389 0 : pDocShTables = NULL;
390 :
391 0 : FillTables_Impl( NULL );
392 0 : aFtPath.SetText( EMPTY_STRING );
393 0 : }
394 : }
395 :
396 0 : DoEnable_Impl();
397 : }
398 0 : else if ( bMustClose )
399 : // execute slot FID_INS_TABLE_EXT and cancel file dialog
400 0 : EndDialog( RET_CANCEL );
401 :
402 0 : return 0;
403 0 : }
404 :
405 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|