[Libreoffice-commits] core.git: cui/source cui/uiconfig extras/source include/svx svx/Library_svx.mk svx/source

Akshay Deep akshaydeepiitr at gmail.com
Thu Aug 10 08:29:09 UTC 2017


 cui/source/dialogs/cuicharmap.cxx              |  192 +++++++++-
 cui/source/inc/cuicharmap.hxx                  |   16 
 cui/uiconfig/ui/specialcharacters.ui           |  104 ++++-
 extras/source/glade/libreoffice-catalog.xml.in |    3 
 include/svx/charmap.hxx                        |   18 
 include/svx/searchcharmap.hxx                  |   96 +++++
 include/svx/ucsubset.hxx                       |    1 
 svx/Library_svx.mk                             |    1 
 svx/source/dialog/charmap.cxx                  |   14 
 svx/source/dialog/searchcharmap.cxx            |  475 +++++++++++++++++++++++++
 10 files changed, 875 insertions(+), 45 deletions(-)

New commits:
commit e74be9ad773c7769c5d8765bb2ac234967e420ec
Author: Akshay Deep <akshaydeepiitr at gmail.com>
Date:   Sun Jul 30 15:03:56 2017 +0530

    Search feature for Special Characters
    
    1. Name data stored in map
    2. Retrive the data to compare with search string
    3. create search control
    4. populate search results
    5. Read-only subset listbox meanwhile
    
    Change-Id: I689bbee0dd9a226261c37a5824af7f83a510167d
    Reviewed-on: https://gerrit.libreoffice.org/40563
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Heiko Tietze <tietze.heiko at googlemail.com>
    Tested-by: Heiko Tietze <tietze.heiko at googlemail.com>

diff --git a/cui/source/dialogs/cuicharmap.cxx b/cui/source/dialogs/cuicharmap.cxx
index b535fd95b525..9ae777a7affe 100644
--- a/cui/source/dialogs/cuicharmap.cxx
+++ b/cui/source/dialogs/cuicharmap.cxx
@@ -57,9 +57,11 @@ using namespace css;
 SvxCharacterMap::SvxCharacterMap( vcl::Window* pParent, const SfxItemSet* pSet )
     : SfxModalDialog(pParent, "SpecialCharactersDialog", "cui/ui/specialcharacters.ui")
     , pSubsetMap( nullptr )
+    , isSearchMode(true)
     , mxContext(comphelper::getProcessComponentContext())
 {
     get(m_pShowSet, "showcharset");
+    get(m_pSearchSet, "searchcharset");
     get(m_pShowChar, "showchar");
     m_pShowChar->SetCentered(true);
     get(m_pOKBtn, "ok");
@@ -76,6 +78,7 @@ SvxCharacterMap::SvxCharacterMap( vcl::Window* pParent, const SfxItemSet* pSet )
     get(m_pCharName, "charname");
     m_pCharName->set_height_request(m_pCharName->GetTextHeight()*3);
     m_pCharName->SetPaintTransparent(true);
+    get(m_pSearchText, "search");
     //lock the size request of this widget to the width of the original .ui string
     m_pHexCodeText->set_width_request(m_pHexCodeText->get_preferred_size().Width());
 
@@ -140,6 +143,8 @@ SvxCharacterMap::SvxCharacterMap( vcl::Window* pParent, const SfxItemSet* pSet )
     }
 
     CreateOutputItemSet( pSet ? *pSet->GetPool() : SfxGetpApp()->GetPool() );
+    m_pShowSet->Show();
+    m_pSearchSet->Hide();
 }
 
 SvxCharacterMap::~SvxCharacterMap()
@@ -174,6 +179,7 @@ void SvxCharacterMap::dispose()
         m_pRecentCharView[i].clear();
 
     m_pShowSet.clear();
+    m_pSearchSet.clear();
     m_pOKBtn.clear();
     m_pFontText.clear();
     m_pFontLB.clear();
@@ -190,6 +196,7 @@ void SvxCharacterMap::dispose()
     maFavCharFontList.clear();
 
     m_pFavouritesBtn.clear();
+    m_pSearchText.clear();
 
     SfxModalDialog::dispose();
 }
@@ -199,7 +206,7 @@ void SvxCharacterMap::SetChar( sal_UCS4 c )
 {
     m_pShowSet->SelectCharacter( c );
 
-        setFavButtonState(OUString(&c, 1), aFont.GetFamilyName());
+    setFavButtonState(OUString(&c, 1), aFont.GetFamilyName());
 }
 
 
@@ -464,10 +471,17 @@ void SvxCharacterMap::init()
     m_pFontLB->SetSelectHdl( LINK( this, SvxCharacterMap, FontSelectHdl ) );
     m_pSubsetLB->SetSelectHdl( LINK( this, SvxCharacterMap, SubsetSelectHdl ) );
     m_pOKBtn->SetClickHdl( LINK( this, SvxCharacterMap, InsertClickHdl ) );
+
     m_pShowSet->SetDoubleClickHdl( LINK( this, SvxCharacterMap, CharDoubleClickHdl ) );
     m_pShowSet->SetSelectHdl( LINK( this, SvxCharacterMap, CharSelectHdl ) );
     m_pShowSet->SetHighlightHdl( LINK( this, SvxCharacterMap, CharHighlightHdl ) );
     m_pShowSet->SetPreSelectHdl( LINK( this, SvxCharacterMap, CharPreSelectHdl ) );
+
+    m_pSearchSet->SetDoubleClickHdl( LINK( this, SvxCharacterMap, SearchCharDoubleClickHdl ) );
+    m_pSearchSet->SetSelectHdl( LINK( this, SvxCharacterMap, SearchCharSelectHdl ) );
+    m_pSearchSet->SetHighlightHdl( LINK( this, SvxCharacterMap, SearchCharHighlightHdl ) );
+    m_pSearchSet->SetPreSelectHdl( LINK( this, SvxCharacterMap, SearchCharPreSelectHdl ) );
+
     m_pDecimalCodeText->SetModifyHdl( LINK( this, SvxCharacterMap, DecimalCodeChangeHdl ) );
     m_pHexCodeText->SetModifyHdl( LINK( this, SvxCharacterMap, HexCodeChangeHdl ) );
     m_pFavouritesBtn->SetClickHdl( LINK(this, SvxCharacterMap, FavSelectHdl));
@@ -506,6 +520,10 @@ void SvxCharacterMap::init()
     }
 
     setCharName(90);
+
+    m_pSearchText->SetGetFocusHdl(LINK( this, SvxCharacterMap, SearchFieldGetFocusHdl ));
+    m_pSearchText->SetUpdateDataHdl(LINK( this, SvxCharacterMap, SearchUpdateHdl ));
+    m_pSearchText->EnableUpdateData();
 }
 
 bool SvxCharacterMap::isFavChar(const OUString& sTitle, const OUString& rFont)
@@ -622,7 +640,13 @@ IMPL_LINK_NOARG(SvxCharacterMap, FontSelectHdl, ListBox&, void)
 
     // notify children using this font
     m_pShowSet->SetFont( aFont );
+    m_pSearchSet->SetFont( aFont );
     m_pShowChar->SetFont( aFont );
+    if(isSearchMode)
+    {
+        SearchUpdateHdl(*m_pSearchText);
+        SearchCharHighlightHdl(m_pSearchSet);
+    }
 
     // setup unicode subset listbar with font specific subsets,
     // hide unicode subset listbar for symbol fonts
@@ -659,6 +683,26 @@ IMPL_LINK_NOARG(SvxCharacterMap, FontSelectHdl, ListBox&, void)
     m_pSubsetLB->Enable(bNeedSubset);
 }
 
+void SvxCharacterMap::toggleSearchView(bool state)
+{
+    isSearchMode = state;
+    m_pHexCodeText->SetReadOnly(state);
+    m_pDecimalCodeText->SetReadOnly(state);
+    m_pSubsetLB->SetReadOnly(state);
+    m_pSubsetLB->Invalidate();
+
+    if(state)
+    {
+        m_pSearchSet->Show();
+        m_pShowSet->Hide();
+    }
+    else
+    {
+        m_pSearchSet->Hide();
+        m_pShowSet->Show();
+    }
+}
+
 void SvxCharacterMap::setCharName(sal_UCS4 nDecimalValue)
 {
     /* get the character name */
@@ -675,14 +719,29 @@ IMPL_LINK_NOARG(SvxCharacterMap, SubsetSelectHdl, ListBox&, void)
 {
     const sal_Int32 nPos = m_pSubsetLB->GetSelectEntryPos();
     const Subset* pSubset = static_cast<const Subset*> (m_pSubsetLB->GetEntryData(nPos));
-    if( pSubset )
+    if( pSubset && !isSearchMode)
     {
         sal_UCS4 cFirst = pSubset->GetRangeMin();
         m_pShowSet->SelectCharacter( cFirst );
 
         setFavButtonState(OUString(&cFirst, 1), aFont.GetFamilyName());
+        m_pSubsetLB->SelectEntryPos( nPos );
+    }
+    else if( pSubset && isSearchMode)
+    {
+        m_pSearchSet->SelectCharacter( pSubset );
+
+        const Subset* curSubset = nullptr;
+        if( pSubsetMap )
+            curSubset = pSubsetMap->GetSubsetByUnicode( m_pSearchSet->GetSelectCharacter() );
+        if( curSubset )
+            m_pSubsetLB->SelectEntry( curSubset->GetName() );
+        else
+            m_pSubsetLB->SetNoSelection();
+
+        sal_UCS4 sChar = m_pSearchSet->GetSelectCharacter();
+        setFavButtonState(OUString(&sChar, 1), aFont.GetFamilyName());
     }
-    m_pSubsetLB->SelectEntryPos( nPos );
 }
 
 IMPL_LINK(SvxCharacterMap, RecentClearClickHdl, SvxCharView*, rView, void)
@@ -760,6 +819,59 @@ IMPL_LINK_NOARG(SvxCharacterMap, FavClearAllClickHdl, SvxCharView*, void)
     updateFavCharControl();
 }
 
+IMPL_LINK_NOARG(SvxCharacterMap, SearchFieldGetFocusHdl, Control&, void)
+{
+    m_pOKBtn->Disable();
+}
+
+
+IMPL_LINK_NOARG(SvxCharacterMap, SearchUpdateHdl, Edit&, void)
+{
+    if(!m_pSearchText->GetText().isEmpty())
+    {
+        m_pSearchSet->ClearPreviousData();
+        OUString aKeyword = m_pSearchText->GetText();
+
+        toggleSearchView(true);
+
+        FontCharMapRef xFontCharMap(new FontCharMap());
+        m_pSearchSet->GetFontCharMap(xFontCharMap);
+
+        sal_UCS4 sChar = xFontCharMap->GetFirstChar();
+        while(sChar != xFontCharMap->GetLastChar())
+        {
+            UErrorCode errorCode = U_ZERO_ERROR;
+            char buffer[100];
+            u_charName(sChar, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &errorCode);
+            if (U_SUCCESS(errorCode))
+            {
+                OUString sName = OUString::createFromAscii(buffer);
+                if(!sName.isEmpty() && sName.toAsciiLowerCase().indexOf(aKeyword.toAsciiLowerCase()) >= 0)
+                    m_pSearchSet->AppendCharToList(sChar);
+            }
+            sChar = xFontCharMap->GetNextChar(sChar);
+        }
+        //for last char
+        UErrorCode errorCode = U_ZERO_ERROR;
+        char buffer[100];
+        u_charName(sChar, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &errorCode);
+        if (U_SUCCESS(errorCode))
+        {
+            OUString sName = OUString::createFromAscii(buffer);
+            if(!sName.isEmpty() && sName.toAsciiLowerCase().indexOf(aKeyword.toAsciiLowerCase()) >= 0)
+                m_pSearchSet->AppendCharToList(sChar);
+        }
+
+        m_pSearchSet->Resize();
+
+    }
+    else
+    {
+        toggleSearchView(false);
+    }
+}
+
+
 IMPL_LINK(SvxCharacterMap, CharClickHdl, SvxCharView*, rView, void)
 {
     m_pShowChar->SetText( rView->GetText() );
@@ -795,11 +907,25 @@ IMPL_LINK_NOARG(SvxCharacterMap, CharDoubleClickHdl, SvxShowCharSet*, void)
     insertCharToDoc(aOUStr);
 }
 
