vcl/Library_vclplug_qt5.mk        |    1 
 vcl/Library_vclplug_qt6.mk        |    1 
 vcl/inc/qt5/QtInstanceBuilder.hxx |    2 
 vcl/inc/qt5/QtInstanceEntry.hxx   |   51 +++++++++++++
 vcl/inc/qt6/QtInstanceEntry.hxx   |   12 +++
 vcl/qt5/QtBuilder.cxx             |   10 ++
 vcl/qt5/QtInstanceBuilder.cxx     |    9 +-
 vcl/qt5/QtInstanceEntry.cxx       |  141 ++++++++++++++++++++++++++++++++++++++
 vcl/qt6/QtInstanceEntry.cxx       |   12 +++
 9 files changed, 235 insertions(+), 4 deletions(-)

New commits:
commit e0b4f69ef3885ab9bf1fd5a22430f1581259fb67
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Fri Oct 4 16:47:55 2024 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Sat Oct 5 09:39:21 2024 +0200

    tdf#130857 qt weld: Add basic handling for "GtkScrolledWindow"
    
    Create a QScrollArea when encountering a
    "GtkScrolledWindow" object in a .ui file.
    
    This commit does not yet implement an
    actual Qt-native weld::ScrolledWindow,
    i.e. QtInstanceBuilder::weld_scrolled_window
    currently still triggeres an assert.
    
    This will help to support
    cui/uiconfig/ui/objecttitledescdialog.ui,
    which has a GtkScrolledWindow, but
    SvxObjectTitleDescDialog doesn't explicitly
    interact with it, so this basic implementation
    is sufficient for a start.
    
    Change-Id: I80d2565e57809be0cc3ae452359d0d1b827e46f6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174494
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    Tested-by: Jenkins

diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx
index bc1dac89b15e..f1aedbce9a90 100644
--- a/vcl/qt5/QtBuilder.cxx
+++ b/vcl/qt5/QtBuilder.cxx
@@ -22,6 +22,7 @@
 #include <QtWidgets/QLineEdit>
 #include <QtWidgets/QLayout>
 #include <QtWidgets/QPushButton>
+#include <QtWidgets/QScrollArea>
 
 namespace
 {
@@ -157,6 +158,10 @@ QObject* QtBuilder::makeObject(QObject* pParent, 
std::u16string_view sName, cons
     {
         pObject = new QLabel(pParentWidget);
     }
+    else if (sName == u"GtkScrolledWindow")
+    {
+        pObject = new QScrollArea(pParentWidget);
+    }
     else
     {
         SAL_WARN("vcl.qt", "Widget type not supported yet: "
commit 778fb6b8f7273f8c792c3c7c78e5ec2acb5e3463
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Fri Oct 4 16:36:16 2024 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Sat Oct 5 09:39:13 2024 +0200

    tdf#130857 qt weld: Add QtInstanceEntry
    
    Add a native Qt implementation for weld::Entry,
    QtInstanceEntry, that uses a QLineEdit,
    and let QtInstanceBuilder use it when it
    encounters a "GtkEntry" object in a .ui file.
    
    Implement the most straightforward and probably most
    relevant methods, and trigger an assert in case one of
    the not yet implemented methods gets called for now.
    These can be implemented when adding support
    for .ui files whose dialogs make use of these
    features.
    
    None of the .ui files currently marked as
    supported by QtInstanceBuilder uses this new class
    yet, but it will be needed to support more in the future.
    
    Change-Id: I56e26fe22b1cc0cb7d61cfd1503991273957e23f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174489
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/vcl/Library_vclplug_qt5.mk b/vcl/Library_vclplug_qt5.mk
index b17b5d336462..d3046eba60a4 100644
--- a/vcl/Library_vclplug_qt5.mk
+++ b/vcl/Library_vclplug_qt5.mk
@@ -100,6 +100,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\
     vcl/qt5/QtInstanceCheckButton \
     vcl/qt5/QtInstanceContainer \
     vcl/qt5/QtInstanceDialog \
+    vcl/qt5/QtInstanceEntry \
     vcl/qt5/QtInstanceMessageDialog \
     vcl/qt5/QtInstanceLabel \
     vcl/qt5/QtInstanceWidget \
diff --git a/vcl/Library_vclplug_qt6.mk b/vcl/Library_vclplug_qt6.mk
index 684c7d409e1f..832adf500931 100644
--- a/vcl/Library_vclplug_qt6.mk
+++ b/vcl/Library_vclplug_qt6.mk
@@ -99,6 +99,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt6,\
     vcl/qt6/QtInstanceCheckButton \
     vcl/qt6/QtInstanceContainer \
     vcl/qt6/QtInstanceDialog \
+    vcl/qt6/QtInstanceEntry \
     vcl/qt6/QtInstanceLabel \
     vcl/qt6/QtInstanceMessageDialog \
     vcl/qt6/QtInstanceWidget \
diff --git a/vcl/inc/qt5/QtInstanceBuilder.hxx 
b/vcl/inc/qt5/QtInstanceBuilder.hxx
index ff5d9e83fc68..713f7c5fed6a 100644
--- a/vcl/inc/qt5/QtInstanceBuilder.hxx
+++ b/vcl/inc/qt5/QtInstanceBuilder.hxx
@@ -55,7 +55,7 @@ public:
     virtual std::unique_ptr<weld::Spinner> weld_spinner(const OUString&) 
override;
     virtual std::unique_ptr<weld::Image> weld_image(const OUString&) override;
     virtual std::unique_ptr<weld::Calendar> weld_calendar(const OUString&) 
override;
-    virtual std::unique_ptr<weld::Entry> weld_entry(const OUString&) override;
+    virtual std::unique_ptr<weld::Entry> weld_entry(const OUString& rId) 
override;
     virtual std::unique_ptr<weld::SpinButton> weld_spin_button(const 
OUString&) override;
     virtual std::unique_ptr<weld::MetricSpinButton> 
weld_metric_spin_button(const OUString&,
                                                                             
FieldUnit) override;
diff --git a/vcl/inc/qt5/QtInstanceEntry.hxx b/vcl/inc/qt5/QtInstanceEntry.hxx
new file mode 100644
index 000000000000..001d6714bcc4
--- /dev/null
+++ b/vcl/inc/qt5/QtInstanceEntry.hxx
@@ -0,0 +1,51 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include "QtInstanceWidget.hxx"
+
+#include <QtWidgets/QLineEdit>
+
+class QtInstanceEntry : public QtInstanceWidget, public virtual weld::Entry
+{
+    QLineEdit* m_pLineEdit;
+
+public:
+    QtInstanceEntry(QLineEdit* pLineEdit);
+
+    virtual void set_text(const OUString& rText) override;
+    virtual OUString get_text() const override;
+    virtual void set_width_chars(int nChars) override;
+    virtual int get_width_chars() const override;
+    virtual void set_max_length(int nChars) override;
+    virtual void select_region(int nStartPos, int nEndPos) override;
+    virtual bool get_selection_bounds(int& rStartPos, int& rEndPos) override;
+    virtual void replace_selection(const OUString& rText) override;
+    virtual void set_position(int nCursorPos) override;
+    virtual int get_position() const override;
+    virtual void set_editable(bool bEditable) override;
+    virtual bool get_editable() const override;
+    virtual void set_message_type(weld::EntryMessageType eType) override;
+    virtual void set_placeholder_text(const OUString& rText) override;
+
+    virtual void set_overwrite_mode(bool bOn) override;
+    virtual bool get_overwrite_mode() const override;
+
+    virtual void set_font(const vcl::Font& rFont) override;
+    virtual void set_font_color(const Color& rColor) override;
+
+    virtual void cut_clipboard() override;
+    virtual void copy_clipboard() override;
+    virtual void paste_clipboard() override;
+
+    virtual void set_alignment(TxtAlign eXAlign) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt6/QtInstanceEntry.hxx b/vcl/inc/qt6/QtInstanceEntry.hxx
new file mode 100644
index 000000000000..f8b85d462faa
--- /dev/null
+++ b/vcl/inc/qt6/QtInstanceEntry.hxx
@@ -0,0 +1,12 @@
+/* -*- 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 "../qt5/QtInstanceEntry.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx
index da4bb8ec5974..bc1dac89b15e 100644
--- a/vcl/qt5/QtBuilder.cxx
+++ b/vcl/qt5/QtBuilder.cxx
@@ -19,6 +19,7 @@
 #include <QtWidgets/QDialogButtonBox>
 #include <QtWidgets/QGroupBox>
 #include <QtWidgets/QLabel>
+#include <QtWidgets/QLineEdit>
 #include <QtWidgets/QLayout>
 #include <QtWidgets/QPushButton>
 
@@ -144,6 +145,10 @@ QObject* QtBuilder::makeObject(QObject* pParent, 
std::u16string_view sName, cons
     {
         pObject = new QDialog(pParentWidget);
     }
+    else if (sName == u"GtkEntry")
+    {
+        pObject = new QLineEdit(pParentWidget);
+    }
     else if (sName == u"GtkFrame")
     {
         pObject = new QGroupBox(pParentWidget);
diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx
index b4f608d49932..8bab727f6800 100644
--- a/vcl/qt5/QtInstanceBuilder.cxx
+++ b/vcl/qt5/QtInstanceBuilder.cxx
@@ -13,6 +13,7 @@
 
 #include <QtBuilder.hxx>
 #include <QtInstanceCheckButton.hxx>
+#include <QtInstanceEntry.hxx>
 #include <QtInstanceLabel.hxx>
 #include <QtInstanceMessageDialog.hxx>
 
@@ -193,10 +194,12 @@ std::unique_ptr<weld::Calendar> 
QtInstanceBuilder::weld_calendar(const OUString&
     return nullptr;
 }
 
-std::unique_ptr<weld::Entry> QtInstanceBuilder::weld_entry(const OUString&)
+std::unique_ptr<weld::Entry> QtInstanceBuilder::weld_entry(const OUString& rId)
 {
-    assert(false && "Not implemented yet");
-    return nullptr;
+    QLineEdit* pLineEdit = m_xBuilder->get<QLineEdit>(rId);
+    std::unique_ptr<weld::Entry> xRet(pLineEdit ? 
std::make_unique<QtInstanceEntry>(pLineEdit)
+                                                : nullptr);
+    return xRet;
 }
 
 std::unique_ptr<weld::SpinButton> QtInstanceBuilder::weld_spin_button(const 
OUString&)
diff --git a/vcl/qt5/QtInstanceEntry.cxx b/vcl/qt5/QtInstanceEntry.cxx
new file mode 100644
index 000000000000..f1ab7bf824fc
--- /dev/null
+++ b/vcl/qt5/QtInstanceEntry.cxx
@@ -0,0 +1,141 @@
+/* -*- 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 <QtInstanceEntry.hxx>
+
+QtInstanceEntry::QtInstanceEntry(QLineEdit* pLineEdit)
+    : QtInstanceWidget(pLineEdit)
+    , m_pLineEdit(pLineEdit)
+{
+    assert(m_pLineEdit);
+}
+
+void QtInstanceEntry::set_text(const OUString& rText)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { 
m_pLineEdit->setText(toQString(rText)); });
+}
+
+OUString QtInstanceEntry::get_text() const
+{
+    SolarMutexGuard g;
+    OUString sText;
+    GetQtInstance().RunInMainThread([&] { sText = 
toOUString(m_pLineEdit->text()); });
+    return sText;
+}
+
+void QtInstanceEntry::set_width_chars(int) { assert(false && "Not implemented 
yet"); }
+
+int QtInstanceEntry::get_width_chars() const
+{
+    assert(false && "Not implemented yet");
+    return -1;
+}
+
+void QtInstanceEntry::set_max_length(int nChars)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { m_pLineEdit->setMaxLength(nChars); 
});
+}
+
+void QtInstanceEntry::select_region(int nStartPos, int nEndPos)
+{
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        if (nEndPos == -1)
+            nEndPos = m_pLineEdit->text().length();
+
+        const int nLength = nEndPos - nStartPos;
+        m_pLineEdit->setSelection(nStartPos, nLength);
+    });
+}
+
+bool QtInstanceEntry::get_selection_bounds(int& rStartPos, int& rEndPos)
+{
+    SolarMutexGuard g;
+
+    bool bHasSelection = false;
+    GetQtInstance().RunInMainThread([&] {
+        bHasSelection = m_pLineEdit->hasSelectedText();
+        rStartPos = m_pLineEdit->selectionStart();
+        rEndPos = m_pLineEdit->selectionEnd();
+    });
+
+    return bHasSelection;
+}
+
+void QtInstanceEntry::replace_selection(const OUString& rText)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { 
m_pLineEdit->insert(toQString(rText)); });
+}
+
+void QtInstanceEntry::set_position(int nCursorPos)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { 
m_pLineEdit->setCursorPosition(nCursorPos); });
+}
+
+int QtInstanceEntry::get_position() const
+{
+    SolarMutexGuard g;
+    int nCursorPos = 0;
+    GetQtInstance().RunInMainThread([&] { nCursorPos = 
m_pLineEdit->cursorPosition(); });
+
+    return nCursorPos;
+}
+
+void QtInstanceEntry::set_editable(bool bEditable)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { 
m_pLineEdit->setReadOnly(!bEditable); });
+}
+
+bool QtInstanceEntry::get_editable() const
+{
+    SolarMutexGuard g;
+    bool bEditable = false;
+    GetQtInstance().RunInMainThread([&] { bEditable = 
!m_pLineEdit->isReadOnly(); });
+
+    return bEditable;
+}
+
+void QtInstanceEntry::set_message_type(weld::EntryMessageType)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceEntry::set_placeholder_text(const OUString& rText)
+{
+    SolarMutexGuard g;
+    GetQtInstance().RunInMainThread([&] { 
m_pLineEdit->setPlaceholderText(toQString(rText)); });
+}
+
+void QtInstanceEntry::set_overwrite_mode(bool) { assert(false && "Not 
implemented yet"); }
+
+bool QtInstanceEntry::get_overwrite_mode() const
+{
+    assert(false && "Not implemented yet");
+    return false;
+}
+
+void QtInstanceEntry::set_font(const vcl::Font&) { assert(false && "Not 
implemented yet"); }
+
+void QtInstanceEntry::set_font_color(const Color&) { assert(false && "Not 
implemented yet"); }
+
+void QtInstanceEntry::cut_clipboard() { assert(false && "Not implemented 
yet"); }
+
+void QtInstanceEntry::copy_clipboard() { assert(false && "Not implemented 
yet"); }
+
+void QtInstanceEntry::paste_clipboard() { assert(false && "Not implemented 
yet"); }
+
+void QtInstanceEntry::set_alignment(TxtAlign) { assert(false && "Not 
implemented yet"); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt6/QtInstanceEntry.cxx b/vcl/qt6/QtInstanceEntry.cxx
new file mode 100644
index 000000000000..7cf1bf2c023f
--- /dev/null
+++ b/vcl/qt6/QtInstanceEntry.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "../qt5/QtInstanceEntry.cxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to