summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@collabora.com>2019-09-14 21:26:21 +0200
committerSzymon Kłos <szymon.klos@collabora.com>2019-10-01 10:21:08 +0200
commit75b8db7fa7344a679d3c5dbdc8c5bd4228cdbc7c (patch)
tree26f0c24aa1c5d4dacb3e1a019a0a30441fc8f7e2
parent9590e8d0a2194b36d5a025a21dc2e71f37f4f54b (diff)
lok jsdialogs: Introduce dumping of widgets hierarchy to vcl::Window.
Change-Id: Ie3267e1f888df371d281e81ead437a150aa8dc1c Reviewed-on: https://gerrit.libreoffice.org/79796 Tested-by: Jenkins Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r--canvas/source/opengl/ogl_canvashelper.cxx16
-rw-r--r--include/vcl/window.hxx5
-rw-r--r--vcl/source/window/window.cxx114
3 files changed, 127 insertions, 8 deletions
diff --git a/canvas/source/opengl/ogl_canvashelper.cxx b/canvas/source/opengl/ogl_canvashelper.cxx
index cbbd639741f6..e5966e3e9ebe 100644
--- a/canvas/source/opengl/ogl_canvashelper.cxx
+++ b/canvas/source/opengl/ogl_canvashelper.cxx
@@ -395,7 +395,7 @@ namespace oglcanvas
setupGraphicsState( rAct, viewState, renderState );
rAct.maFunction = std::bind(&lcl_drawLine,
- _1, _2, _3, _4, _5,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5,
aStartPoint, aEndPoint);
}
}
@@ -415,7 +415,7 @@ namespace oglcanvas
// TODO(F2): subdivide&render whole curve
rAct.maFunction = std::bind(&lcl_drawLine,
- _1,_2,_3,_4,_5,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5,
geometry::RealPoint2D(
aBezierSegment.Px,
aBezierSegment.Py),
@@ -568,10 +568,10 @@ namespace oglcanvas
pGradient->getValues() );
rAct.maFunction = std::bind(&lcl_fillGradientPolyPolygon,
- _1,_2,_3,_4,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4,
rValues,
textures[0],
- _6);
+ std::placeholders::_6);
}
else
{
@@ -611,14 +611,14 @@ namespace oglcanvas
canvas::tools::getStdColorSpace()));
rAct.maFunction = std::bind(&lcl_fillTexturedPolyPolygon,
- _1,_2,_3,_4,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4,
textures[0],
aSize,
aARGBBytes,
rtl_crc32(0,
aARGBBytes.getConstArray(),
aARGBBytes.getLength()),
- _6);
+ std::placeholders::_6);
}
// TODO(F1): handle non-integer case
}
@@ -791,7 +791,7 @@ namespace oglcanvas
setupGraphicsState( rAct, viewState, renderState );
rAct.maFunction = std::bind(&lcl_drawOwnBitmap,
- _1,_2,_3,_4,_5,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5,
*pOwnBitmap);
}
else
@@ -820,7 +820,7 @@ namespace oglcanvas
setupGraphicsState( rAct, viewState, renderState );
rAct.maFunction = std::bind(&lcl_drawGenericBitmap,
- _1,_2,_3,_4,_5,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5,
aSize, aARGBBytes,
rtl_crc32(0,
aARGBBytes.getConstArray(),
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 823456ff077e..ed4786d31f55 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -34,6 +34,8 @@
#include <com/sun/star/uno/Reference.hxx>
#include <memory>
+#include <boost/property_tree/ptree.hpp>
+
class VirtualDevice;
struct ImplSVEvent;
struct ImplWinData;
@@ -1213,6 +1215,9 @@ public:
/// Find an existing Window based on the LOKWindowId.
static VclPtr<vcl::Window> FindLOKWindow(vcl::LOKWindowId nWindowId);
+ /// Dumps itself and potentially its children to a property tree, to be written easily to JSON.
+ virtual boost::property_tree::ptree DumpAsPropertyTree();
+
/// Dialog / window tunneling related methods.
Size PaintActiveFloatingWindow(VirtualDevice& rDevice) const;
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index a0cb34f6d936..4121cb565c30 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3251,6 +3251,120 @@ VclPtr<vcl::Window> Window::GetParentWithLOKNotifier()
return pWindow;
}
+namespace
+{
+
+const char* windowTypeName(WindowType nWindowType)
+{
+ switch (nWindowType)
+ {
+ case WindowType::NONE: return "none";
+ case WindowType::MESSBOX: return "messagebox";
+ case WindowType::INFOBOX: return "infobox";
+ case WindowType::WARNINGBOX: return "warningbox";
+ case WindowType::ERRORBOX: return "errorbox";
+ case WindowType::QUERYBOX: return "querybox";
+ case WindowType::WINDOW: return "window";
+ case WindowType::WORKWINDOW: return "workwindow";
+ case WindowType::CONTAINER: return "container";
+ case WindowType::FLOATINGWINDOW: return "floatingwindow";
+ case WindowType::DIALOG: return "dialog";
+ case WindowType::MODELESSDIALOG: return "modelessdialog";
+ case WindowType::MODALDIALOG: return "modaldialog";
+ case WindowType::CONTROL: return "control";
+ case WindowType::PUSHBUTTON: return "pushbutton";
+ case WindowType::OKBUTTON: return "okbutton";
+ case WindowType::CANCELBUTTON: return "cancelbutton";
+ case WindowType::HELPBUTTON: return "helpbutton";
+ case WindowType::IMAGEBUTTON: return "imagebutton";
+ case WindowType::MENUBUTTON: return "menubutton";
+ case WindowType::MOREBUTTON: return "morebutton";
+ case WindowType::SPINBUTTON: return "spinbutton";
+ case WindowType::RADIOBUTTON: return "radiobutton";
+ case WindowType::CHECKBOX: return "checkbox";
+ case WindowType::TRISTATEBOX: return "tristatebox";
+ case WindowType::EDIT: return "edit";
+ case WindowType::MULTILINEEDIT: return "multilineedit";
+ case WindowType::COMBOBOX: return "combobox";
+ case WindowType::LISTBOX: return "listbox";
+ case WindowType::MULTILISTBOX: return "multilistbox";
+ case WindowType::FIXEDTEXT: return "fixedtext";
+ case WindowType::FIXEDLINE: return "fixedline";
+ case WindowType::FIXEDBITMAP: return "fixedbitmap";
+ case WindowType::FIXEDIMAGE: return "fixedimage";
+ case WindowType::GROUPBOX: return "groupbox";
+ case WindowType::SCROLLBAR: return "scrollbar";
+ case WindowType::SCROLLBARBOX: return "scrollbarbox";
+ case WindowType::SPLITTER: return "splitter";
+ case WindowType::SPLITWINDOW: return "splitwindow";
+ case WindowType::SPINFIELD: return "spinfield";
+ case WindowType::PATTERNFIELD: return "patternfield";
+ case WindowType::NUMERICFIELD: return "numericfield";
+ case WindowType::METRICFIELD: return "metricfield";
+ case WindowType::CURRENCYFIELD: return "currencyfield";
+ case WindowType::DATEFIELD: return "datefield";
+ case WindowType::TIMEFIELD: return "timefield";
+ case WindowType::PATTERNBOX: return "patternbox";
+ case WindowType::NUMERICBOX: return "numericbox";
+ case WindowType::METRICBOX: return "metricbox";
+ case WindowType::CURRENCYBOX: return "currencybox";
+ case WindowType::DATEBOX: return "datebox";
+ case WindowType::TIMEBOX: return "timebox";
+ case WindowType::LONGCURRENCYFIELD: return "longcurrencyfield";
+ case WindowType::LONGCURRENCYBOX: return "longcurrencybox";
+ case WindowType::SCROLLWINDOW: return "scrollwindow";
+ case WindowType::TOOLBOX: return "toolbox";
+ case WindowType::DOCKINGWINDOW: return "dockingwindow";
+ case WindowType::STATUSBAR: return "statusbar";
+ case WindowType::TABPAGE: return "tabpage";
+ case WindowType::TABCONTROL: return "tabcontrol";
+ case WindowType::TABDIALOG: return "tabdialog";
+ case WindowType::BORDERWINDOW: return "borderwindow";
+ case WindowType::BUTTONDIALOG: return "buttondialog";
+ case WindowType::SYSTEMCHILDWINDOW: return "systemchildwindow";
+ case WindowType::SLIDER: return "slider";
+ case WindowType::MENUBARWINDOW: return "menubarwindow";
+ case WindowType::TREELISTBOX: return "treelistbox";
+ case WindowType::HELPTEXTWINDOW: return "helptextwindow";
+ case WindowType::INTROWINDOW: return "introwindow";
+ case WindowType::LISTBOXWINDOW: return "listboxwindow";
+ case WindowType::DOCKINGAREA: return "dockingarea";
+ case WindowType::RULER: return "ruler";
+ case WindowType::CALCINPUTLINE: return "calcinputline";
+ case WindowType::HEADERBAR: return "headerbar";
+ case WindowType::VERTICALTABCONTROL: return "verticaltabcontrol";
+
+ // nothing to do here, but for completeness
+ case WindowType::TOOLKIT_FRAMEWINDOW: return "toolkit_framewindow";
+ case WindowType::TOOLKIT_SYSTEMCHILDWINDOW: return "toolkit_systemchildwindow";
+ }
+
+ return "none";
+}
+
+}
+
+boost::property_tree::ptree Window::DumpAsPropertyTree()
+{
+ boost::property_tree::ptree aTree;
+ aTree.put("id", get_id()); // TODO could be missing - sort out
+ aTree.put("type", windowTypeName(GetType()));
+ aTree.put("text", GetText());
+
+ boost::property_tree::ptree aChildren;
+ if (vcl::Window* pChild = mpWindowImpl->mpFirstChild)
+ {
+ while (pChild)
+ {
+ aChildren.push_back(std::make_pair("", pChild->DumpAsPropertyTree()));
+ pChild = pChild->mpWindowImpl->mpNext;
+ }
+ aTree.add_child("children", aChildren);
+ }
+
+ return aTree;
+}
+
void Window::ImplCallDeactivateListeners( vcl::Window *pNew )
{
// no deactivation if the newly activated window is my child