summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/Library_swui.mk1
-rw-r--r--sw/source/ui/table/autoformatpreview.cxx482
-rw-r--r--sw/source/ui/table/instable.cxx140
-rw-r--r--sw/source/ui/table/tautofmt.cxx532
-rw-r--r--sw/source/uibase/inc/autoformatpreview.hxx91
-rw-r--r--sw/source/uibase/inc/instable.hxx62
-rw-r--r--sw/source/uibase/inc/tautofmt.hxx21
-rw-r--r--sw/uiconfig/swriter/ui/inserttable.ui71
8 files changed, 773 insertions, 627 deletions
diff --git a/sw/Library_swui.mk b/sw/Library_swui.mk
index e33d16450b11..23c737e2a740 100644
--- a/sw/Library_swui.mk
+++ b/sw/Library_swui.mk
@@ -146,6 +146,7 @@ $(eval $(call gb_Library_add_exception_objects,swui,\
sw/source/ui/misc/titlepage \
sw/source/ui/table/colwd \
sw/source/ui/table/convert \
+ sw/source/ui/table/autoformatpreview \
sw/source/ui/table/instable \
sw/source/ui/table/mergetbl \
sw/source/ui/table/rowht \
diff --git a/sw/source/ui/table/autoformatpreview.cxx b/sw/source/ui/table/autoformatpreview.cxx
new file mode 100644
index 000000000000..8386dcb16cb3
--- /dev/null
+++ b/sw/source/ui/table/autoformatpreview.cxx
@@ -0,0 +1,482 @@
+/* -*- 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 <vcl/builderfactory.hxx>
+#include <com/sun/star/i18n/BreakIterator.hpp>
+#include <svtools/scriptedtext.hxx>
+#include <drawinglayer/processor2d/processor2dtools.hxx>
+#include <strings.hrc>
+
+#include <autoformatpreview.hxx>
+
+#define FRAME_OFFSET 4
+
+AutoFormatPreview::AutoFormatPreview(vcl::Window* pParent, WinBits nStyle)
+ : Window(pParent, nStyle)
+ , aCurData(OUString())
+ , aVD(VclPtr<VirtualDevice>::Create(*this))
+ , bFitWidth(false)
+ , mbRTL(false)
+ , aStrJan(SwResId(STR_JAN))
+ , aStrFeb(SwResId(STR_FEB))
+ , aStrMar(SwResId(STR_MAR))
+ , aStrNorth(SwResId(STR_NORTH))
+ , aStrMid(SwResId(STR_MID))
+ , aStrSouth(SwResId(STR_SOUTH))
+ , aStrSum(SwResId(STR_SUM))
+{
+ uno::Reference<uno::XComponentContext> xContext = comphelper::getProcessComponentContext();
+ m_xBreak = i18n::BreakIterator::create(xContext);
+ pNumFormat = new SvNumberFormatter(xContext, LANGUAGE_SYSTEM);
+
+ Init();
+}
+
+VCL_BUILDER_FACTORY_CONSTRUCTOR(AutoFormatPreview, 0)
+
+void AutoFormatPreview::Resize()
+{
+ aPrvSize = Size(GetSizePixel().Width() - 6, GetSizePixel().Height() - 30);
+ nLabelColWidth = (aPrvSize.Width() - 4) / 4 - 12;
+ nDataColWidth1 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 3;
+ nDataColWidth2 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 4;
+ nRowHeight = (aPrvSize.Height() - 4) / 5;
+ NotifyChange(aCurData);
+}
+
+void AutoFormatPreview::DetectRTL(SwWrtShell const* pWrtShell)
+{
+ if (!pWrtShell->IsCursorInTable()) // We haven't created the table yet
+ mbRTL = AllSettings::GetLayoutRTL();
+ else
+ mbRTL = pWrtShell->IsTableRightToLeft();
+}
+
+AutoFormatPreview::~AutoFormatPreview() { disposeOnce(); }
+
+void AutoFormatPreview::dispose()
+{
+ delete pNumFormat;
+ vcl::Window::dispose();
+}
+
+static void lcl_SetFontProperties(vcl::Font& rFont, const SvxFontItem& rFontItem,
+ const SvxWeightItem& rWeightItem,
+ const SvxPostureItem& rPostureItem)
+{
+ rFont.SetFamily(rFontItem.GetFamily());
+ rFont.SetFamilyName(rFontItem.GetFamilyName());
+ rFont.SetStyleName(rFontItem.GetStyleName());
+ rFont.SetCharSet(rFontItem.GetCharSet());
+ rFont.SetPitch(rFontItem.GetPitch());
+ rFont.SetWeight(rWeightItem.GetValue());
+ rFont.SetItalic(rPostureItem.GetValue());
+}
+
+#define SETONALLFONTS(MethodName, Value) \
+ rFont.MethodName(Value); \
+ rCJKFont.MethodName(Value); \
+ rCTLFont.MethodName(Value);
+
+void AutoFormatPreview::MakeFonts(sal_uInt8 nIndex, vcl::Font& rFont, vcl::Font& rCJKFont,
+ vcl::Font& rCTLFont)
+{
+ const SwBoxAutoFormat& rBoxFormat = aCurData.GetBoxFormat(nIndex);
+
+ rFont = rCJKFont = rCTLFont = GetFont();
+ Size aFontSize(rFont.GetFontSize().Width(), 10 * GetDPIScaleFactor());
+
+ lcl_SetFontProperties(rFont, rBoxFormat.GetFont(), rBoxFormat.GetWeight(),
+ rBoxFormat.GetPosture());
+ lcl_SetFontProperties(rCJKFont, rBoxFormat.GetCJKFont(), rBoxFormat.GetCJKWeight(),
+ rBoxFormat.GetCJKPosture());
+ lcl_SetFontProperties(rCTLFont, rBoxFormat.GetCTLFont(), rBoxFormat.GetCTLWeight(),
+ rBoxFormat.GetCTLPosture());
+
+ SETONALLFONTS(SetUnderline, rBoxFormat.GetUnderline().GetValue());
+ SETONALLFONTS(SetOverline, rBoxFormat.GetOverline().GetValue());
+ SETONALLFONTS(SetStrikeout, rBoxFormat.GetCrossedOut().GetValue());
+ SETONALLFONTS(SetOutline, rBoxFormat.GetContour().GetValue());
+ SETONALLFONTS(SetShadow, rBoxFormat.GetShadowed().GetValue());
+ SETONALLFONTS(SetColor, rBoxFormat.GetColor().GetValue());
+ SETONALLFONTS(SetFontSize, aFontSize);
+ SETONALLFONTS(SetTransparent, true);
+}
+
+sal_uInt8 AutoFormatPreview::GetFormatIndex(size_t nCol, size_t nRow) const
+{
+ static const sal_uInt8 pnFormatMap[]
+ = { 0, 1, 2, 1, 3, 4, 5, 6, 5, 7, 8, 9, 10, 9, 11, 4, 5, 6, 5, 7, 12, 13, 14, 13, 15 };
+ return pnFormatMap[maArray.GetCellIndex(nCol, nRow, mbRTL)];
+}
+
+void AutoFormatPreview::DrawString(vcl::RenderContext& rRenderContext, size_t nCol, size_t nRow)
+{
+ // Output of the cell text:
+ sal_uLong nNum;
+ double nVal;
+ OUString cellString;
+ sal_uInt8 nIndex = static_cast<sal_uInt8>(maArray.GetCellIndex(nCol, nRow, mbRTL));
+
+ switch (nIndex)
+ {
+ case 1:
+ cellString = aStrJan;
+ break;
+ case 2:
+ cellString = aStrFeb;
+ break;
+ case 3:
+ cellString = aStrMar;
+ break;
+ case 5:
+ cellString = aStrNorth;
+ break;
+ case 10:
+ cellString = aStrMid;
+ break;
+ case 15:
+ cellString = aStrSouth;
+ break;
+ case 4:
+ case 20:
+ cellString = aStrSum;
+ break;
+ case 6:
+ case 8:
+ case 16:
+ case 18:
+ nVal = nIndex;
+ nNum = 5;
+ goto MAKENUMSTR;
+ case 17:
+ case 7:
+ nVal = nIndex;
+ nNum = 6;
+ goto MAKENUMSTR;
+ case 11:
+ case 12:
+ case 13:
+ nVal = nIndex;
+ nNum = 12 == nIndex ? 10 : 9;
+ goto MAKENUMSTR;
+ case 9:
+ nVal = 21;
+ nNum = 7;
+ goto MAKENUMSTR;
+ case 14:
+ nVal = 36;
+ nNum = 11;
+ goto MAKENUMSTR;
+ case 19:
+ nVal = 51;
+ nNum = 7;
+ goto MAKENUMSTR;
+ case 21:
+ nVal = 33;
+ nNum = 13;
+ goto MAKENUMSTR;
+ case 22:
+ nVal = 36;
+ nNum = 14;
+ goto MAKENUMSTR;
+ case 23:
+ nVal = 39;
+ nNum = 13;
+ goto MAKENUMSTR;
+ case 24:
+ nVal = 108;
+ nNum = 15;
+ goto MAKENUMSTR;
+
+ MAKENUMSTR:
+ if (aCurData.IsValueFormat())
+ {
+ OUString sFormat;
+ LanguageType eLng, eSys;
+ aCurData.GetBoxFormat(sal_uInt8(nNum)).GetValueFormat(sFormat, eLng, eSys);
+
+ SvNumFormatType nType;
+ bool bNew;
+ sal_Int32 nCheckPos;
+ sal_uInt32 nKey = pNumFormat->GetIndexPuttingAndConverting(sFormat, eLng, eSys,
+ nType, bNew, nCheckPos);
+ Color* pDummy;
+ pNumFormat->GetOutputString(nVal, nKey, cellString, &pDummy);
+ }
+ else
+ cellString = OUString::number(sal_Int32(nVal));
+ break;
+ }
+
+ if (cellString.isEmpty())
+ return;
+
+ SvtScriptedTextHelper aScriptedText(rRenderContext);
+ Size aStrSize;
+ sal_uInt8 nFormatIndex = GetFormatIndex(nCol, nRow);
+ const basegfx::B2DRange aCellRange(maArray.GetCellRange(nCol, nRow, true));
+ const tools::Rectangle cellRect(
+ basegfx::fround(aCellRange.getMinX()), basegfx::fround(aCellRange.getMinY()),
+ basegfx::fround(aCellRange.getMaxX()), basegfx::fround(aCellRange.getMaxY()));
+ Point aPos = cellRect.TopLeft();
+ long nRightX = 0;
+
+ Size theMaxStrSize(cellRect.GetWidth() - FRAME_OFFSET, cellRect.GetHeight() - FRAME_OFFSET);
+ if (aCurData.IsFont())
+ {
+ vcl::Font aFont, aCJKFont, aCTLFont;
+ MakeFonts(nFormatIndex, aFont, aCJKFont, aCTLFont);
+ aScriptedText.SetFonts(&aFont, &aCJKFont, &aCTLFont);
+ }
+ else
+ aScriptedText.SetDefaultFont();
+
+ aScriptedText.SetText(cellString, m_xBreak);
+ aStrSize = aScriptedText.GetTextSize();
+
+ if (aCurData.IsFont() && theMaxStrSize.Height() < aStrSize.Height())
+ {
+ // If the string in this font does not
+ // fit into the cell, the standard font
+ // is taken again:
+ aScriptedText.SetDefaultFont();
+ aStrSize = aScriptedText.GetTextSize();
+ }
+
+ while (theMaxStrSize.Width() <= aStrSize.Width() && cellString.getLength() > 1)
+ {
+ cellString = cellString.copy(0, cellString.getLength() - 1);
+ aScriptedText.SetText(cellString, m_xBreak);
+ aStrSize = aScriptedText.GetTextSize();
+ }
+
+ nRightX = cellRect.GetWidth() - aStrSize.Width() - FRAME_OFFSET;
+
+ // vertical (always centering):
+ aPos.AdjustY((nRowHeight - aStrSize.Height()) / 2);
+
+ // horizontal
+ if (mbRTL)
+ aPos.AdjustX(nRightX);
+ else if (aCurData.IsJustify())
+ {
+ const SvxAdjustItem& rAdj = aCurData.GetBoxFormat(nFormatIndex).GetAdjust();
+ switch (rAdj.GetAdjust())
+ {
+ case SvxAdjust::Left:
+ aPos.AdjustX(FRAME_OFFSET);
+ break;
+ case SvxAdjust::Right:
+ aPos.AdjustX(nRightX);
+ break;
+ default:
+ aPos.AdjustX((cellRect.GetWidth() - aStrSize.Width()) / 2);
+ break;
+ }
+ }
+ else
+ {
+ // Standard align:
+ if (nCol == 0 || nIndex == 4)
+ {
+ // Text-Label left or sum left aligned
+ aPos.AdjustX(FRAME_OFFSET);
+ }
+ else
+ {
+ // numbers/dates right aligned
+ aPos.AdjustX(nRightX);
+ }
+ }
+
+ aScriptedText.DrawText(aPos);
+}
+
+#undef FRAME_OFFSET
+
+void AutoFormatPreview::DrawBackground(vcl::RenderContext& rRenderContext)
+{
+ for (size_t nRow = 0; nRow < 5; ++nRow)
+ {
+ for (size_t nCol = 0; nCol < 5; ++nCol)
+ {
+ SvxBrushItem aBrushItem(
+ aCurData.GetBoxFormat(GetFormatIndex(nCol, nRow)).GetBackground());
+
+ rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::FILLCOLOR);
+ rRenderContext.SetLineColor();
+ rRenderContext.SetFillColor(aBrushItem.GetColor());
+ const basegfx::B2DRange aCellRange(maArray.GetCellRange(nCol, nRow, true));
+ rRenderContext.DrawRect(tools::Rectangle(
+ basegfx::fround(aCellRange.getMinX()), basegfx::fround(aCellRange.getMinY()),
+ basegfx::fround(aCellRange.getMaxX()), basegfx::fround(aCellRange.getMaxY())));
+ rRenderContext.Pop();
+ }
+ }
+}
+
+void AutoFormatPreview::PaintCells(vcl::RenderContext& rRenderContext)
+{
+ // 1) background
+ if (aCurData.IsBackground())
+ DrawBackground(rRenderContext);
+
+ // 2) values
+ for (size_t nRow = 0; nRow < 5; ++nRow)
+ for (size_t nCol = 0; nCol < 5; ++nCol)
+ DrawString(rRenderContext, nCol, nRow);
+
+ // 3) border
+ if (aCurData.IsFrame())
+ {
+ const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D;
+ std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor2D(
+ drawinglayer::processor2d::createPixelProcessor2DFromOutputDevice(
+ rRenderContext, aNewViewInformation2D));
+
+ if (pProcessor2D)
+ {
+ pProcessor2D->process(maArray.CreateB2DPrimitiveArray());
+ pProcessor2D.reset();
+ }
+ }
+}
+
+void AutoFormatPreview::Init()
+{
+ SetBorderStyle(GetBorderStyle() | WindowBorderStyle::MONO);
+ maArray.Initialize(5, 5);
+ nLabelColWidth = 0;
+ nDataColWidth1 = 0;
+ nDataColWidth2 = 0;
+ nRowHeight = 0;
+ CalcCellArray(false);
+ CalcLineMap();
+}
+
+void AutoFormatPreview::CalcCellArray(bool _bFitWidth)
+{
+ maArray.SetXOffset(2);
+ maArray.SetAllColWidths(_bFitWidth ? nDataColWidth2 : nDataColWidth1);
+ maArray.SetColWidth(0, nLabelColWidth);
+ maArray.SetColWidth(4, nLabelColWidth);
+
+ maArray.SetYOffset(2);
+ maArray.SetAllRowHeights(nRowHeight);
+
+ aPrvSize.setWidth(maArray.GetWidth() + 4);
+ aPrvSize.setHeight(maArray.GetHeight() + 4);
+}
+
+inline void lclSetStyleFromBorder(svx::frame::Style& rStyle,
+ const ::editeng::SvxBorderLine* pBorder)
+{
+ rStyle.Set(pBorder, 0.05, 5);
+}
+
+void AutoFormatPreview::CalcLineMap()
+{
+ for (size_t nRow = 0; nRow < 5; ++nRow)
+ {
+ for (size_t nCol = 0; nCol < 5; ++nCol)
+ {
+ svx::frame::Style aStyle;
+
+ const SvxBoxItem& rItem = aCurData.GetBoxFormat(GetFormatIndex(nCol, nRow)).GetBox();
+ lclSetStyleFromBorder(aStyle, rItem.GetLeft());
+ maArray.SetCellStyleLeft(nCol, nRow, aStyle);
+ lclSetStyleFromBorder(aStyle, rItem.GetRight());
+ maArray.SetCellStyleRight(nCol, nRow, aStyle);
+ lclSetStyleFromBorder(aStyle, rItem.GetTop());
+ maArray.SetCellStyleTop(nCol, nRow, aStyle);
+ lclSetStyleFromBorder(aStyle, rItem.GetBottom());
+ maArray.SetCellStyleBottom(nCol, nRow, aStyle);
+
+ // FIXME - uncomment to draw diagonal borders
+ // lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
+ // maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
+ // lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
+ // maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
+ }
+ }
+}
+
+void AutoFormatPreview::NotifyChange(const SwTableAutoFormat& rNewData)
+{
+ aCurData = rNewData;
+ bFitWidth = aCurData.IsJustify(); // true; //???
+ CalcCellArray(bFitWidth);
+ CalcLineMap();
+ Invalidate(tools::Rectangle(Point(0, 0), GetSizePixel()));
+}
+
+void AutoFormatPreview::DoPaint(vcl::RenderContext& rRenderContext)
+{
+ DrawModeFlags nOldDrawMode = aVD->GetDrawMode();
+ if (rRenderContext.GetSettings().GetStyleSettings().GetHighContrastMode())
+ aVD->SetDrawMode(DrawModeFlags::SettingsLine | DrawModeFlags::SettingsFill
+ | DrawModeFlags::SettingsText | DrawModeFlags::SettingsGradient);
+
+ Bitmap thePreview;
+ Point aCenterPos;
+ Size theWndSize = GetSizePixel();
+ Color oldColor;
+ vcl::Font aFont;
+
+ aFont = aVD->GetFont();
+ aFont.SetTransparent(true);
+
+ aVD->SetFont(aFont);
+ aVD->SetLineColor();
+ const Color& rWinColor = rRenderContext.GetSettings().GetStyleSettings().GetWindowColor();
+ aVD->SetBackground(Wallpaper(rWinColor));
+ aVD->SetFillColor(rWinColor);
+ aVD->SetOutputSizePixel(aPrvSize);
+
+ // Draw cells on virtual device
+ // and save the result
+ PaintCells(*aVD.get());
+ thePreview = aVD->GetBitmap(Point(0, 0), aPrvSize);
+
+ // Draw the Frame and center the preview:
+ // (virtual Device for window output)
+ aVD->SetOutputSizePixel(theWndSize);
+ oldColor = aVD->GetLineColor();
+ aVD->SetLineColor();
+ aVD->DrawRect(tools::Rectangle(Point(0, 0), theWndSize));
+
+ rRenderContext.SetLineColor(oldColor);
+
+ aCenterPos = Point((theWndSize.Width() - aPrvSize.Width()) / 2,
+ (theWndSize.Height() - aPrvSize.Height()) / 2);
+ aVD->DrawBitmap(aCenterPos, thePreview);
+
+ // Output in the preview window:
+ rRenderContext.DrawBitmap(Point(0, 0), aVD->GetBitmap(Point(0, 0), theWndSize));
+
+ aVD->SetDrawMode(nOldDrawMode);
+}
+
+void AutoFormatPreview::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/)
+{
+ DoPaint(rRenderContext);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/table/instable.cxx b/sw/source/ui/table/instable.cxx
index 90f50d67ace1..1cb841d5ef01 100644
--- a/sw/source/ui/table/instable.cxx
+++ b/sw/source/ui/table/instable.cxx
@@ -17,21 +17,13 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include <vcl/msgbox.hxx>
-
-#include <wrtsh.hxx>
-#include <view.hxx>
-#include <itabenum.hxx>
#include <instable.hxx>
-#include <tblafmt.hxx>
+#include <shellres.hxx>
#include <modcfg.hxx>
#include <swmodule.hxx>
#include <sfx2/htmlmode.hxx>
#include <viewopt.hxx>
-
#include <swabstdlg.hxx>
-#include <swuiexp.hxx>
-#include <memory>
#define ROW_COL_PROD 16384
@@ -44,8 +36,6 @@ void SwInsTableDlg::GetValues( OUString& rName, sal_uInt16& rRow, sal_uInt16& rC
rRow = static_cast<sal_uInt16>(m_pRowNF->GetValue());
rCol = static_cast<sal_uInt16>(m_pColNF->GetValue());
- if (m_pBorderCB->IsChecked())
- nInsMode |= tabopts::DEFAULT_BORDER;
if (m_pHeaderCB->IsChecked())
nInsMode |= tabopts::HEADLINE;
if (m_pRepeatHeaderCB->IsEnabled() && m_pRepeatHeaderCB->IsChecked())
@@ -77,11 +67,11 @@ SwInsTableDlg::SwInsTableDlg( SwView& rView )
get(m_pHeaderCB, "headercb");
get(m_pRepeatHeaderCB, "repeatcb");
get(m_pDontSplitCB, "dontsplitcb");
- get(m_pBorderCB, "bordercb");
- get(m_pAutoFormatBtn, "autoformat");
get(m_pInsertBtn, "ok");
get(m_pRepeatGroup, "repeatgroup");
get(m_pRepeatHeaderNF, "repeatheaderspin");
+ get(m_pLbFormat, "formatlbinstable");
+ get(m_pWndPreview, "previewinstable");
m_pNameEdit->SetText(pShell->GetUniqueTableName());
m_pNameEdit->SetModifyHdl(LINK(this, SwInsTableDlg, ModifyName));
@@ -90,7 +80,6 @@ SwInsTableDlg::SwInsTableDlg( SwView& rView )
m_pRowNF->SetMax(ROW_COL_PROD/m_pColNF->GetValue());
m_pColNF->SetMax(ROW_COL_PROD/m_pRowNF->GetValue());
- m_pAutoFormatBtn->SetClickHdl(LINK(this, SwInsTableDlg, AutoFormatHdl));
m_pInsertBtn->SetClickHdl(LINK(this, SwInsTableDlg, OKHdl));
@@ -103,19 +92,13 @@ SwInsTableDlg::SwInsTableDlg( SwView& rView )
m_pHeaderCB->Check( 0 != (nInsTableFlags & tabopts::HEADLINE) );
m_pRepeatHeaderCB->Check(aInsOpts.mnRowsToRepeat > 0);
if(bHTMLMode)
- {
m_pDontSplitCB->Hide();
- m_pBorderCB->SetPosPixel(m_pDontSplitCB->GetPosPixel());
- }
else
- {
m_pDontSplitCB->Check( 0 == (nInsTableFlags & tabopts::SPLIT_LAYOUT) );
- }
- m_pBorderCB->Check( 0 != (nInsTableFlags & tabopts::DEFAULT_BORDER) );
m_pRepeatHeaderNF->SetModifyHdl( LINK( this, SwInsTableDlg, ModifyRepeatHeaderNF_Hdl ) );
- m_pHeaderCB->SetClickHdl(LINK(this, SwInsTableDlg, CheckBoxHdl));
- m_pRepeatHeaderCB->SetClickHdl(LINK(this, SwInsTableDlg, ReapeatHeaderCheckBoxHdl));
+ m_pHeaderCB->SetClickHdl( LINK( this, SwInsTableDlg, CheckBoxHdl ) );
+ m_pRepeatHeaderCB->SetClickHdl( LINK( this, SwInsTableDlg, ReapeatHeaderCheckBoxHdl ) );
ReapeatHeaderCheckBoxHdl(nullptr);
CheckBoxHdl(nullptr);
@@ -125,11 +108,52 @@ SwInsTableDlg::SwInsTableDlg( SwView& rView )
else
--nMax;
m_pRepeatHeaderNF->SetMax( nMax );
+
+ InitAutoTableFormat();
}
-IMPL_LINK_NOARG(SwInsTableDlg, OKHdl, Button*, void)
+void SwInsTableDlg::InitAutoTableFormat()
{
- EndDialog(RET_OK);
+ m_pWndPreview->DetectRTL(pShell);
+
+ m_pLbFormat->SetSelectHdl( LINK( this, SwInsTableDlg, SelFormatHdl ) );
+
+ pTableTable = new SwTableAutoFormatTable;
+ pTableTable->Load();
+
+ // Add "- none -" style autoformat table.
+ m_pLbFormat->InsertEntry( SwViewShell::GetShellRes()->aStrNone ); // Insert to listbox
+
+ // Add other styles of autoformat tables.
+ for (sal_uInt8 i = 0, nCount = static_cast<sal_uInt8>(pTableTable->size());
+ i < nCount; i++)
+ {
+ SwTableAutoFormat const& rFormat = (*pTableTable)[ i ];
+ m_pLbFormat->InsertEntry(rFormat.GetName());
+ if (pTAutoFormat && rFormat.GetName() == pTAutoFormat->GetName())
+ lbIndex = i;
+ }
+
+ // Change this min variable if you add autotable manually.
+ minTableIndexInLb = 1;
+ maxTableIndexInLb = minTableIndexInLb + static_cast<sal_uInt8>(pTableTable->size());
+ lbIndex = 1;
+ m_pLbFormat->SelectEntryPos( lbIndex );
+ tbIndex = lbIndexToTableIndex(lbIndex);
+
+ SelFormatHdl( *m_pLbFormat );
+}
+
+sal_uInt8 SwInsTableDlg::lbIndexToTableIndex( const sal_uInt8 listboxIndex )
+{
+ if( minTableIndexInLb != maxTableIndexInLb &&
+ minTableIndexInLb <= listboxIndex &&
+ listboxIndex < maxTableIndexInLb )
+ {
+ return listboxIndex - minTableIndexInLb;
+ }
+
+ return 255;
}
SwInsTableDlg::~SwInsTableDlg()
@@ -140,6 +164,7 @@ SwInsTableDlg::~SwInsTableDlg()
void SwInsTableDlg::dispose()
{
delete pTAutoFormat;
+ m_pLbFormat.clear();
m_pNameEdit.clear();
m_pColNF.clear();
m_pRowNF.clear();
@@ -148,12 +173,65 @@ void SwInsTableDlg::dispose()
m_pRepeatHeaderNF.clear();
m_pRepeatGroup.clear();
m_pDontSplitCB.clear();
- m_pBorderCB.clear();
m_pInsertBtn.clear();
- m_pAutoFormatBtn.clear();
+ m_pWndPreview.clear();
+ pTableTable->Save();
+ delete pTableTable;
SfxModalDialog::dispose();
}
+static void lcl_SetProperties( SwTableAutoFormat* pTableAutoFormat, bool bVal )
+{
+ pTableAutoFormat->SetFont( bVal );
+ pTableAutoFormat->SetJustify( bVal );
+ pTableAutoFormat->SetFrame( bVal );
+ pTableAutoFormat->SetBackground( bVal );
+ pTableAutoFormat->SetValueFormat( bVal );
+ pTableAutoFormat->SetWidthHeight( bVal );
+}
+
+
+IMPL_LINK_NOARG(SwInsTableDlg, SelFormatHdl, ListBox&, void)
+{
+ // Get index of selected item from the listbox
+ lbIndex = static_cast<sal_uInt8>(m_pLbFormat->GetSelectedEntryPos());
+ tbIndex = lbIndexToTableIndex( lbIndex );
+
+ // To understand this index maping, look InitAutoTableFormat function to
+ // see how listbox item is implemented.
+ if( tbIndex < 255 )
+ m_pWndPreview->NotifyChange( (*pTableTable)[tbIndex] );
+ else
+ {
+ SwTableAutoFormat aTmp( SwViewShell::GetShellRes()->aStrNone );
+ lcl_SetProperties( &aTmp, false );
+
+ m_pWndPreview->NotifyChange( aTmp );
+ }
+}
+
+IMPL_LINK_NOARG(SwInsTableDlg, OKHdl, Button*, void)
+{
+ if( tbIndex < 255 )
+ pShell->SetTableStyle((*pTableTable)[tbIndex]);
+
+ if( tbIndex < 255 )
+ {
+ if( pTAutoFormat )
+ *pTAutoFormat = (*pTableTable)[ tbIndex ];
+ else
+ pTAutoFormat = new SwTableAutoFormat( (*pTableTable)[ tbIndex ] );
+ }
+ else
+ {
+ delete pTAutoFormat;
+ pTAutoFormat = new SwTableAutoFormat( SwViewShell::GetShellRes()->aStrNone );
+ lcl_SetProperties( pTAutoFormat, false );
+ }
+
+ EndDialog(RET_OK);
+}
+
IMPL_LINK( SwInsTableDlg, ModifyName, Edit&, rEdit, void )
{
OUString sTableName = rEdit.GetText();
@@ -194,16 +272,6 @@ IMPL_LINK( SwInsTableDlg, ModifyRowCol, Edit&, rEdit, void )
m_pRepeatHeaderNF->SetValue( std::min( nEnteredValRepeatHeaderNF, nMax ) );
}
}
-IMPL_LINK( SwInsTableDlg, AutoFormatHdl, Button*, pButton, void )
-{
- SwAbstractDialogFactory* pFact = swui::GetFactory();
- OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
-
- ScopedVclPtr<AbstractSwAutoFormatDlg> pDlg(pFact->CreateSwAutoFormatDlg(pButton,pShell, false, pTAutoFormat));
- OSL_ENSURE(pDlg, "Dialog creation failed!");
- if( RET_OK == pDlg->Execute())
- pDlg->FillAutoFormatOfIndex( pTAutoFormat );
-}
IMPL_LINK_NOARG(SwInsTableDlg, CheckBoxHdl, Button*, void)
{
diff --git a/sw/source/ui/table/tautofmt.cxx b/sw/source/ui/table/tautofmt.cxx
index 75edc414fe14..f930e53799f1 100644
--- a/sw/source/ui/table/tautofmt.cxx
+++ b/sw/source/ui/table/tautofmt.cxx
@@ -18,85 +18,11 @@
*/
#include <memory>
-#include <vcl/edit.hxx>
-#include <vcl/layout.hxx>
-#include <vcl/svapp.hxx>
-#include <vcl/settings.hxx>
-#include <vcl/builderfactory.hxx>
#include <vcl/weld.hxx>
-#include <svl/zforlist.hxx>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/i18n/BreakIterator.hpp>
-#include <comphelper/processfactory.hxx>
-#include <svtools/scriptedtext.hxx>
-#include <svtools/accessibilityoptions.hxx>
-#include <svx/framelinkarray.hxx>
-#include <drawinglayer/processor2d/processor2dtools.hxx>
-
-#include <app.hrc>
#include <strings.hrc>
-#include <swmodule.hxx>
-#include <swtypes.hxx>
#include <view.hxx>
-#include <wrtsh.hxx>
-#include <tblafmt.hxx>
-#include <tautofmt.hxx>
#include <shellres.hxx>
-
-using namespace com::sun::star;
-
-#define FRAME_OFFSET 4
-
-class AutoFormatPreview : public vcl::Window
-{
-public:
- AutoFormatPreview(vcl::Window* pParent, WinBits nStyle);
- virtual ~AutoFormatPreview() override;
- virtual void dispose() override;
-
- void NotifyChange( const SwTableAutoFormat& rNewData );
-
- void DetectRTL(SwWrtShell const * pWrtShell);
-
- virtual void Resize() override;
-protected:
- virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
-
-private:
- SwTableAutoFormat aCurData;
- ScopedVclPtr<VirtualDevice> aVD;
- svx::frame::Array maArray; /// Implementation to draw the frame borders.
- bool bFitWidth;
- bool mbRTL;
- Size aPrvSize;
- long nLabelColWidth;
- long nDataColWidth1;
- long nDataColWidth2;
- long nRowHeight;
- const OUString aStrJan;
- const OUString aStrFeb;
- const OUString aStrMar;
- const OUString aStrNorth;
- const OUString aStrMid;
- const OUString aStrSouth;
- const OUString aStrSum;
- SvNumberFormatter* pNumFormat;
-
- uno::Reference<i18n::XBreakIterator> m_xBreak;
-
- void Init();
- void DoPaint(vcl::RenderContext& rRenderContext);
- void CalcCellArray(bool bFitWidth);
- void CalcLineMap();
- void PaintCells(vcl::RenderContext& rRenderContext);
-
- sal_uInt8 GetFormatIndex( size_t nCol, size_t nRow ) const;
-
- void DrawString(vcl::RenderContext& rRenderContext, size_t nCol, size_t nRow);
- void DrawBackground(vcl::RenderContext& rRenderContext);
-
- void MakeFonts(sal_uInt8 nIndex, vcl::Font& rFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont);
-};
+#include <tautofmt.hxx>
class SwStringInputDlg : public ModalDialog
{
@@ -511,460 +437,4 @@ IMPL_LINK_NOARG(SwAutoFormatDlg, OkHdl, Button*, void)
EndDialog( RET_OK );
}
-AutoFormatPreview::AutoFormatPreview(vcl::Window* pParent, WinBits nStyle) :
- Window ( pParent, nStyle ),
- aCurData ( OUString() ),
- aVD ( VclPtr<VirtualDevice>::Create(*this) ),
- bFitWidth ( false ),
- mbRTL ( false ),
- aStrJan ( SwResId( STR_JAN ) ),
- aStrFeb ( SwResId( STR_FEB ) ),
- aStrMar ( SwResId( STR_MAR ) ),
- aStrNorth ( SwResId( STR_NORTH ) ),
- aStrMid ( SwResId( STR_MID ) ),
- aStrSouth ( SwResId( STR_SOUTH ) ),
- aStrSum ( SwResId( STR_SUM ) )
-{
- uno::Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext();
- m_xBreak = i18n::BreakIterator::create(xContext);
- pNumFormat = new SvNumberFormatter( xContext, LANGUAGE_SYSTEM );
-
- Init();
-}
-
-VCL_BUILDER_FACTORY_CONSTRUCTOR(AutoFormatPreview, 0)
-
-void AutoFormatPreview::Resize()
-{
- aPrvSize = Size(GetSizePixel().Width() - 6, GetSizePixel().Height() - 30);
- nLabelColWidth = (aPrvSize.Width() - 4) / 4 - 12;
- nDataColWidth1 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 3;
- nDataColWidth2 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 4;
- nRowHeight = (aPrvSize.Height() - 4) / 5;
- NotifyChange(aCurData);
-}
-
-void AutoFormatPreview::DetectRTL(SwWrtShell const * pWrtShell)
-{
- if (!pWrtShell->IsCursorInTable()) // We haven't created the table yet
- mbRTL = AllSettings::GetLayoutRTL();
- else
- mbRTL = pWrtShell->IsTableRightToLeft();
-}
-
-AutoFormatPreview::~AutoFormatPreview()
-{
- disposeOnce();
-}
-
-void AutoFormatPreview::dispose()
-{
- delete pNumFormat;
- vcl::Window::dispose();
-}
-
-static void lcl_SetFontProperties(
- vcl::Font& rFont,
- const SvxFontItem& rFontItem,
- const SvxWeightItem& rWeightItem,
- const SvxPostureItem& rPostureItem )
-{
- rFont.SetFamily ( rFontItem.GetFamily() );
- rFont.SetFamilyName ( rFontItem.GetFamilyName() );
- rFont.SetStyleName ( rFontItem.GetStyleName() );
- rFont.SetCharSet ( rFontItem.GetCharSet() );
- rFont.SetPitch ( rFontItem.GetPitch() );
- rFont.SetWeight ( rWeightItem.GetValue() );
- rFont.SetItalic ( rPostureItem.GetValue() );
-}
-
-#define SETONALLFONTS( MethodName, Value ) \
-rFont.MethodName( Value ); \
-rCJKFont.MethodName( Value ); \
-rCTLFont.MethodName( Value );
-
-void AutoFormatPreview::MakeFonts( sal_uInt8 nIndex, vcl::Font& rFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont )
-{
- const SwBoxAutoFormat& rBoxFormat = aCurData.GetBoxFormat( nIndex );
-
- rFont = rCJKFont = rCTLFont = GetFont();
- Size aFontSize( rFont.GetFontSize().Width(), 10 * GetDPIScaleFactor() );
-
- lcl_SetFontProperties( rFont, rBoxFormat.GetFont(), rBoxFormat.GetWeight(), rBoxFormat.GetPosture() );
- lcl_SetFontProperties( rCJKFont, rBoxFormat.GetCJKFont(), rBoxFormat.GetCJKWeight(), rBoxFormat.GetCJKPosture() );
- lcl_SetFontProperties( rCTLFont, rBoxFormat.GetCTLFont(), rBoxFormat.GetCTLWeight(), rBoxFormat.GetCTLPosture() );
-
- SETONALLFONTS( SetUnderline, rBoxFormat.GetUnderline().GetValue() );
- SETONALLFONTS( SetOverline, rBoxFormat.GetOverline().GetValue() );
- SETONALLFONTS( SetStrikeout, rBoxFormat.GetCrossedOut().GetValue() );
- SETONALLFONTS( SetOutline, rBoxFormat.GetContour().GetValue() );
- SETONALLFONTS( SetShadow, rBoxFormat.GetShadowed().GetValue() );
- SETONALLFONTS( SetColor, rBoxFormat.GetColor().GetValue() );
- SETONALLFONTS( SetFontSize, aFontSize );
- SETONALLFONTS( SetTransparent, true );
-}
-
-sal_uInt8 AutoFormatPreview::GetFormatIndex( size_t nCol, size_t nRow ) const
-{
- static const sal_uInt8 pnFormatMap[] =
- {
- 0, 1, 2, 1, 3,
- 4, 5, 6, 5, 7,
- 8, 9, 10, 9, 11,
- 4, 5, 6, 5, 7,
- 12, 13, 14, 13, 15
- };
- return pnFormatMap[ maArray.GetCellIndex( nCol, nRow, mbRTL ) ];
-}
-
-void AutoFormatPreview::DrawString(vcl::RenderContext& rRenderContext, size_t nCol, size_t nRow)
-{
- // Output of the cell text:
- sal_uLong nNum;
- double nVal;
- OUString cellString;
- sal_uInt8 nIndex = static_cast<sal_uInt8>(maArray.GetCellIndex(nCol, nRow, mbRTL));
-
- switch(nIndex)
- {
- case 1:
- cellString = aStrJan;
- break;
- case 2:
- cellString = aStrFeb;
- break;
- case 3:
- cellString = aStrMar;
- break;
- case 5:
- cellString = aStrNorth;
- break;
- case 10:
- cellString = aStrMid;
- break;
- case 15:
- cellString = aStrSouth;
- break;
- case 4:
- case 20:
- cellString = aStrSum;
- break;
- case 6:
- case 8:
- case 16:
- case 18:
- nVal = nIndex;
- nNum = 5;
- goto MAKENUMSTR;
- case 17:
- case 7:
- nVal = nIndex;
- nNum = 6;
- goto MAKENUMSTR;
- case 11:
- case 12:
- case 13:
- nVal = nIndex;
- nNum = 12 == nIndex ? 10 : 9;
- goto MAKENUMSTR;
- case 9:
- nVal = 21; nNum = 7;
- goto MAKENUMSTR;
- case 14:
- nVal = 36; nNum = 11;
- goto MAKENUMSTR;
- case 19:
- nVal = 51; nNum = 7;
- goto MAKENUMSTR;
- case 21:
- nVal = 33; nNum = 13;
- goto MAKENUMSTR;
- case 22:
- nVal = 36; nNum = 14;
- goto MAKENUMSTR;
- case 23:
- nVal = 39; nNum = 13;
- goto MAKENUMSTR;
- case 24:
- nVal = 108; nNum = 15;
- goto MAKENUMSTR;
-
-MAKENUMSTR:
- if (aCurData.IsValueFormat())
- {
- OUString sFormat;
- LanguageType eLng, eSys;
- aCurData.GetBoxFormat(sal_uInt8(nNum)).GetValueFormat(sFormat, eLng, eSys);
-
- SvNumFormatType nType;
- bool bNew;
- sal_Int32 nCheckPos;
- sal_uInt32 nKey = pNumFormat->GetIndexPuttingAndConverting(sFormat, eLng,
- eSys, nType, bNew, nCheckPos);
- Color* pDummy;
- pNumFormat->GetOutputString(nVal, nKey, cellString, &pDummy);
- }
- else
- cellString = OUString::number(sal_Int32(nVal));
- break;
-
- }
-
- if (cellString.isEmpty())
- return;
-
- SvtScriptedTextHelper aScriptedText(rRenderContext);
- Size aStrSize;
- sal_uInt8 nFormatIndex = GetFormatIndex( nCol, nRow );
- const basegfx::B2DRange aCellRange(maArray.GetCellRange( nCol, nRow, true ));
- const tools::Rectangle cellRect(
- basegfx::fround(aCellRange.getMinX()), basegfx::fround(aCellRange.getMinY()),
- basegfx::fround(aCellRange.getMaxX()), basegfx::fround(aCellRange.getMaxY()));
- Point aPos = cellRect.TopLeft();
- long nRightX = 0;
-
- Size theMaxStrSize(cellRect.GetWidth() - FRAME_OFFSET,
- cellRect.GetHeight() - FRAME_OFFSET);
- if (aCurData.IsFont())
- {
- vcl::Font aFont, aCJKFont, aCTLFont;
- MakeFonts(nFormatIndex, aFont, aCJKFont, aCTLFont);
- aScriptedText.SetFonts(&aFont, &aCJKFont, &aCTLFont);
- }
- else
- aScriptedText.SetDefaultFont();
-
- aScriptedText.SetText(cellString, m_xBreak);
- aStrSize = aScriptedText.GetTextSize();
-
- if (aCurData.IsFont() &&
- theMaxStrSize.Height() < aStrSize.Height())
- {
- // If the string in this font does not
- // fit into the cell, the standard font
- // is taken again:
- aScriptedText.SetDefaultFont();
- aStrSize = aScriptedText.GetTextSize();
- }
-
- while (theMaxStrSize.Width() <= aStrSize.Width() &&
- cellString.getLength() > 1)
- {
- cellString = cellString.copy(0, cellString.getLength() - 1);
- aScriptedText.SetText(cellString, m_xBreak);
- aStrSize = aScriptedText.GetTextSize();
- }
-
- nRightX = cellRect.GetWidth() - aStrSize.Width() - FRAME_OFFSET;
-
- // vertical (always centering):
- aPos.AdjustY((nRowHeight - aStrSize.Height()) / 2 );
-
- // horizontal
- if (mbRTL)
- aPos.AdjustX(nRightX );
- else if (aCurData.IsJustify())
- {
- const SvxAdjustItem& rAdj = aCurData.GetBoxFormat(nFormatIndex).GetAdjust();
- switch (rAdj.GetAdjust())
- {
- case SvxAdjust::Left:
- aPos.AdjustX(FRAME_OFFSET );
- break;
- case SvxAdjust::Right:
- aPos.AdjustX(nRightX );
- break;
- default:
- aPos.AdjustX((cellRect.GetWidth() - aStrSize.Width()) / 2 );
- break;
- }
- }
- else
- {
- // Standard align:
- if (nCol == 0 || nIndex == 4)
- {
- // Text-Label left or sum left aligned
- aPos.AdjustX(FRAME_OFFSET );
- }
- else
- {
- // numbers/dates right aligned
- aPos.AdjustX(nRightX );
- }
- }
-
- aScriptedText.DrawText(aPos);
-
-}
-
-#undef FRAME_OFFSET
-
-void AutoFormatPreview::DrawBackground(vcl::RenderContext& rRenderContext)
-{
- for (size_t nRow = 0; nRow < 5; ++nRow)
- {
- for (size_t nCol = 0; nCol < 5; ++nCol)
- {
- SvxBrushItem aBrushItem(aCurData.GetBoxFormat(GetFormatIndex(nCol, nRow)).GetBackground());
-
- rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::FILLCOLOR);
- rRenderContext.SetLineColor();
- rRenderContext.SetFillColor(aBrushItem.GetColor());
- const basegfx::B2DRange aCellRange(maArray.GetCellRange( nCol, nRow, true ));
- rRenderContext.DrawRect(
- tools::Rectangle(
- basegfx::fround(aCellRange.getMinX()), basegfx::fround(aCellRange.getMinY()),
- basegfx::fround(aCellRange.getMaxX()), basegfx::fround(aCellRange.getMaxY())));
- rRenderContext.Pop();
- }
- }
-}
-
-void AutoFormatPreview::PaintCells(vcl::RenderContext& rRenderContext)
-{
- // 1) background
- if (aCurData.IsBackground())
- DrawBackground(rRenderContext);
-
- // 2) values
- for (size_t nRow = 0; nRow < 5; ++nRow)
- for (size_t nCol = 0; nCol < 5; ++nCol)
- DrawString(rRenderContext, nCol, nRow);
-
- // 3) border
- if (aCurData.IsFrame())
- {
- const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D;
- std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor2D(
- drawinglayer::processor2d::createPixelProcessor2DFromOutputDevice(
- rRenderContext,
- aNewViewInformation2D));
-
- if (pProcessor2D)
- {
- pProcessor2D->process(maArray.CreateB2DPrimitiveArray());
- pProcessor2D.reset();
- }
- }
-}
-
-void AutoFormatPreview::Init()
-{
- SetBorderStyle( GetBorderStyle() | WindowBorderStyle::MONO );
- maArray.Initialize( 5, 5 );
- nLabelColWidth = 0;
- nDataColWidth1 = 0;
- nDataColWidth2 = 0;
- nRowHeight = 0;
- CalcCellArray( false );
- CalcLineMap();
-}
-
-void AutoFormatPreview::CalcCellArray( bool _bFitWidth )
-{
- maArray.SetXOffset( 2 );
- maArray.SetAllColWidths( _bFitWidth ? nDataColWidth2 : nDataColWidth1 );
- maArray.SetColWidth( 0, nLabelColWidth );
- maArray.SetColWidth( 4, nLabelColWidth );
-
- maArray.SetYOffset( 2 );
- maArray.SetAllRowHeights( nRowHeight );
-
- aPrvSize.setWidth( maArray.GetWidth() + 4 );
- aPrvSize.setHeight( maArray.GetHeight() + 4 );
-}
-
-inline void lclSetStyleFromBorder( svx::frame::Style& rStyle, const ::editeng::SvxBorderLine* pBorder )
-{
- rStyle.Set( pBorder, 0.05, 5 );
-}
-
-void AutoFormatPreview::CalcLineMap()
-{
- for( size_t nRow = 0; nRow < 5; ++nRow )
- {
- for( size_t nCol = 0; nCol < 5; ++nCol )
- {
- svx::frame::Style aStyle;
-
- const SvxBoxItem& rItem = aCurData.GetBoxFormat( GetFormatIndex( nCol, nRow ) ).GetBox();
- lclSetStyleFromBorder( aStyle, rItem.GetLeft() );
- maArray.SetCellStyleLeft( nCol, nRow, aStyle );
- lclSetStyleFromBorder( aStyle, rItem.GetRight() );
- maArray.SetCellStyleRight( nCol, nRow, aStyle );
- lclSetStyleFromBorder( aStyle, rItem.GetTop() );
- maArray.SetCellStyleTop( nCol, nRow, aStyle );
- lclSetStyleFromBorder( aStyle, rItem.GetBottom() );
- maArray.SetCellStyleBottom( nCol, nRow, aStyle );
-
-// FIXME - uncomment to draw diagonal borders
-// lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
-// maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
-// lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
-// maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
- }
- }
-}
-
-void AutoFormatPreview::NotifyChange( const SwTableAutoFormat& rNewData )
-{
- aCurData = rNewData;
- bFitWidth = aCurData.IsJustify(); // true; //???
- CalcCellArray( bFitWidth );
- CalcLineMap();
- Invalidate(tools::Rectangle(Point(0,0), GetSizePixel()));
-}
-
-void AutoFormatPreview::DoPaint(vcl::RenderContext& rRenderContext)
-{
- DrawModeFlags nOldDrawMode = aVD->GetDrawMode();
- if (rRenderContext.GetSettings().GetStyleSettings().GetHighContrastMode())
- aVD->SetDrawMode(DrawModeFlags::SettingsLine | DrawModeFlags::SettingsFill | DrawModeFlags::SettingsText | DrawModeFlags::SettingsGradient);
-
- Bitmap thePreview;
- Point aCenterPos;
- Size theWndSize = GetSizePixel();
- Color oldColor;
- vcl::Font aFont;
-
- aFont = aVD->GetFont();
- aFont.SetTransparent( true );
-
- aVD->SetFont(aFont);
- aVD->SetLineColor();
- const Color& rWinColor = rRenderContext.GetSettings().GetStyleSettings().GetWindowColor();
- aVD->SetBackground(Wallpaper(rWinColor));
- aVD->SetFillColor(rWinColor);
- aVD->SetOutputSizePixel(aPrvSize);
-
- // Draw cells on virtual device
- // and save the result
- PaintCells(*aVD.get());
- thePreview = aVD->GetBitmap(Point(0,0), aPrvSize);
-
- // Draw the Frame and center the preview:
- // (virtual Device for window output)
- aVD->SetOutputSizePixel(theWndSize);
- oldColor = aVD->GetLineColor();
- aVD->SetLineColor();
- aVD->DrawRect(tools::Rectangle(Point(0,0), theWndSize));
-
- rRenderContext.SetLineColor(oldColor);
-
- aCenterPos = Point((theWndSize.Width() - aPrvSize.Width()) / 2,
- (theWndSize.Height() - aPrvSize.Height()) / 2);
- aVD->DrawBitmap(aCenterPos, thePreview);
-
- // Output in the preview window:
- rRenderContext.DrawBitmap(Point(0, 0), aVD->GetBitmap(Point(0,0), theWndSize));
-
- aVD->SetDrawMode(nOldDrawMode);
-}
-
-void AutoFormatPreview::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/ )
-{
- DoPaint(rRenderContext);
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/inc/autoformatpreview.hxx b/sw/source/uibase/inc/autoformatpreview.hxx
new file mode 100644
index 000000000000..30be17fc218d
--- /dev/null
+++ b/sw/source/uibase/inc/autoformatpreview.hxx
@@ -0,0 +1,91 @@
+/* -*- 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 .
+ */
+#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_AUTOFORMATPREVIEW_HXX
+#define INCLUDED_SW_SOURCE_UIBASE_INC_AUTOFORMATPREVIEW_HXX
+
+#include <com/sun/star/i18n/XBreakIterator.hpp>
+#include <sal/types.h>
+#include <svx/framelinkarray.hxx>
+#include <svl/zforlist.hxx>
+#include <tools/gen.hxx>
+#include <tools/link.hxx>
+#include <rtl/ustring.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/font.hxx>
+
+#include "wrtsh.hxx"
+#include <tblafmt.hxx>
+
+class AutoFormatPreview : public vcl::Window
+{
+public:
+ AutoFormatPreview(vcl::Window* pParent, WinBits nStyle);
+ virtual ~AutoFormatPreview() override;
+ virtual void dispose() override;
+
+ void NotifyChange(const SwTableAutoFormat& rNewData);
+
+ void DetectRTL(SwWrtShell const* pWrtShell);
+
+ virtual void Resize() override;
+
+protected:
+ virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
+
+private:
+ SwTableAutoFormat aCurData;
+ ScopedVclPtr<VirtualDevice> aVD;
+ svx::frame::Array maArray; /// Implementation to draw the frame borders.
+ bool bFitWidth;
+ bool mbRTL;
+ Size aPrvSize;
+ long nLabelColWidth;
+ long nDataColWidth1;
+ long nDataColWidth2;
+ long nRowHeight;
+ const OUString aStrJan;
+ const OUString aStrFeb;
+ const OUString aStrMar;
+ const OUString aStrNorth;
+ const OUString aStrMid;
+ const OUString aStrSouth;
+ const OUString aStrSum;
+ SvNumberFormatter* pNumFormat;
+
+ uno::Reference<i18n::XBreakIterator> m_xBreak;
+
+ void Init();
+ void DoPaint(vcl::RenderContext& rRenderContext);
+ void CalcCellArray(bool bFitWidth);
+ void CalcLineMap();
+ void PaintCells(vcl::RenderContext& rRenderContext);
+
+ sal_uInt8 GetFormatIndex(size_t nCol, size_t nRow) const;
+
+ void DrawString(vcl::RenderContext& rRenderContext, size_t nCol, size_t nRow);
+ void DrawBackground(vcl::RenderContext& rRenderContext);
+
+ void MakeFonts(sal_uInt8 nIndex, vcl::Font& rFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont);
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/inc/instable.hxx b/sw/source/uibase/inc/instable.hxx
index 9992a16ba9eb..dfc82f034c9e 100644
--- a/sw/source/uibase/inc/instable.hxx
+++ b/sw/source/uibase/inc/instable.hxx
@@ -19,48 +19,64 @@
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_INSTABLE_HXX
#define INCLUDED_SW_SOURCE_UIBASE_INC_INSTABLE_HXX
+#include <sfx2/basedlgs.hxx>
+#include <sal/types.h>
#include <rtl/ustring.hxx>
+#include <tools/link.hxx>
+#include <vcl/vclreferencebase.hxx>
#include <vcl/button.hxx>
-#include <vcl/field.hxx>
#include <vcl/edit.hxx>
+#include <vcl/field.hxx>
#include <vcl/layout.hxx>
-#include <sfx2/basedlgs.hxx>
-#include "actctrl.hxx"
-class SwWrtShell;
-class SwTableAutoFormat;
-class SwView;
-struct SwInsertTableOptions;
+#include "wrtsh.hxx"
+#include "autoformatpreview.hxx"
+#include <view.hxx>
+#include <tblafmt.hxx>
+#include <itabenum.hxx>
class SwInsTableDlg : public SfxModalDialog
{
- VclPtr<Edit> m_pNameEdit;
TextFilter m_aTextFilter;
+ VclPtr<Edit> m_pNameEdit;
- VclPtr<NumericField> m_pColNF;
- VclPtr<NumericField> m_pRowNF;
+ VclPtr<NumericField> m_pColNF;
+ VclPtr<NumericField> m_pRowNF;
- VclPtr<CheckBox> m_pHeaderCB;
- VclPtr<CheckBox> m_pRepeatHeaderCB;
- VclPtr<NumericField> m_pRepeatHeaderNF;
- VclPtr<VclContainer> m_pRepeatGroup;
+ VclPtr<CheckBox> m_pHeaderCB;
+ VclPtr<CheckBox> m_pRepeatHeaderCB;
+ VclPtr<NumericField> m_pRepeatHeaderNF;
+ VclPtr<VclContainer> m_pRepeatGroup;
- VclPtr<CheckBox> m_pDontSplitCB;
- VclPtr<CheckBox> m_pBorderCB;
+ VclPtr<CheckBox> m_pDontSplitCB;
- VclPtr<PushButton> m_pInsertBtn;
- VclPtr<PushButton> m_pAutoFormatBtn;
+ VclPtr<PushButton> m_pInsertBtn;
+
+ VclPtr<ListBox> m_pLbFormat;
+
+ VclPtr<AutoFormatPreview> m_pWndPreview;
SwWrtShell* pShell;
- SwTableAutoFormat* pTAutoFormat;
+ SwTableAutoFormatTable* pTableTable;
+ SwTableAutoFormat* pTAutoFormat;
+
+ sal_uInt8 lbIndex;
+ sal_uInt8 tbIndex;
+ sal_uInt8 minTableIndexInLb;
+ sal_uInt8 maxTableIndexInLb;
sal_Int64 nEnteredValRepeatHeaderNF;
+ // Returns 255 if mapping is not possible.
+ // This means there cannot be more than 255 autotable style.
+ sal_uInt8 lbIndexToTableIndex( const sal_uInt8 listboxIndex );
+ void InitAutoTableFormat();
+
+ DECL_LINK( SelFormatHdl, ListBox&, void );
DECL_LINK( ModifyName, Edit&, void );
DECL_LINK( ModifyRowCol, Edit&, void );
- DECL_LINK( AutoFormatHdl, Button*, void );
- DECL_LINK( OKHdl, Button*, void);
- DECL_LINK( CheckBoxHdl, Button*, void);
- DECL_LINK( ReapeatHeaderCheckBoxHdl, Button*, void);
+ DECL_LINK( OKHdl, Button*, void );
+ DECL_LINK( CheckBoxHdl, Button*, void );
+ DECL_LINK( ReapeatHeaderCheckBoxHdl, Button*, void );
DECL_LINK( ModifyRepeatHeaderNF_Hdl, Edit&, void );
public:
diff --git a/sw/source/uibase/inc/tautofmt.hxx b/sw/source/uibase/inc/tautofmt.hxx
index 169b741a150a..cd294065b377 100644
--- a/sw/source/uibase/inc/tautofmt.hxx
+++ b/sw/source/uibase/inc/tautofmt.hxx
@@ -18,20 +18,21 @@
*/
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_TAUTOFMT_HXX
#define INCLUDED_SW_SOURCE_UIBASE_INC_TAUTOFMT_HXX
-#include <sfx2/basedlgs.hxx>
-
-#include <vcl/fixed.hxx>
-
-#include <vcl/lstbox.hxx>
+#include <tools/link.hxx>
+#include <sfx2/basedlgs.hxx>
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <vcl/vclreferencebase.hxx>
#include <vcl/button.hxx>
+#include <vcl/layout.hxx>
+#include <vcl/window.hxx>
-#include <vcl/morebtn.hxx>
-
-#include <vcl/virdev.hxx>
+#include "wrtsh.hxx"
+#include "autoformatpreview.hxx"
+#include <tblafmt.hxx>
class SwTableAutoFormat;
-class AutoFormatPreview;
class SwTableAutoFormatTable;
class SwWrtShell;
@@ -61,7 +62,7 @@ class SwAutoFormatDlg : public SfxModalDialog
VclPtr<AutoFormatPreview> m_pWndPreview;
SwWrtShell* pShell;
- SwTableAutoFormatTable* pTableTable;
+ SwTableAutoFormatTable* pTableTable;
sal_uInt8 nIndex;
sal_uInt8 nDfltStylePos;
bool bCoreDataChanged : 1;
diff --git a/sw/uiconfig/swriter/ui/inserttable.ui b/sw/uiconfig/swriter/ui/inserttable.ui
index 4adfcf48c16e..deb2ddd8936c 100644
--- a/sw/uiconfig/swriter/ui/inserttable.ui
+++ b/sw/uiconfig/swriter/ui/inserttable.ui
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.18.3 -->
<interface domain="sw">
<requires lib="gtk+" version="3.0"/>
<object class="GtkAdjustment" id="adjustment1">
@@ -48,7 +48,7 @@
<property name="receives_default">True</property>
</object>
<packing>
- <property name="expand">False</property>
+ <property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
@@ -278,22 +278,6 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="bordercb">
- <property name="label" translatable="yes" context="inserttable|bordercb">_Border</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="xalign">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">4</property>
- </packing>
- </child>
- <child>
<object class="GtkCheckButton" id="dontsplitcb">
<property name="label" translatable="yes" context="inserttable|dontsplitcb">Don’t _split table over pages</property>
<property name="visible">True</property>
@@ -351,19 +335,52 @@
</packing>
</child>
<child>
- <object class="GtkButton" id="autoformat">
- <property name="label" translatable="yes" context="inserttable|autoformat">Auto_Format</property>
+ <object class="GtkGrid" id="grid1">
+ <property name="width_request">400</property>
+ <property name="height_request">200</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="halign">end</property>
- <property name="hexpand">True</property>
- <property name="use_underline">True</property>
- <property name="image_position">right</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="swuilo-AutoFormatPreview" id="previewinstable">
+ <property name="width_request">200</property>
+ <property name="height_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindowinstable">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="formatlbinstable:border">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeviewinstable-selection1"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">5</property>
+ <property name="top_attach">4</property>
</packing>
</child>
</object>