+IMPL_LINK_NOARG(SvxCharacterMap, SearchCharDoubleClickHdl, SvxShowCharSet*, void)
+{
+    sal_UCS4 cChar = m_pSearchSet->GetSelectCharacter();
+    // using the new UCS4 constructor
+    OUString aOUStr( &cChar, 1 );
+    setFavButtonState(aOUStr, aFont.GetFamilyName());
+    insertCharToDoc(aOUStr);
+}
+
 IMPL_LINK_NOARG(SvxCharacterMap, CharSelectHdl, SvxShowCharSet*, void)
 {
     m_pOKBtn->Enable();
 }
 
+IMPL_LINK_NOARG(SvxCharacterMap, SearchCharSelectHdl, SvxShowCharSet*, void)
+{
+    m_pOKBtn->Enable();
+}
+
 IMPL_LINK_NOARG(SvxCharacterMap, InsertClickHdl, Button*, void)
 {
    insertCharToDoc(m_pShowChar->GetText());
@@ -875,6 +1001,49 @@ IMPL_LINK_NOARG(SvxCharacterMap, CharHighlightHdl, SvxShowCharSet*, void)
         m_pDecimalCodeText->SetText( aDecimalText );
 }
 
+IMPL_LINK_NOARG(SvxCharacterMap, SearchCharHighlightHdl, SvxShowCharSet*, void)
+{
+    OUString aText;
+    OUString aHexText;
+    OUString aDecimalText;
+    sal_UCS4 cChar = m_pSearchSet->GetSelectCharacter();
+    bool bSelect = (cChar > 0);
+
+    // show char sample
+    if ( bSelect )
+    {
+        aText = OUString( &cChar, 1 );
+        // Get the hexadecimal code
+        aHexText = OUString::number(cChar, 16).toAsciiUpperCase();
+        // Get the decimal code
+        aDecimalText = OUString::number(cChar);
+        setCharName(cChar);
+
+        // Update the hex and decimal codes only if necessary
+        if (m_pHexCodeText->GetText() != aHexText)
+            m_pHexCodeText->SetText( aHexText );
+        if (m_pDecimalCodeText->GetText() != aDecimalText)
+            m_pDecimalCodeText->SetText( aDecimalText );
+
+        const Subset* pSubset = nullptr;
+        if( pSubsetMap )
+            pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
+        if( pSubset )
+            m_pSubsetLB->SelectEntry( pSubset->GetName() );
+        else
+            m_pSubsetLB->SetNoSelection();
+    }
+
+    if(m_pSearchSet->HasFocus())
+    {
+        m_pShowChar->SetText( aText );
+        m_pShowChar->SetFont( aFont );
+        m_pShowChar->Update();
+
+        setFavButtonState(aText, aFont.GetFamilyName());
+    }
+}
+
 void SvxCharacterMap::selectCharByCode(Radix radix)
 {
     OUString aCodeString;
@@ -923,6 +1092,23 @@ IMPL_LINK_NOARG(SvxCharacterMap, CharPreSelectHdl, SvxShowCharSet*, void)
     m_pOKBtn->Enable();
 }
 
+IMPL_LINK_NOARG(SvxCharacterMap, SearchCharPreSelectHdl, SvxShowCharSet*, void)
+{
+    // adjust subset selection
+    if( pSubsetMap )
+    {
+        sal_UCS4 cChar = m_pSearchSet->GetSelectCharacter();
+
+        setFavButtonState(OUString(&cChar, 1), aFont.GetFamilyName());
+        const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
+        if( pSubset )
+            m_pSubsetLB->SelectEntry( pSubset->GetName() );
+    }
+
+    m_pOKBtn->Enable();
+}
+
+
 
 // class SvxShowText =====================================================
 
diff --git a/cui/source/inc/cuicharmap.hxx b/cui/source/inc/cuicharmap.hxx
index 9f4f2e9a0fb2..e7c63c29429c 100644
--- a/cui/source/inc/cuicharmap.hxx
+++ b/cui/source/inc/cuicharmap.hxx
@@ -26,6 +26,7 @@
 #include <vcl/lstbox.hxx>
 #include <sfx2/basedlgs.hxx>
 #include <svx/charmap.hxx>
+#include <svx/searchcharmap.hxx>
 #include <sfx2/charwin.hxx>
 
 using namespace ::com::sun::star;
@@ -70,12 +71,14 @@ private:
     void            init();
 
     VclPtr<SvxShowCharSet> m_pShowSet;
+    VclPtr<SvxSearchCharSet> m_pSearchSet;
     VclPtr<PushButton>     m_pOKBtn;
     VclPtr<FixedText>      m_pFontText;
     VclPtr<ListBox>        m_pFontLB;
     VclPtr<FixedText>      m_pSubsetText;
     VclPtr<ListBox>        m_pSubsetLB;
     VclPtr<SvxShowText>    m_pShowChar;
+    VclPtr<Edit>           m_pSearchText;
     VclPtr<Edit>           m_pHexCodeText;
     VclPtr<Edit>           m_pDecimalCodeText;
     VclPtr<Button>         m_pFavouritesBtn;
@@ -83,8 +86,9 @@ private:
     VclPtr<SvxCharView>    m_pFavCharView[16];
     VclPtr<VclMultiLineEdit>      m_pCharName;
 
-    vcl::Font       aFont;
-    const SubsetMap* pSubsetMap;
+    vcl::Font           aFont;
+    const SubsetMap*    pSubsetMap;
+    bool                isSearchMode;
 
     std::deque<OUString> maRecentCharList;
     std::deque<OUString> maRecentCharFontList;
@@ -102,6 +106,10 @@ private:
     DECL_LINK(CharSelectHdl, SvxShowCharSet*, void);
     DECL_LINK(CharHighlightHdl, SvxShowCharSet*, void);
     DECL_LINK(CharPreSelectHdl, SvxShowCharSet*, void);
