summaryrefslogtreecommitdiff
path: root/cui
diff options
context:
space:
mode:
Diffstat (limited to 'cui')
-rw-r--r--cui/source/dialogs/cuicharmap.cxx192
-rw-r--r--cui/source/inc/cuicharmap.hxx16
-rw-r--r--cui/uiconfig/ui/specialcharacters.ui104
3 files changed, 280 insertions, 32 deletions
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>