/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_scui.hxx" #undef SC_DLLIMPLEMENTATION //------------------------------------------------------------------ #include #include #include #include #include #include #include #include "global.hxx" #include "docsh.hxx" #include "viewdata.hxx" #include "scresid.hxx" #include "instbdlg.hrc" #include "globstr.hrc" #define SC_INSTBDLG_CXX #include "instbdlg.hxx" #include #if ENABLE_LAYOUT #undef ScResId #define ScResId(x) #x #undef ModalDialog #define ModalDialog( parent, id ) Dialog( parent, "insert-sheet.xml", id ) #undef ErrorBox #define ErrorBox( this, bits, message ) ErrorBox (LAYOUT_THIS_WINDOW (this), bits, message) #endif /* ENABLE_LAYOUT */ //================================================================== ScInsertTableDlg::ScInsertTableDlg( Window* pParent, ScViewData& rData, SCTAB nTabCount, bool bFromFile ) : ModalDialog ( pParent, ScResId( RID_SCDLG_INSERT_TABLE ) ), // aFlPos ( this, ScResId( FL_POSITION ) ), aBtnBefore ( this, ScResId( RB_BEFORE ) ), aBtnBehind ( this, ScResId( RB_BEHIND ) ), aFlTable ( this, ScResId( FL_TABLE ) ), aBtnNew ( this, ScResId( RB_NEW ) ), aBtnFromFile ( this, ScResId( RB_FROMFILE ) ), aFtCount ( this, ScResId( FT_COUNT ) ), aNfCount ( this, ScResId( NF_COUNT ) ), aFtName ( this, ScResId( FT_NAME ) ), aEdName ( this, ScResId( ED_TABNAME ) ), aLbTables ( this, ScResId( LB_TABLES ) ), aFtPath ( this, ScResId( FT_PATH ) ), aBtnBrowse ( this, ScResId( BTN_BROWSE ) ), aBtnLink ( this, ScResId( CB_LINK ) ), aBtnOk ( this, ScResId( BTN_OK ) ), aBtnCancel ( this, ScResId( BTN_CANCEL ) ), aBtnHelp ( this, ScResId( BTN_HELP ) ), rViewData ( rData ), rDoc ( *rData.GetDocument() ), pDocShTables ( NULL ), pDocInserter ( NULL ), bMustClose ( false ), nSelTabIndex ( 0 ), nTableCount (nTabCount) { #if ENABLE_LAYOUT SetHelpId (SID_INSERT_TABLE); aFtPath.SetText (EMPTY_STRING); #endif /* ENABLE_LAYOUT */ Init_Impl( bFromFile ); FreeResource(); aLbTables.SetAccessibleName(aBtnFromFile.GetText()); } //------------------------------------------------------------------------ __EXPORT ScInsertTableDlg::~ScInsertTableDlg() { if (pDocShTables) pDocShTables->DoClose(); delete pDocInserter; } //------------------------------------------------------------------------ void ScInsertTableDlg::Init_Impl( bool bFromFile ) { aBtnBrowse .SetClickHdl( LINK( this, ScInsertTableDlg, BrowseHdl_Impl ) ); aBtnNew .SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) ); aBtnFromFile .SetClickHdl( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) ); aLbTables .SetSelectHdl( LINK( this, ScInsertTableDlg, SelectHdl_Impl ) ); aNfCount .SetModifyHdl( LINK( this, ScInsertTableDlg, CountHdl_Impl)); aBtnOk .SetClickHdl( LINK( this, ScInsertTableDlg, DoEnterHdl )); aBtnBefore.Check(); aNfCount.SetText( String::CreateFromInt32(nTableCount) ); aNfCount.SetMax( MAXTAB - rDoc.GetTableCount() + 1 ); if(nTableCount==1) { String aName; rDoc.CreateValidTabName( aName ); aEdName.SetText( aName ); } else { String aName=aFlTable.GetText(); aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM("...")); aEdName.SetText( aName ); aFtName.Disable(); aEdName.Disable(); } bool bShared = ( rViewData.GetDocShell() ? rViewData.GetDocShell()->IsDocShared() : false ); if ( !bFromFile || bShared ) { aBtnNew.Check(); SetNewTable_Impl(); if ( bShared ) { aBtnFromFile.Disable(); } } else { aBtnFromFile.Check(); SetFromTo_Impl(); aBrowseTimer.SetTimeoutHdl( LINK( this, ScInsertTableDlg, BrowseTimeoutHdl ) ); aBrowseTimer.SetTimeout( 200 ); } } //------------------------------------------------------------------------ #if ENABLE_LAYOUT #undef ModalDialog #define ModalDialog Dialog #endif /* ENABLE_LAYOUT */ short __EXPORT ScInsertTableDlg::Execute() { // set Parent of DocumentInserter and Doc-Manager Window* pOldDefParent = Application::GetDefDialogParent(); Application::SetDefDialogParent( LAYOUT_THIS_WINDOW (this) ); if ( aBtnFromFile.IsChecked() ) aBrowseTimer.Start(); short nRet = ModalDialog::Execute(); Application::SetDefDialogParent( pOldDefParent ); return nRet; } //------------------------------------------------------------------------ void ScInsertTableDlg::SetNewTable_Impl() { if (aBtnNew.IsChecked() ) { aNfCount .Enable(); aFtCount .Enable(); aLbTables .Disable(); aFtPath .Disable(); aBtnBrowse .Disable(); aBtnLink .Disable(); if(nTableCount==1) { aEdName.Enable(); aFtName.Enable(); } } } //------------------------------------------------------------------------ void ScInsertTableDlg::SetFromTo_Impl() { if (aBtnFromFile.IsChecked() ) { aEdName .Disable(); aFtName .Disable(); aFtCount .Disable(); aNfCount .Disable(); aLbTables .Enable(); aFtPath .Enable(); aBtnBrowse .Enable(); aBtnLink .Enable(); } } //------------------------------------------------------------------------ void ScInsertTableDlg::FillTables_Impl( ScDocument* pSrcDoc ) { aLbTables.SetUpdateMode( sal_False ); aLbTables.Clear(); if ( pSrcDoc ) { SCTAB nCount = pSrcDoc->GetTableCount(); String aName; for ( SCTAB i=0; iGetName( i, aName ); aLbTables.InsertEntry( aName ); } } aLbTables.SetUpdateMode( sal_True ); if(aLbTables.GetEntryCount()==1) aLbTables.SelectEntryPos(0); } //------------------------------------------------------------------------ const String* ScInsertTableDlg::GetFirstTable( sal_uInt16* pN ) { const String* pStr = NULL; if ( aBtnNew.IsChecked() ) { aStrCurSelTable = aEdName.GetText(); pStr = &aStrCurSelTable; } else if ( nSelTabIndex < aLbTables.GetSelectEntryCount() ) { aStrCurSelTable = aLbTables.GetSelectEntry( 0 ); pStr = &aStrCurSelTable; if ( pN ) *pN = aLbTables.GetSelectEntryPos( 0 ); nSelTabIndex = 1; } return pStr; } //------------------------------------------------------------------------ const String* ScInsertTableDlg::GetNextTable( sal_uInt16* pN ) { const String* pStr = NULL; if ( !aBtnNew.IsChecked() && nSelTabIndex < aLbTables.GetSelectEntryCount() ) { aStrCurSelTable = aLbTables.GetSelectEntry( nSelTabIndex ); pStr = &aStrCurSelTable; if ( pN ) *pN = aLbTables.GetSelectEntryPos( nSelTabIndex ); nSelTabIndex++; } return pStr; } //------------------------------------------------------------------------ // Handler: //------------------------------------------------------------------------ IMPL_LINK( ScInsertTableDlg, CountHdl_Impl, NumericField*, EMPTYARG ) { nTableCount = static_cast(aNfCount.GetValue()); if ( nTableCount==1) { String aName; rDoc.CreateValidTabName( aName ); aEdName.SetText( aName ); aFtName.Enable(); aEdName.Enable(); } else { String aName=aFlTable.GetText(); aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM("...")); aEdName.SetText( aName ); aFtName.Disable(); aEdName.Disable(); } DoEnable_Impl(); return 0; } //------------------------------------------------------------------------ IMPL_LINK( ScInsertTableDlg, ChoiceHdl_Impl, RadioButton*, EMPTYARG ) { if ( aBtnNew.IsChecked() ) SetNewTable_Impl(); else SetFromTo_Impl(); DoEnable_Impl(); return 0; } //------------------------------------------------------------------------ IMPL_LINK( ScInsertTableDlg, BrowseHdl_Impl, PushButton*, EMPTYARG ) { if ( pDocInserter ) delete pDocInserter; pDocInserter = new ::sfx2::DocumentInserter( 0, String::CreateFromAscii( ScDocShell::Factory().GetShortName() ) ); pDocInserter->StartExecuteModal( LINK( this, ScInsertTableDlg, DialogClosedHdl ) ); return 0; } //------------------------------------------------------------------------ IMPL_LINK( ScInsertTableDlg, SelectHdl_Impl, MultiListBox*, EMPTYARG ) { DoEnable_Impl(); return 0; } //------------------------------------------------------------------------ void ScInsertTableDlg::DoEnable_Impl() { if ( aBtnNew.IsChecked() || ( pDocShTables && aLbTables.GetSelectEntryCount() ) ) aBtnOk.Enable(); else aBtnOk.Disable(); } IMPL_LINK( ScInsertTableDlg, DoEnterHdl, PushButton*, EMPTYARG ) { if(nTableCount > 1 || rDoc.ValidTabName(aEdName.GetText())) { EndDialog(RET_OK); } else { String aErrMsg ( ScGlobal::GetRscString( STR_INVALIDTABNAME ) ); (void)ErrorBox( this,WinBits( WB_OK | WB_DEF_OK ),aErrMsg).Execute(); } return 0; } IMPL_LINK( ScInsertTableDlg, BrowseTimeoutHdl, Timer*, EMPTYARG ) { bMustClose = true; BrowseHdl_Impl( &aBtnBrowse ); return 0; } IMPL_LINK( ScInsertTableDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) { if ( ERRCODE_NONE == _pFileDlg->GetError() ) { SfxMedium* pMed = pDocInserter->CreateMedium(); if ( pMed ) { // ERRCTX_SFX_OPENDOC -> "Fehler beim Laden des Dokumentes" SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() ); if ( pDocShTables ) pDocShTables->DoClose(); // delete passiert beim Zuweisen auf die Ref pMed->UseInteractionHandler( sal_True ); // to enable the filter options dialog pDocShTables = new ScDocShell; aDocShTablesRef = pDocShTables; Pointer aOldPtr( GetPointer() ); SetPointer( Pointer( POINTER_WAIT ) ); pDocShTables->DoLoad( pMed ); SetPointer( aOldPtr ); sal_uLong nErr = pDocShTables->GetErrorCode(); if ( nErr ) ErrorHandler::HandleError( nErr ); // auch Warnings if ( !pDocShTables->GetError() ) // nur Errors { FillTables_Impl( pDocShTables->GetDocument() ); aFtPath.SetText( pDocShTables->GetTitle( SFX_TITLE_FULLNAME ) ); } else { pDocShTables->DoClose(); aDocShTablesRef.Clear(); pDocShTables = NULL; FillTables_Impl( NULL ); aFtPath.SetText( EMPTY_STRING ); } } DoEnable_Impl(); } else if ( bMustClose ) // execute slot FID_INS_TABLE_EXT and cancel file dialog EndDialog( RET_CANCEL ); return 0; }