+    DECL_LINK(SearchCharDoubleClickHdl, SvxShowCharSet*,void);
+    DECL_LINK(SearchCharSelectHdl, SvxShowCharSet*, void);
+    DECL_LINK(SearchCharHighlightHdl, SvxShowCharSet*, void);
+    DECL_LINK(SearchCharPreSelectHdl, SvxShowCharSet*, void);
     DECL_LINK(DecimalCodeChangeHdl, Edit&, void);
     DECL_LINK(HexCodeChangeHdl, Edit&, void);
     DECL_LINK(CharClickHdl, SvxCharView*, void);
@@ -112,6 +120,8 @@ private:
     DECL_LINK(InsertClickHdl, Button*, void);
     DECL_STATIC_LINK(SvxCharacterMap, LoseFocusHdl, Control&, void);
     DECL_LINK(FavSelectHdl, Button*, void);
+    DECL_LINK(SearchUpdateHdl, Edit&, void);
+    DECL_LINK(SearchFieldGetFocusHdl, Control&, void);
 
     static void fillAllSubsets(ListBox &rListBox);
     void selectCharByCode(Radix radix);
@@ -145,6 +155,8 @@ public:
     void            setFavButtonState(const OUString& sTitle, const OUString& rFont);
 
     void            setCharName(sal_UCS4 nDecimalValue);
+
+    void            toggleSearchView(bool state);
 };
 
 #endif
diff --git a/cui/uiconfig/ui/specialcharacters.ui b/cui/uiconfig/ui/specialcharacters.ui
index b321dfc21185..f210b8a25551 100644
--- a/cui/uiconfig/ui/specialcharacters.ui
+++ b/cui/uiconfig/ui/specialcharacters.ui
@@ -86,36 +86,36 @@
                 <property name="hexpand">True</property>
                 <property name="column_spacing">12</property>
                 <child>
-                  <object class="GtkLabel" id="fontft">
+                  <object class="GtkLabel" id="subsetft">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes" context="specialcharacters|fontft">Font:</property>
+                    <property name="halign">start</property>
+                    <property name="label" translatable="yes" context="specialcharacters|subsetft">Subset:</property>
                     <property name="use_underline">True</property>
-                    <property name="mnemonic_widget">fontlb</property>
                   </object>
                   <packing>
-                    <property name="left_attach">0</property>
+                    <property name="left_attach">2</property>
                     <property name="top_attach">0</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkLabel" id="subsetft">
+                  <object class="GtkComboBox" id="fontlb">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes" context="specialcharacters|subsetft">Subset:</property>
-                    <property name="use_underline">True</property>
-                    <property name="mnemonic_widget">subsetlb</property>
+                    <property name="hexpand">True</property>
                   </object>
                   <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">0</property>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkComboBox" id="fontlb">
+                  <object class="GtkLabel" id="fontft">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="hexpand">True</property>
+                    <property name="halign">start</property>
+                    <property name="label" translatable="yes" context="specialcharacters|fontft">Font:</property>
+                    <property name="use_underline">True</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
@@ -129,10 +129,33 @@
                     <property name="hexpand">True</property>
                   </object>
                   <packing>
-                    <property name="left_attach">3</property>
+                    <property name="left_attach">2</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="srchft">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">start</property>
+                    <property name="label" translatable="yes">Search:</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
                     <property name="top_attach">0</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkEntry" id="search">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">0</property>
@@ -141,20 +164,6 @@
               </packing>
             </child>
             <child>
-              <object class="svxlo-SvxShowCharSet" id="showcharset">
-                <property name="width_request">580</property>
-                <property name="height_request">250</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="hexpand">True</property>
-                <property name="vexpand">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-              </packing>
-            </child>
-            <child>
               <object class="GtkGrid" id="grid3">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
@@ -745,6 +754,47 @@
                 <property name="width">2</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkBox" id="box6">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="svxlo-SvxShowCharSet" id="showcharset">
+                <property name="width_request">580</property>
+                <property name="height_request">250</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+              </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="svxlo-SvxSearchCharSet" id="searchcharset">
+                <property name="width_request">580</property>
+                <property name="height_request">250</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+              </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index 93b8d81ad22a..83d1bc211779 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -275,6 +275,9 @@
     <glade-widget-class title="Math Char Selection" name="svxlo-SvxShowCharSet"
                         generic-name="Math Char Selection" parent="GtkDrawingArea"
                         icon-name="widget-gtk-drawingarea"/>
+    <glade-widget-class title="Math Char Selection" name="svxlo-SvxSearchCharSet"
+                        generic-name="Math Char Selection" parent="GtkDrawingArea"
+                        icon-name="widget-gtk-drawingarea"/>
     <glade-widget-class title="Number Preview" name="cuilo-SvxNumberPreview"
                         generic-name="Number Preview Window" parent="GtkDrawingArea"
                         icon-name="widget-gtk-drawingarea"/>
diff --git a/include/svx/charmap.hxx b/include/svx/charmap.hxx
index ade653b697be..86c95fc0cad5 100644
--- a/include/svx/charmap.hxx
+++ b/include/svx/charmap.hxx
@@ -60,10 +60,10 @@ public:
     virtual void    dispose() override;
     virtual void    ApplySettings(vcl::RenderContext& rRenderContext) override;
 
-    void            RecalculateFont(vcl::RenderContext& rRenderContext);
+    virtual void            RecalculateFont(vcl::RenderContext& rRenderContext);
 
     void            SelectCharacter( sal_uInt32 cNew );
-    sal_UCS4        GetSelectCharacter() const;
+    virtual sal_UCS4        GetSelectCharacter() const;
 
     void            SetDoubleClickHdl( const Link<SvxShowCharSet*,void>& rLink ) { aDoubleClkHdl = rLink; }
     void            SetSelectHdl( const Link<SvxShowCharSet*,void>& rHdl ) { aSelectHdl = rHdl; }
@@ -72,11 +72,11 @@ public:
     static sal_uInt32& getSelectedChar();
     void            SetFont( const vcl::Font& rFont );
 
-    svx::SvxShowCharSetItem*    ImplGetItem( int _nPos );
+    virtual svx::SvxShowCharSetItem*    ImplGetItem( int _nPos );
     int                         FirstInView() const;
-    int                         LastInView() const;
+    virtual int                         LastInView() const;
     int                         PixelToMapIndex( const Point&) const;
-    void                        SelectIndex( int index, bool bFocus = false );
+    virtual void                        SelectIndex( int index, bool bFocus = false );
     void                        OutputIndex( int index );
     void                        DeSelect();
     bool                 IsSelected(sal_uInt16 _nPos) const { return _nPos == nSelectedIndex; }
@@ -86,7 +86,7 @@ public:
 
     ScrollBar&                  getScrollBar() { return *aVscrollSB.get();}
     void                        ReleaseAccessible();
-    sal_Int32                   getMaxCharCount() const;
+    virtual sal_Int32                   getMaxCharCount() const;
 
     virtual void    Resize() override;
 
@@ -106,7 +106,7 @@ protected:
 
     virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
 
-private:
+protected:
     typedef std::map<sal_Int32, std::shared_ptr<svx::SvxShowCharSetItem> > ItemsMap;
     ItemsMap        m_aItems;
     Link<SvxShowCharSet*,void>     aDoubleClkHdl;
@@ -131,8 +131,8 @@ private:
     bool mbUpdateBackground : 1;
 
 
-private:
-    void            DrawChars_Impl(vcl::RenderContext& rRenderContext, int n1, int n2);
+protected:
+    virtual void            DrawChars_Impl(vcl::RenderContext& rRenderContext, int n1, int n2);
     void            InitSettings(vcl::RenderContext& rRenderContext);
     // abstraction layers are: Unicode<->MapIndex<->Pixel
     Point           MapIndexToPixel( int) const;
