summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2022-05-13 08:26:32 +0200
committerMiklos Vajna <vmiklos@collabora.com>2022-05-16 11:59:46 +0200
commit49c87cd2c82f0203593487e579e84283ffb9f1fd (patch)
tree5e99f58e34307f514a06083f90721d26c8a9ee1b /libreofficekit
parentebd760cffb9bf607b58f1eead796830a89e3cbba (diff)
sw content controls, dropdown: add LOK API
- expose the available list items in a new "items" key of the LOK_CALLBACK_CONTENT_CONTROL callback - add a new lok::Document::sendContentControlEvent() function to be able to select a list item from the current drop-down - add a new listbox to the gtktiledviewer toolbar to select a content control list item when the cursor is inside a dropdown - add tests for the array API of tools::JsonWriter (cherry picked from commit c7d80d229a5660a0ee702477bfbd2ca137992a7d) Change-Id: I47f1333a7815d67952f7c20a9cba1b248886f6dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134385 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'libreofficekit')
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx2
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx30
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx4
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx1
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx16
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx2
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtv.ui18
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx27
9 files changed, 96 insertions, 5 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
index 4d2dbd41f251..7e2f9f907ebf 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
@@ -331,6 +331,8 @@ static void setupDocView(GtvApplicationWindow* window)
g_signal_connect(window->lokdocview, "search-result-count", G_CALLBACK(LOKDocViewSigHandlers::searchResultCount), nullptr);
g_signal_connect(window->lokdocview, "part-changed", G_CALLBACK(LOKDocViewSigHandlers::partChanged), nullptr);
g_signal_connect(window->lokdocview, "hyperlink-clicked", G_CALLBACK(LOKDocViewSigHandlers::hyperlinkClicked), nullptr);
+ g_signal_connect(window->lokdocview, "content-control",
+ G_CALLBACK(LOKDocViewSigHandlers::contentControl), nullptr);
g_signal_connect(window->lokdocview, "cursor-changed", G_CALLBACK(LOKDocViewSigHandlers::cursorChanged), nullptr);
g_signal_connect(window->lokdocview, "address-changed", G_CALLBACK(LOKDocViewSigHandlers::addressChanged), nullptr);
g_signal_connect(window->lokdocview, "formula-changed", G_CALLBACK(LOKDocViewSigHandlers::formulaChanged), nullptr);
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
index 90b96e57488a..eadcd1a01c76 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
@@ -202,6 +202,36 @@ void LOKDocViewSigHandlers::formulaChanged(LOKDocView* pDocView, char* pPayload,
gtk_entry_set_text(pFormulabar, pPayload);
}
+void LOKDocViewSigHandlers::contentControl(LOKDocView* pDocView, gchar* pJson, gpointer)
+{
+ GtvApplicationWindow* window
+ = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
+ GtvMainToolbar* toolbar = gtv_application_window_get_main_toolbar(window);
+ gtv_application_window_set_part_broadcast(window, false);
+ gtk_list_store_clear(
+ GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(toolbar->m_pContentControlSelector))));
+ if (!window->lokdocview)
+ {
+ return;
+ }
+
+ std::stringstream aStream(pJson);
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ boost::optional<boost::property_tree::ptree&> oItems = aTree.get_child_optional("items");
+ if (oItems)
+ {
+ for (const auto& rItem : *oItems)
+ {
+ std::string aValue = rItem.second.get_value<std::string>();
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(toolbar->m_pContentControlSelector),
+ aValue.c_str());
+ }
+ }
+
+ gtv_application_window_set_part_broadcast(window, true);
+}
+
void LOKDocViewSigHandlers::passwordRequired(LOKDocView* pDocView, char* pUrl, gboolean bModify, gpointer)
{
GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(pDocView)));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
index 41fc73ab1a07..0c5bb7113e26 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
@@ -27,6 +27,7 @@ namespace LOKDocViewSigHandlers {
void passwordRequired(LOKDocView* pDocView, char* pUrl, gboolean bModify, gpointer);
void comment(LOKDocView* pDocView, gchar* pComment, gpointer);
void window(LOKDocView* pDocView, gchar* pPayload, gpointer);
+ void contentControl(LOKDocView* pDocView, gchar* pComment, gpointer);
gboolean configureEvent(GtkWidget* pWidget, GdkEventConfigure* pEvent, gpointer pData);
}
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx
index 73ff6042e911..afe6162f76fc 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx
@@ -116,6 +116,8 @@ gtv_main_toolbar_init(GtvMainToolbar* toolbar)
toolbar->m_pAddressbar = GTK_WIDGET(gtk_builder_get_object(builder.get(), "addressbar_entry"));
toolbar->m_pFormulabar = GTK_WIDGET(gtk_builder_get_object(builder.get(), "formulabar_entry"));
+ toolbar->m_pContentControlSelector
+ = GTK_WIDGET(gtk_builder_get_object(builder.get(), "combo_contentcontrolselector"));
// TODO: compile with -rdynamic and get rid of it
gtk_builder_add_callback_symbol(builder.get(), "btn_clicked", G_CALLBACK(btn_clicked));
@@ -128,6 +130,8 @@ gtv_main_toolbar_init(GtvMainToolbar* toolbar)
gtk_builder_add_callback_symbol(builder.get(), "toggleEditing", G_CALLBACK(toggleEditing));
gtk_builder_add_callback_symbol(builder.get(), "changePartMode", G_CALLBACK(changePartMode));
gtk_builder_add_callback_symbol(builder.get(), "changePart", G_CALLBACK(changePart));
+ gtk_builder_add_callback_symbol(builder.get(), "changeContentControl",
+ G_CALLBACK(changeContentControl));
gtk_builder_add_callback_symbol(builder.get(), "changeZoom", G_CALLBACK(changeZoom));
gtk_builder_add_callback_symbol(builder.get(), "toggleFindbar", G_CALLBACK(toggleFindbar));
gtk_builder_add_callback_symbol(builder.get(), "documentRedline", G_CALLBACK(documentRedline));
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx
index 0930228fda59..e385e6e855d1 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx
@@ -29,6 +29,7 @@ struct GtvMainToolbar
GtkWidget* m_pAddressbar;
GtkWidget* m_pFormulabar;
+ GtkWidget* m_pContentControlSelector;
};
struct GtvMainToolbarClass
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
index e7208e5860a3..0afce9b671db 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
@@ -318,6 +318,22 @@ void changePartMode( GtkWidget* pSelector, gpointer /* pItem */ )
}
}
+void changeContentControl(GtkWidget* pSelector, gpointer /*pItem*/)
+{
+ GtvApplicationWindow* window = GTV_APPLICATION_WINDOW(gtk_widget_get_toplevel(pSelector));
+ if (gtv_application_window_get_part_broadcast(window) && window->lokdocview)
+ {
+ int nItem = gtk_combo_box_get_active(GTK_COMBO_BOX(pSelector));
+ boost::property_tree::ptree aValues;
+ aValues.put("type", "drop-down");
+ aValues.put("selected", std::to_string(nItem));
+ std::stringstream aStream;
+ boost::property_tree::write_json(aStream, aValues);
+ std::string aJson = aStream.str();
+ lok_doc_view_send_content_control_event(LOK_DOC_VIEW(window->lokdocview), aJson.c_str());
+ }
+}
+
void changeZoom( GtkWidget* pButton, gpointer /* pItem */ )
{
static const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 };
diff --git a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx
index a441d4e13bf5..c5cf89c281fc 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx
+++ b/libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.hxx
@@ -67,6 +67,8 @@ gboolean signalAddressbar(GtkWidget* pWidget, GdkEventKey* pEvent, gpointer /*pD
/// Handles the key-press-event of the formula entry widget.
gboolean signalFormulabar(GtkWidget* /*pWidget*/, GdkEventKey* /*pEvent*/, gpointer /*pData*/);
+void changeContentControl(GtkWidget* pSelector, gpointer /*pItem*/);
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/libreofficekit/qa/gtktiledviewer/gtv.ui b/libreofficekit/qa/gtktiledviewer/gtv.ui
index 2efb235cc2b0..26e15a0a9e3d 100644
--- a/libreofficekit/qa/gtktiledviewer/gtv.ui
+++ b/libreofficekit/qa/gtktiledviewer/gtv.ui
@@ -428,6 +428,24 @@
</packing>
</child>
<child>
+ <object class="GtkToolItem" id="contentcontrolselectortoolitem">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkComboBoxText" id="combo_contentcontrolselector">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text">Content control list items</property>
+ <signal name="changed" handler="changeContentControl" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkToggleToolButton" id="btn_editmode">
<property name="visible">True</property>
<property name="label" translatable="yes">Turn on/off edit mode</property>
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 4d090dcc0de5..e36dec43c720 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -1412,8 +1412,8 @@ callback (gpointer pData)
{
priv->m_aContentControlRectangles.clear();
}
- bool bIsTextSelected = !priv->m_aContentControlRectangles.empty();
- g_signal_emit(pDocView, doc_view_signals[CONTENT_CONTROL], 0, bIsTextSelected);
+ g_signal_emit(pCallback->m_pDocView, doc_view_signals[CONTENT_CONTROL], 0,
+ pCallback->m_aPayload.c_str());
gtk_widget_queue_draw(GTK_WIDGET(pDocView));
}
break;
@@ -3326,7 +3326,7 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
/**
* LOKDocView::content-control:
* @pDocView: the #LOKDocView on which the signal is emitted
- * @bIsTextSelected: whether current content control is non-null
+ * @pPayload: the JSON string containing the information about ruler properties
*/
doc_view_signals[CONTENT_CONTROL] =
g_signal_new("content-control",
@@ -3334,9 +3334,9 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
G_SIGNAL_RUN_FIRST,
0,
nullptr, nullptr,
- g_cclosure_marshal_VOID__BOOLEAN,
+ g_cclosure_marshal_generic,
G_TYPE_NONE, 1,
- G_TYPE_BOOLEAN);
+ G_TYPE_STRING);
/**
* LOKDocView::password-required:
@@ -3727,6 +3727,23 @@ lok_doc_view_set_part (LOKDocView* pDocView, int nPart)
priv->m_nPartId = nPart;
}
+SAL_DLLPUBLIC_EXPORT void lok_doc_view_send_content_control_event(LOKDocView* pDocView,
+ const gchar* pArguments)
+{
+ LOKDocViewPrivate& priv = getPrivate(pDocView);
+ if (!priv->m_pDocument)
+ {
+ return;
+ }
+
+ std::scoped_lock<std::mutex> aGuard(g_aLOKMutex);
+ std::stringstream ss;
+ ss << "lok::Document::sendContentControlEvent('" << pArguments << "')";
+ g_info("%s", ss.str().c_str());
+ priv->m_pDocument->pClass->setView(priv->m_pDocument, priv->m_nViewId);
+ return priv->m_pDocument->pClass->sendContentControlEvent(priv->m_pDocument, pArguments);
+}
+
SAL_DLLPUBLIC_EXPORT gchar*
lok_doc_view_get_part_name (LOKDocView* pDocView, int nPart)
{