1
0
Fork 0
libreoffice/sw/source/ui/table/convert.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

354 lines
12 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 .
*/
#include <modcfg.hxx>
#include <sfx2/htmlmode.hxx>
#include <viewopt.hxx>
#include <swmodule.hxx>
#include <convert.hxx>
#include <tablemgr.hxx>
#include <view.hxx>
#include <tblafmt.hxx>
#include <strings.hrc>
#include <swabstdlg.hxx>
#include <swuiexp.hxx>
#include <memory>
#include <vcl/svapp.hxx>
#include <vcl/weld.hxx>
#include <sal/log.hxx>
#include <shellres.hxx>
//keep the state of the buttons on runtime
static int nSaveButtonState = -1; // 0: tab, 1: semicolon, 2: paragraph, 3: other, -1: not yet used
static bool bIsKeepColumn = true;
static sal_Unicode uOther = ',';
void SwConvertTableDlg::GetValues(sal_Unicode& rDelim, SwInsertTableOptions& rInsTableOpts,
SwTableAutoFormat const*& prTAFormat)
{
if (m_xTabBtn->get_active())
{
//0x0b mustn't be set when re-converting table into text
bIsKeepColumn = !m_xKeepColumn->get_visible() || m_xKeepColumn->get_active();
rDelim = bIsKeepColumn ? 0x09 : 0x0b;
nSaveButtonState = 0;
}
else if (m_xSemiBtn->get_active())
{
rDelim = ';';
nSaveButtonState = 1;
}
else if (m_xOtherBtn->get_active() && !m_xOtherEd->get_text().isEmpty())
{
uOther = m_xOtherEd->get_text()[0];
rDelim = uOther;
nSaveButtonState = 3;
}
else
{
nSaveButtonState = 2;
rDelim = cParaDelim;
if (m_xOtherBtn->get_active())
{
nSaveButtonState = 3;
uOther = 0;
}
}
SwInsertTableFlags nInsMode = SwInsertTableFlags::NONE;
if (m_xHeaderCB->get_active())
nInsMode |= SwInsertTableFlags::Headline;
if (m_xRepeatHeaderCB->get_sensitive() && m_xRepeatHeaderCB->get_active())
rInsTableOpts.mnRowsToRepeat = m_xRepeatHeaderNF->get_value();
else
rInsTableOpts.mnRowsToRepeat = 0;
if (!m_xDontSplitCB->get_active())
nInsMode |= SwInsertTableFlags::SplitLayout;
if (mxTAutoFormat)
prTAFormat = new SwTableAutoFormat(*mxTAutoFormat);
rInsTableOpts.mnInsMode = nInsMode;
}
SwConvertTableDlg::SwConvertTableDlg(SwView& rView, bool bToTable)
: SfxDialogController(rView.GetFrameWeld(), u"modules/swriter/ui/converttexttable.ui"_ustr,
u"ConvertTextTableDialog"_ustr)
, m_aStrTitle(SwResId(STR_ADD_AUTOFORMAT_TITLE))
, m_aStrLabel(SwResId(STR_ADD_AUTOFORMAT_LABEL))
, m_aStrClose(SwResId(STR_BTN_AUTOFORMAT_CLOSE))
, m_aStrDelTitle(SwResId(STR_DEL_AUTOFORMAT_TITLE))
, m_aStrDelMsg(SwResId(STR_DEL_AUTOFORMAT_MSG))
, m_aStrRenameTitle(SwResId(STR_RENAME_AUTOFORMAT_TITLE))
, m_aStrInvalidFormat(SwResId(STR_INVALID_AUTOFORMAT_NAME))
, m_nIndex(0)
, m_nDfltStylePos(0)
, m_bCoreDataChanged(false)
, m_xTableTable(new SwTableAutoFormatTable)
, m_xTabBtn(m_xBuilder->weld_radio_button(u"tabs"_ustr))
, m_xSemiBtn(m_xBuilder->weld_radio_button(u"semicolons"_ustr))
, m_xParaBtn(m_xBuilder->weld_radio_button(u"paragraph"_ustr))
, m_xOtherBtn(m_xBuilder->weld_radio_button(u"other"_ustr))
, m_xOtherEd(m_xBuilder->weld_entry(u"othered"_ustr))
, m_xKeepColumn(m_xBuilder->weld_check_button(u"keepcolumn"_ustr))
, m_xOptions(m_xBuilder->weld_container(u"options"_ustr))
, m_xHeaderCB(m_xBuilder->weld_check_button(u"headingcb"_ustr))
, m_xRepeatHeaderCB(m_xBuilder->weld_check_button(u"repeatheading"_ustr))
, m_xRepeatRows(m_xBuilder->weld_container(u"repeatrows"_ustr))
, m_xRepeatHeaderNF(m_xBuilder->weld_spin_button(u"repeatheadersb"_ustr))
, m_xDontSplitCB(m_xBuilder->weld_check_button(u"dontsplitcb"_ustr))
, m_xLbFormat(m_xBuilder->weld_tree_view(u"formatlb"_ustr))
, m_xBtnNumFormat(m_xBuilder->weld_check_button(u"numformatcb"_ustr))
, m_xBtnBorder(m_xBuilder->weld_check_button(u"bordercb"_ustr))
, m_xBtnFont(m_xBuilder->weld_check_button(u"fontcb"_ustr))
, m_xBtnPattern(m_xBuilder->weld_check_button(u"patterncb"_ustr))
, m_xBtnAlignment(m_xBuilder->weld_check_button(u"alignmentcb"_ustr))
, m_xWndPreview(new weld::CustomWeld(*m_xBuilder, u"preview"_ustr, m_aWndPreview))
, m_pShell(&rView.GetWrtShell())
{
m_aWndPreview.DetectRTL(&rView.GetWrtShell());
m_xTableTable->Load();
const int nWidth = m_xLbFormat->get_approximate_digit_width() * 32;
const int nHeight = m_xLbFormat->get_height_rows(8);
m_xLbFormat->set_size_request(nWidth, nHeight);
m_xWndPreview->set_size_request(nWidth, nHeight);
if (nSaveButtonState > -1)
{
switch (nSaveButtonState)
{
case 0:
m_xTabBtn->set_active(true);
m_xKeepColumn->set_active(bIsKeepColumn);
break;
case 1:
m_xSemiBtn->set_active(true);
break;
case 2:
m_xParaBtn->set_active(true);
break;
case 3:
m_xOtherBtn->set_active(true);
if (uOther)
m_xOtherEd->set_text(OUString(uOther));
break;
}
}
if (bToTable)
{
m_xDialog->set_title(SwResId(STR_CONVERT_TEXT_TABLE));
m_xKeepColumn->show();
m_xKeepColumn->set_sensitive(m_xTabBtn->get_active());
}
else
{
//hide insert options
m_xOptions->hide();
}
m_xKeepColumn->save_state();
Link<weld::Toggleable&, void> aLk(LINK(this, SwConvertTableDlg, BtnHdl));
m_xTabBtn->connect_toggled(aLk);
m_xSemiBtn->connect_toggled(aLk);
m_xParaBtn->connect_toggled(aLk);
m_xOtherBtn->connect_toggled(aLk);
m_xOtherEd->set_sensitive(m_xOtherBtn->get_active());
const SwModuleOptions* pModOpt = SwModule::get()->GetModuleConfig();
bool bHTMLMode = 0 != (::GetHtmlMode(rView.GetDocShell()) & HTMLMODE_ON);
SwInsertTableOptions aInsOpts = pModOpt->GetInsTableFlags(bHTMLMode);
SwInsertTableFlags nInsTableFlags = aInsOpts.mnInsMode;
m_xHeaderCB->set_active(bool(nInsTableFlags & SwInsertTableFlags::Headline));
m_xRepeatHeaderCB->set_active(aInsOpts.mnRowsToRepeat > 0);
m_xDontSplitCB->set_active(!(nInsTableFlags & SwInsertTableFlags::SplitLayout));
m_xHeaderCB->connect_toggled(LINK(this, SwConvertTableDlg, CheckBoxHdl));
m_xRepeatHeaderCB->connect_toggled(LINK(this, SwConvertTableDlg, RepeatHeaderCheckBoxHdl));
RepeatHeaderCheckBoxHdl(*m_xRepeatHeaderCB);
CheckBoxHdl(*m_xHeaderCB);
Init();
}
SwConvertTableDlg::~SwConvertTableDlg()
{
try
{
if (m_bCoreDataChanged)
m_xTableTable->Save();
}
catch (...)
{
}
m_xTableTable.reset();
}
void SwConvertTableDlg::Init()
{
const SwTableAutoFormat* pSelFormat = mxTAutoFormat.get();
Link<weld::Toggleable&, void> aLk(LINK(this, SwConvertTableDlg, CheckHdl));
m_xBtnBorder->connect_toggled(aLk);
m_xBtnFont->connect_toggled(aLk);
m_xBtnPattern->connect_toggled(aLk);
m_xBtnAlignment->connect_toggled(aLk);
m_xBtnNumFormat->connect_toggled(aLk);
m_xLbFormat->connect_changed(LINK(this, SwConvertTableDlg, SelFormatHdl));
// Then the list to be expanded by the entry "- none -".
m_xLbFormat->append_text(SwViewShell::GetShellRes()->aStrNone);
m_nDfltStylePos = 1;
m_nIndex = 255;
for (sal_uInt8 i = 0, nCount = static_cast<sal_uInt8>(m_xTableTable->size()); i < nCount; i++)
{
SwTableAutoFormat const& rFormat = (*m_xTableTable)[i];
m_xLbFormat->append_text(rFormat.GetName());
if (pSelFormat && rFormat.GetName() == pSelFormat->GetName())
m_nIndex = i;
}
m_xLbFormat->select(255 != m_nIndex ? (m_nDfltStylePos + m_nIndex) : 0);
SelFormatHdl(*m_xLbFormat);
}
void SwConvertTableDlg::UpdateChecks(const SwTableAutoFormat& rFormat, bool bEnable)
{
m_xBtnNumFormat->set_sensitive(bEnable);
m_xBtnNumFormat->set_active(rFormat.IsValueFormat());
m_xBtnBorder->set_sensitive(bEnable);
m_xBtnBorder->set_active(rFormat.IsFrame());
m_xBtnFont->set_sensitive(bEnable);
m_xBtnFont->set_active(rFormat.IsFont());
m_xBtnPattern->set_sensitive(bEnable);
m_xBtnPattern->set_active(rFormat.IsBackground());
m_xBtnAlignment->set_sensitive(bEnable);
m_xBtnAlignment->set_active(rFormat.IsJustify());
}
std::unique_ptr<SwTableAutoFormat> SwConvertTableDlg::FillAutoFormatOfIndex() const
{
if (255 != m_nIndex)
{
return std::make_unique<SwTableAutoFormat>((*m_xTableTable)[m_nIndex]);
}
return nullptr;
}
IMPL_LINK(SwConvertTableDlg, CheckHdl, weld::Toggleable&, rBtn, void)
{
if (m_nIndex == 255)
return;
SwTableAutoFormat& rData = (*m_xTableTable)[m_nIndex];
bool bCheck = rBtn.get_active(), bDataChgd = true;
if (&rBtn == m_xBtnNumFormat.get())
rData.SetValueFormat(bCheck);
else if (&rBtn == m_xBtnBorder.get())
rData.SetFrame(bCheck);
else if (&rBtn == m_xBtnFont.get())
rData.SetFont(bCheck);
else if (&rBtn == m_xBtnPattern.get())
rData.SetBackground(bCheck);
else if (&rBtn == m_xBtnAlignment.get())
rData.SetJustify(bCheck);
else
bDataChgd = false;
if (bDataChgd)
{
if (!m_bCoreDataChanged)
{
m_bCoreDataChanged = true;
}
m_aWndPreview.NotifyChange(rData);
mxTAutoFormat = FillAutoFormatOfIndex();
}
}
IMPL_LINK_NOARG(SwConvertTableDlg, SelFormatHdl, weld::TreeView&, void)
{
sal_uInt8 nOldIdx = m_nIndex;
int nSelPos = m_xLbFormat->get_selected_index();
if (nSelPos >= m_nDfltStylePos)
{
m_nIndex = nSelPos - m_nDfltStylePos;
m_aWndPreview.NotifyChange((*m_xTableTable)[m_nIndex]);
UpdateChecks((*m_xTableTable)[m_nIndex], true);
mxTAutoFormat = FillAutoFormatOfIndex();
}
else
{
m_nIndex = 255;
SwTableAutoFormat aTmp(SwViewShell::GetShellRes()->aStrNone);
aTmp.SetFont(false);
aTmp.SetJustify(false);
aTmp.SetFrame(false);
aTmp.SetBackground(false);
aTmp.SetValueFormat(false);
aTmp.SetWidthHeight(false);
if (nOldIdx != m_nIndex)
m_aWndPreview.NotifyChange(aTmp);
UpdateChecks(aTmp, false);
}
}
IMPL_LINK(SwConvertTableDlg, BtnHdl, weld::Toggleable&, rButton, void)
{
if (!rButton.get_active())
return;
if (m_xTabBtn->get_active())
m_xKeepColumn->set_state(m_xKeepColumn->get_saved_state());
else
{
if (m_xKeepColumn->get_sensitive())
m_xKeepColumn->save_state();
m_xKeepColumn->set_active(true);
}
m_xKeepColumn->set_sensitive(m_xTabBtn->get_active());
m_xOtherEd->set_sensitive(m_xOtherBtn->get_active());
}
IMPL_LINK_NOARG(SwConvertTableDlg, CheckBoxHdl, weld::Toggleable&, void)
{
m_xRepeatHeaderCB->set_sensitive(m_xHeaderCB->get_active());
RepeatHeaderCheckBoxHdl(*m_xRepeatHeaderCB);
}
IMPL_LINK_NOARG(SwConvertTableDlg, RepeatHeaderCheckBoxHdl, weld::Toggleable&, void)
{
bool bEnable = m_xHeaderCB->get_active() && m_xRepeatHeaderCB->get_active();
m_xRepeatRows->set_sensitive(bEnable);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */