summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2016-07-21 16:12:47 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2016-08-18 02:39:12 +0200
commitdc1e30095fa02fa4116fa96783bd4d51fe912473 (patch)
tree8383d5253dda2c340b4de2ebf90969f907bf54e3
parentd098f0c957824bd5dec89a799398d587ce9fb96f (diff)
screenshots: fallback screenshot to ui files
Besides the already existing methods to dump adapted dialogs and create and dump fallback dialogs I added a possibility to process a given input file which may contain a list of UXMLDescription files (*.ui files), one per line. This file is processed (empty lines and comment lines using '#' allowed) and for each descriptor first tries to find a known, adapted dialog. If found it gets used, else fallback is tried. Added ui-definition files for sd and sc which contain all ui-files from these dialogs. Adapted the test base class to hold the needed functionality. Change-Id: I1d4c64af8cd5d9c89a53b193951c3e49669f5852
-rw-r--r--include/test/screenshot_test.hxx38
-rw-r--r--sc/qa/unit/screenshots/data/screenshots.txt154
-rw-r--r--sc/qa/unit/screenshots/screenshots.cxx211
-rw-r--r--sd/qa/unit/data/dialogs-test.txt66
-rw-r--r--sd/qa/unit/dialogs-test.cxx123
-rw-r--r--sd/source/ui/dlg/headerfooterdlg.cxx41
-rw-r--r--test/source/screenshot_test.cxx28
7 files changed, 500 insertions, 161 deletions
diff --git a/include/test/screenshot_test.hxx b/include/test/screenshot_test.hxx
index a3b0b0e6eee7..443db3102bd5 100644
--- a/include/test/screenshot_test.hxx
+++ b/include/test/screenshot_test.hxx
@@ -16,18 +16,46 @@
#include <com/sun/star/lang/XComponent.hpp>
#include <osl/file.hxx>
#include <vcl/dialog.hxx>
+#include <map>
class VclAbstractDialog;
-
+typedef std::map< OString, sal_uInt32 > mapType;
class OOO_DLLPUBLIC_TEST ScreenshotTest : public test::BootstrapFixture, public unotest::MacrosTest
{
+private:
+ /// the target directory for screenshots
+ OUString m_aScreenshotDirectory;
+
+ /// the set of known dialogs and their ID for usage in createDialogByID
+ mapType maKnownDialogs;
+
+private:
+ /// helpers
+ void implSaveScreenshot(const Bitmap& rScreenshot, const OString& rScreenshotId);
+ void saveScreenshot(VclAbstractDialog& rDialog);
+ void saveScreenshot(Dialog& rDialog);
+
+ /// helper method to populate maKnownDialogs, called in setUp(). Needs to be
+ /// written and has to add entries to maKnownDialogs
+ virtual void registerKnownDialogsByID(mapType& rKnownDialogs) = 0;
+
+ /// dialog creation for known dialogs by ID. Has to be implemented for
+ /// each registered known dialog
+ virtual VclAbstractDialog* createDialogByID(sal_uInt32 nID) = 0;
+
public:
ScreenshotTest();
+ virtual ~ScreenshotTest();
virtual void setUp() override;
virtual void tearDown() override;
+ /// Dialog creation for known dialogs by Name (path and UIXMLDescription, *.ui file).
+ /// This uses maKnownDialogs to check if known, and if so, calls createDialogByID
+ /// with the ID from the map
+ VclAbstractDialog* createDialogByName(const OString& rName);
+
/// version for AbstractDialogs, the ones created in AbstractDialogFactories
void dumpDialogToPath(VclAbstractDialog& rDialog);
@@ -40,12 +68,8 @@ public:
/// compared to the active dialog (can be compared with dialog previewer)
void dumpDialogToPath(const OString& rUIXMLDescription);
-private:
- void implSaveScreenshot(const Bitmap& rScreenshot, const OString& rScreenshotId);
- void saveScreenshot(VclAbstractDialog& rDialog);
- void saveScreenshot(Dialog& rDialog);
-
- OUString m_aScreenshotDirectory;
+ /// const access to known dialogs
+ const mapType& getKnownDialogs() const { return maKnownDialogs; }
};
#endif // INCLUDED_TEST_SCREENSHOT_TEST_HXX
diff --git a/sc/qa/unit/screenshots/data/screenshots.txt b/sc/qa/unit/screenshots/data/screenshots.txt
new file mode 100644
index 000000000000..1fa34d7952d1
--- /dev/null
+++ b/sc/qa/unit/screenshots/data/screenshots.txt
@@ -0,0 +1,154 @@
+# -*- 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 contains all dialogs that the test dialogs-test
+# will test. It will read one-by-one, try to open it and create a
+# screenshot that will be saved in workdir/screenshots using the
+# pattern of the ui-file name.
+#
+# You may use empty lines, or lines starrting with '#' which are treated
+# as comments. All other lines have to end with <CR> and will be interpreted
+# as ui-files.
+
+#
+# The known dialogs which have a hard-coded representation
+#
+
+modules/scalc/ui/insertsheet.ui
+modules/scalc/ui/deletecells.ui
+modules/scalc/ui/pastespecial.ui
+modules/scalc/ui/changesourcedialog.ui
+modules/scalc/ui/selectdatasource.ui
+modules/scalc/ui/selectsource.ui
+modules/scalc/ui/deletecontents.ui
+modules/scalc/ui/createnamesdialog.ui
+modules/scalc/ui/inputstringdialog.ui
+modules/scalc/ui/tabcolordialog.ui
+modules/scalc/ui/textimportoptions.ui
+modules/scalc/ui/dataform.ui
+modules/scalc/ui/movecopysheet.ui
+modules/scalc/ui/textimportcsv.ui
+modules/scalc/ui/formatcellsdialog.ui
+
+#
+# Dialogs without a hard-coded representation. These will
+# be visualized using a fallback based on VclBuilder
+#
+
+modules/scalc/ui/autoformattable.ui
+modules/scalc/ui/sortwarning.ui
+modules/scalc/ui/condformatmanager.ui
+modules/scalc/ui/pagetemplatedialog.ui
+modules/scalc/ui/paratemplatedialog.ui
+modules/scalc/ui/databaroptions.ui
+modules/scalc/ui/advancedfilterdialog.ui
+modules/scalc/ui/datafielddialog.ui
+modules/scalc/ui/pivotfielddialog.ui
+modules/scalc/ui/datafieldoptionsdialog.ui
+modules/scalc/ui/showdetaildialog.ui
+modules/scalc/ui/consolidatedialog.ui
+modules/scalc/ui/dapiservicedialog.ui
+modules/scalc/ui/imoptdialog.ui
+modules/scalc/ui/pivotfilterdialog.ui
+modules/scalc/ui/groupbynumber.ui
+modules/scalc/ui/groupbydate.ui
+modules/scalc/ui/sortdialog.ui
+modules/scalc/ui/standardfilterdialog.ui
+modules/scalc/ui/pivottablelayoutdialog.ui
+modules/scalc/ui/validationdialog.ui
+modules/scalc/ui/subtotaldialog.ui
+modules/scalc/ui/scenariodialog.ui
+modules/scalc/ui/searchresults.ui
+modules/scalc/ui/definename.ui
+modules/scalc/ui/insertname.ui
+modules/scalc/ui/tpviewpage.ui
+modules/scalc/ui/scgeneralpage.ui
+modules/scalc/ui/optformula.ui
+modules/scalc/ui/formulacalculationoptions.ui
+modules/scalc/ui/optdlg.ui
+modules/scalc/ui/optcompatibilitypage.ui
+modules/scalc/ui/optchangespage.ui
+modules/scalc/ui/optdefaultpage.ui
+modules/scalc/ui/optsortlists.ui
+modules/scalc/ui/optcalculatepage.ui
+modules/scalc/ui/movingaveragedialog.ui
+modules/scalc/ui/analysisofvariancedialog.ui
+modules/scalc/ui/covariancedialog.ui
+modules/scalc/ui/correlationdialog.ui
+modules/scalc/ui/ttestdialog.ui
+modules/scalc/ui/ztestdialog.ui
+modules/scalc/ui/chisquaretestdialog.ui
+modules/scalc/ui/regressiondialog.ui
+modules/scalc/ui/exponentialsmoothingdialog.ui
+modules/scalc/ui/descriptivestatisticsdialog.ui
+modules/scalc/ui/samplingdialog.ui
+modules/scalc/ui/goalseekdlg.ui
+modules/scalc/ui/selectrange.ui
+modules/scalc/ui/protectsheetdlg.ui
+modules/scalc/ui/namerangesdialog.ui
+modules/scalc/ui/sharedocumentdlg.ui
+modules/scalc/ui/solverdlg.ui
+modules/scalc/ui/solveroptionsdialog.ui
+modules/scalc/ui/externaldata.ui
+modules/scalc/ui/datastreams.ui
+modules/scalc/ui/statisticsinfopage.ui
+modules/scalc/ui/cellprotectionpage.ui
+modules/scalc/ui/printareasdialog.ui
+modules/scalc/ui/headerfooterdialog.ui
+modules/scalc/ui/conditionalformatdialog.ui
+modules/scalc/ui/definedatabaserangedialog.ui
+modules/scalc/ui/sortkey.ui
+modules/scalc/ui/sortcriteriapage.ui
+modules/scalc/ui/sortoptionspage.ui
+modules/scalc/ui/subtotalgrppage.ui
+modules/scalc/ui/subtotaloptionspage.ui
+modules/scalc/ui/validationcriteriapage.ui
+modules/scalc/ui/validationhelptabpage.ui
+modules/scalc/ui/erroralerttabpage.ui
+modules/scalc/ui/conflictsdialog.ui
+modules/scalc/ui/colorrowdialog.ui
+modules/scalc/ui/filldlg.ui
+modules/scalc/ui/ungroupdialog.ui
+modules/scalc/ui/groupdialog.ui
+modules/scalc/ui/showchangesdialog.ui
+modules/scalc/ui/insertcells.ui
+modules/scalc/ui/RowHeightDialog.ui
+modules/scalc/ui/OptimalRowHeightDialog.ui
+modules/scalc/ui/ColWidthDialog.ui
+modules/scalc/ui/OptimalColWidthDialog.ui
+modules/scalc/ui/solverprogressdialog.ui
+modules/scalc/ui/nosolutiondialog.ui
+modules/scalc/ui/solversuccessdialog.ui
+modules/scalc/ui/retypepassdialog.ui
+modules/scalc/ui/retypepassworddialog.ui
+modules/scalc/ui/showsheetdialog.ui
+modules/scalc/ui/simplerefdialog.ui
+modules/scalc/ui/integerdialog.ui
+modules/scalc/ui/doubledialog.ui
+modules/scalc/ui/multipleoperationsdialog.ui
+modules/scalc/ui/chardialog.ui
+modules/scalc/ui/paradialog.ui
+modules/scalc/ui/managenamesdialog.ui
+modules/scalc/ui/headerdialog.ui
+modules/scalc/ui/footerdialog.ui
+modules/scalc/ui/leftheaderdialog.ui
+modules/scalc/ui/rightheaderdialog.ui
+modules/scalc/ui/leftfooterdialog.ui
+modules/scalc/ui/rightfooterdialog.ui
+modules/scalc/ui/sharedheaderdialog.ui
+modules/scalc/ui/sharedfooterdialog.ui
+modules/scalc/ui/allheaderfooterdialog.ui
+modules/scalc/ui/headerfootercontent.ui
+modules/scalc/ui/sheetprintpage.ui
+modules/scalc/ui/sidebaralignment.ui
+modules/scalc/ui/sidebarcellappearance.ui
+modules/scalc/ui/sidebarnumberformat.ui
+modules/scalc/ui/randomnumbergenerator.ui
+modules/scalc/ui/printeroptions.ui
+modules/scalc/ui/xmlsourcedialog.ui
diff --git a/sc/qa/unit/screenshots/screenshots.cxx b/sc/qa/unit/screenshots/screenshots.cxx
index 556db725314e..927ec010af04 100644
--- a/sc/qa/unit/screenshots/screenshots.cxx
+++ b/sc/qa/unit/screenshots/screenshots.cxx
@@ -40,17 +40,36 @@
#include <sc.hrc>
#include <scresid.hxx>
#include <scitems.hxx>
-#include <map>
using namespace css;
-typedef std::map< OString, sal_uInt32 > mapType;
-
static const char* DATA_DIRECTORY = "/sc/qa/unit/screenshots/data/";
class ScScreenshotTest : public ScreenshotTest
{
+private:
+ /// members
+ uno::Reference<lang::XComponent> mxComponent;
+ SfxObjectShell* mpFoundShell;
+ ScDocShellRef mxDocSh;
+ ScTabViewShell* mpViewShell;
+ ScAbstractDialogFactory* mpFact;
+ std::unique_ptr<ScImportStringStream> mpStream;
+ std::unique_ptr<SfxItemSet> mpItemSet;
+
+ /// helper
+ void initializeWithDoc(const char* pName);
+
+ /// helper method to populate KnownDialogs, called in setUp(). Needs to be
+ /// written and has to add entries to KnownDialogs
+ virtual void registerKnownDialogsByID(mapType& rKnownDialogs) override;
+
+ /// dialog creation for known dialogs by ID. Has to be implemented for
+ /// each registered known dialog
+ virtual VclAbstractDialog* createDialogByID(sal_uInt32 nID) override;
+
public:
ScScreenshotTest();
+ virtual ~ScScreenshotTest();
void testOpeningModalDialogs();
//void testOpeningModelessDialogs();
@@ -59,34 +78,20 @@ public:
CPPUNIT_TEST(testOpeningModalDialogs);
//CPPUNIT_TEST(testOpeningModelessDialogs);
CPPUNIT_TEST_SUITE_END();
-
-private:
- void initializeWithDoc(const char* pName);
-
- VclAbstractDialog* createDialogByID( sal_uInt32 nID);
-
-
- uno::Reference<lang::XComponent> mxComponent;
- SfxObjectShell* pFoundShell;
- ScDocShellRef xDocSh;
- ScTabViewShell* pViewShell;
- ScAbstractDialogFactory* pFact;
-
- std::unique_ptr<ScImportStringStream> pStream;
- std::unique_ptr<SfxItemSet> pItemSet;
-
- /// the set of known dialogs and their ID for usage in createDialogByID
- mapType maKnownDialogs;
};
ScScreenshotTest::ScScreenshotTest()
: mxComponent(),
- pFoundShell(nullptr),
- xDocSh(),
- pViewShell(nullptr),
- pFact(nullptr),
- pStream(),
- maKnownDialogs()
+ mpFoundShell(nullptr),
+ mxDocSh(),
+ mpViewShell(nullptr),
+ mpFact(nullptr),
+ mpStream(),
+ mpItemSet()
+{
+}
+
+ScScreenshotTest::~ScScreenshotTest()
{
}
@@ -96,45 +101,43 @@ void ScScreenshotTest::initializeWithDoc(const char* pName)
mxComponent->dispose();
mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.sheet.SpreadsheetDocument");
- pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent);
- CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell);
+ mpFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent);
+ CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", mpFoundShell);
- xDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
- CPPUNIT_ASSERT(xDocSh != nullptr);
+ mxDocSh = dynamic_cast<ScDocShell*>(mpFoundShell);
+ CPPUNIT_ASSERT(mxDocSh != nullptr);
- pViewShell = xDocSh->GetBestViewShell(false);
- CPPUNIT_ASSERT(pViewShell != nullptr);
+ mpViewShell = mxDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT(mpViewShell != nullptr);
- pFact = ScAbstractDialogFactory::Create();
- CPPUNIT_ASSERT_MESSAGE("Failed to create dialog factory", pFact);
+ mpFact = ScAbstractDialogFactory::Create();
+ CPPUNIT_ASSERT_MESSAGE("Failed to create dialog factory", mpFact);
const OUString aCsv("some, strings, here, separated, by, commas");
- pStream.reset(new ScImportStringStream(aCsv));
+ mpStream.reset(new ScImportStringStream(aCsv));
+}
- if (maKnownDialogs.empty())
- {
- // fill map of unknown dilogs. Use a set here to allow later
- // to 'find' a ID for construction based on the UIXMLDescription
- // string (currently not yet used)
- maKnownDialogs["modules/scalc/ui/insertsheet.ui"] = 0;
- maKnownDialogs["modules/scalc/ui/deletecells.ui"] = 1;
- maKnownDialogs["modules/scalc/ui/pastespecial.ui"] = 2;
- maKnownDialogs["modules/scalc/ui/changesourcedialog.ui"] = 3;
- maKnownDialogs["modules/scalc/ui/selectdatasource.ui"] = 4;
- maKnownDialogs["modules/scalc/ui/selectsource.ui"] = 5;
- maKnownDialogs["modules/scalc/ui/deletecontents.ui"] = 6;
- maKnownDialogs["modules/scalc/ui/createnamesdialog.ui"] = 7;
- maKnownDialogs["modules/scalc/ui/inputstringdialog.ui"] = 8;
- maKnownDialogs["modules/scalc/ui/tabcolordialog.ui"] = 9;
- maKnownDialogs["modules/scalc/ui/textimportoptions.ui"] = 10;
- maKnownDialogs["modules/scalc/ui/dataform.ui"] = 11;
- maKnownDialogs["modules/scalc/ui/movecopysheet.ui"] = 12;
- maKnownDialogs["modules/scalc/ui/textimportcsv.ui"] = 13;
- maKnownDialogs["modules/scalc/ui/formatcellsdialog.ui"] = 14;
- }
+void ScScreenshotTest::registerKnownDialogsByID(mapType& rKnownDialogs)
+{
+ // fill map of unknown dilogs
+ rKnownDialogs["modules/scalc/ui/insertsheet.ui"] = 0;
+ rKnownDialogs["modules/scalc/ui/deletecells.ui"] = 1;
+ rKnownDialogs["modules/scalc/ui/pastespecial.ui"] = 2;
+ rKnownDialogs["modules/scalc/ui/changesourcedialog.ui"] = 3;
+ rKnownDialogs["modules/scalc/ui/selectdatasource.ui"] = 4;
+ rKnownDialogs["modules/scalc/ui/selectsource.ui"] = 5;
+ rKnownDialogs["modules/scalc/ui/deletecontents.ui"] = 6;
+ rKnownDialogs["modules/scalc/ui/createnamesdialog.ui"] = 7;
+ rKnownDialogs["modules/scalc/ui/inputstringdialog.ui"] = 8;
+ rKnownDialogs["modules/scalc/ui/tabcolordialog.ui"] = 9;
+ rKnownDialogs["modules/scalc/ui/textimportoptions.ui"] = 10;
+ rKnownDialogs["modules/scalc/ui/dataform.ui"] = 11;
+ rKnownDialogs["modules/scalc/ui/movecopysheet.ui"] = 12;
+ rKnownDialogs["modules/scalc/ui/textimportcsv.ui"] = 13;
+ rKnownDialogs["modules/scalc/ui/formatcellsdialog.ui"] = 14;
}
-VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
+VclAbstractDialog* ScScreenshotTest::createDialogByID(sal_uInt32 nID)
{
VclAbstractDialog *pReturnDialog = nullptr;
////FIXME: translatable string here
@@ -144,47 +147,47 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
{
case 0: // "modules/scalc/ui/insertsheet.ui"
{
- ScViewData& rViewData = pViewShell->GetViewData();
+ ScViewData& rViewData = mpViewShell->GetViewData();
SCTAB nTabSelCount = rViewData.GetMarkData().GetSelectCount();
- pReturnDialog = pFact->CreateScInsertTableDlg(
- pViewShell->GetDialogParent(), rViewData, nTabSelCount, false);
+ pReturnDialog = mpFact->CreateScInsertTableDlg(
+ mpViewShell->GetDialogParent(), rViewData, nTabSelCount, false);
break;
}
case 1: // "modules/scalc/ui/deletecells.ui"
{
- pReturnDialog = pFact->CreateScDeleteCellDlg( pViewShell->GetDialogParent(), false );
+ pReturnDialog = mpFact->CreateScDeleteCellDlg(mpViewShell->GetDialogParent(), false);
break;
}
case 2: // "modules/scalc/ui/pastespecial.ui"
{
- pReturnDialog = pFact->CreateScInsertContentsDlg( pViewShell->GetDialogParent() );
+ pReturnDialog = mpFact->CreateScInsertContentsDlg(mpViewShell->GetDialogParent());
break;
}
case 3: // "modules/scalc/ui/changesourcedialog.ui"
{
- pReturnDialog = pFact->CreateScColRowLabelDlg( pViewShell->GetDialogParent(), true, false );
+ pReturnDialog = mpFact->CreateScColRowLabelDlg(mpViewShell->GetDialogParent(), true, false);
break;
}
case 4: // "modules/scalc/ui/selectdatasource.ui"
{
- pReturnDialog = pFact->CreateScDataPilotDatabaseDlg( pViewShell->GetDialogParent() );
+ pReturnDialog = mpFact->CreateScDataPilotDatabaseDlg(mpViewShell->GetDialogParent());
break;
}
case 5: // "modules/scalc/ui/selectsource.ui"
{
- pReturnDialog = pFact->CreateScDataPilotSourceTypeDlg(pViewShell->GetDialogParent(), true );
+ pReturnDialog = mpFact->CreateScDataPilotSourceTypeDlg(mpViewShell->GetDialogParent(), true);
break;
}
case 6: // "modules/scalc/ui/deletecontents.ui"
{
- pReturnDialog = pFact->CreateScDeleteContentsDlg( pViewShell->GetDialogParent() );
+ pReturnDialog = mpFact->CreateScDeleteContentsDlg(mpViewShell->GetDialogParent());
break;
}
@@ -192,14 +195,14 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
{
//// just fake some flags
sal_uInt16 nFlags = NAME_LEFT | NAME_TOP;
- pReturnDialog = pFact->CreateScNameCreateDlg( pViewShell->GetDialogParent(), nFlags );
+ pReturnDialog = mpFact->CreateScNameCreateDlg(mpViewShell->GetDialogParent(), nFlags);
break;
}
case 8: // "modules/scalc/ui/inputstringdialog.ui"
{
const OString aEmpty("");
- pReturnDialog = pFact->CreateScStringInputDlg( pViewShell->GetDialogParent(),
+ pReturnDialog = mpFact->CreateScStringInputDlg(mpViewShell->GetDialogParent(),
OUString(ScResId(SCSTR_APDTABLE)), OUString(ScResId(SCSTR_NAME)),
aDefaultSheetName, aEmpty, aEmpty );
break;
@@ -207,7 +210,7 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
case 9: // "modules/scalc/ui/tabcolordialog.ui"
{
- pReturnDialog = pFact->CreateScTabBgColorDlg( pViewShell->GetDialogParent(),
+ pReturnDialog = mpFact->CreateScTabBgColorDlg(mpViewShell->GetDialogParent(),
OUString(ScResId(SCSTR_SET_TAB_BG_COLOR)),
OUString(ScResId(SCSTR_NO_TAB_BG_COLOR)), Color(0xff00ff) );
break;
@@ -215,7 +218,7 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
case 10: // "modules/scalc/ui/textimportoptions.ui"
{
- pReturnDialog = pFact->CreateScTextImportOptionsDlg();
+ pReturnDialog = mpFact->CreateScTextImportOptionsDlg();
break;
}
@@ -223,43 +226,43 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID )
{
////FIXME: looks butt-ugly w/ empty file, move it elsewhere, where
////we actually have some data
- pReturnDialog = pFact->CreateScDataFormDlg( pViewShell->GetDialogParent(), pViewShell );
+ pReturnDialog = mpFact->CreateScDataFormDlg(mpViewShell->GetDialogParent(), mpViewShell);
break;
}
case 12: // "modules/scalc/ui/movecopysheet.ui"
{
- pReturnDialog = pFact->CreateScMoveTableDlg( pViewShell->GetDialogParent(), aDefaultSheetName );
+ pReturnDialog = mpFact->CreateScMoveTableDlg(mpViewShell->GetDialogParent(), aDefaultSheetName);
break;
}
case 13: // "modules/scalc/ui/textimportcsv.ui"
{
- pReturnDialog = pFact->CreateScImportAsciiDlg( OUString(), pStream.get(), SC_PASTETEXT );
+ pReturnDialog = mpFact->CreateScImportAsciiDlg(OUString(), mpStream.get(), SC_PASTETEXT);
break;
}
case 14: // "modules/scalc/ui/formatcellsdialog.ui"
{
- ScViewData& rViewData = pViewShell->GetViewData();
+ ScViewData& rViewData = mpViewShell->GetViewData();
ScDocument *pDoc = rViewData.GetDocument();
- const ScPatternAttr *pAttr = pViewShell->GetSelectionPattern();
+ const ScPatternAttr *pAttr = mpViewShell->GetSelectionPattern();
std::unique_ptr<SvxNumberInfoItem> pNumberInfoItem;
- pItemSet.reset( new SfxItemSet( pAttr->GetItemSet() ) );
- pItemSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT,
+ mpItemSet.reset(new SfxItemSet(pAttr->GetItemSet()));
+ mpItemSet->Put(SfxUInt32Item(ATTR_VALUE_FORMAT,
pAttr->GetNumberFormat( pDoc->GetFormatTable() ) ) );
- pNumberInfoItem.reset( pViewShell->MakeNumberInfoItem(pDoc, &rViewData) );
+ pNumberInfoItem.reset(mpViewShell->MakeNumberInfoItem(pDoc, &rViewData));
- pItemSet->MergeRange( SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO );
- pItemSet->Put(*pNumberInfoItem );
+ mpItemSet->MergeRange(SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO);
+ mpItemSet->Put(*pNumberInfoItem);
- pReturnDialog = pFact->CreateScAttrDlg( pViewShell->GetDialogParent(), pItemSet.get() );
+ pReturnDialog = mpFact->CreateScAttrDlg(mpViewShell->GetDialogParent(), mpItemSet.get());
break;
}
- //ScopedVclPtrInstance<ScShareDocumentDlg> pDlg14( pViewShell->GetDialogParent(), &rViewData );
- //ScopedVclPtrInstance<ScTableProtectionDlg> pDlg16(pViewShell->GetDialogParent());
+ //ScopedVclPtrInstance<ScShareDocumentDlg> pDlg14( mpViewShell->GetDialogParent(), &rViewData );
+ //ScopedVclPtrInstance<ScTableProtectionDlg> pDlg16(mpViewShell->GetDialogParent());
default:
break;
}
@@ -272,11 +275,45 @@ void ScScreenshotTest::testOpeningModalDialogs()
{
initializeWithDoc("empty.ods");
- static bool bDumpAllKnownDialogs = true;
+ /// example how to process an input file containing the UXMLDescriptions of the dialogs
+ /// to dump
+ if (true)
+ {
+ test::Directories aDirectories;
+ OUString aURL = aDirectories.getURLFromSrc("sc/qa/unit/screenshots/data/screenshots.txt");
+ SvFileStream aStream(aURL, StreamMode::READ);
+ OString aNextUIFile;
+ OString aComment("#");
+
+ while (aStream.ReadLine(aNextUIFile))
+ {
+ if (!aNextUIFile.isEmpty() && !aNextUIFile.startsWith(aComment))
+ {
+ // first check if it's a known dialog
+ std::unique_ptr<VclAbstractDialog> pDlg(createDialogByName(aNextUIFile));
+
+ if (pDlg)
+ {
+ // known dialog, dump screenshot to path
+ dumpDialogToPath(*pDlg);
+ }
+ else
+ {
+ // unknown dialog, try fallback to generic created
+ // VclBuilder-generated instance. Keep in mind that Dialogs
+ // using this mechanism will probably not be layouted well
+ // since the setup/initialization part is missing. Thus,
+ // only use for fallback when only the UI file is available.
+ dumpDialogToPath(aNextUIFile);
+ }
+ }
+ }
+ }
- if (bDumpAllKnownDialogs)
+ /// example how to dump all known dialogs
+ if (false)
{
- for (mapType::const_iterator i = maKnownDialogs.begin(); i != maKnownDialogs.end(); i++)
+ for (mapType::const_iterator i = getKnownDialogs().begin(); i != getKnownDialogs().end(); i++)
{
std::unique_ptr<VclAbstractDialog> pDlg(createDialogByID((*i).second));
diff --git a/sd/qa/unit/data/dialogs-test.txt b/sd/qa/unit/data/dialogs-test.txt
new file mode 100644
index 000000000000..2b7ad1acf71f
--- /dev/null
+++ b/sd/qa/unit/data/dialogs-test.txt
@@ -0,0 +1,66 @@
+# -*- 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 contains all dialogs that the test dialogs-test
+# will test. It will read one-by-one, try to open it and create a
+# screenshot that will be saved in workdir/screenshots using the
+# pattern of the ui-file name.
+#
+# You may use empty lines, or lines starrting with '#' which are treated
+# as comments. All other lines have to end with <CR> and will be interpreted
+# as ui-files.
+
+#
+# The known dialogs which have a hard-coded representation
+#
+
+modules/simpress/ui/publishingdialog.ui
+modules/sdraw/ui/breakdialog.ui
+modules/sdraw/ui/copydlg.ui
+modules/simpress/ui/customslideshows.ui
+modules/sdraw/ui/drawchardialog.ui
+modules/sdraw/ui/drawpagedialog.ui
+modules/simpress/ui/dlgfield.ui
+modules/sdraw/ui/dlgsnap.ui
+modules/sdraw/ui/insertlayer.ui
+modules/sdraw/ui/insertslidesdialog.ui
+modules/sdraw/ui/crossfadedialog.ui
+modules/sdraw/ui/bulletsandnumbering.ui
+modules/sdraw/ui/drawparadialog.ui
+modules/simpress/ui/presentationdialog.ui
+modules/simpress/ui/remotedialog.ui
+modules/simpress/ui/templatedialog.ui
+modules/simpress/ui/slidedesigndialog.ui
+modules/sdraw/ui/drawprtldialog.ui
+modules/simpress/ui/interactiondialog.ui
+modules/sdraw/ui/vectorize.ui
+modules/simpress/ui/photoalbum.ui
+modules/simpress/ui/masterlayoutdlg.ui
+modules/simpress/ui/headerfooterdialog.ui
+
+#
+# Dialogs without a hard-coded representation. These will
+# be visualized using a fallback based on VclBuilder
+#
+
+modules/simpress/ui/headerfootertab.ui
+modules/simpress/ui/customanimationproperties.ui
+modules/simpress/ui/customanimationeffecttab.ui
+modules/simpress/ui/customanimationtimingtab.ui
+modules/simpress/ui/customanimationtexttab.ui
+modules/sdraw/ui/paranumberingtab.ui
+modules/simpress/ui/sdviewpage.ui
+modules/simpress/ui/prntopts.ui
+modules/simpress/ui/optimpressgeneralpage.ui
+modules/simpress/ui/interactionpage.ui
+modules/simpress/ui/assistentdialog.ui
+modules/sdraw/ui/namedesign.ui
+modules/simpress/ui/definecustomslideshow.ui
+modules/simpress/ui/insertslides.ui
+modules/sdraw/ui/tabledesigndialog.ui
diff --git a/sd/qa/unit/dialogs-test.cxx b/sd/qa/unit/dialogs-test.cxx
index 893fd438badf..368a96a54203 100644
--- a/sd/qa/unit/dialogs-test.cxx
+++ b/sd/qa/unit/dialogs-test.cxx
@@ -54,10 +54,8 @@
#include <com/sun/star/frame/XDesktop2.hpp>
#include <comphelper/processfactory.hxx>
#include <unotest/macros_test.hxx>
-#include <map>
using namespace ::com::sun::star;
-typedef std::map< OString, sal_uInt32 > mapType;
/// Test opening a dialog in sd
class SdDialogsTest : public ScreenshotTest
@@ -79,9 +77,6 @@ private:
std::unique_ptr<SfxItemSet> mpEmptySfxItemSet;
std::unique_ptr<SfxItemSet> mpEmptyFillStyleSfxItemSet;
- /// the set of known dialogs and their ID for usage in createDialogByID
- mapType maKnownDialogs;
-
/// helpers
SdAbstractDialogFactory* getSdAbstractDialogFactory();
SdXImpressDocument* getSdXImpressDocument();
@@ -92,12 +87,17 @@ private:
const SfxItemSet& getEmptySfxItemSet();
const SfxItemSet& getEmptyFillStyleSfxItemSet();
- /// central method: dialog creation and dumping to target directory (path)
- VclAbstractDialog* createDialogByID(sal_uInt32 nID);
+ /// helper method to populate KnownDialogs, called in setUp(). Needs to be
+ /// written and has to add entries to KnownDialogs
+ virtual void registerKnownDialogsByID(mapType& rKnownDialogs) override;
+
+ /// dialog creation for known dialogs by ID. Has to be implemented for
+ /// each registered known dialog
+ virtual VclAbstractDialog* createDialogByID(sal_uInt32 nID) override;
public:
SdDialogsTest();
- ~SdDialogsTest();
+ virtual ~SdDialogsTest();
virtual void setUp() override;
@@ -118,8 +118,7 @@ SdDialogsTest::SdDialogsTest()
mpDrawView(nullptr),
mpSfxItemSetFromSdrObject(nullptr),
mpEmptySfxItemSet(nullptr),
- mpEmptyFillStyleSfxItemSet(nullptr),
- maKnownDialogs()
+ mpEmptyFillStyleSfxItemSet(nullptr)
{
}
@@ -137,38 +136,9 @@ void SdDialogsTest::setUp()
mpImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
CPPUNIT_ASSERT(mpImpressDocument);
-
- if (maKnownDialogs.empty())
- {
- // fill map of unknown dilogs. Use a set here to allow later
- // to 'find' a ID for construction based on the UIXMLDescription
- // string (currently not yet used)
- maKnownDialogs["modules/simpress/ui/publishingdialog.ui"] = 0;
- maKnownDialogs["modules/sdraw/ui/breakdialog.ui"] = 1;
- maKnownDialogs["modules/sdraw/ui/copydlg.ui"] = 2;
- maKnownDialogs["modules/simpress/ui/customslideshows.ui"] = 3;
- maKnownDialogs["modules/sdraw/ui/drawchardialog.ui"] = 4;
- maKnownDialogs["modules/sdraw/ui/drawpagedialog.ui"] = 5;
- maKnownDialogs["modules/simpress/ui/dlgfield.ui"] = 6;
- maKnownDialogs["modules/sdraw/ui/dlgsnap.ui"] = 7;
- maKnownDialogs["modules/sdraw/ui/insertlayer.ui"] = 8;
- maKnownDialogs["modules/sdraw/ui/insertslidesdialog.ui"] = 9;
- maKnownDialogs["modules/sdraw/ui/crossfadedialog.ui"] = 10;
- maKnownDialogs["modules/sdraw/ui/bulletsandnumbering.ui"] = 11;
- maKnownDialogs["modules/sdraw/ui/drawparadialog.ui"] = 12;
- maKnownDialogs["modules/simpress/ui/presentationdialog.ui"] = 13;
- maKnownDialogs["modules/simpress/ui/remotedialog.ui"] = 14;
- maKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 15;
- maKnownDialogs["modules/simpress/ui/slidedesigndialog.ui"] = 16;
- maKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 17;
- maKnownDialogs["modules/simpress/ui/interactiondialog.ui"] = 18;
- maKnownDialogs["modules/sdraw/ui/vectorize.ui"] = 19;
- maKnownDialogs["modules/simpress/ui/photoalbum.ui"] = 20;
- maKnownDialogs["modules/simpress/ui/masterlayoutdlg.ui"] = 21;
- maKnownDialogs["modules/simpress/ui/headerfooterdialog.ui"] = 22;
- }
}
+
SdAbstractDialogFactory* SdDialogsTest::getSdAbstractDialogFactory()
{
return mpFact;
@@ -257,6 +227,34 @@ const SfxItemSet& SdDialogsTest::getEmptyFillStyleSfxItemSet()
return *mpEmptyFillStyleSfxItemSet;
}
+void SdDialogsTest::registerKnownDialogsByID(mapType& rKnownDialogs)
+{
+ // fill map of known dilogs
+ rKnownDialogs["modules/simpress/ui/publishingdialog.ui"] = 0;
+ rKnownDialogs["modules/sdraw/ui/breakdialog.ui"] = 1;
+ rKnownDialogs["modules/sdraw/ui/copydlg.ui"] = 2;
+ rKnownDialogs["modules/simpress/ui/customslideshows.ui"] = 3;
+ rKnownDialogs["modules/sdraw/ui/drawchardialog.ui"] = 4;
+ rKnownDialogs["modules/sdraw/ui/drawpagedialog.ui"] = 5;
+ rKnownDialogs["modules/simpress/ui/dlgfield.ui"] = 6;
+ rKnownDialogs["modules/sdraw/ui/dlgsnap.ui"] = 7;
+ rKnownDialogs["modules/sdraw/ui/insertlayer.ui"] = 8;
+ rKnownDialogs["modules/sdraw/ui/insertslidesdialog.ui"] = 9;
+ rKnownDialogs["modules/sdraw/ui/crossfadedialog.ui"] = 10;
+ rKnownDialogs["modules/sdraw/ui/bulletsandnumbering.ui"] = 11;
+ rKnownDialogs["modules/sdraw/ui/drawparadialog.ui"] = 12;
+ rKnownDialogs["modules/simpress/ui/presentationdialog.ui"] = 13;
+ rKnownDialogs["modules/simpress/ui/remotedialog.ui"] = 14;
+ rKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 15;
+ rKnownDialogs["modules/simpress/ui/slidedesigndialog.ui"] = 16;
+ rKnownDialogs["modules/simpress/ui/templatedialog.ui"] = 17;
+ rKnownDialogs["modules/simpress/ui/interactiondialog.ui"] = 18;
+ rKnownDialogs["modules/sdraw/ui/vectorize.ui"] = 19;
+ rKnownDialogs["modules/simpress/ui/photoalbum.ui"] = 20;
+ rKnownDialogs["modules/simpress/ui/masterlayoutdlg.ui"] = 21;
+ rKnownDialogs["modules/simpress/ui/headerfooterdialog.ui"] = 22;
+}
+
VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID)
{
VclAbstractDialog* pRetval = 0;
@@ -606,14 +604,48 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID)
void SdDialogsTest::openAnyDialog()
{
- static bool bDumpAllKnownDialogs = true;
+ /// example how to process an input file containing the UXMLDescriptions of the dialogs
+ /// to dump
+ if (true)
+ {
+ test::Directories aDirectories;
+ OUString aURL = aDirectories.getURLFromSrc("sd/qa/unit/data/dialogs-test.txt");
+ SvFileStream aStream(aURL, StreamMode::READ);
+ OString aNextUIFile;
+ OString aComment("#");
+
+ while (aStream.ReadLine(aNextUIFile))
+ {
+ if (!aNextUIFile.isEmpty() && !aNextUIFile.startsWith(aComment))
+ {
+ // first check if it's a known dialog
+ std::unique_ptr<VclAbstractDialog> pDlg(createDialogByName(aNextUIFile));
+
+ if (pDlg)
+ {
+ // known dialog, dump screenshot to path
+ dumpDialogToPath(*pDlg);
+ }
+ else
+ {
+ // unknown dialog, try fallback to generic created
+ // VclBuilder-generated instance. Keep in mind that Dialogs
+ // using this mechanism will probably not be layouted well
+ // since the setup/initialization part is missing. Thus,
+ // only use for fallback when only the UI file is available.
+ dumpDialogToPath(aNextUIFile);
+ }
+ }
+ }
+ }
- if (bDumpAllKnownDialogs)
+ /// example how to dump all known dialogs
+ if (false)
{
// example for SfxTabDialog: 5 -> "modules/sdraw/ui/drawpagedialog.ui"
// example for TabDialog: 22 -> "modules/simpress/ui/headerfooterdialog.ui"
// example for self-adapted wizard: 0 -> "modules/simpress/ui/publishingdialog.ui"
- for (mapType::const_iterator i = maKnownDialogs.begin(); i != maKnownDialogs.end(); i++)
+ for (mapType::const_iterator i = getKnownDialogs().begin(); i != getKnownDialogs().end(); i++)
{
std::unique_ptr<VclAbstractDialog> pDlg(createDialogByID((*i).second));
@@ -631,9 +663,8 @@ void SdDialogsTest::openAnyDialog()
}
}
- static bool bCheckFallbackDialog = false;
-
- if (bCheckFallbackDialog)
+ /// example how to dump a dialog using fallback functionality
+ if (false)
{
// unknown dialog, try fallback to generic created
// VclBuilder-generated instance. Keep in mind that Dialogs
diff --git a/sd/source/ui/dlg/headerfooterdlg.cxx b/sd/source/ui/dlg/headerfooterdlg.cxx
index 84e5216f83f6..ccab84b8cfa3 100644
--- a/sd/source/ui/dlg/headerfooterdlg.cxx
+++ b/sd/source/ui/dlg/headerfooterdlg.cxx
@@ -796,25 +796,28 @@ void PresLayoutPreview::Paint(vcl::RenderContext& rRenderContext, const Rectangl
rRenderContext.DrawRect(maOutRect);
// paint presentation objects from masterpage
- SdrTextObj* pMasterTitle = static_cast<SdrTextObj*>(mpMaster->GetPresObj( PRESOBJ_TITLE ));
- SdrTextObj* pMasterOutline = static_cast<SdrTextObj*>(mpMaster->GetPresObj( mpMaster->GetPageKind()==PK_NOTES ? PRESOBJ_NOTES : PRESOBJ_OUTLINE ));
- SdrTextObj* pHeader = static_cast<SdrTextObj*>(mpMaster->GetPresObj( PRESOBJ_HEADER ));
- SdrTextObj* pFooter = static_cast<SdrTextObj*>(mpMaster->GetPresObj( PRESOBJ_FOOTER ));
- SdrTextObj* pDate = static_cast<SdrTextObj*>(mpMaster->GetPresObj( PRESOBJ_DATETIME ));
- SdrTextObj* pNumber = static_cast<SdrTextObj*>(mpMaster->GetPresObj( PRESOBJ_SLIDENUMBER ));
-
- if (pMasterTitle)
- Paint(rRenderContext, pMasterTitle, true, true);
- if (pMasterOutline)
- Paint(rRenderContext, pMasterOutline, true, true);
- if (pHeader)
- Paint(rRenderContext, pHeader, maSettings.mbHeaderVisible);
- if (pFooter)
- Paint(rRenderContext, pFooter, maSettings.mbFooterVisible);
- if (pDate)
- Paint(rRenderContext, pDate, maSettings.mbDateTimeVisible);
- if (pNumber)
- Paint(rRenderContext, pNumber, maSettings.mbSlideNumberVisible);
+ if (nullptr != mpMaster)
+ {
+ SdrTextObj* pMasterTitle = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PRESOBJ_TITLE));
+ SdrTextObj* pMasterOutline = static_cast<SdrTextObj*>(mpMaster->GetPresObj(mpMaster->GetPageKind() == PK_NOTES ? PRESOBJ_NOTES : PRESOBJ_OUTLINE));
+ SdrTextObj* pHeader = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PRESOBJ_HEADER));
+ SdrTextObj* pFooter = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PRESOBJ_FOOTER));
+ SdrTextObj* pDate = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PRESOBJ_DATETIME));
+ SdrTextObj* pNumber = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PRESOBJ_SLIDENUMBER));
+
+ if (pMasterTitle)
+ Paint(rRenderContext, pMasterTitle, true, true);
+ if (pMasterOutline)
+ Paint(rRenderContext, pMasterOutline, true, true);
+ if (pHeader)
+ Paint(rRenderContext, pHeader, maSettings.mbHeaderVisible);
+ if (pFooter)
+ Paint(rRenderContext, pFooter, maSettings.mbFooterVisible);
+ if (pDate)
+ Paint(rRenderContext, pDate, maSettings.mbDateTimeVisible);
+ if (pNumber)
+ Paint(rRenderContext, pNumber, maSettings.mbSlideNumberVisible);
+ }
rRenderContext.Pop();
}
diff --git a/test/source/screenshot_test.cxx b/test/source/screenshot_test.cxx
index e33cf21b6545..92f48ee28823 100644
--- a/test/source/screenshot_test.cxx
+++ b/test/source/screenshot_test.cxx
@@ -1,4 +1,4 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
@@ -33,7 +33,12 @@ using namespace css;
using namespace css::uno;
ScreenshotTest::ScreenshotTest()
- : m_aScreenshotDirectory("/workdir/screenshots/")
+: m_aScreenshotDirectory("/workdir/screenshots/"),
+ maKnownDialogs()
+{
+}
+
+ScreenshotTest::~ScreenshotTest()
{
}
@@ -46,6 +51,12 @@ void ScreenshotTest::setUp()
osl::FileBase::RC err = osl::Directory::create( m_directories.getURLFromSrc( m_aScreenshotDirectory ) );
CPPUNIT_ASSERT_MESSAGE( "Failed to create screenshot directory", (err == osl::FileBase::E_None || err == osl::FileBase::E_EXIST) );
+
+ // initialize maKnownDialogs
+ if (maKnownDialogs.empty())
+ {
+ registerKnownDialogsByID(maKnownDialogs);
+ }
}
void ScreenshotTest::tearDown()
@@ -101,6 +112,19 @@ void ScreenshotTest::saveScreenshot(Dialog& rDialog)
}
}
+VclAbstractDialog* ScreenshotTest::createDialogByName(const OString& rName)
+{
+ VclAbstractDialog* pRetval = nullptr;
+ const mapType::const_iterator aHit = maKnownDialogs.find(rName);
+
+ if (aHit != maKnownDialogs.end())
+ {
+ return createDialogByID((*aHit).second);
+ }
+
+ return pRetval;
+}
+
void ScreenshotTest::dumpDialogToPath(VclAbstractDialog& rDialog)
{
const std::vector<OString> aPageDescriptions(rDialog.getAllPageUIXMLDescriptions());