summaryrefslogtreecommitdiffstats
path: root/sc/source/ui/uitest/uiobject.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/uitest/uiobject.cxx')
-rw-r--r--sc/source/ui/uitest/uiobject.cxx410
1 files changed, 410 insertions, 0 deletions
diff --git a/sc/source/ui/uitest/uiobject.cxx b/sc/source/ui/uitest/uiobject.cxx
new file mode 100644
index 000000000..58722b50e
--- /dev/null
+++ b/sc/source/ui/uitest/uiobject.cxx
@@ -0,0 +1,410 @@
+/* -*- 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/.
+ */
+
+#include <memory>
+#include <uiobject.hxx>
+
+#include <rangeutl.hxx>
+#include <gridwin.hxx>
+
+#include <viewdata.hxx>
+#include <viewfunc.hxx>
+#include <dbfunc.hxx>
+#include <tabvwsh.hxx>
+#include <drwlayer.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <appoptio.hxx>
+#include <scmod.hxx>
+#include <fudraw.hxx>
+#include <postit.hxx>
+
+#include <com/sun/star/embed/EmbedVerbs.hpp>
+
+#include <svx/svditer.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdoole2.hxx>
+#include <sal/log.hxx>
+
+namespace {
+
+ScAddress get_address_from_string(const ScDocument& rDoc, const OUString& rStr)
+{
+ ScAddress aAddr;
+ sal_Int32 nOffset = 0;
+ ScRangeStringConverter::GetAddressFromString(aAddr, rStr, rDoc, formula::FormulaGrammar::CONV_OOO, nOffset);
+ return aAddr;
+}
+
+ScRange get_range_from_string(const ScDocument& rDoc, const OUString& rStr)
+{
+ ScRange aRange;
+ sal_Int32 nOffset = 0;
+ ScRangeStringConverter::GetRangeFromString(aRange, rStr, rDoc, formula::FormulaGrammar::CONV_OOO, nOffset);
+
+ return aRange;
+}
+
+}
+
+ScGridWinUIObject::ScGridWinUIObject(const VclPtr<ScGridWindow>& xGridWin):
+ WindowUIObject(xGridWin),
+ mxGridWindow(xGridWin)
+{
+}
+
+StringMap ScGridWinUIObject::get_state()
+{
+ StringMap aMap = WindowUIObject::get_state();
+
+ aMap["SelectedTable"] = OUString::number(mxGridWindow->getViewData().GetTabNo());
+ aMap["CurrentColumn"] = OUString::number(mxGridWindow->getViewData().GetCurX());
+ aMap["CurrentRow"] = OUString::number(mxGridWindow->getViewData().GetCurY());
+
+ ScSplitPos eAlign = mxGridWindow->getViewData().GetActivePart();
+ ScHSplitPos eAlignX = WhichH(eAlign);
+ ScVSplitPos eAlignY = WhichV(eAlign);
+ aMap["TopVisibleRow"] = OUString::number(mxGridWindow->getViewData().GetPosY(eAlignY));
+ aMap["TopVisibleColumn"] = OUString::number(mxGridWindow->getViewData().GetPosX(eAlignX));
+
+ ScRangeList aMarkedArea = mxGridWindow->getViewData().GetMarkData().GetMarkedRanges();
+ OUString aMarkedAreaString;
+ ScRangeStringConverter::GetStringFromRangeList(aMarkedAreaString, &aMarkedArea, &mxGridWindow->getViewData().GetDocument(), formula::FormulaGrammar::CONV_OOO);
+
+ aMap["MarkedArea"] = aMarkedAreaString;
+
+ ScDocument& rDoc = mxGridWindow->getViewData().GetDocument();
+ ScAddress aPos( mxGridWindow->getViewData().GetCurX() , mxGridWindow->getViewData().GetCurY() , mxGridWindow->getViewData().GetTabNo() );
+ if ( rDoc.HasNote( aPos ) )
+ {
+ ScPostIt* pNote = rDoc.GetNote(aPos);
+ assert(pNote);
+ aMap["CurrentCellCommentText"] = pNote->GetText();
+ }
+
+ ScAppOptions aOpt = SC_MOD()->GetAppOptions();
+ aMap["Zoom"] = OUString::number( aOpt.GetZoom() );
+ return aMap;
+}
+
+ScDBFunc* ScGridWinUIObject::getDBFunc()
+{
+ ScViewData& rViewData = mxGridWindow->getViewData();
+ ScDBFunc* pFunc = rViewData.GetView();
+
+ return pFunc;
+}
+
+ScDrawView* ScGridWinUIObject::getDrawView()
+{
+ ScViewData& rViewData = mxGridWindow->getViewData();
+ ScDrawView* pDrawView = rViewData.GetScDrawView();
+
+ return pDrawView;
+}
+
+ScTabViewShell* ScGridWinUIObject::getViewShell()
+{
+ ScViewData& rViewData = mxGridWindow->getViewData();
+ ScTabViewShell* pViewShell = rViewData.GetViewShell();
+
+ return pViewShell;
+}
+
+ScViewFunc* ScGridWinUIObject::getViewFunc()
+{
+ ScViewData& rViewData = mxGridWindow->getViewData();
+ ScViewFunc* pViewFunc = rViewData.GetView();
+
+ return pViewFunc;
+}
+
+void ScGridWinUIObject::execute(const OUString& rAction,
+ const StringMap& rParameters)
+{
+ if (rAction == "SELECT")
+ {
+ bool bExtend = false;
+ if (rParameters.find("EXTEND") != rParameters.end())
+ {
+ auto itr = rParameters.find("EXTEND");
+ if (itr->second.equalsIgnoreAsciiCase("true") || itr->second == "1")
+ bExtend = true;
+ }
+
+ if (rParameters.find("CELL") != rParameters.end())
+ {
+ auto itr = rParameters.find("CELL");
+ const OUString& rStr = itr->second;
+ ScAddress aAddr = get_address_from_string(mxGridWindow->getViewData().GetDocument(), rStr);
+ ScDBFunc* pFunc = getDBFunc();
+ pFunc->MarkRange(ScRange(aAddr), true, bExtend);
+ mxGridWindow->CursorChanged();
+ }
+ else if (rParameters.find("RANGE") != rParameters.end())
+ {
+ auto itr = rParameters.find("RANGE");
+ const OUString rStr = itr->second;
+ ScRange aRange = get_range_from_string(mxGridWindow->getViewData().GetDocument(), rStr);
+ ScDBFunc* pFunc = getDBFunc();
+ pFunc->MarkRange(aRange, true, bExtend);
+ mxGridWindow->CursorChanged();
+ }
+ else if (rParameters.find("TABLE") != rParameters.end())
+ {
+ auto itr = rParameters.find("TABLE");
+ const OUString rStr = itr->second;
+ sal_Int32 nTab = rStr.toUInt32();
+ ScTabView* pTabView = mxGridWindow->getViewData().GetView();
+ if (pTabView)
+ {
+ ScDocument& rDoc = mxGridWindow->getViewData().GetDocument();
+ if( nTab < rDoc.GetTableCount() )
+ pTabView->SetTabNo(nTab);
+ else
+ {
+ SAL_WARN("sc.uitest", "incorrect table number");
+ }
+ }
+ }
+ else if (rParameters.find("OBJECT") != rParameters.end())
+ {
+ auto itr = rParameters.find("OBJECT");
+ const OUString rStr = itr->second;
+
+ ScDrawView* pDrawView = getDrawView();
+ pDrawView->SelectObject(rStr);
+ }
+ else
+ {
+ SAL_WARN("sc.uitest", "unknown selection method");
+ }
+ }
+ else if (rAction == "DESELECT")
+ {
+ if (rParameters.find("OBJECT") != rParameters.end())
+ {
+ ScDrawView* pDrawView = getDrawView();
+ pDrawView->UnmarkAll();
+
+ ScTabViewShell* pViewShell = getViewShell();
+ pViewShell->SetDrawShell(false);
+ }
+ }
+ else if (rAction == "ACTIVATE")
+ {
+ ScDrawView* pDrawView = getDrawView();
+ const SdrMarkList& rMarkList = pDrawView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+ SdrObjKind nSdrObjKind = pObj->GetObjIdentifier();
+ if (nSdrObjKind == SdrObjKind::OLE2)
+ {
+ ScTabViewShell* pViewShell = getViewShell();
+ pViewShell->ActivateObject(static_cast<SdrOle2Obj*>(pObj), css::embed::EmbedVerbs::MS_OLEVERB_PRIMARY);
+ }
+ else
+ {
+ SAL_WARN("sc.uitest", "can't activate non-ole objects");
+ }
+ }
+ else
+ SAL_WARN("sc.uitest", "can't activate the current selection");
+ }
+ else if (rAction == "LAUNCH")
+ {
+ if ( rParameters.find("AUTOFILTER") != rParameters.end())
+ {
+ auto itrCol = rParameters.find("COL");
+ if (itrCol == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing COL parameter");
+ return;
+ }
+
+ auto itrRow = rParameters.find("ROW");
+ if (itrRow == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing ROW parameter");
+ return;
+ }
+ SCROW nRow = itrRow->second.toUInt32();
+ SCCOL nCol = itrCol->second.toUInt32();
+ mxGridWindow->LaunchAutoFilterMenu(nCol, nRow);
+ }
+ else if ( rParameters.find("PIVOTTABLE") != rParameters.end())
+ {
+ auto itrCol = rParameters.find("COL");
+ if (itrCol == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing COL parameter");
+ return;
+ }
+
+ auto itrRow = rParameters.find("ROW");
+ if (itrRow == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing ROW parameter");
+ return;
+ }
+ SCROW nRow = itrRow->second.toUInt32();
+ SCCOL nCol = itrCol->second.toUInt32();
+ mxGridWindow->LaunchDPFieldMenu(nCol, nRow);
+ }
+ else if ( rParameters.find("SELECTMENU") != rParameters.end())
+ {
+ auto itrCol = rParameters.find("COL");
+ if (itrCol == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing COL parameter");
+ return;
+ }
+
+ auto itrRow = rParameters.find("ROW");
+ if (itrRow == rParameters.end())
+ {
+ SAL_WARN("sc.uitest", "missing ROW parameter");
+ return;
+ }
+ SCROW nRow = itrRow->second.toUInt32();
+ SCCOL nCol = itrCol->second.toUInt32();
+ mxGridWindow->LaunchDataSelectMenu(nCol, nRow);
+ }
+ }
+ else if (rAction == "COMMENT")
+ {
+ if ( rParameters.find("OPEN") != rParameters.end() )
+ {
+ ScViewFunc* pViewFunc = getViewFunc();
+ pViewFunc->EditNote();
+ }
+ else if ( rParameters.find("CLOSE") != rParameters.end() )
+ {
+ FuDraw* pDraw = dynamic_cast<FuDraw*>(getViewFunc()->GetDrawFuncPtr());
+ assert(pDraw);
+ ScViewData& rViewData = mxGridWindow->getViewData();
+ rViewData.GetDispatcher().Execute( pDraw->GetSlotID() , SfxCallMode::SLOT | SfxCallMode::RECORD );
+ }
+ else if ( rParameters.find("SETTEXT") != rParameters.end() )
+ {
+ auto itr = rParameters.find("SETTEXT");
+ const OUString rStr = itr->second;
+ ScDocument& rDoc = mxGridWindow->getViewData().GetDocument();
+ ScAddress aPos( mxGridWindow->getViewData().GetCurX() , mxGridWindow->getViewData().GetCurY() , mxGridWindow->getViewData().GetTabNo() );
+ rDoc.GetOrCreateNote( aPos )->SetText( aPos , rStr );
+ }
+ }
+ else if (rAction == "SIDEBAR")
+ {
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ DBG_ASSERT(pViewFrm, "ScGridWinUIObject::execute: no viewframe");
+ pViewFrm->ShowChildWindow(SID_SIDEBAR);
+
+ auto itr = rParameters.find("PANEL");
+ if (itr != rParameters.end())
+ {
+ OUString aVal = itr->second;
+ ::sfx2::sidebar::Sidebar::ShowPanel(aVal, pViewFrm->GetFrame().GetFrameInterface());
+ }
+ }
+ else if (rAction == "SET")
+ {
+ if (rParameters.find("ZOOM") != rParameters.end())
+ {
+ auto itr = rParameters.find("ZOOM");
+ OUString aVal = itr->second;
+ sal_Int32 nVal = aVal.toInt32();
+ ScTabViewShell* pViewShell = getViewShell();
+ ScModule* pScMod = SC_MOD();
+ if( nVal )
+ {
+ ScAppOptions aNewOpt = pScMod->GetAppOptions();
+ aNewOpt.SetZoom( nVal );
+ pScMod->SetAppOptions( aNewOpt );
+ Fraction aFract( nVal, 100 );
+ pViewShell->SetZoom( aFract, aFract, true );
+ pViewShell->PaintGrid();
+ pViewShell->PaintTop();
+ pViewShell->PaintLeft();
+ }
+ }
+ }
+ else
+ {
+ WindowUIObject::execute(rAction, rParameters);
+ }
+}
+
+namespace {
+
+ScDrawLayer* get_draw_layer(VclPtr<ScGridWindow> const & xGridWindow)
+{
+ return xGridWindow->getViewData().GetDocument().GetDrawLayer();
+}
+
+SdrPage* get_draw_page(VclPtr<ScGridWindow> const & xGridWindow, SCTAB nTab)
+{
+ ScDrawLayer* pDrawLayer = get_draw_layer(xGridWindow);
+
+ return pDrawLayer->GetPage(nTab);
+}
+
+std::set<OUString> collect_charts(VclPtr<ScGridWindow> const & xGridWindow)
+{
+ SCTAB nTab = xGridWindow->getViewData().GetTabNo();
+ SdrPage* pPage = get_draw_page(xGridWindow, nTab);
+
+ std::set<OUString> aRet;
+
+ if (!pPage)
+ return aRet;
+
+ SdrObjListIter aIter( pPage, SdrIterMode::Flat );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if (pObject->GetObjIdentifier() == SdrObjKind::OLE2)
+ {
+ aRet.insert(static_cast<SdrOle2Obj*>(pObject)->GetPersistName());
+ }
+ pObject = aIter.Next();
+ }
+
+ return aRet;
+}
+
+}
+
+std::set<OUString> ScGridWinUIObject::get_children() const
+{
+ std::set<OUString> aChildren = collect_charts(mxGridWindow);
+ return aChildren;
+}
+
+std::unique_ptr<UIObject> ScGridWinUIObject::get_child(const OUString& /*rID*/)
+{
+ return nullptr;
+}
+
+std::unique_ptr<UIObject> ScGridWinUIObject::create(vcl::Window* pWindow)
+{
+ ScGridWindow* pGridWin = dynamic_cast<ScGridWindow*>(pWindow);
+ assert(pGridWin);
+ return std::unique_ptr<UIObject>(new ScGridWinUIObject(pGridWin));
+}
+
+OUString ScGridWinUIObject::get_name() const
+{
+ return "ScGridWinUIObject";
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */