1
0
Fork 0
libreoffice/sc/source/ui/miscdlgs/instbdlg.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

352 lines
10 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#undef SC_DLLIMPLEMENTATION
#include <sfx2/docfile.hxx>
#include <sfx2/docinsert.hxx>
#include <sfx2/filedlghelper.hxx>
#include <svtools/ehdl.hxx>
#include <svtools/sfxecode.hxx>
#include <vcl/svapp.hxx>
#include <vcl/weld.hxx>
#include <docsh.hxx>
#include <viewdata.hxx>
#include <globstr.hrc>
#include <scresid.hxx>
#include <instbdlg.hxx>
ScInsertTableDlg::ScInsertTableDlg(weld::Window* pParent, ScViewData& rData, SCTAB nTabCount, bool bFromFile)
: GenericDialogController(pParent, u"modules/scalc/ui/insertsheet.ui"_ustr, u"InsertSheetDialog"_ustr)
, aBrowseTimer("ScInsertTableDlg aBrowseTimer")
, rViewData(rData)
, rDoc(rData.GetDocument())
, bMustClose(false)
, nSelTabIndex(0)
, nTableCount(nTabCount)
, m_xBtnBefore(m_xBuilder->weld_radio_button(u"before"_ustr))
, m_xBtnNew(m_xBuilder->weld_radio_button(u"new"_ustr))
, m_xBtnFromFile(m_xBuilder->weld_radio_button(u"fromfile"_ustr))
, m_xFtCount(m_xBuilder->weld_label(u"countft"_ustr))
, m_xNfCount(m_xBuilder->weld_spin_button(u"countnf"_ustr))
, m_xFtName(m_xBuilder->weld_label(u"nameft"_ustr))
, m_xEdName(m_xBuilder->weld_entry(u"nameed"_ustr))
, m_xLbTables(m_xBuilder->weld_tree_view(u"tables"_ustr))
, m_xFtPath(m_xBuilder->weld_label(u"path"_ustr))
, m_xBtnBrowse(m_xBuilder->weld_button(u"browse"_ustr))
, m_xBtnLink(m_xBuilder->weld_check_button(u"link"_ustr))
, m_xBtnOk(m_xBuilder->weld_button(u"ok"_ustr))
{
m_sSheetDotDotDot = m_xEdName->get_text();
m_xLbTables->set_size_request(-1, m_xLbTables->get_height_rows(8));
Init_Impl(bFromFile);
}
ScInsertTableDlg::~ScInsertTableDlg()
{
if (pDocShTables)
pDocShTables->DoClose();
pDocInserter.reset();
}
void ScInsertTableDlg::Init_Impl( bool bFromFile )
{
m_xLbTables->set_selection_mode(SelectionMode::Multiple);
m_xBtnBrowse->connect_clicked( LINK( this, ScInsertTableDlg, BrowseHdl_Impl ) );
m_xBtnNew->connect_toggled( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
m_xBtnFromFile->connect_toggled( LINK( this, ScInsertTableDlg, ChoiceHdl_Impl ) );
m_xLbTables->connect_changed( LINK( this, ScInsertTableDlg, SelectHdl_Impl ) );
m_xNfCount->connect_value_changed( LINK( this, ScInsertTableDlg, CountHdl_Impl));
m_xBtnOk->connect_clicked( LINK( this, ScInsertTableDlg, DoEnterHdl ));
m_xBtnBefore->set_active(true);
m_xNfCount->set_max(MAXTAB - rDoc.GetTableCount() + 1);
m_xNfCount->set_value(nTableCount);
if(nTableCount==1)
{
OUString aName;
rDoc.CreateValidTabName( aName );
m_xEdName->set_text( aName );
}
else
{
m_xEdName->set_text(m_sSheetDotDotDot);
m_xFtName->set_sensitive(false);
m_xEdName->set_sensitive(false);
}
bool bShared = rViewData.GetDocShell() && rViewData.GetDocShell()->IsDocShared();
if ( !bFromFile || bShared )
{
m_xBtnNew->set_active(true);
SetNewTable_Impl();
if ( bShared )
{
m_xBtnFromFile->set_sensitive(false);
}
}
else
{
m_xBtnFromFile->set_active(true);
SetFromTo_Impl();
aBrowseTimer.SetInvokeHandler( LINK( this, ScInsertTableDlg, BrowseTimeoutHdl ) );
aBrowseTimer.SetTimeout( 200 );
}
}
short ScInsertTableDlg::run()
{
if (m_xBtnFromFile->get_active())
aBrowseTimer.Start();
return GenericDialogController::run();
}
void ScInsertTableDlg::SetNewTable_Impl()
{
if (!m_xBtnNew->get_active() )
return;
m_xNfCount->set_sensitive(true);
m_xFtCount->set_sensitive(true);
m_xLbTables->set_sensitive(false);
m_xFtPath->set_sensitive(false);
m_xBtnBrowse->set_sensitive(false);
m_xBtnLink->set_sensitive(false);
if(nTableCount==1)
{
m_xEdName->set_sensitive(true);
m_xFtName->set_sensitive(true);
}
}
void ScInsertTableDlg::SetFromTo_Impl()
{
if (m_xBtnFromFile->get_active() )
{
m_xEdName->set_sensitive(false);
m_xFtName->set_sensitive(false);
m_xFtCount->set_sensitive(false);
m_xNfCount->set_sensitive(false);
m_xLbTables->set_sensitive(true);
m_xFtPath->set_sensitive(true);
m_xBtnBrowse->set_sensitive(true);
m_xBtnLink->set_sensitive(true);
}
}
void ScInsertTableDlg::FillTables_Impl( const ScDocument* pSrcDoc )
{
m_xLbTables->freeze();
m_xLbTables->clear();
if ( pSrcDoc )
{
SCTAB nCount = pSrcDoc->GetTableCount();
OUString aName;
for (SCTAB i=0; i<nCount; ++i)
{
pSrcDoc->GetName( i, aName );
m_xLbTables->append_text(aName);
}
}
m_xLbTables->thaw();
if (m_xLbTables->n_children() == 1)
m_xLbTables->select(0);
}
const OUString* ScInsertTableDlg::GetFirstTable( sal_uInt16* pN )
{
const OUString* pStr = nullptr;
if ( m_xBtnNew->get_active() )
{
aStrCurSelTable = m_xEdName->get_text();
pStr = &aStrCurSelTable;
}
else
{
std::vector<int> aRows(m_xLbTables->get_selected_rows());
if (nSelTabIndex < aRows.size())
{
aStrCurSelTable = m_xLbTables->get_text(aRows[0]);
pStr = &aStrCurSelTable;
if ( pN )
*pN = aRows[0];
nSelTabIndex = 1;
}
}
return pStr;
}
const OUString* ScInsertTableDlg::GetNextTable( sal_uInt16* pN )
{
if (m_xBtnNew->get_active())
return nullptr;
std::vector<int> aRows(m_xLbTables->get_selected_rows());
const OUString* pStr = nullptr;
if (nSelTabIndex < aRows.size())
{
aStrCurSelTable = m_xLbTables->get_text(aRows[nSelTabIndex]);
pStr = &aStrCurSelTable;
if ( pN )
*pN = aRows[nSelTabIndex];
nSelTabIndex++;
}
return pStr;
}
// Handler:
IMPL_LINK_NOARG(ScInsertTableDlg, CountHdl_Impl, weld::SpinButton&, void)
{
nTableCount = static_cast<SCTAB>(m_xNfCount->get_value());
if ( nTableCount==1)
{
OUString aName;
rDoc.CreateValidTabName( aName );
m_xEdName->set_text( aName );
m_xFtName->set_sensitive(true);
m_xEdName->set_sensitive(true);
}
else
{
m_xEdName->set_text(m_sSheetDotDotDot);
m_xFtName->set_sensitive(false);
m_xEdName->set_sensitive(false);
}
DoEnable_Impl();
}
IMPL_LINK(ScInsertTableDlg, ChoiceHdl_Impl, weld::Toggleable&, rButton, void)
{
if (!rButton.get_active())
return;
if ( m_xBtnNew->get_active() )
SetNewTable_Impl();
else
SetFromTo_Impl();
DoEnable_Impl();
}
IMPL_LINK_NOARG(ScInsertTableDlg, BrowseHdl_Impl, weld::Button&, void)
{
pDocInserter.reset();
pDocInserter.reset( new ::sfx2::DocumentInserter(m_xDialog.get(), ScDocShell::Factory().GetFactoryName()) );
pDocInserter->StartExecuteModal( LINK( this, ScInsertTableDlg, DialogClosedHdl ) );
}
IMPL_LINK_NOARG(ScInsertTableDlg, SelectHdl_Impl, weld::TreeView&, void)
{
DoEnable_Impl();
}
void ScInsertTableDlg::DoEnable_Impl()
{
if ( m_xBtnNew->get_active() || ( pDocShTables && m_xLbTables->count_selected_rows() ) )
m_xBtnOk->set_sensitive(true);
else
m_xBtnOk->set_sensitive(false);
}
IMPL_LINK_NOARG(ScInsertTableDlg, DoEnterHdl, weld::Button&, void)
{
if (nTableCount > 1 || ScDocument::ValidTabName(m_xEdName->get_text()))
{
m_xDialog->response(RET_OK);
}
else
{
OUString aErrMsg ( ScResId( STR_INVALIDTABNAME ) );
std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(m_xDialog.get(), VclMessageType::Warning,
VclButtonsType::Ok, aErrMsg));
xBox->run();
}
}
IMPL_LINK_NOARG(ScInsertTableDlg, BrowseTimeoutHdl, Timer *, void)
{
bMustClose = true;
BrowseHdl_Impl(*m_xBtnBrowse);
}
IMPL_LINK( ScInsertTableDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg, void )
{
if ( ERRCODE_NONE == _pFileDlg->GetError() )
{
std::unique_ptr<SfxMedium> pMed = pDocInserter->CreateMedium();
if ( pMed )
{
// ERRCTX_SFX_OPENDOC -> "Error loading document"
SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
if ( pDocShTables )
pDocShTables->DoClose(); // deletion is done when assigning to the reference
pMed->UseInteractionHandler( true ); // to enable the filter options dialog
pDocShTables = new ScDocShell;
{
weld::WaitObject aWait(m_xDialog.get());
pDocShTables->DoLoad(pMed.release());
}
ErrCodeMsg nErr = pDocShTables->GetErrorCode();
if ( nErr )
ErrorHandler::HandleError(nErr, m_xDialog.get()); // warnings, too
if ( !pDocShTables->GetErrorIgnoreWarning() ) // errors only
{
FillTables_Impl( &pDocShTables->GetDocument() );
m_xFtPath->set_label(pDocShTables->GetTitle(SFX_TITLE_FULLNAME));
}
else
{
pDocShTables->DoClose();
pDocShTables.clear();
FillTables_Impl( nullptr );
m_xFtPath->set_label(OUString());
}
}
DoEnable_Impl();
}
else if ( bMustClose )
// execute slot FID_INS_TABLE_EXT and cancel file dialog
m_xDialog->response(RET_CANCEL);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */