summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk3/gtk3gtkinst.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/gtk3/gtk3gtkinst.cxx')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx85
1 files changed, 66 insertions, 19 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 4a24e5d03357..a7c0ac3824e6 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1310,6 +1310,14 @@ public:
gtk_widget_set_margin_bottom(m_pWidget, nMargin);
}
+ virtual void set_accessible_name(const OUString& rName) override
+ {
+ AtkObject* pAtkObject = gtk_widget_get_accessible(m_pWidget);
+ if (!pAtkObject)
+ return;
+ atk_object_set_description(pAtkObject, OUStringToOString(rName, RTL_TEXTENCODING_UTF8).getStr());
+ }
+
virtual weld::Container* weld_parent() const override;
virtual OString get_buildable_name() const override
@@ -2622,12 +2630,51 @@ private:
return sRet;
}
+ int find(const OUString& rStr, int col) const
+ {
+ GtkTreeModel *pModel = gtk_combo_box_get_model(GTK_COMBO_BOX(m_pComboBoxText));
+ GtkTreeIter iter;
+ if (!gtk_tree_model_get_iter_first(pModel, &iter))
+ return -1;
+
+ OString aStr(OUStringToOString(rStr, RTL_TEXTENCODING_UTF8).getStr());
+ int nRet = 0;
+ do
+ {
+ gchar* pStr;
+ gtk_tree_model_get(pModel, &iter, col, &pStr, -1);
+ const bool bEqual = strcmp(pStr, aStr.getStr()) == 0;
+ g_free(pStr);
+ if (bEqual)
+ return nRet;
+ ++nRet;
+ } while (gtk_tree_model_iter_next(pModel, &iter));
+
+ return -1;
+ }
+
+ void setup_completion()
+ {
+ GtkWidget* pChild = gtk_bin_get_child(GTK_BIN(m_pComboBoxText));
+ if (GTK_IS_ENTRY(pChild))
+ {
+ GtkEntry* pEntry = GTK_ENTRY(pChild);
+ GtkEntryCompletion* pCompletion = gtk_entry_completion_new();
+ gtk_entry_completion_set_model(pCompletion, gtk_combo_box_get_model(GTK_COMBO_BOX(m_pComboBoxText)));
+ gtk_entry_completion_set_text_column(pCompletion, 0);
+ gtk_entry_completion_set_inline_selection(pCompletion, true);
+ gtk_entry_set_completion(pEntry, pCompletion);
+ g_object_unref(pCompletion);
+ }
+ }
+
public:
GtkInstanceComboBoxText(GtkComboBoxText* pComboBoxText, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pComboBoxText), bTakeOwnership)
, m_pComboBoxText(pComboBoxText)
, m_nSignalId(g_signal_connect(m_pComboBoxText, "changed", G_CALLBACK(signalChanged), this))
{
+ setup_completion();
}
virtual int get_active() const override
@@ -2638,7 +2685,7 @@ public:
virtual OUString get_active_id() const override
{
const gchar* pText = gtk_combo_box_get_active_id(GTK_COMBO_BOX(m_pComboBoxText));
- return OUString(pText, strlen(pText), RTL_TEXTENCODING_UTF8);
+ return OUString(pText, pText ? strlen(pText) : 0, RTL_TEXTENCODING_UTF8);
}
virtual void set_active_id(const OUString& rStr) override
@@ -2707,31 +2754,20 @@ public:
virtual int find_text(const OUString& rStr) const override
{
- GtkTreeModel *pModel = gtk_combo_box_get_model(GTK_COMBO_BOX(m_pComboBoxText));
- GtkTreeIter iter;
- if (!gtk_tree_model_get_iter_first(pModel, &iter))
- return -1;
-
- OString aStr(OUStringToOString(rStr, RTL_TEXTENCODING_UTF8).getStr());
- int nRet = 0;
- do
- {
- gchar* pStr;
- gtk_tree_model_get(pModel, &iter, 0, &pStr, -1);
- const bool bEqual = strcmp(pStr, aStr.getStr()) == 0;
- g_free(pStr);
- if (bEqual)
- return nRet;
- ++nRet;
- } while (gtk_tree_model_iter_next(pModel, &iter));
+ return find(rStr, 0);
+ }
- return -1;
+ virtual int find_id(const OUString& rId) const override
+ {
+ return find(rId, 1);
}
virtual void clear() override
{
+ disable_notify_events();
GtkTreeModel *pModel = gtk_combo_box_get_model(GTK_COMBO_BOX(m_pComboBoxText));
gtk_list_store_clear(GTK_LIST_STORE(pModel));
+ enable_notify_events();
}
virtual void make_sorted() override
@@ -2745,6 +2781,17 @@ public:
gtk_tree_sortable_set_sort_column_id(pSortable, 0, GTK_SORT_ASCENDING);
}
+ virtual void set_entry_error(bool bError) override
+ {
+ GtkWidget* pChild = gtk_bin_get_child(GTK_BIN(m_pComboBoxText));
+ assert(GTK_IS_ENTRY(pChild));
+ GtkEntry* pEntry = GTK_ENTRY(pChild);
+ if (bError)
+ gtk_entry_set_icon_from_icon_name(pEntry, GTK_ENTRY_ICON_SECONDARY, "dialog-error");
+ else
+ gtk_entry_set_icon_from_icon_name(pEntry, GTK_ENTRY_ICON_SECONDARY, nullptr);
+ }
+
virtual void disable_notify_events() override
{
g_signal_handler_block(m_pComboBoxText, m_nSignalId);