diff --git a/include/svx/searchcharmap.hxx b/include/svx/searchcharmap.hxx
new file mode 100644
index 000000000000..bf66a1cf55fa
--- /dev/null
+++ b/include/svx/searchcharmap.hxx
@@ -0,0 +1,96 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef INCLUDED_SVX_SEARCHCHARMAP_HXX
+#define INCLUDED_SVX_SEARCHCHARMAP_HXX
+
+#include <map>
+#include <memory>
+
+#include <sal/types.h>
+#include <rtl/ref.hxx>
+#include <svx/svxdllapi.h>
+#include <svx/charmap.hxx>
+#include <tools/gen.hxx>
+#include <tools/link.hxx>
+#include <vcl/ctrl.hxx>
+#include <vcl/event.hxx>
+#include <vcl/outdev.hxx>
+#include <svx/ucsubset.hxx>
+#include <vcl/metric.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/window.hxx>
+#include <vector>
+#include <unordered_map>
+
+namespace com { namespace sun { namespace star {
+    namespace accessibility { class XAccessible; }
+} } }
+
+namespace vcl { class Font; }
+
+#define COLUMN_COUNT    16
+#define ROW_COUNT        8
+
+class CommandEvent;
+class ScrollBar;
+
+namespace svx
+{
+    struct SvxShowCharSetItem;
+    class SvxShowCharSetVirtualAcc;
+}
+
+class SVX_DLLPUBLIC SvxSearchCharSet : public SvxShowCharSet
+{
+public:
+    SvxSearchCharSet( vcl::Window* pParent );
+    virtual ~SvxSearchCharSet() override;
+    virtual void                        dispose() override;
+
+    virtual void                        RecalculateFont(vcl::RenderContext& rRenderContext) override;
+
+    void                                SelectCharacter( const Subset* sub);
+    virtual sal_UCS4                    GetSelectCharacter() const override;
+
+    virtual svx::SvxShowCharSetItem*    ImplGetItem( int _nPos ) override;
+    virtual int                         LastInView() const override;
+    virtual void                        SelectIndex( int index, bool bFocus = false ) override;
+    void                                AppendCharToList(sal_UCS4 cChar);
+    void                                AppendCharList(std::vector<sal_UCS4> cCharList);
+    void                                ClearPreviousData();
+
+    virtual sal_Int32                   getMaxCharCount() const override;
+
+protected:
+    virtual void    Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override;
+    virtual void    KeyInput( const KeyEvent& rKEvt ) override;
+
+private:
+    sal_Int32     nCount;
+
+    //index to char code mapping for the search
+    //to uniquely identify each appended element
+    std::unordered_map<sal_Int32, sal_UCS4> m_aItemList;
+private:
+    virtual void            DrawChars_Impl(vcl::RenderContext& rRenderContext, int n1, int n2) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svx/ucsubset.hxx b/include/svx/ucsubset.hxx
index 570913f3bd18..f5dc7847ab98 100644
--- a/include/svx/ucsubset.hxx
+++ b/include/svx/ucsubset.hxx
@@ -22,6 +22,7 @@
 
 #include <svx/svxdllapi.h>
 
+#include <unordered_map>
 #include <vcl/metric.hxx>
 
 #include <list>
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index d326ad7365eb..d1c310fe29af 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -108,6 +108,7 @@ $(eval $(call gb_Library_add_exception_objects,svx,\
     svx/source/customshapes/EnhancedCustomShapeHandle \
     svx/source/dialog/_bmpmask \
     svx/source/dialog/charmap \
+    svx/source/dialog/searchcharmap \
     svx/source/dialog/connctrl \
     svx/source/dialog/_contdlg \
     svx/source/dialog/contwnd \
diff --git a/svx/source/dialog/charmap.cxx b/svx/source/dialog/charmap.cxx
index 5f4d17043f30..4904de3ab689 100644
--- a/svx/source/dialog/charmap.cxx
+++ b/svx/source/dialog/charmap.cxx
@@ -25,6 +25,8 @@
 
 #include <rtl/textenc.h>
 #include <svx/ucsubset.hxx>
+#include <unordered_map>
+
 
 #include <svx/strings.hrc>
 
@@ -146,7 +148,7 @@ void SvxShowCharSet::MouseButtonDown( const MouseEvent& rMEvt )
             CaptureMouse();
 
             int nIndex = PixelToMapIndex( rMEvt.GetPosPixel() );
-        // Fire the focus event
+            // Fire the focus event
             SelectIndex( nIndex, true);
         }
 
@@ -231,7 +233,7 @@ int SvxShowCharSet::LastInView() const
 }
 
 
-inline Point SvxShowCharSet::MapIndexToPixel( int nIndex ) const
+Point SvxShowCharSet::MapIndexToPixel( int nIndex ) const
 {
     const int nBase = FirstInView();
     int x = ((nIndex - nBase) % COLUMN_COUNT) * nX;
@@ -650,7 +652,6 @@ void SvxShowCharSet::OutputIndex( int nNewIndex )
 {
     SelectIndex( nNewIndex, true );
     aSelectHdl.Call( this );
-
 }
 
 
@@ -763,9 +764,13 @@ SubsetMap::SubsetMap( const FontCharMapRef& rxFontCharMap )
 const Subset* SubsetMap::GetNextSubset( bool bFirst ) const
 {
     if( bFirst )
+    {
         maSubsetIterator = maSubsets.begin();
+    }
+
     if( maSubsetIterator == maSubsets.end() )
         return nullptr;
+
     const Subset* s = &*(maSubsetIterator++);
     return s;
 }
@@ -781,7 +786,8 @@ const Subset* SubsetMap::GetSubsetByUnicode( sal_UCS4 cChar ) const
 
 inline Subset::Subset(sal_UCS4 nMin, sal_UCS4 nMax, const OUString& rName)
 :   mnRangeMin(nMin), mnRangeMax(nMax), maRangeName(rName)
-{}
+{
+}
 
 void SubsetMap::InitList()
 {
diff --git a/svx/source/dialog/searchcharmap.cxx b/svx/source/dialog/searchcharmap.cxx
new file mode 100644
index 000000000000..2e4379440015
--- /dev/null
+++ b/svx/source/dialog/searchcharmap.cxx
@@ -0,0 +1,475 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/builderfactory.hxx>
+#include <vcl/fontcharmap.hxx>
+#include <svtools/colorcfg.hxx>
+
+#include <rtl/textenc.h>
+#include <svx/ucsubset.hxx>
+#include <unordered_map>
+
+
+#include <svx/strings.hrc>
+
+#include <svx/searchcharmap.hxx>
+#include <svx/dialmgr.hxx>
+#include <svx/svxdlg.hxx>
+
+#include "charmapacc.hxx"
+#include "uiobject.hxx"
+
+#include <com/sun/star/accessibility/AccessibleEventObject.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <comphelper/types.hxx>
+#include <svl/itemset.hxx>
+#include <unicode/uchar.h>
+#include "rtl/ustrbuf.hxx"
+
+using namespace ::com::sun::star::accessibility;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+
+SvxSearchCharSet::SvxSearchCharSet(vcl::Window* pParent)
+    : SvxShowCharSet(pParent),
+    nCount(0)
+{
+}
+
+VCL_BUILDER_FACTORY(SvxSearchCharSet)
+
+
+int SvxSearchCharSet::LastInView() const
+{
+    sal_uIntPtr nIndex = FirstInView();
+    nIndex += ROW_COUNT * COLUMN_COUNT - 1;
+    sal_uIntPtr nCompare = sal::static_int_cast<sal_uIntPtr>(nCount - 1);
+    if (nIndex > nCompare)
+        nIndex = nCompare;
+    return nIndex;
+}
+
+
+void SvxSearchCharSet::KeyInput(const KeyEvent& rKEvt)
+{
+    vcl::KeyCode aCode = rKEvt.GetKeyCode();
+
+    if (aCode.GetModifier())
+    {
+        Control::KeyInput(rKEvt);
+        return;
+    }
+
+    int tmpSelected = nSelectedIndex;
+
+    switch (aCode.GetCode())
+    {
+        case KEY_SPACE:
+            aSelectHdl.Call( this );
+            break;
+        case KEY_LEFT:
+            --tmpSelected;
+            break;
+        case KEY_RIGHT:
+            ++tmpSelected;
+            break;
+        case KEY_UP:
+            tmpSelected -= COLUMN_COUNT;
+            break;
+        case KEY_DOWN:
+            tmpSelected += COLUMN_COUNT;
+            break;
+        case KEY_PAGEUP:
+            tmpSelected -= ROW_COUNT * COLUMN_COUNT;
+            break;
+        case KEY_PAGEDOWN:
+            tmpSelected += ROW_COUNT * COLUMN_COUNT;
+            break;
+        case KEY_HOME:
+            tmpSelected = 0;
+            break;
+        case KEY_END:
+            tmpSelected = nCount - 1;
+            break;
+        case KEY_TAB:   // some fonts have a character at these unicode control codes
+        case KEY_ESCAPE:
+        case KEY_RETURN:
+            Control::KeyInput(rKEvt);
+            tmpSelected = - 1;  // mark as invalid
+            break;
+        default:
+            {
+                tmpSelected = -1;
+            }
+    }
+
+    if ( tmpSelected >= 0 )
+    {
+        SelectIndex( tmpSelected, true );
+        aPreSelectHdl.Call( this );
+    }
+}
+
+void SvxSearchCharSet::SelectCharacter( const Subset* sub )
+{
+    if ( !mxFontCharMap.is() )
+        RecalculateFont( *this );
+
+    // get next available char of current font
+    sal_UCS4 cChar = sub->GetRangeMin();
+    int nMapIndex = 0;
+
+    while(cChar <= sub->GetRangeMax() && nMapIndex == 0)
+    {
+        for(auto it = m_aItemList.begin(); it!= m_aItemList.end(); it++)
+            if(it->second == cChar)
+            {
+                nMapIndex = it->first;
+                break;
+            }
+        cChar++;
+    }
+
+    if(nMapIndex == 0)
+        SelectIndex( 0 );
+    else
+        SelectIndex( nMapIndex );
+    aHighHdl.Call(this);
+    // move selected item to top row if not in focusf
+    aVscrollSB->SetThumbPos( nMapIndex / COLUMN_COUNT );
+    Invalidate();
+}
+
+void SvxSearchCharSet::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& )
+{
+    InitSettings(rRenderContext);
+    RecalculateFont(rRenderContext);
+    DrawChars_Impl(rRenderContext, FirstInView(), LastInView());
+}
+
+void SvxSearchCharSet::DrawChars_Impl(vcl::RenderContext& rRenderContext, int n1, int n2)
+{
+    if (n1 > LastInView() || n2 < FirstInView())
+        return;
+
+    Size aOutputSize(GetOutputSizePixel());
+    if (aVscrollSB->IsVisible())
+        aOutputSize.Width() -= aVscrollSB->GetOptimalSize().Width();
+
+    int i;
+    for (i = 1; i < COLUMN_COUNT; ++i)
+    {
+        rRenderContext.DrawLine(Point(nX * i + m_nXGap, 0),
+                          Point(nX * i + m_nXGap, aOutputSize.Height()));
+    }
+    for (i = 1; i < ROW_COUNT; ++i)
+    {
+        rRenderContext.DrawLine(Point(0, nY * i + m_nYGap),
+                                Point(aOutputSize.Width(), nY * i + m_nYGap));
+    }
+    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+    const Color aWindowTextColor(rStyleSettings.GetFieldTextColor());
+    Color aHighlightColor(rStyleSettings.GetHighlightColor());
+    Color aHighlightTextColor(rStyleSettings.GetHighlightTextColor());
+    Color aFaceColor(rStyleSettings.GetFaceColor());
+    Color aLightColor(rStyleSettings.GetLightColor());
+    Color aShadowColor(rStyleSettings.GetShadowColor());
+
+    int nTextHeight = rRenderContext.GetTextHeight();
+    tools::Rectangle aBoundRect;
+    for (i = n1; i <= n2; ++i)
+    {
+        Point pix = MapIndexToPixel(i);
+        int x = pix.X();
+        int y = pix.Y();
+
+        OUStringBuffer buf;
+        std::unordered_map<sal_Int32, sal_UCS4>::const_iterator got = m_aItemList.find (i);
+        sal_UCS4 sName;
+
+        if(got == m_aItemList.end())
+            continue;
+        else
+            sName = got->second;
+
+        buf.appendUtf32(sName);
+        OUString aCharStr(buf.makeStringAndClear());
+        int nTextWidth = rRenderContext.GetTextWidth(aCharStr);
+        int tx = x + (nX - nTextWidth + 1) / 2;
+        int ty = y + (nY - nTextHeight + 1) / 2;
+        Point aPointTxTy(tx, ty);
+
+        // adjust position before it gets out of bounds
+        if (rRenderContext.GetTextBoundRect(aBoundRect, aCharStr) && !aBoundRect.IsEmpty())
+        {
+            // zero advance width => use ink width to center glyph
+            if (!nTextWidth)
+            {
+                aPointTxTy.X() = x - aBoundRect.Left() + (nX - aBoundRect.GetWidth() + 1) / 2;
+            }
+
+            aBoundRect += aPointTxTy;
+
+            // shift back vertically if needed
+            int nYLDelta = aBoundRect.Top() - y;
+            int nYHDelta = (y + nY) - aBoundRect.Bottom();
+            if (nYLDelta <= 0)
+                aPointTxTy.Y() -= nYLDelta - 1;
+            else if (nYHDelta <= 0)
+                aPointTxTy.Y() += nYHDelta - 1;
+
+            // shift back horizontally if needed
+            int nXLDelta = aBoundRect.Left() - x;
+            int nXHDelta = (x + nX) - aBoundRect.Right();
+            if (nXLDelta <= 0)
+                aPointTxTy.X() -= nXLDelta - 1;
+            else if (nXHDelta <= 0)
+                aPointTxTy.X() += nXHDelta - 1;
+        }
+
+        Color aTextCol = rRenderContext.GetTextColor();
+        if (i != nSelectedIndex)
+        {
+            rRenderContext.SetTextColor(aWindowTextColor);
+            rRenderContext.DrawText(aPointTxTy, aCharStr);
+        }
+        else
+        {
+            Color aLineCol = rRenderContext.GetLineColor();
+            Color aFillCol = rRenderContext.GetFillColor();
+            rRenderContext.SetLineColor();
+            Point aPointUL(x + 1, y + 1);
+            if (HasFocus())
+            {
+                rRenderContext.SetFillColor(aHighlightColor);
+                rRenderContext.DrawRect(getGridRectangle(aPointUL, aOutputSize));
+
+                rRenderContext.SetTextColor(aHighlightTextColor);
+                rRenderContext.DrawText(aPointTxTy, aCharStr);
+            }
+            else
+            {
+                rRenderContext.SetFillColor(aFaceColor);
+                rRenderContext.DrawRect(getGridRectangle(aPointUL, aOutputSize));
+
+                rRenderContext.SetLineColor(aLightColor);
+                rRenderContext.DrawLine(aPointUL, Point(x + nX - 1, y + 1));
+                rRenderContext.DrawLine(aPointUL, Point(x + 1, y + nY - 1));
+
+                rRenderContext.SetLineColor(aShadowColor);
+                rRenderContext.DrawLine(Point(x + 1, y + nY - 1), Point(x + nX - 1, y + nY - 1));
+                rRenderContext.DrawLine(Point(x + nX - 1, y + nY - 1), Point(x + nX - 1, y + 1));
+
+                rRenderContext.DrawText(aPointTxTy, aCharStr);
+            }
+            rRenderContext.SetLineColor(aLineCol);
+            rRenderContext.SetFillColor(aFillCol);
+        }
+        rRenderContext.SetTextColor(aTextCol);
+    }
+}
+
+sal_UCS4 SvxSearchCharSet::GetSelectCharacter() const
+{
+    if( nSelectedIndex >= 0 )
+    {
+        std::unordered_map<sal_Int32,sal_UCS4>::const_iterator got = m_aItemList.find (nSelectedIndex);
+
+        if(got == m_aItemList.end())
+            return 1;
+        else
+            return got->second;
+    }
+    return 1;
+}
+
+void SvxSearchCharSet::RecalculateFont(vcl::RenderContext& rRenderContext)
+{
+    if (!mbRecalculateFont)
+        return;
+
+    Size aSize(GetOutputSizePixel());
+    long nSBWidth = aVscrollSB->GetOptimalSize().Width();
+    aSize.Width() -= nSBWidth;
+
+    vcl::Font aFont = rRenderContext.GetFont();
+    aFont.SetWeight(WEIGHT_LIGHT);
+    aFont.SetAlignment(ALIGN_TOP);
+    int nFontHeight = (aSize.Height() - 5) * 2 / (3 * ROW_COUNT);
+    maFontSize = rRenderContext.PixelToLogic(Size(0, nFontHeight));
+    aFont.SetFontSize(maFontSize);
+    aFont.SetTransparent(true);
+    rRenderContext.SetFont(aFont);
+    rRenderContext.GetFontCharMap(mxFontCharMap);
+
+    nX = aSize.Width() / COLUMN_COUNT;
+    nY = aSize.Height() / ROW_COUNT;
+
+    //scrollbar settings -- error
+    aVscrollSB->setPosSizePixel(aSize.Width(), 0, nSBWidth, aSize.Height());
+    aVscrollSB->SetRangeMin(0);
+    int nLastRow = (nCount - 1 + COLUMN_COUNT) / COLUMN_COUNT;
+    aVscrollSB->SetRangeMax(nLastRow);
+    aVscrollSB->SetPageSize(ROW_COUNT - 1);
+    aVscrollSB->SetVisibleSize(ROW_COUNT);
+
+    aVscrollSB->Show();
+
+    // rearrange CharSet element in sync with nX- and nY-multiples
+    Size aDrawSize(nX * COLUMN_COUNT, nY * ROW_COUNT);
+    m_nXGap = (aSize.Width() - aDrawSize.Width()) / 2;
+    m_nYGap = (aSize.Height() - aDrawSize.Height()) / 2;
+
+    mbRecalculateFont = false;
+}
+
+void SvxSearchCharSet::SelectIndex( int nNewIndex, bool bFocus )
+{
+    if( !aVscrollSB )
+        return;
+
+    if ( !mxFontCharMap.is() )
+        RecalculateFont( *this );
+
+    if( nNewIndex < 0 )
+    {
+        aVscrollSB->SetThumbPos( 0 );
+        nSelectedIndex = bFocus ? 0 : -1;
+        Invalidate();
+    }
+    else if( nNewIndex < FirstInView() )
+    {
+        // need to scroll up to see selected item
+        int nOldPos = aVscrollSB->GetThumbPos();
+        int nDelta = (FirstInView() - nNewIndex + COLUMN_COUNT-1) / COLUMN_COUNT;
+        aVscrollSB->SetThumbPos( nOldPos - nDelta );
+        nSelectedIndex = nNewIndex;
+        Invalidate();
+    }
+    else if( nNewIndex > LastInView() )
+    {
+        // need to scroll down to see selected item
+        int nOldPos = aVscrollSB->GetThumbPos();
+        int nDelta = (nNewIndex - LastInView() + COLUMN_COUNT) / COLUMN_COUNT;
+        aVscrollSB->SetThumbPos( nOldPos + nDelta );
+        if( nNewIndex < nCount )
+        {
+            nSelectedIndex = nNewIndex;
+            Invalidate();
+        }
+        else if (nOldPos != aVscrollSB->GetThumbPos())
+        {
+            Invalidate();
+        }
+    }
+    else
+    {
+        nSelectedIndex = nNewIndex;
+        Invalidate();
+    }
+
+    if( nSelectedIndex >= 0 )
+    {
+        if( m_xAccessible.is() )
+        {
+            svx::SvxShowCharSetItem* pItem = ImplGetItem(nSelectedIndex);
+            // Don't fire the focus event.
+            if ( bFocus )
+                m_xAccessible->fireEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, Any(), makeAny(pItem->GetAccessible()) ); // this call assures that m_pItem is set
+            else
+                m_xAccessible->fireEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS, Any(), makeAny(pItem->GetAccessible()) ); // this call assures that m_pItem is set
+
+            assert(pItem->m_xItem.is() && "No accessible created!");
+            Any aOldAny, aNewAny;
+            aNewAny <<= AccessibleStateType::FOCUSED;
+            // Don't fire the focus event.
+            if ( bFocus )
+                pItem->m_xItem->fireEvent( AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
+
+            aNewAny <<= AccessibleStateType::SELECTED;
+            pItem->m_xItem->fireEvent( AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
+        }
+    }
+    aHighHdl.Call( this );
+}
+
+SvxSearchCharSet::~SvxSearchCharSet()
+{
+    disposeOnce();
+}
+
+void SvxSearchCharSet::dispose()
+{
+    m_aItemList.clear();
+
+    SvxShowCharSet::dispose();
+}
+
+svx::SvxShowCharSetItem* SvxSearchCharSet::ImplGetItem( int _nPos )
+{
+    ItemsMap::iterator aFind = m_aItems.find(_nPos);
+    if ( aFind == m_aItems.end() )
+    {
+        OSL_ENSURE(m_xAccessible.is(), "Who wants to create a child of my table without a parent?");
+        std::shared_ptr<svx::SvxShowCharSetItem> xItem(new svx::SvxShowCharSetItem(*this,
+            m_xAccessible->getTable(), sal::static_int_cast< sal_uInt16 >(_nPos)));
+        aFind = m_aItems.insert(ItemsMap::value_type(_nPos, xItem)).first;
+        OUStringBuffer buf;
+        std::unordered_map<sal_Int32,sal_UCS4>::const_iterator got = m_aItemList.find (_nPos);
+        buf.appendUtf32( got->second );
+        aFind->second->maText = buf.makeStringAndClear();
+        Point pix = MapIndexToPixel( _nPos );
+        aFind->second->maRect = tools::Rectangle( Point( pix.X() + 1, pix.Y() + 1 ), Size(nX-1,nY-1) );
+    }
+
+    return aFind->second.get();
+}
+
+sal_Int32 SvxSearchCharSet::getMaxCharCount() const
+{
+    return nCount;
+}
+
+void SvxSearchCharSet::ClearPreviousData()
+{
+    m_aItemList.clear();
+    nCount = 0;
+    Invalidate();
+}
+
+void SvxSearchCharSet::AppendCharToList(sal_UCS4 sChar)
+{
+    m_aItemList.insert(std::make_pair(nCount++, sChar));
+}
+
+void SvxSearchCharSet::AppendCharList(std::vector<sal_UCS4> sList)
+{
+    std::vector<sal_UCS4>::iterator list_iter = sList.begin();
+    while(list_iter != sList.end())
+    {
+        AppendCharToList(*list_iter);
+        list_iter++;
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list