summaryrefslogtreecommitdiff
path: root/cui/source/dialogs/cuicharmap.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/dialogs/cuicharmap.cxx')
-rw-r--r--cui/source/dialogs/cuicharmap.cxx1268
1 files changed, 0 insertions, 1268 deletions
diff --git a/cui/source/dialogs/cuicharmap.cxx b/cui/source/dialogs/cuicharmap.cxx
deleted file mode 100644
index c8bf07cc5794..000000000000
--- a/cui/source/dialogs/cuicharmap.cxx
+++ /dev/null
@@ -1,1268 +0,0 @@
-/* -*- 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 <stdio.h>
-
-#include <vcl/svapp.hxx>
-#include <svl/eitem.hxx>
-#include <svl/intitem.hxx>
-#include <svl/itempool.hxx>
-
-#include <rtl/textenc.h>
-#include <svx/ucsubset.hxx>
-#include <vcl/settings.hxx>
-#include <vcl/fontcharmap.hxx>
-#include <vcl/virdev.hxx>
-#include <svl/stritem.hxx>
-#include <o3tl/temporary.hxx>
-#include <officecfg/Office/Common.hxx>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <comphelper/processfactory.hxx>
-#include <comphelper/dispatchcommand.hxx>
-
-#include <dialmgr.hxx>
-#include <cui/cuicharmap.hxx>
-#include <sfx2/app.hxx>
-#include <svx/svxids.hrc>
-#include <editeng/editids.hrc>
-#include <editeng/fontitem.hxx>
-#include <strings.hrc>
-#include <unicode/uchar.h>
-#include <unicode/utypes.h>
-
-using namespace css;
-
-SvxCharacterMap::SvxCharacterMap(weld::Widget* pParent, const SfxItemSet* pSet,
- const css::uno::Reference<css::frame::XFrame>& rFrame)
- : SfxDialogController(pParent, "cui/ui/specialcharacters.ui", "SpecialCharactersDialog")
- , m_xVirDev(VclPtr<VirtualDevice>::Create())
- , isSearchMode(true)
- , m_xFrame(rFrame)
- , mxContext(comphelper::getProcessComponentContext())
- , m_aRecentCharView{SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev)}
- , m_aFavCharView{SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev),
- SvxCharView(m_xVirDev)}
- , m_aShowChar(m_xVirDev)
- , m_xOKBtn(m_xFrame.is() ? m_xBuilder->weld_button("insert") : m_xBuilder->weld_button("ok"))
- , m_xFontText(m_xBuilder->weld_label("fontft"))
- , m_xFontLB(m_xBuilder->weld_combo_box("fontlb"))
- , m_xSubsetText(m_xBuilder->weld_label("subsetft"))
- , m_xSubsetLB(m_xBuilder->weld_combo_box("subsetlb"))
- , m_xSearchText(m_xBuilder->weld_entry("search"))
- , m_xHexCodeText(m_xBuilder->weld_entry("hexvalue"))
- , m_xDecimalCodeText(m_xBuilder->weld_entry("decimalvalue"))
- , m_xFavouritesBtn(m_xBuilder->weld_button("favbtn"))
- , m_xCharName(m_xBuilder->weld_label("charname"))
- , m_xRecentGrid(m_xBuilder->weld_widget("viewgrid"))
- , m_xFavGrid(m_xBuilder->weld_widget("favgrid"))
- , m_xShowChar(new weld::CustomWeld(*m_xBuilder, "showchar", m_aShowChar))
- , m_xRecentCharView{std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar1", m_aRecentCharView[0]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar2", m_aRecentCharView[1]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar3", m_aRecentCharView[2]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar4", m_aRecentCharView[3]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar5", m_aRecentCharView[4]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar6", m_aRecentCharView[5]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar7", m_aRecentCharView[6]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar8", m_aRecentCharView[7]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar9", m_aRecentCharView[8]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar10", m_aRecentCharView[9]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar11", m_aRecentCharView[10]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar12", m_aRecentCharView[11]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar13", m_aRecentCharView[12]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar14", m_aRecentCharView[13]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar15", m_aRecentCharView[14]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "viewchar16", m_aRecentCharView[15])}
- , m_xFavCharView{std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar1", m_aFavCharView[0]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar2", m_aFavCharView[1]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar3", m_aFavCharView[2]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar4", m_aFavCharView[3]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar5", m_aFavCharView[4]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar6", m_aFavCharView[5]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar7", m_aFavCharView[6]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar8", m_aFavCharView[7]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar9", m_aFavCharView[8]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar10", m_aFavCharView[9]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar11", m_aFavCharView[10]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar12", m_aFavCharView[11]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar13", m_aFavCharView[12]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar14", m_aFavCharView[13]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar15", m_aFavCharView[14]),
- std::make_unique<weld::CustomWeld>(*m_xBuilder, "favchar16", m_aFavCharView[15])}
- , m_xShowSet(new SvxShowCharSet(m_xBuilder->weld_scrolled_window("showscroll", true), m_xVirDev))
- , m_xShowSetArea(new weld::CustomWeld(*m_xBuilder, "showcharset", *m_xShowSet))
- , m_xSearchSet(new SvxSearchCharSet(m_xBuilder->weld_scrolled_window("searchscroll", true), m_xVirDev))
- , m_xSearchSetArea(new weld::CustomWeld(*m_xBuilder, "searchcharset", *m_xSearchSet))
-{
- m_aShowChar.SetCentered(true);
- m_xFontLB->make_sorted();
- //lock the size request of this widget to the width of all possible entries
- fillAllSubsets(*m_xSubsetLB);
- m_xSubsetLB->set_size_request(m_xSubsetLB->get_preferred_size().Width(), -1);
- m_xCharName->set_size_request(m_aShowChar.get_preferred_size().Width(), m_xCharName->get_text_height() * 4);
- //lock the size request of this widget to the width of the original .ui string
- m_xHexCodeText->set_size_request(m_xHexCodeText->get_preferred_size().Width(), -1);
- //so things don't jump around if all the children are hidden
- m_xRecentGrid->set_size_request(-1, m_aRecentCharView[0].get_preferred_size().Height());
- m_xFavGrid->set_size_request(-1, m_aFavCharView[0].get_preferred_size().Height());
-
- init();
-
- const SfxInt32Item* pCharItem = SfxItemSet::GetItem<SfxInt32Item>(pSet, SID_ATTR_CHAR, false);
- if ( pCharItem )
- SetChar( pCharItem->GetValue() );
-
- const SfxBoolItem* pDisableItem = SfxItemSet::GetItem<SfxBoolItem>(pSet, FN_PARAM_2, false);
- if ( pDisableItem && pDisableItem->GetValue() )
- DisableFontSelection();
-
- const SvxFontItem* pFontItem = SfxItemSet::GetItem<SvxFontItem>(pSet, SID_ATTR_CHAR_FONT, false);
- const SfxStringItem* pFontNameItem = SfxItemSet::GetItem<SfxStringItem>(pSet, SID_FONT_NAME, false);
- if ( pFontItem )
- {
- vcl::Font aTmpFont( pFontItem->GetFamilyName(), pFontItem->GetStyleName(), GetCharFont().GetFontSize() );
- aTmpFont.SetCharSet( pFontItem->GetCharSet() );
- aTmpFont.SetPitch( pFontItem->GetPitch() );
- SetCharFont( aTmpFont );
- }
- else if ( pFontNameItem )
- {
- vcl::Font aTmpFont( GetCharFont() );
- aTmpFont.SetFamilyName( pFontNameItem->GetValue() );
- SetCharFont( aTmpFont );
- }
-
- m_xOutputSet.reset(new SfxAllItemSet(pSet ? *pSet->GetPool() : SfxGetpApp()->GetPool()));
- m_xShowSet->Show();
- m_xSearchSet->Hide();
-}
-
-short SvxCharacterMap::run()
-{
- if( SvxShowCharSet::getSelectedChar() == ' ')
- {
- m_xOKBtn->set_sensitive(false);
- setFavButtonState(u"", u"");
- }
- else
- {
- sal_UCS4 cChar = m_xShowSet->GetSelectCharacter();
- // using the new UCS4 constructor
- OUString aOUStr( &cChar, 1 );
- m_aShowChar.SetText(aOUStr);
-
- setFavButtonState(aOUStr, m_aShowChar.GetFont().GetFamilyName());
- m_xOKBtn->set_sensitive(true);
- }
-
- return SfxDialogController::run();
-}
-
-void SvxCharacterMap::SetChar( sal_UCS4 c )
-{
- m_xShowSet->SelectCharacter( c );
- setFavButtonState(OUString(&c, 1), aFont.GetFamilyName());
-}
-
-sal_UCS4 SvxCharacterMap::GetChar() const
-{
- return m_aShowChar.GetText().iterateCodePoints(&o3tl::temporary(sal_Int32(0)));
-}
-
-void SvxCharacterMap::DisableFontSelection()
-{
- m_xFontText->set_sensitive(false);
- m_xFontLB->set_sensitive(false);
-}
-
-
-void SvxCharacterMap::getRecentCharacterList()
-{
- //retrieve recent character list
- const css::uno::Sequence< OUString > rRecentCharList( officecfg::Office::Common::RecentCharacters::RecentCharacterList::get() );
- for (OUString const & s : rRecentCharList)
- {
- maRecentCharList.push_back(s);
- }
-
- //retrieve recent character font list
- const css::uno::Sequence< OUString > rRecentCharFontList( officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::get() );
- for (OUString const & s : rRecentCharFontList)
- {
- maRecentCharFontList.push_back(s);
- }
-
- // tdf#135997: make sure that the two lists are same length
- const auto nCommonLength = std::min(maRecentCharList.size(), maRecentCharFontList.size());
- maRecentCharList.resize(nCommonLength);
- maRecentCharFontList.resize(nCommonLength);
-}
-
-
-void SvxCharacterMap::getFavCharacterList()
-{
- maFavCharList.clear();
- maFavCharFontList.clear();
- //retrieve recent character list
- const css::uno::Sequence< OUString > rFavCharList( officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::get() );
- for (const OUString& s : rFavCharList)
- {
- maFavCharList.push_back(s);
- }
-
- //retrieve recent character font list
- const css::uno::Sequence< OUString > rFavCharFontList( officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::get() );
- for (const OUString& s : rFavCharFontList)
- {
- maFavCharFontList.push_back(s);
- }
-
- // tdf#135997: make sure that the two lists are same length
- const auto nCommonLength = std::min(maFavCharList.size(), maFavCharFontList.size());
- maFavCharList.resize(nCommonLength);
- maFavCharFontList.resize(nCommonLength);
-}
-
-static std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator>
-findInPair(std::u16string_view str1, const std::deque<OUString>& rContainer1,
- std::u16string_view str2, const std::deque<OUString>& rContainer2)
-{
- assert(rContainer1.size() == rContainer2.size());
-
- if (auto it1 = std::find(rContainer1.begin(), rContainer1.end(), str1);
- it1 != rContainer1.end())
- {
- auto it2 = rContainer2.begin() + (it1 - rContainer1.begin());
- if (*it2 == str2)
- return { it1, it2 };
- }
- return { rContainer1.end(), rContainer2.end() };
-}
-
-std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator>
-SvxCharacterMap::getRecentChar(std::u16string_view sTitle, std::u16string_view rFont) const
-{
- return findInPair(sTitle, maRecentCharList, rFont, maRecentCharFontList);
-}
-
-std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator>
-SvxCharacterMap::getFavChar(std::u16string_view sTitle, std::u16string_view rFont) const
-{
- return findInPair(sTitle, maFavCharList, rFont, maFavCharFontList);
-}
-
-
-void SvxCharacterMap::updateRecentCharControl()
-{
- assert(maRecentCharList.size() == maRecentCharFontList.size());
-
- int i = 0;
- for ( std::deque< OUString >::iterator it = maRecentCharList.begin(), it2 = maRecentCharFontList.begin();
- it != maRecentCharList.end() && it2 != maRecentCharFontList.end();
- ++it, ++it2, i++)
- {
- m_aRecentCharView[i].SetText(*it);
- vcl::Font rFont = m_aRecentCharView[i].GetFont();
- rFont.SetFamilyName( *it2 );
- m_aRecentCharView[i].SetFont(rFont);
- m_aRecentCharView[i].Show();
- }
-
- for(; i < 16 ; i++)
- {
- m_aRecentCharView[i].SetText(OUString());
- m_aRecentCharView[i].Hide();
- }
-}
-
-void SvxCharacterMap::updateRecentCharacterList(const OUString& sTitle, const OUString& rFont)
-{
- // if recent char to be added is already in list, remove it
- if( const auto& [itChar, itChar2] = getRecentChar(sTitle, rFont);
- itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() )
- {
- maRecentCharList.erase( itChar );
- maRecentCharFontList.erase( itChar2);
- }
-
- if (maRecentCharList.size() == 16)
- {
- maRecentCharList.pop_back();
- maRecentCharFontList.pop_back();
- }
-
- maRecentCharList.push_front(sTitle);
- maRecentCharFontList.push_front(rFont);
-
- css::uno::Sequence< OUString > aRecentCharList(maRecentCharList.size());
- css::uno::Sequence< OUString > aRecentCharFontList(maRecentCharFontList.size());
-
- for (size_t i = 0; i < maRecentCharList.size(); ++i)
- {
- aRecentCharList[i] = maRecentCharList[i];
- aRecentCharFontList[i] = maRecentCharFontList[i];
- }
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::RecentCharacters::RecentCharacterList::set(aRecentCharList, batch);
- officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::set(aRecentCharFontList, batch);
- batch->commit();
-
- updateRecentCharControl();
-}
-
-
-void SvxCharacterMap::updateFavCharacterList(const OUString& sTitle, const OUString& rFont)
-{
- // if Fav char to be added is already in list, remove it
- if( const auto& [itChar, itChar2] = getFavChar(sTitle, rFont);
- itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() )
- {
- maFavCharList.erase( itChar );
- maFavCharFontList.erase( itChar2);
- }
-
- if (maFavCharList.size() == 16)
- {
- maFavCharList.pop_back();
- maFavCharFontList.pop_back();
- }
-
- maFavCharList.push_back(sTitle);
- maFavCharFontList.push_back(rFont);
-
- css::uno::Sequence< OUString > aFavCharList(maFavCharList.size());
- css::uno::Sequence< OUString > aFavCharFontList(maFavCharFontList.size());
-
- for (size_t i = 0; i < maFavCharList.size(); ++i)
- {
- aFavCharList[i] = maFavCharList[i];
- aFavCharFontList[i] = maFavCharFontList[i];
- }
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::set(aFavCharList, batch);
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::set(aFavCharFontList, batch);
- batch->commit();
-}
-
-
-void SvxCharacterMap::updateFavCharControl()
-{
- assert(maFavCharList.size() == maFavCharFontList.size());
-
- int i = 0;
- for ( std::deque< OUString >::iterator it = maFavCharList.begin(), it2 = maFavCharFontList.begin();
- it != maFavCharList.end() && it2 != maFavCharFontList.end();
- ++it, ++it2, i++)
- {
- m_aFavCharView[i].SetText(*it);
- vcl::Font rFont = m_aFavCharView[i].GetFont();
- rFont.SetFamilyName( *it2 );
- m_aFavCharView[i].SetFont(rFont);
- m_aFavCharView[i].Show();
- }
-
- for(; i < 16 ; i++)
- {
- m_aFavCharView[i].SetText(OUString());
- m_aFavCharView[i].Hide();
- }
- m_xShowSet->getFavCharacterList();
- m_xSearchSet->getFavCharacterList();
-}
-
-void SvxCharacterMap::deleteFavCharacterFromList(std::u16string_view sTitle, std::u16string_view rFont)
-{
- // if Fav char is found, remove it
- if( const auto& [itChar, itChar2] = getFavChar(sTitle, rFont);
- itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() )
- {
- maFavCharList.erase( itChar );
- maFavCharFontList.erase( itChar2);
- }
-
- css::uno::Sequence< OUString > aFavCharList(maFavCharList.size());
- css::uno::Sequence< OUString > aFavCharFontList(maFavCharFontList.size());
-
- for (size_t i = 0; i < maFavCharList.size(); ++i)
- {
- aFavCharList[i] = maFavCharList[i];
- aFavCharFontList[i] = maFavCharFontList[i];
- }
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::set(aFavCharList, batch);
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::set(aFavCharFontList, batch);
- batch->commit();
-}
-
-void SvxCharacterMap::init()
-{
- aFont = m_xVirDev->GetFont();
- aFont.SetTransparent( true );
- aFont.SetFamily( FAMILY_DONTKNOW );
- aFont.SetPitch( PITCH_DONTKNOW );
- aFont.SetCharSet( RTL_TEXTENCODING_DONTKNOW );
-
- OUString aDefStr( aFont.GetFamilyName() );
- OUString aLastName;
- int nCount = m_xVirDev->GetDevFontCount();
- std::vector<weld::ComboBoxEntry> aEntries;
- aEntries.reserve(nCount);
- for (int i = 0; i < nCount; ++i)
- {
- OUString aFontName( m_xVirDev->GetDevFont( i ).GetFamilyName() );
- if (aFontName != aLastName)
- {
- aLastName = aFontName;
- aEntries.emplace_back(aFontName, OUString::number(i));
- }
- }
- m_xFontLB->insert_vector(aEntries, true);
- // the font may not be in the list =>
- // try to find a font name token in list and select found font,
- // else select topmost entry
- bool bFound = (m_xFontLB->find_text(aDefStr) == -1);
- if (!bFound)
- {
- sal_Int32 nIndex = 0;
- do
- {
- OUString aToken = aDefStr.getToken(0, ';', nIndex);
- if (m_xFontLB->find_text(aToken) != -1)
- {
- aDefStr = aToken;
- bFound = true;
- break;
- }
- }
- while ( nIndex >= 0 );
- }
-
- if (bFound)
- m_xFontLB->set_active_text(aDefStr);
- else if (m_xFontLB->get_count() )
- m_xFontLB->set_active(0);
- FontSelectHdl(*m_xFontLB);
- if (m_xSubsetLB->get_count())
- m_xSubsetLB->set_active(0);
-
- m_xFontLB->connect_changed(LINK( this, SvxCharacterMap, FontSelectHdl));
- m_xSubsetLB->connect_changed(LINK( this, SvxCharacterMap, SubsetSelectHdl));
- m_xOKBtn->connect_clicked(LINK(this, SvxCharacterMap, InsertClickHdl));
- m_xOKBtn->show();
-
- m_xShowSet->SetDoubleClickHdl( LINK( this, SvxCharacterMap, CharDoubleClickHdl ) );
- m_xShowSet->SetSelectHdl( LINK( this, SvxCharacterMap, CharSelectHdl ) );
- m_xShowSet->SetHighlightHdl( LINK( this, SvxCharacterMap, CharHighlightHdl ) );
- m_xShowSet->SetPreSelectHdl( LINK( this, SvxCharacterMap, CharPreSelectHdl ) );
- m_xShowSet->SetFavClickHdl( LINK( this, SvxCharacterMap, FavClickHdl ) );
-
- m_xSearchSet->SetDoubleClickHdl( LINK( this, SvxCharacterMap, SearchCharDoubleClickHdl ) );
- m_xSearchSet->SetSelectHdl( LINK( this, SvxCharacterMap, SearchCharSelectHdl ) );
- m_xSearchSet->SetHighlightHdl( LINK( this, SvxCharacterMap, SearchCharHighlightHdl ) );
- m_xSearchSet->SetPreSelectHdl( LINK( this, SvxCharacterMap, SearchCharPreSelectHdl ) );
- m_xSearchSet->SetFavClickHdl( LINK( this, SvxCharacterMap, FavClickHdl ) );
-
- m_xDecimalCodeText->connect_changed( LINK( this, SvxCharacterMap, DecimalCodeChangeHdl ) );
- m_xHexCodeText->connect_changed( LINK( this, SvxCharacterMap, HexCodeChangeHdl ) );
- m_xFavouritesBtn->connect_clicked( LINK(this, SvxCharacterMap, FavSelectHdl));
-
- // tdf#117038 set the buttons width to its max possible width so it doesn't
- // make layout change when the label changes
- m_xFavouritesBtn->set_label(CuiResId(RID_SVXSTR_REMOVE_FAVORITES));
- auto nMaxWidth = m_xFavouritesBtn->get_preferred_size().Width();
- m_xFavouritesBtn->set_label(CuiResId(RID_SVXSTR_ADD_FAVORITES));
- nMaxWidth = std::max(nMaxWidth, m_xFavouritesBtn->get_preferred_size().Width());
- m_xFavouritesBtn->set_size_request(nMaxWidth, -1);
-
- if( SvxShowCharSet::getSelectedChar() == ' ')
- {
- m_xOKBtn->set_sensitive(false);
- }
- else
- {
- sal_UCS4 cChar = m_xShowSet->GetSelectCharacter();
- // using the new UCS4 constructor
- OUString aOUStr( &cChar, 1 );
- m_aShowChar.SetText(aOUStr);
-
- setFavButtonState(aOUStr, aDefStr);
- m_xOKBtn->set_sensitive(true);
- }
-
- getRecentCharacterList();
- updateRecentCharControl();
-
- getFavCharacterList();
- updateFavCharControl();
-
- bool bHasInsert = m_xFrame.is();
-
- for(int i = 0; i < 16; i++)
- {
- m_aRecentCharView[i].SetHasInsert(bHasInsert);
- m_aRecentCharView[i].setMouseClickHdl(LINK(this,SvxCharacterMap, CharClickHdl));
- m_aRecentCharView[i].setClearClickHdl(LINK(this,SvxCharacterMap, RecentClearClickHdl));
- m_aRecentCharView[i].setClearAllClickHdl(LINK(this,SvxCharacterMap, RecentClearAllClickHdl));
- m_aFavCharView[i].SetHasInsert(bHasInsert);
- m_aFavCharView[i].setMouseClickHdl(LINK(this,SvxCharacterMap, CharClickHdl));
- m_aFavCharView[i].setClearClickHdl(LINK(this,SvxCharacterMap, FavClearClickHdl));
- m_aFavCharView[i].setClearAllClickHdl(LINK(this,SvxCharacterMap, FavClearAllClickHdl));
- }
-
- setCharName(90);
-
- m_xSearchText->connect_focus_in(LINK( this, SvxCharacterMap, SearchFieldGetFocusHdl ));
- m_xSearchText->connect_changed(LINK(this, SvxCharacterMap, SearchUpdateHdl));
-}
-
-bool SvxCharacterMap::isFavChar(std::u16string_view sTitle, std::u16string_view rFont)
-{
- const auto& [itChar, itFont] = getFavChar(sTitle, rFont);
- return itChar != maFavCharList.end() && itFont != maFavCharFontList.end();
-}
-
-
-void SvxCharacterMap::setFavButtonState(std::u16string_view sTitle, std::u16string_view rFont)
-{
- if(sTitle.empty() || rFont.empty())
- {
- m_xFavouritesBtn->set_sensitive(false);
- return;
- }
- else
- m_xFavouritesBtn->set_sensitive(true);
-
- if (isFavChar(sTitle, rFont))
- {
- m_xFavouritesBtn->set_label(CuiResId(RID_SVXSTR_REMOVE_FAVORITES));
- }
- else
- {
- if(maFavCharList.size() == 16)
- {
- m_xFavouritesBtn->set_sensitive(false);
- }
-
- m_xFavouritesBtn->set_label(CuiResId(RID_SVXSTR_ADD_FAVORITES));
- }
-}
-
-
-void SvxCharacterMap::SetCharFont( const vcl::Font& rFont )
-{
- // first get the underlying info in order to get font names
- // like "Times New Roman;Times" resolved
- vcl::Font aTmp(m_xVirDev->GetFontMetric(rFont));
-
- if (aTmp.GetFamilyName() == "StarSymbol" && m_xFontLB->find_text(aTmp.GetFamilyName()) == -1)
- {
- //if for some reason, like font in an old document, StarSymbol is requested and it's not available, then
- //try OpenSymbol instead
- aTmp.SetFamilyName("OpenSymbol");
- }
-
- if (m_xFontLB->find_text(aTmp.GetFamilyName()) == -1)
- return;
-
- m_xFontLB->set_active_text(aTmp.GetFamilyName());
- aFont = aTmp;
- FontSelectHdl(*m_xFontLB);
- if (m_xSubsetLB->get_count())
- m_xSubsetLB->set_active(0);
-}
-
-void SvxCharacterMap::fillAllSubsets(weld::ComboBox& rListBox)
-{
- SubsetMap aAll(nullptr);
- std::vector<weld::ComboBoxEntry> aEntries;
- for (auto & subset : aAll.GetSubsetMap())
- aEntries.emplace_back(subset.GetName());
- rListBox.insert_vector(aEntries, true);
-}
-
-void SvxCharacterMap::insertCharToDoc(const OUString& sGlyph)
-{
- if(sGlyph.isEmpty())
- return;
-
- if (m_xFrame.is()) {
- uno::Sequence<beans::PropertyValue> aArgs(2);
- aArgs[0].Name = "Symbols";
- aArgs[0].Value <<= sGlyph;
-
- aArgs[1].Name = "FontName";
- aArgs[1].Value <<= aFont.GetFamilyName();
- comphelper::dispatchCommand(".uno:InsertSymbol", m_xFrame, aArgs);
-
- updateRecentCharacterList(sGlyph, aFont.GetFamilyName());
-
- } else {
- sal_UCS4 cChar = sGlyph.iterateCodePoints(&o3tl::temporary(sal_Int32(0)));
- const SfxItemPool* pPool = m_xOutputSet->GetPool();
- m_xOutputSet->Put( SfxStringItem( pPool->GetWhich(SID_CHARMAP), sGlyph ) );
- m_xOutputSet->Put( SvxFontItem( aFont.GetFamilyType(), aFont.GetFamilyName(),
- aFont.GetStyleName(), aFont.GetPitch(), aFont.GetCharSet(), pPool->GetWhich(SID_ATTR_CHAR_FONT) ) );
- m_xOutputSet->Put( SfxStringItem( pPool->GetWhich(SID_FONT_NAME), aFont.GetFamilyName() ) );
- m_xOutputSet->Put( SfxInt32Item( pPool->GetWhich(SID_ATTR_CHAR), cChar ) );
- }
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, FontSelectHdl, weld::ComboBox&, void)
-{
- const sal_uInt32 nFont = m_xFontLB->get_active_id().toUInt32();
- aFont = m_xVirDev->GetDevFont(nFont);
- aFont.SetWeight( WEIGHT_DONTKNOW );
- aFont.SetItalic( ITALIC_NONE );
- aFont.SetWidthType( WIDTH_DONTKNOW );
- aFont.SetPitch( PITCH_DONTKNOW );
- aFont.SetFamily( FAMILY_DONTKNOW );
-
- // notify children using this font
- m_xShowSet->SetFont( aFont );
- m_xSearchSet->SetFont( aFont );
- m_aShowChar.SetFont( aFont );
-
- // setup unicode subset listbar with font specific subsets,
- // hide unicode subset listbar for symbol fonts
- // TODO: get info from the Font once it provides it
- pSubsetMap.reset();
- m_xSubsetLB->clear();
-
- bool bNeedSubset = (aFont.GetCharSet() != RTL_TEXTENCODING_SYMBOL);
- if (bNeedSubset)
- {
- FontCharMapRef xFontCharMap = m_xShowSet->GetFontCharMap();
- pSubsetMap.reset(new SubsetMap( xFontCharMap ));
-
- // update subset listbox for new font's unicode subsets
- for (auto const& subset : pSubsetMap->GetSubsetMap())
- {
- m_xSubsetLB->append(OUString::number(reinterpret_cast<sal_uInt64>(&subset)), subset.GetName());
- // NOTE: subset must live at least as long as the selected font
- }
-
- if (m_xSubsetLB->get_count() <= 1)
- bNeedSubset = false;
- }
-
- m_xSubsetText->set_sensitive(bNeedSubset);
- m_xSubsetLB->set_sensitive(bNeedSubset);
-
- if (isSearchMode)
- {
- // tdf#137294 do this after modifying m_xSubsetLB sensitivity to
- // restore insensitive for the search case
- SearchUpdateHdl(*m_xSearchText);
- SearchCharHighlightHdl(m_xSearchSet.get());
- }
-
- // tdf#118304 reselect current glyph to see if its still there in new font
- selectCharByCode(Radix::hexadecimal);
-}
-
-void SvxCharacterMap::toggleSearchView(bool state)
-{
- isSearchMode = state;
- m_xHexCodeText->set_editable(!state);
- m_xDecimalCodeText->set_editable(!state);
- m_xSubsetLB->set_sensitive(!state);
-
- if(state)
- {
- m_xSearchSet->Show();
- m_xShowSet->Hide();
- }
- else
- {
- m_xSearchSet->Hide();
- m_xShowSet->Show();
- }
-}
-
-void SvxCharacterMap::setCharName(sal_UCS4 nDecimalValue)
-{
- /* get the character name */
- UErrorCode errorCode = U_ZERO_ERROR;
- // icu has a private uprv_getMaxCharNameLength function which returns the max possible
- // length of this property. Unicode 3.2 max char name length was 83
- char buffer[100];
- u_charName(nDecimalValue, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &errorCode);
- if (U_SUCCESS(errorCode))
- m_xCharName->set_label(OUString::createFromAscii(buffer));
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SubsetSelectHdl, weld::ComboBox&, void)
-{
- const sal_Int32 nPos = m_xSubsetLB->get_active();
- const Subset* pSubset = reinterpret_cast<const Subset*>(m_xSubsetLB->get_active_id().toUInt64());
-
- if( pSubset && !isSearchMode)
- {
- sal_UCS4 cFirst = pSubset->GetRangeMin();
- m_xShowSet->SelectCharacter( cFirst );
-
- setFavButtonState(OUString(&cFirst, 1), aFont.GetFamilyName());
- m_xSubsetLB->set_active(nPos);
- }
- else if( pSubset && isSearchMode)
- {
- m_xSearchSet->SelectCharacter( pSubset );
-
- const Subset* curSubset = nullptr;
- if( pSubsetMap )
- curSubset = pSubsetMap->GetSubsetByUnicode( m_xSearchSet->GetSelectCharacter() );
- if( curSubset )
- m_xSubsetLB->set_active_text(curSubset->GetName());
- else
- m_xSubsetLB->set_active(-1);
-
- sal_UCS4 sChar = m_xSearchSet->GetSelectCharacter();
- setFavButtonState(OUString(&sChar, 1), aFont.GetFamilyName());
- }
-}
-
-IMPL_LINK(SvxCharacterMap, RecentClearClickHdl, SvxCharView*, rView, void)
-{
- const OUString& sTitle = rView->GetText();
- OUString sFont = rView->GetFont().GetFamilyName();
-
- // if recent char to be added is already in list, remove it
- if( const auto& [itChar, itChar2] = getRecentChar(sTitle, sFont);
- itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() )
- {
- maRecentCharList.erase( itChar );
- maRecentCharFontList.erase( itChar2);
- }
-
- css::uno::Sequence< OUString > aRecentCharList(maRecentCharList.size());
- css::uno::Sequence< OUString > aRecentCharFontList(maRecentCharFontList.size());
-
- for (size_t i = 0; i < maRecentCharList.size(); ++i)
- {
- aRecentCharList[i] = maRecentCharList[i];
- aRecentCharFontList[i] = maRecentCharFontList[i];
- }
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::RecentCharacters::RecentCharacterList::set(aRecentCharList, batch);
- officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::set(aRecentCharFontList, batch);
- batch->commit();
-
- updateRecentCharControl();
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, RecentClearAllClickHdl, SvxCharView*, void)
-{
- css::uno::Sequence< OUString > aRecentCharList(0);
- css::uno::Sequence< OUString > aRecentCharFontList(0);
-
- maRecentCharList.clear();
- maRecentCharFontList.clear();
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::RecentCharacters::RecentCharacterList::set(aRecentCharList, batch);
- officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::set(aRecentCharFontList, batch);
- batch->commit();
-
- updateRecentCharControl();
-}
-
-IMPL_LINK(SvxCharacterMap, FavClearClickHdl, SvxCharView*, rView, void)
-{
- deleteFavCharacterFromList(rView->GetText(), rView->GetFont().GetFamilyName());
- updateFavCharControl();
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, FavClearAllClickHdl, SvxCharView*, void)
-{
- css::uno::Sequence< OUString > aFavCharList(0);
- css::uno::Sequence< OUString > aFavCharFontList(0);
-
- maFavCharList.clear();
- maFavCharFontList.clear();
-
- std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::set(aFavCharList, batch);
- officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::set(aFavCharFontList, batch);
- batch->commit();
-
- updateFavCharControl();
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchFieldGetFocusHdl, weld::Widget&, void)
-{
- m_xOKBtn->set_sensitive(false);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchUpdateHdl, weld::Entry&, void)
-{
- if (!m_xSearchText->get_text().isEmpty())
- {
- m_xSearchSet->ClearPreviousData();
- OUString aKeyword = m_xSearchText->get_text();
-
- toggleSearchView(true);
-
- FontCharMapRef xFontCharMap = m_xSearchSet->GetFontCharMap();
-
- 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_xSearchSet->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_xSearchSet->AppendCharToList(sChar);
- }
- }
- else
- {
- toggleSearchView(false);
- }
-}
-
-
-IMPL_LINK(SvxCharacterMap, CharClickHdl, SvxCharView*, rView, void)
-{
- rView->GrabFocus();
-
- m_aShowChar.SetText( rView->GetText() );
- m_aShowChar.SetFont(rView->GetFont());
- m_aShowChar.Invalidate();
-
- setFavButtonState(rView->GetText(), rView->GetFont().GetFamilyName());//check state
-
- // Get the hexadecimal code
- OUString charValue = rView->GetText();
- sal_UCS4 cChar = charValue.iterateCodePoints(&o3tl::temporary(sal_Int32(1)), -1);
- OUString aHexText = OUString::number(cChar, 16).toAsciiUpperCase();
-
- // Get the decimal code
- OUString aDecimalText = OUString::number(cChar);
-
- m_xHexCodeText->set_text(aHexText);
- m_xDecimalCodeText->set_text(aDecimalText);
- setCharName(cChar);
-
- rView->Invalidate();
- m_xOKBtn->set_sensitive(true);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, CharDoubleClickHdl, SvxShowCharSet*, void)
-{
- sal_UCS4 cChar = m_xShowSet->GetSelectCharacter();
- // using the new UCS4 constructor
- OUString aOUStr( &cChar, 1 );
- setFavButtonState(aOUStr, aFont.GetFamilyName());
- insertCharToDoc(aOUStr);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchCharDoubleClickHdl, SvxShowCharSet*, void)
-{
- sal_UCS4 cChar = m_xSearchSet->GetSelectCharacter();
- // using the new UCS4 constructor
- OUString aOUStr( &cChar, 1 );
- setFavButtonState(aOUStr, aFont.GetFamilyName());
- insertCharToDoc(aOUStr);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, CharSelectHdl, SvxShowCharSet*, void)
-{
- m_xOKBtn->set_sensitive(true);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchCharSelectHdl, SvxShowCharSet*, void)
-{
- m_xOKBtn->set_sensitive(true);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, InsertClickHdl, weld::Button&, void)
-{
- OUString sChar = m_aShowChar.GetText();
- insertCharToDoc(sChar);
- // Need to update recent character list, when OK button does not insert
- if(!m_xFrame.is())
- updateRecentCharacterList(sChar, aFont.GetFamilyName());
- m_xDialog->response(RET_OK);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, FavSelectHdl, weld::Button&, void)
-{
- if (m_xFavouritesBtn->get_label().match(CuiResId(RID_SVXSTR_ADD_FAVORITES)))
- {
- updateFavCharacterList(m_aShowChar.GetText(), m_aShowChar.GetFont().GetFamilyName());
- setFavButtonState(m_aShowChar.GetText(), m_aShowChar.GetFont().GetFamilyName());
- }
- else
- {
- deleteFavCharacterFromList(m_aShowChar.GetText(), m_aShowChar.GetFont().GetFamilyName());
- m_xFavouritesBtn->set_label(CuiResId(RID_SVXSTR_ADD_FAVORITES));
- m_xFavouritesBtn->set_sensitive(false);
- }
-
- updateFavCharControl();
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, FavClickHdl, SvxShowCharSet*, void)
-{
- getFavCharacterList();
- updateFavCharControl();
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, CharHighlightHdl, SvxShowCharSet*, void)
-{
- OUString aText;
- sal_UCS4 cChar = m_xShowSet->GetSelectCharacter();
- bool bSelect = (cChar > 0);
-
- // show char sample
- if ( bSelect )
- {
- // using the new UCS4 constructor
- aText = OUString( &cChar, 1 );
- // Get the hexadecimal code
- OUString aHexText = OUString::number(cChar, 16).toAsciiUpperCase();
- // Get the decimal code
- OUString aDecimalText = OUString::number(cChar);
- setCharName(cChar);
-
- // Update the hex and decimal codes only if necessary
- if (!m_xHexCodeText->get_text().equalsIgnoreAsciiCase(aHexText))
- m_xHexCodeText->set_text(aHexText);
- if (m_xDecimalCodeText->get_text() != aDecimalText)
- m_xDecimalCodeText->set_text( aDecimalText );
-
- const Subset* pSubset = nullptr;
- if( pSubsetMap )
- pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
- if( pSubset )
- m_xSubsetLB->set_active_text(pSubset->GetName());
- else
- m_xSubsetLB->set_active(-1);
- }
-
- m_aShowChar.SetText( aText );
- m_aShowChar.SetFont( aFont );
- m_aShowChar.Invalidate();
-
- setFavButtonState(aText, aFont.GetFamilyName());
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchCharHighlightHdl, SvxShowCharSet*, void)
-{
- OUString aText;
- sal_UCS4 cChar = m_xSearchSet->GetSelectCharacter();
- bool bSelect = (cChar > 0);
-
- // show char sample
- if ( bSelect )
- {
- aText = OUString( &cChar, 1 );
- // Get the hexadecimal code
- OUString aHexText = OUString::number(cChar, 16).toAsciiUpperCase();
- // Get the decimal code
- OUString aDecimalText = OUString::number(cChar);
- setCharName(cChar);
-
- // Update the hex and decimal codes only if necessary
- if (!m_xHexCodeText->get_text().equalsIgnoreAsciiCase(aHexText))
- m_xHexCodeText->set_text(aHexText);
- if (m_xDecimalCodeText->get_text() != aDecimalText)
- m_xDecimalCodeText->set_text( aDecimalText );
-
- const Subset* pSubset = nullptr;
- if( pSubsetMap )
- pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
- if( pSubset )
- m_xSubsetLB->set_active_text(pSubset->GetName());
- else
- m_xSubsetLB->set_active(-1);
- }
-
- if(m_xSearchSet->HasFocus())
- {
- m_aShowChar.SetText( aText );
- m_aShowChar.SetFont( aFont );
- m_aShowChar.Invalidate();
-
- setFavButtonState(aText, aFont.GetFamilyName());
- }
-}
-
-void SvxCharacterMap::selectCharByCode(Radix radix)
-{
- OUString aCodeString;
- switch(radix)
- {
- case Radix::decimal:
- aCodeString = m_xDecimalCodeText->get_text();
- break;
- case Radix::hexadecimal:
- aCodeString = m_xHexCodeText->get_text();
- break;
- }
- // Convert the code back to a character using the appropriate radix
- sal_UCS4 cChar = aCodeString.toUInt32(static_cast<sal_Int16> (radix));
- // Use FontCharMap::HasChar(sal_UCS4 cChar) to see if the desired character is in the font
- FontCharMapRef xFontCharMap = m_xShowSet->GetFontCharMap();
- if (xFontCharMap->HasChar(cChar))
- // Select the corresponding character
- SetChar(cChar);
- else {
- m_xCharName->set_label(CuiResId(RID_SVXSTR_MISSING_CHAR));
- m_aShowChar.SetText(" ");
- switch(radix)
- {
- case Radix::decimal:
- m_xHexCodeText->set_text(OUString::number(cChar, 16));
- break;
- case Radix::hexadecimal:
- m_xDecimalCodeText->set_text(OUString::number(cChar));
- break;
- }
- }
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, DecimalCodeChangeHdl, weld::Entry&, void)
-{
- selectCharByCode(Radix::decimal);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, HexCodeChangeHdl, weld::Entry&, void)
-{
- selectCharByCode(Radix::hexadecimal);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, CharPreSelectHdl, SvxShowCharSet*, void)
-{
- // adjust subset selection
- if( pSubsetMap )
- {
- sal_UCS4 cChar = m_xShowSet->GetSelectCharacter();
-
- setFavButtonState(OUString(&cChar, 1), aFont.GetFamilyName());
- const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
- if( pSubset )
- m_xSubsetLB->set_active_text(pSubset->GetName());
- }
-
- m_xOKBtn->set_sensitive(true);
-}
-
-IMPL_LINK_NOARG(SvxCharacterMap, SearchCharPreSelectHdl, SvxShowCharSet*, void)
-{
- // adjust subset selection
- if( pSubsetMap )
- {
- sal_UCS4 cChar = m_xSearchSet->GetSelectCharacter();
-
- setFavButtonState(OUString(&cChar, 1), aFont.GetFamilyName());
- const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
- if( pSubset )
- m_xSubsetLB->set_active_text(pSubset->GetName());
- }
-
- m_xOKBtn->set_sensitive(true);
-}
-
-// class SvxShowText =====================================================
-SvxShowText::SvxShowText(const VclPtr<VirtualDevice>& rVirDev)
- : m_xVirDev(rVirDev)
- , mnY(0)
- , mbCenter(false)
-{
-}
-
-void SvxShowText::SetDrawingArea(weld::DrawingArea* pDrawingArea)
-{
- CustomWidgetController::SetDrawingArea(pDrawingArea);
- vcl::Font aFont = m_xVirDev->GetFont();
- Size aFontSize(aFont.GetFontSize().Width() * 5, aFont.GetFontSize().Height() * 5);
- aFont.SetFontSize(aFontSize);
- m_xVirDev->Push(PUSH_ALLFONT);
- m_xVirDev->SetFont(aFont);
- pDrawingArea->set_size_request(m_xVirDev->approximate_digit_width() + 2 * 12,
- m_xVirDev->LogicToPixel(aFontSize).Height() * 2);
- m_xVirDev->Pop();
-}
-
-void SvxShowText::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
-{
- rRenderContext.SetFont(m_aFont);
-
- Color aTextCol = rRenderContext.GetTextColor();
- Color aFillCol = rRenderContext.GetFillColor();
-
- const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
- const Color aWindowTextColor(rStyleSettings.GetDialogTextColor());
- const Color aWindowColor(rStyleSettings.GetWindowColor());
- rRenderContext.SetTextColor(aWindowTextColor);
- rRenderContext.SetFillColor(aWindowColor);
-
- const OUString aText = GetText();
-
- Size aSize(GetOutputSizePixel());
- tools::Long nAvailWidth = aSize.Width();
- tools::Long nWinHeight = aSize.Height();
-
- bool bGotBoundary = true;
- bool bShrankFont = false;
- vcl::Font aOrigFont(rRenderContext.GetFont());
- Size aFontSize(aOrigFont.GetFontSize());
- ::tools::Rectangle aBoundRect;
-
- for (tools::Long nFontHeight = aFontSize.Height(); nFontHeight > 0; nFontHeight -= 5)
- {
- if (!rRenderContext.GetTextBoundRect( aBoundRect, aText ) || aBoundRect.IsEmpty())
- {
- bGotBoundary = false;
- break;
- }
- if (!mbCenter)
- break;
- //only shrink in the single glyph large view mode
- tools::Long nTextWidth = aBoundRect.GetWidth();
- if (nAvailWidth > nTextWidth)
- break;
- vcl::Font aFont(aOrigFont);
- aFontSize.setHeight( nFontHeight );
- aFont.SetFontSize(aFontSize);
- rRenderContext.SetFont(aFont);
- mnY = (nWinHeight - rRenderContext.GetTextHeight()) / 2;
- bShrankFont = true;
- }
-
- Point aPoint(2, mnY);
- // adjust position using ink boundary if possible
- if (!bGotBoundary)
- aPoint.setX( (aSize.Width() - rRenderContext.GetTextWidth(aText)) / 2 );
- else
- {
- // adjust position before it gets out of bounds
- aBoundRect += aPoint;
-
- // shift back vertically if needed
- int nYLDelta = aBoundRect.Top();
- int nYHDelta = aSize.Height() - aBoundRect.Bottom();
- if( nYLDelta <= 0 )
- aPoint.AdjustY( -(nYLDelta - 1) );
- else if( nYHDelta <= 0 )
- aPoint.AdjustY(nYHDelta - 1 );
-
- if (mbCenter)
- {
- // move glyph to middle of cell
- aPoint.setX( -aBoundRect.Left() + (aSize.Width() - aBoundRect.GetWidth()) / 2 );
- }
- else
- {
- // shift back horizontally if needed
- int nXLDelta = aBoundRect.Left();
- int nXHDelta = aSize.Width() - aBoundRect.Right();
- if( nXLDelta <= 0 )
- aPoint.AdjustX( -(nXLDelta - 1) );
- else if( nXHDelta <= 0 )
- aPoint.AdjustX(nXHDelta - 1 );
- }
- }
-
- rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), aSize));
- rRenderContext.DrawText(aPoint, aText);
- rRenderContext.SetTextColor(aTextCol);
- rRenderContext.SetFillColor(aFillCol);
- if (bShrankFont)
- rRenderContext.SetFont(aOrigFont);
-}
-
-void SvxShowText::SetFont( const vcl::Font& rFont )
-{
- tools::Long nWinHeight = GetOutputSizePixel().Height();
-
- m_aFont = rFont;
- m_aFont.SetWeight(WEIGHT_NORMAL);
- m_aFont.SetAlignment(ALIGN_TOP);
- m_aFont.SetFontSize(m_xVirDev->PixelToLogic(Size(0, nWinHeight / 2)));
- m_aFont.SetTransparent(true);
-
- m_xVirDev->Push(PUSH_ALLFONT);
- m_xVirDev->SetFont(m_aFont);
- mnY = (nWinHeight - m_xVirDev->GetTextHeight()) / 2;
- m_xVirDev->Pop();
-
- Invalidate();
-}
-
-void SvxShowText::Resize()
-{
- SetFont(GetFont()); //force recalculation of size
-}
-
-void SvxShowText::SetText(const OUString& rText)
-{
- m_sText = rText;
- Invalidate();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */