LibreOffice Module svx (master)  1
charmap.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <vcl/event.hxx>
21 #include <vcl/fontcharmap.hxx>
22 #include <vcl/svapp.hxx>
23 #include <vcl/settings.hxx>
24 #include <vcl/virdev.hxx>
25 
26 #include <svx/ucsubset.hxx>
27 
28 
29 #include <svx/strings.hrc>
30 
31 #include <svx/charmap.hxx>
32 #include <svx/dialmgr.hxx>
33 
34 #include <charmapacc.hxx>
35 #include <uiobject.hxx>
36 
37 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
38 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
39 #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
40 #include <com/sun/star/datatransfer/clipboard/SystemClipboard.hpp>
41 #include <officecfg/Office/Common.hxx>
43 #include <unicode/uchar.h>
44 #include <vcl/textview.hxx>
45 #include <rtl/ustrbuf.hxx>
46 
47 using namespace ::com::sun::star::accessibility;
48 using namespace ::com::sun::star::uno;
49 using namespace ::com::sun::star;
50 
52 {
53  static sal_uInt32 cSelectedChar = ' '; // keeps selected character over app lifetime
54  return cSelectedChar;
55 }
56 
58 {
60 }
61 
62 SvxShowCharSet::SvxShowCharSet(std::unique_ptr<weld::ScrolledWindow> pScrolledWindow, const VclPtr<VirtualDevice>& rVirDev)
63  : mxVirDev(rVirDev)
64  , mxScrollArea(std::move(pScrolledWindow))
66  , nX(0)
67  , nY(0)
68  , maFontSize(0, 0)
69  , maPosition(0,0)
70  , mbRecalculateFont(true)
71  , mbUpdateForeground(true)
72  , mbUpdateBackground(true)
73 {
74  init();
75 }
76 
78 {
79  CustomWidgetController::SetDrawingArea(pDrawingArea);
80 
81  Size aSize(COLUMN_COUNT * pDrawingArea->get_approximate_digit_width() * 5.25,
82  ROW_COUNT * pDrawingArea->get_text_height() * 2);
83 
84  nX = aSize.Width() / COLUMN_COUNT;
85  nY = aSize.Height() / ROW_COUNT;
86 
87  // tdf#121232 set a size request that will result in a 0 m_nXGap by default
88  mxScrollArea->set_size_request(COLUMN_COUNT * nX + mxScrollArea->get_scroll_thickness() + 2,
89  ROW_COUNT * nY);
90 }
91 
93 {
94  nSelectedIndex = -1; // TODO: move into init list when it is no longer static
95  m_nXGap = 0;
96  m_nYGap = 0;
97 
98  mxScrollArea->connect_vadjustment_changed(LINK(this, SvxShowCharSet, VscrollHdl));
100  // other settings depend on selected font => see RecalculateFont
101 
102  bDrag = false;
103 }
104 
106 {
107  mbRecalculateFont = true;
108 }
109 
111 {
113 }
114 
116 {
118 }
119 
121 {
122  if ( rMEvt.IsLeft() )
123  {
124  if ( rMEvt.GetClicks() == 1 )
125  {
126  GrabFocus();
127  bDrag = true;
128  CaptureMouse();
129 
130  int nIndex = PixelToMapIndex( rMEvt.GetPosPixel() );
131  // Fire the focus event
132  SelectIndex( nIndex, true);
133  }
134 
135  if ( !(rMEvt.GetClicks() % 2) )
136  aDoubleClkHdl.Call( this );
137  }
138 
139  if (rMEvt.IsRight())
140  {
141  Point aPosition (rMEvt.GetPosPixel());
142  maPosition = aPosition;
143  int nIndex = PixelToMapIndex( rMEvt.GetPosPixel() );
144  // Fire the focus event
145  SelectIndex( nIndex, true);
147  }
148 
149  return true;
150 }
151 
153 {
154  if ( bDrag && rMEvt.IsLeft() )
155  {
156  // released mouse over character map
158  aSelectHdl.Call( this );
159  ReleaseMouse();
160  bDrag = false;
161  }
162 
163  return true;
164 }
165 
167 {
168  if ( rMEvt.IsLeft() && bDrag )
169  {
170  Point aPos = rMEvt.GetPosPixel();
171  Size aSize = GetOutputSizePixel();
172 
173  if ( aPos.X() < 0 )
174  aPos.setX( 0 );
175  else if ( aPos.X() > aSize.Width()-5 )
176  aPos.setX( aSize.Width()-5 );
177  if ( aPos.Y() < 0 )
178  aPos.setY( 0 );
179  else if ( aPos.Y() > aSize.Height()-5 )
180  aPos.setY( aSize.Height()-5 );
181 
182  int nIndex = PixelToMapIndex( aPos );
183  // Fire the focus event.
184  SelectIndex( nIndex, true );
185  }
186 
187  return true;
188 }
189 
190 sal_uInt16 SvxShowCharSet::GetRowPos(sal_uInt16 _nPos)
191 {
192  return _nPos / COLUMN_COUNT ;
193 }
194 
196 {
197  maFavCharList.clear();
198  maFavCharFontList.clear();
199  //retrieve recent character list
200  css::uno::Sequence< OUString > rFavCharList( officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::get() );
202 
203  //retrieve recent character font list
204  css::uno::Sequence< OUString > rFavCharFontList( officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::get() );
206 }
207 
208 bool SvxShowCharSet::isFavChar(const OUString& sTitle, const OUString& rFont)
209 {
210  auto isFavCharTitleExists = std::any_of(maFavCharList.begin(),
211  maFavCharList.end(),
212  [sTitle] (const OUString & a) { return a == sTitle; });
213 
214  auto isFavCharFontExists = std::any_of(maFavCharFontList.begin(),
215  maFavCharFontList.end(),
216  [rFont] (const OUString & a) { return a == rFont; });
217 
218  // if Fav char to be added is already in list, return true
219  return isFavCharTitleExists && isFavCharFontExists;
220 }
221 
223 {
224  std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetDrawingArea(), "svx/ui/charsetmenu.ui"));
225  std::unique_ptr<weld::Menu> xItemMenu(xBuilder->weld_menu("charsetmenu"));
226 
227  sal_UCS4 cChar = GetSelectCharacter();
228  OUString aOUStr( &cChar, 1 );
229  if (isFavChar(aOUStr, mxVirDev->GetFont().GetFamilyName()) || maFavCharList.size() >= 16)
230  xItemMenu->set_visible("add", false);
231  else
232  xItemMenu->set_visible("remove", false);
233 
234  ContextMenuSelect(xItemMenu->popup_at_rect(GetDrawingArea(), tools::Rectangle(maPosition, Size(1,1))));
235  GrabFocus();
236  Invalidate();
237 }
238 
239 void SvxShowCharSet::ContextMenuSelect(std::string_view rIdent)
240 {
241  sal_UCS4 cChar = GetSelectCharacter();
242  OUString aOUStr(&cChar, 1);
243 
244  if (rIdent == "insert")
245  aDoubleClkHdl.Call(this);
246  else if (rIdent == "add" || rIdent == "remove")
247  {
249  aFavClickHdl.Call(this);
250  }
251  else if (rIdent == "copy")
252  CopyToClipboard(aOUStr);
253 }
254 
255 void SvxShowCharSet::CopyToClipboard(const OUString& rOUStr)
256 {
257  css::uno::Reference<css::datatransfer::clipboard::XClipboard> xClipboard =
258  css::datatransfer::clipboard::SystemClipboard::create(comphelper::getProcessComponentContext());
259 
260  if (!xClipboard.is())
261  return;
262 
263  rtl::Reference<TETextDataObject> pDataObj = new TETextDataObject(rOUStr);
264 
265  try
266  {
267  xClipboard->setContents( pDataObj, nullptr );
268 
269  css::uno::Reference<css::datatransfer::clipboard::XFlushableClipboard> xFlushableClipboard(xClipboard, css::uno::UNO_QUERY);
270  if( xFlushableClipboard.is() )
271  xFlushableClipboard->flushClipboard();
272  }
273  catch( const css::uno::Exception& )
274  {
275  }
276 }
277 
278 void SvxShowCharSet::updateFavCharacterList(const OUString& sTitle, const OUString& rFont)
279 {
280  if(isFavChar(sTitle, rFont))
281  {
282  auto itChar = std::find(maFavCharList.begin(), maFavCharList.end(), sTitle);
283  auto itChar2 = std::find(maFavCharFontList.begin(), maFavCharFontList.end(), rFont);
284 
285  // if Fav char to be added is already in list, remove it
286  if( itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() )
287  {
288  maFavCharList.erase( itChar );
289  maFavCharFontList.erase( itChar2);
290  }
291 
292  css::uno::Sequence< OUString > aFavCharList(maFavCharList.size());
293  auto aFavCharListRange = asNonConstRange(aFavCharList);
294  css::uno::Sequence< OUString > aFavCharFontList(maFavCharFontList.size());
295  auto aFavCharFontListRange = asNonConstRange(aFavCharFontList);
296 
297  for (size_t i = 0; i < maFavCharList.size(); ++i)
298  {
299  aFavCharListRange[i] = maFavCharList[i];
300  aFavCharFontListRange[i] = maFavCharFontList[i];
301  }
302 
303  std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
304  officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::set(aFavCharList, batch);
305  officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::set(aFavCharFontList, batch);
306  batch->commit();
307  return;
308  }
309 
310  auto itChar = std::find(maFavCharList.begin(), maFavCharList.end(), sTitle);
311  auto itChar2 = std::find(maFavCharFontList.begin(), maFavCharFontList.end(), rFont);
312 
313  // if Fav char to be added is already in list, remove it
314  if( itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() )
315  {
316  maFavCharList.erase( itChar );
317  maFavCharFontList.erase( itChar2);
318  }
319 
320  if (maFavCharList.size() == 16)
321  {
322  maFavCharList.pop_back();
323  maFavCharFontList.pop_back();
324  }
325 
326  maFavCharList.push_back(sTitle);
327  maFavCharFontList.push_back(rFont);
328 
329  css::uno::Sequence< OUString > aFavCharList(maFavCharList.size());
330  auto aFavCharListRange = asNonConstRange(aFavCharList);
331  css::uno::Sequence< OUString > aFavCharFontList(maFavCharFontList.size());
332  auto aFavCharFontListRange = asNonConstRange(aFavCharFontList);
333 
334  for (size_t i = 0; i < maFavCharList.size(); ++i)
335  {
336  aFavCharListRange[i] = maFavCharList[i];
337  aFavCharFontListRange[i] = maFavCharFontList[i];
338  }
339 
340  std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create(mxContext));
341  officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterList::set(aFavCharList, batch);
342  officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::set(aFavCharFontList, batch);
343  batch->commit();
344 }
345 
346 sal_uInt16 SvxShowCharSet::GetColumnPos(sal_uInt16 _nPos)
347 {
348  return _nPos % COLUMN_COUNT ;
349 }
350 
352 {
353  return mxScrollArea->vadjustment_get_value() * COLUMN_COUNT;
354 }
355 
357 {
358  sal_uInt32 nIndex = FirstInView();
359  nIndex += ROW_COUNT * COLUMN_COUNT - 1;
360  sal_uInt32 nCompare = mxFontCharMap->GetCharCount() - 1;
361  if (nIndex > nCompare)
362  nIndex = nCompare;
363  return nIndex;
364 }
365 
367 {
368  const int nBase = FirstInView();
369  int x = ((nIndex - nBase) % COLUMN_COUNT) * nX;
370  int y = ((nIndex - nBase) / COLUMN_COUNT) * nY;
371  return Point( x + m_nXGap, y + m_nYGap );
372 }
373 
374 
375 int SvxShowCharSet::PixelToMapIndex( const Point& point) const
376 {
377  int nBase = FirstInView();
378  return (nBase + ((point.X() - m_nXGap)/nX) + ((point.Y() - m_nYGap)/nY) * COLUMN_COUNT);
379 }
380 
382 {
383  vcl::KeyCode aCode = rKEvt.GetKeyCode();
384 
385  if (aCode.GetModifier())
386  return false;
387 
388  bool bRet = true;
389 
390  int tmpSelected = nSelectedIndex;
391 
392  switch (aCode.GetCode())
393  {
394  case KEY_SPACE:
395  aSelectHdl.Call( this );
396  break;
397  case KEY_LEFT:
398  --tmpSelected;
399  break;
400  case KEY_RIGHT:
401  ++tmpSelected;
402  break;
403  case KEY_UP:
404  tmpSelected -= COLUMN_COUNT;
405  break;
406  case KEY_DOWN:
407  tmpSelected += COLUMN_COUNT;
408  break;
409  case KEY_PAGEUP:
410  tmpSelected -= ROW_COUNT * COLUMN_COUNT;
411  break;
412  case KEY_PAGEDOWN:
413  tmpSelected += ROW_COUNT * COLUMN_COUNT;
414  break;
415  case KEY_HOME:
416  tmpSelected = 0;
417  break;
418  case KEY_END:
419  tmpSelected = mxFontCharMap->GetCharCount() - 1;
420  break;
421  case KEY_TAB: // some fonts have a character at these unicode control codes
422  case KEY_ESCAPE:
423  case KEY_RETURN:
424  tmpSelected = - 1; // mark as invalid
425  bRet = false;
426  break;
427  default:
428  {
429  sal_UCS4 cChar = rKEvt.GetCharCode();
430  sal_UCS4 cNext = mxFontCharMap->GetNextChar(cChar - 1);
431  tmpSelected = mxFontCharMap->GetIndexFromChar(cNext);
432  if (tmpSelected < 0 || (cChar != cNext))
433  {
434  tmpSelected = - 1; // mark as invalid
435  bRet = false;
436  }
437  break;
438  }
439  }
440 
441  if ( tmpSelected >= 0 )
442  {
443  SelectIndex( tmpSelected, true );
444  aPreSelectHdl.Call( this );
445  }
446 
447  return bRet;
448 }
449 
451 {
452  InitSettings(rRenderContext);
453  RecalculateFont(rRenderContext);
454  DrawChars_Impl(rRenderContext, FirstInView(), LastInView());
455 }
456 
457 void SvxShowCharSet::SetFont( const vcl::Font& rFont )
458 {
459  maFont = rFont;
460  mbRecalculateFont = true;
461  Invalidate();
462 }
463 
465 {
466  Invalidate();
467 }
468 
469 // stretch a grid rectangle if its at the edge to fill unused space
470 tools::Rectangle SvxShowCharSet::getGridRectangle(const Point &rPointUL, const Size &rOutputSize) const
471 {
472  tools::Long x = rPointUL.X() - 1;
473  tools::Long y = rPointUL.Y() - 1;
474  Point aPointUL(x+1, y+1);
475  Size aGridSize(nX-1, nY-1);
476 
477  tools::Long nXDistFromLeft = x - m_nXGap;
478  if (nXDistFromLeft <= 1)
479  {
480  aPointUL.setX( 1 );
481  aGridSize.AdjustWidth(m_nXGap + nXDistFromLeft );
482  }
483  tools::Long nXDistFromRight = rOutputSize.Width() - m_nXGap - nX - x;
484  if (nXDistFromRight <= 1)
485  aGridSize.AdjustWidth(m_nXGap + nXDistFromRight );
486 
487  tools::Long nXDistFromTop = y - m_nYGap;
488  if (nXDistFromTop <= 1)
489  {
490  aPointUL.setY( 1 );
491  aGridSize.AdjustHeight(m_nYGap + nXDistFromTop );
492  }
493  tools::Long nXDistFromBottom = rOutputSize.Height() - m_nYGap - nY - y;
494  if (nXDistFromBottom <= 1)
495  aGridSize.AdjustHeight(m_nYGap + nXDistFromBottom );
496 
497  return tools::Rectangle(aPointUL, aGridSize);
498 }
499 
500 void SvxShowCharSet::DrawChars_Impl(vcl::RenderContext& rRenderContext, int n1, int n2)
501 {
502  if (n1 > LastInView() || n2 < FirstInView())
503  return;
504 
505  Size aOutputSize(GetOutputSizePixel());
506 
507  int i;
508  for (i = 1; i < COLUMN_COUNT; ++i)
509  {
510  rRenderContext.DrawLine(Point(nX * i + m_nXGap, 0),
511  Point(nX * i + m_nXGap, aOutputSize.Height()));
512  }
513  for (i = 1; i < ROW_COUNT; ++i)
514  {
515  rRenderContext.DrawLine(Point(0, nY * i + m_nYGap),
516  Point(aOutputSize.Width(), nY * i + m_nYGap));
517  }
518  const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
519  const Color aWindowTextColor(rStyleSettings.GetFieldTextColor());
520  Color aHighlightColor(rStyleSettings.GetHighlightColor());
521  Color aHighlightTextColor(rStyleSettings.GetHighlightTextColor());
522  Color aFaceColor(rStyleSettings.GetFaceColor());
523  Color aLightColor(rStyleSettings.GetLightColor());
524  Color aShadowColor(rStyleSettings.GetShadowColor());
525 
526  int nTextHeight = rRenderContext.GetTextHeight();
527  tools::Rectangle aBoundRect;
528  for (i = n1; i <= n2; ++i)
529  {
530  Point pix = MapIndexToPixel(i);
531  int x = pix.X();
532  int y = pix.Y();
533 
534  sal_UCS4 nChar = mxFontCharMap->GetCharFromIndex(i);
535  OUString aCharStr(&nChar, 1);
536  int nTextWidth = rRenderContext.GetTextWidth(aCharStr);
537  int tx = x + (nX - nTextWidth + 1) / 2;
538  int ty = y + (nY - nTextHeight + 1) / 2;
539  Point aPointTxTy(tx, ty);
540 
541  // adjust position before it gets out of bounds
542  if (rRenderContext.GetTextBoundRect(aBoundRect, aCharStr) && !aBoundRect.IsEmpty())
543  {
544  // zero advance width => use ink width to center glyph
545  if (!nTextWidth)
546  {
547  aPointTxTy.setX( x - aBoundRect.Left() + (nX - aBoundRect.GetWidth() + 1) / 2 );
548  }
549 
550  aBoundRect += aPointTxTy;
551 
552  // shift back vertically if needed
553  int nYLDelta = aBoundRect.Top() - y;
554  int nYHDelta = (y + nY) - aBoundRect.Bottom();
555  if (nYLDelta <= 0)
556  aPointTxTy.AdjustY( -(nYLDelta - 1) );
557  else if (nYHDelta <= 0)
558  aPointTxTy.AdjustY(nYHDelta - 1 );
559 
560  // shift back horizontally if needed
561  int nXLDelta = aBoundRect.Left() - x;
562  int nXHDelta = (x + nX) - aBoundRect.Right();
563  if (nXLDelta <= 0)
564  aPointTxTy.AdjustX( -(nXLDelta - 1) );
565  else if (nXHDelta <= 0)
566  aPointTxTy.AdjustX(nXHDelta - 1 );
567  }
568 
569  Color aTextCol = rRenderContext.GetTextColor();
570  if (i != nSelectedIndex)
571  {
572  rRenderContext.SetTextColor(aWindowTextColor);
573  rRenderContext.DrawText(aPointTxTy, aCharStr);
574  }
575  else
576  {
577  Color aLineCol = rRenderContext.GetLineColor();
578  Color aFillCol = rRenderContext.GetFillColor();
579  rRenderContext.SetLineColor();
580  Point aPointUL(x + 1, y + 1);
581  if (HasFocus())
582  {
583  rRenderContext.SetFillColor(aHighlightColor);
584  rRenderContext.DrawRect(getGridRectangle(aPointUL, aOutputSize));
585 
586  rRenderContext.SetTextColor(aHighlightTextColor);
587  rRenderContext.DrawText(aPointTxTy, aCharStr);
588  }
589  else
590  {
591  rRenderContext.SetFillColor(aFaceColor);
592  rRenderContext.DrawRect(getGridRectangle(aPointUL, aOutputSize));
593 
594  rRenderContext.SetLineColor(aLightColor);
595  rRenderContext.DrawLine(aPointUL, Point(x + nX - 1, y + 1));
596  rRenderContext.DrawLine(aPointUL, Point(x + 1, y + nY - 1));
597 
598  rRenderContext.SetLineColor(aShadowColor);
599  rRenderContext.DrawLine(Point(x + 1, y + nY - 1), Point(x + nX - 1, y + nY - 1));
600  rRenderContext.DrawLine(Point(x + nX - 1, y + nY - 1), Point(x + nX - 1, y + 1));
601 
602  rRenderContext.DrawText(aPointTxTy, aCharStr);
603  }
604  rRenderContext.SetLineColor(aLineCol);
605  rRenderContext.SetFillColor(aFillCol);
606  }
607  rRenderContext.SetTextColor(aTextCol);
608  }
609 }
610 
611 
613 {
614  const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
615 
616  if (mbUpdateForeground)
617  {
618  rRenderContext.SetTextColor(rStyleSettings.GetDialogTextColor());
619  mbUpdateForeground = false;
620  }
621 
622  if (mbUpdateBackground)
623  {
624  rRenderContext.SetBackground(rStyleSettings.GetWindowColor());
625  rRenderContext.Erase();
626  mbUpdateBackground = false;
627  }
628 
629  vcl::Font aFont(maFont);
630  aFont.SetWeight(WEIGHT_LIGHT);
631  aFont.SetAlignment(ALIGN_TOP);
632  aFont.SetFontSize(maFontSize);
633  aFont.SetTransparent(true);
634  rRenderContext.SetFont(aFont);
635 }
636 
638 {
639  if( nSelectedIndex >= 0 )
640  getSelectedChar() = mxFontCharMap->GetCharFromIndex( nSelectedIndex );
641  return getSelectedChar();
642 }
643 
644 
646 {
647  if (!mbRecalculateFont)
648  return;
649 
650  // save last selected unicode
651  if (nSelectedIndex >= 0)
652  getSelectedChar() = mxFontCharMap->GetCharFromIndex(nSelectedIndex);
653 
654  Size aSize(GetOutputSizePixel());
655 
656  vcl::Font aFont = maFont;
657  aFont.SetWeight(WEIGHT_LIGHT);
658  aFont.SetAlignment(ALIGN_TOP);
659  int nFontHeight = (aSize.Height() - 5) * 2 / (3 * ROW_COUNT);
660  maFontSize = rRenderContext.PixelToLogic(Size(0, nFontHeight));
661  aFont.SetFontSize(maFontSize);
662  aFont.SetTransparent(true);
663  rRenderContext.SetFont(aFont);
664  rRenderContext.GetFontCharMap(mxFontCharMap);
666 
667  nX = aSize.Width() / COLUMN_COUNT;
668  nY = aSize.Height() / ROW_COUNT;
669 
670  const int nLastRow = (mxFontCharMap->GetCharCount() - 1 + COLUMN_COUNT) / COLUMN_COUNT;
671  mxScrollArea->vadjustment_configure(mxScrollArea->vadjustment_get_value(), 0, nLastRow, 1, ROW_COUNT - 1, ROW_COUNT);
672 
673  // restore last selected unicode
674  int nMapIndex = mxFontCharMap->GetIndexFromChar(getSelectedChar());
675  if (nMapIndex != nSelectedIndex)
676  SelectIndex(nMapIndex);
677 
678  // rearrange CharSet element in sync with nX- and nY-multiples
679  Size aDrawSize(nX * COLUMN_COUNT, nY * ROW_COUNT);
680  m_nXGap = (aSize.Width() - aDrawSize.Width()) / 2;
681  m_nYGap = (aSize.Height() - aDrawSize.Height()) / 2;
682 
683  mbRecalculateFont = false;
684 }
685 
686 void SvxShowCharSet::SelectIndex(int nNewIndex, bool bFocus)
687 {
688  if (!mxFontCharMap.is())
690 
691  if( nNewIndex < 0 )
692  {
693  // need to scroll see closest unicode
694  sal_uInt32 cPrev = mxFontCharMap->GetPrevChar( getSelectedChar() );
695  int nMapIndex = mxFontCharMap->GetIndexFromChar( cPrev );
696  int nNewPos = nMapIndex / COLUMN_COUNT;
697  mxScrollArea->vadjustment_set_value(nNewPos);
698  nSelectedIndex = bFocus ? nMapIndex+1 : -1;
699  Invalidate();
700  }
701  else if( nNewIndex < FirstInView() )
702  {
703  // need to scroll up to see selected item
704  int nOldPos = mxScrollArea->vadjustment_get_value();
705  int nDelta = (FirstInView() - nNewIndex + COLUMN_COUNT-1) / COLUMN_COUNT;
706  mxScrollArea->vadjustment_set_value(nOldPos - nDelta);
707  nSelectedIndex = nNewIndex;
708  Invalidate();
709  }
710  else if( nNewIndex > LastInView() )
711  {
712  // need to scroll down to see selected item
713  int nOldPos = mxScrollArea->vadjustment_get_value();
714  int nDelta = (nNewIndex - LastInView() + COLUMN_COUNT) / COLUMN_COUNT;
715  mxScrollArea->vadjustment_set_value(nOldPos + nDelta);
716  if( nNewIndex < mxFontCharMap->GetCharCount() )
717  {
718  nSelectedIndex = nNewIndex;
719  Invalidate();
720  }
721  else if (nOldPos != mxScrollArea->vadjustment_get_value())
722  {
723  Invalidate();
724  }
725  }
726  else
727  {
728  nSelectedIndex = nNewIndex;
729  Invalidate();
730  }
731 
732  if( nSelectedIndex >= 0 )
733  {
734  getSelectedChar() = mxFontCharMap->GetCharFromIndex( nSelectedIndex );
735  if( m_xAccessible.is() )
736  {
738  // Don't fire the focus event.
739  if ( bFocus )
740  m_xAccessible->fireEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, Any(), makeAny(pItem->GetAccessible()) ); // this call assures that m_pItem is set
741  else
742  m_xAccessible->fireEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS, Any(), makeAny(pItem->GetAccessible()) ); // this call assures that m_pItem is set
743 
744  assert(pItem->m_xItem.is() && "No accessible created!");
745  Any aOldAny, aNewAny;
746  aNewAny <<= AccessibleStateType::FOCUSED;
747  // Don't fire the focus event.
748  if ( bFocus )
749  pItem->m_xItem->fireEvent( AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
750 
751  aNewAny <<= AccessibleStateType::SELECTED;
752  pItem->m_xItem->fireEvent( AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
753  }
754  }
755  aHighHdl.Call( this );
756 }
757 
758 void SvxShowCharSet::OutputIndex( int nNewIndex )
759 {
760  SelectIndex( nNewIndex, true );
761  aSelectHdl.Call( this );
762 }
763 
764 
766 {
767  if ( !mxFontCharMap.is() )
769 
770  // get next available char of current font
771  sal_UCS4 cNext = mxFontCharMap->GetNextChar( (cNew > 0) ? cNew - 1 : cNew );
772 
773  int nMapIndex = mxFontCharMap->GetIndexFromChar( cNext );
774  SelectIndex( nMapIndex );
775  // move selected item to top row if not in focus
776  mxScrollArea->vadjustment_set_value(nMapIndex / COLUMN_COUNT);
777  Invalidate();
778 }
779 
781 {
782  if( nSelectedIndex < FirstInView() )
783  {
784  SelectIndex( FirstInView() + (nSelectedIndex % COLUMN_COUNT) );
785  }
786  else if( nSelectedIndex > LastInView() )
787  {
788  if( m_xAccessible.is() )
789  {
790  css::uno::Any aOldAny, aNewAny;
791  int nLast = LastInView();
792  for ( ; nLast != nSelectedIndex; ++nLast)
793  {
794  aOldAny <<= ImplGetItem(nLast)->GetAccessible();
795  m_xAccessible ->fireEvent( AccessibleEventId::CHILD, aOldAny, aNewAny );
796  }
797  }
798  SelectIndex( (LastInView() - COLUMN_COUNT + 1) + (nSelectedIndex % COLUMN_COUNT) );
799  }
800 
801  Invalidate();
802 }
803 
805 {
806  if (m_xAccessible.is())
807  {
808  m_aItems.clear();
809  m_xAccessible->clearCharSetControl();
810  m_xAccessible.clear();
811  }
812 }
813 
814 css::uno::Reference< XAccessible > SvxShowCharSet::CreateAccessible()
815 {
816  OSL_ENSURE(!m_xAccessible.is(),"Accessible already created!");
818  return m_xAccessible;
819 }
820 
822 {
823  ItemsMap::iterator aFind = m_aItems.find(_nPos);
824  if ( aFind == m_aItems.end() )
825  {
826  OSL_ENSURE(m_xAccessible.is(), "Who wants to create a child of my table without a parent?");
827  auto xItem = std::make_shared<svx::SvxShowCharSetItem>(*this,
828  m_xAccessible.get(), sal::static_int_cast< sal_uInt16 >(_nPos));
829  aFind = m_aItems.emplace(_nPos, xItem).first;
830  OUStringBuffer buf;
831  buf.appendUtf32( mxFontCharMap->GetCharFromIndex( _nPos ) );
832  aFind->second->maText = buf.makeStringAndClear();
833  Point pix = MapIndexToPixel( _nPos );
834  aFind->second->maRect = tools::Rectangle( Point( pix.X() + 1, pix.Y() + 1 ), Size(nX-1,nY-1) );
835  }
836 
837  return aFind->second.get();
838 }
839 
841 {
842  return mxFontCharMap->GetCharCount();
843 }
844 
846 {
848  return mxFontCharMap;
849 }
850 
851 // TODO: should be moved into Font Attributes stuff
852 // we let it mature here though because it is currently the only use
853 
854 SubsetMap::SubsetMap( const FontCharMapRef& rxFontCharMap )
855 {
856  InitList();
857  ApplyCharMap(rxFontCharMap);
858 }
859 
861 {
862  return maSubsets;
863 }
864 
866 {
867  for (auto const& subset : maSubsets)
868  if( (subset.GetRangeMin() <= cChar) && (cChar <= subset.GetRangeMax()) )
869  return &subset;
870  return nullptr;
871 }
872 
873 inline Subset::Subset(sal_UCS4 nMin, sal_UCS4 nMax, const OUString& rName)
874 : mnRangeMin(nMin), mnRangeMax(nMax), maRangeName(rName)
875 {
876 }
877 
879 {
880  static SubsetVec s_aAllSubsets = []()
881  {
882  SubsetVec aAllSubsets;
883  //I wish icu had a way to give me the block ranges
884  for (int i = UBLOCK_BASIC_LATIN; i < UBLOCK_COUNT; ++i)
885  {
886  UBlockCode eBlock = static_cast<UBlockCode>(i);
887  switch (eBlock)
888  {
889  case UBLOCK_NO_BLOCK:
890  case UBLOCK_INVALID_CODE:
891  case UBLOCK_COUNT:
892  case UBLOCK_HIGH_SURROGATES:
893  case UBLOCK_HIGH_PRIVATE_USE_SURROGATES:
894  case UBLOCK_LOW_SURROGATES:
895  break;
896  case UBLOCK_BASIC_LATIN:
897  aAllSubsets.emplace_back( 0x0000, 0x007F, SvxResId(RID_SUBSETSTR_BASIC_LATIN) );
898  break;
899  case UBLOCK_LATIN_1_SUPPLEMENT:
900  aAllSubsets.emplace_back( 0x0080, 0x00FF, SvxResId(RID_SUBSETSTR_LATIN_1) );
901  break;
902  case UBLOCK_LATIN_EXTENDED_A:
903  aAllSubsets.emplace_back( 0x0100, 0x017F, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_A) );
904  break;
905  case UBLOCK_LATIN_EXTENDED_B:
906  aAllSubsets.emplace_back( 0x0180, 0x024F, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_B) );
907  break;
908  case UBLOCK_IPA_EXTENSIONS:
909  aAllSubsets.emplace_back( 0x0250, 0x02AF, SvxResId(RID_SUBSETSTR_IPA_EXTENSIONS) );
910  break;
911  case UBLOCK_SPACING_MODIFIER_LETTERS:
912  aAllSubsets.emplace_back( 0x02B0, 0x02FF, SvxResId(RID_SUBSETSTR_SPACING_MODIFIERS) );
913  break;
914  case UBLOCK_COMBINING_DIACRITICAL_MARKS:
915  aAllSubsets.emplace_back( 0x0300, 0x036F, SvxResId(RID_SUBSETSTR_COMB_DIACRITICAL) );
916  break;
917  case UBLOCK_GREEK:
918  aAllSubsets.emplace_back( 0x0370, 0x03FF, SvxResId(RID_SUBSETSTR_BASIC_GREEK) );
919  break;
920  case UBLOCK_CYRILLIC:
921  aAllSubsets.emplace_back( 0x0400, 0x04FF, SvxResId(RID_SUBSETSTR_CYRILLIC) );
922  break;
923  case UBLOCK_ARMENIAN:
924  aAllSubsets.emplace_back( 0x0530, 0x058F, SvxResId(RID_SUBSETSTR_ARMENIAN) );
925  break;
926  case UBLOCK_HEBREW:
927  aAllSubsets.emplace_back( 0x0590, 0x05FF, SvxResId(RID_SUBSETSTR_BASIC_HEBREW) );
928  break;
929  case UBLOCK_ARABIC:
930  aAllSubsets.emplace_back( 0x0600, 0x065F, SvxResId(RID_SUBSETSTR_BASIC_ARABIC) );
931  break;
932  case UBLOCK_SYRIAC:
933  aAllSubsets.emplace_back( 0x0700, 0x074F, SvxResId(RID_SUBSETSTR_SYRIAC) );
934  break;
935  case UBLOCK_THAANA:
936  aAllSubsets.emplace_back( 0x0780, 0x07BF, SvxResId(RID_SUBSETSTR_THAANA) );
937  break;
938  case UBLOCK_DEVANAGARI:
939  aAllSubsets.emplace_back( 0x0900, 0x097F, SvxResId(RID_SUBSETSTR_DEVANAGARI) );
940  break;
941  case UBLOCK_BENGALI:
942  aAllSubsets.emplace_back( 0x0980, 0x09FF, SvxResId(RID_SUBSETSTR_BENGALI) );
943  break;
944  case UBLOCK_GURMUKHI:
945  aAllSubsets.emplace_back( 0x0A00, 0x0A7F, SvxResId(RID_SUBSETSTR_GURMUKHI) );
946  break;
947  case UBLOCK_GUJARATI:
948  aAllSubsets.emplace_back( 0x0A80, 0x0AFF, SvxResId(RID_SUBSETSTR_GUJARATI) );
949  break;
950  case UBLOCK_ORIYA:
951  aAllSubsets.emplace_back( 0x0B00, 0x0B7F, SvxResId(RID_SUBSETSTR_ODIA) );
952  break;
953  case UBLOCK_TAMIL:
954  aAllSubsets.emplace_back( 0x0B80, 0x0BFF, SvxResId(RID_SUBSETSTR_TAMIL) );
955  break;
956  case UBLOCK_TELUGU:
957  aAllSubsets.emplace_back( 0x0C00, 0x0C7F, SvxResId(RID_SUBSETSTR_TELUGU) );
958  break;
959  case UBLOCK_KANNADA:
960  aAllSubsets.emplace_back( 0x0C80, 0x0CFF, SvxResId(RID_SUBSETSTR_KANNADA) );
961  break;
962  case UBLOCK_MALAYALAM:
963  aAllSubsets.emplace_back( 0x0D00, 0x0D7F, SvxResId(RID_SUBSETSTR_MALAYALAM) );
964  break;
965  case UBLOCK_SINHALA:
966  aAllSubsets.emplace_back( 0x0D80, 0x0DFF, SvxResId(RID_SUBSETSTR_SINHALA) );
967  break;
968  case UBLOCK_THAI:
969  aAllSubsets.emplace_back( 0x0E00, 0x0E7F, SvxResId(RID_SUBSETSTR_THAI) );
970  break;
971  case UBLOCK_LAO:
972  aAllSubsets.emplace_back( 0x0E80, 0x0EFF, SvxResId(RID_SUBSETSTR_LAO) );
973  break;
974  case UBLOCK_TIBETAN:
975  aAllSubsets.emplace_back( 0x0F00, 0x0FBF, SvxResId(RID_SUBSETSTR_TIBETAN) );
976  break;
977  case UBLOCK_MYANMAR:
978  aAllSubsets.emplace_back( 0x1000, 0x109F, SvxResId(RID_SUBSETSTR_MYANMAR) );
979  break;
980  case UBLOCK_GEORGIAN:
981  aAllSubsets.emplace_back( 0x10A0, 0x10FF, SvxResId(RID_SUBSETSTR_BASIC_GEORGIAN) );
982  break;
983  case UBLOCK_HANGUL_JAMO:
984  aAllSubsets.emplace_back( 0x1100, 0x11FF, SvxResId(RID_SUBSETSTR_HANGUL_JAMO) );
985  break;
986  case UBLOCK_ETHIOPIC:
987  aAllSubsets.emplace_back( 0x1200, 0x137F, SvxResId(RID_SUBSETSTR_ETHIOPIC) );
988  break;
989  case UBLOCK_CHEROKEE:
990  aAllSubsets.emplace_back( 0x13A0, 0x13FF, SvxResId(RID_SUBSETSTR_CHEROKEE) );
991  break;
992  case UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS:
993  aAllSubsets.emplace_back( 0x1400, 0x167F, SvxResId(RID_SUBSETSTR_CANADIAN_ABORIGINAL) );
994  break;
995  case UBLOCK_OGHAM:
996  aAllSubsets.emplace_back( 0x1680, 0x169F, SvxResId(RID_SUBSETSTR_OGHAM) );
997  break;
998  case UBLOCK_RUNIC:
999  aAllSubsets.emplace_back( 0x16A0, 0x16F0, SvxResId(RID_SUBSETSTR_RUNIC) );
1000  break;
1001  case UBLOCK_KHMER:
1002  aAllSubsets.emplace_back( 0x1780, 0x17FF, SvxResId(RID_SUBSETSTR_KHMER) );
1003  break;
1004  case UBLOCK_MONGOLIAN:
1005  aAllSubsets.emplace_back( 0x1800, 0x18AF, SvxResId(RID_SUBSETSTR_MONGOLIAN) );
1006  break;
1007  case UBLOCK_LATIN_EXTENDED_ADDITIONAL:
1008  aAllSubsets.emplace_back( 0x1E00, 0x1EFF, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_ADDS) );
1009  break;
1010  case UBLOCK_GREEK_EXTENDED:
1011  aAllSubsets.emplace_back( 0x1F00, 0x1FFF, SvxResId(RID_SUBSETSTR_GREEK_EXTENDED) );
1012  break;
1013  case UBLOCK_GENERAL_PUNCTUATION:
1014  aAllSubsets.emplace_back( 0x2000, 0x206F, SvxResId(RID_SUBSETSTR_GENERAL_PUNCTUATION) );
1015  break;
1016  case UBLOCK_SUPERSCRIPTS_AND_SUBSCRIPTS:
1017  aAllSubsets.emplace_back( 0x2070, 0x209F, SvxResId(RID_SUBSETSTR_SUB_SUPER_SCRIPTS) );
1018  break;
1019  case UBLOCK_CURRENCY_SYMBOLS:
1020  aAllSubsets.emplace_back( 0x20A0, 0x20CF, SvxResId(RID_SUBSETSTR_CURRENCY_SYMBOLS) );
1021  break;
1022  case UBLOCK_COMBINING_MARKS_FOR_SYMBOLS:
1023  aAllSubsets.emplace_back( 0x20D0, 0x20FF, SvxResId(RID_SUBSETSTR_COMB_DIACRITIC_SYMS) );
1024  break;
1025  case UBLOCK_LETTERLIKE_SYMBOLS:
1026  aAllSubsets.emplace_back( 0x2100, 0x214F, SvxResId(RID_SUBSETSTR_LETTERLIKE_SYMBOLS) );
1027  break;
1028  case UBLOCK_NUMBER_FORMS:
1029  aAllSubsets.emplace_back( 0x2150, 0x218F, SvxResId(RID_SUBSETSTR_NUMBER_FORMS) );
1030  break;
1031  case UBLOCK_ARROWS:
1032  aAllSubsets.emplace_back( 0x2190, 0x21FF, SvxResId(RID_SUBSETSTR_ARROWS) );
1033  break;
1034  case UBLOCK_MATHEMATICAL_OPERATORS:
1035  aAllSubsets.emplace_back( 0x2200, 0x22FF, SvxResId(RID_SUBSETSTR_MATH_OPERATORS) );
1036  break;
1037  case UBLOCK_MISCELLANEOUS_TECHNICAL:
1038  aAllSubsets.emplace_back( 0x2300, 0x23FF, SvxResId(RID_SUBSETSTR_MISC_TECHNICAL) );
1039  break;
1040  case UBLOCK_CONTROL_PICTURES:
1041  aAllSubsets.emplace_back( 0x2400, 0x243F, SvxResId(RID_SUBSETSTR_CONTROL_PICTURES) );
1042  break;
1043  case UBLOCK_OPTICAL_CHARACTER_RECOGNITION:
1044  aAllSubsets.emplace_back( 0x2440, 0x245F, SvxResId(RID_SUBSETSTR_OPTICAL_CHAR_REC) );
1045  break;
1046  case UBLOCK_ENCLOSED_ALPHANUMERICS:
1047  aAllSubsets.emplace_back( 0x2460, 0x24FF, SvxResId(RID_SUBSETSTR_ENCLOSED_ALPHANUM) );
1048  break;
1049  case UBLOCK_BOX_DRAWING:
1050  aAllSubsets.emplace_back( 0x2500, 0x257F, SvxResId(RID_SUBSETSTR_BOX_DRAWING) );
1051  break;
1052  case UBLOCK_BLOCK_ELEMENTS:
1053  aAllSubsets.emplace_back( 0x2580, 0x259F, SvxResId(RID_SUBSETSTR_BLOCK_ELEMENTS) );
1054  break;
1055  case UBLOCK_GEOMETRIC_SHAPES:
1056  aAllSubsets.emplace_back( 0x25A0, 0x25FF, SvxResId(RID_SUBSETSTR_GEOMETRIC_SHAPES) );
1057  break;
1058  case UBLOCK_MISCELLANEOUS_SYMBOLS:
1059  aAllSubsets.emplace_back( 0x2600, 0x26FF, SvxResId(RID_SUBSETSTR_MISC_DINGBATS) );
1060  break;
1061  case UBLOCK_DINGBATS:
1062  aAllSubsets.emplace_back( 0x2700, 0x27BF, SvxResId(RID_SUBSETSTR_DINGBATS) );
1063  break;
1064  case UBLOCK_BRAILLE_PATTERNS:
1065  aAllSubsets.emplace_back( 0x2800, 0x28FF, SvxResId(RID_SUBSETSTR_BRAILLE_PATTERNS) );
1066  break;
1067  case UBLOCK_CJK_RADICALS_SUPPLEMENT:
1068  aAllSubsets.emplace_back( 0x2E80, 0x2EFF, SvxResId(RID_SUBSETSTR_CJK_RADICAL_SUPPL) );
1069  break;
1070  case UBLOCK_KANGXI_RADICALS:
1071  aAllSubsets.emplace_back( 0x2F00, 0x2FDF, SvxResId(RID_SUBSETSTR_KANGXI_RADICALS) );
1072  break;
1073  case UBLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS:
1074  aAllSubsets.emplace_back( 0x2FF0, 0x2FFF, SvxResId(RID_SUBSETSTR_IDEO_DESC_CHARS) );
1075  break;
1076  case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION:
1077  aAllSubsets.emplace_back( 0x3000, 0x303F, SvxResId(RID_SUBSETSTR_CJK_SYMS_PUNCTUATION) );
1078  break;
1079  case UBLOCK_HIRAGANA:
1080  aAllSubsets.emplace_back( 0x3040, 0x309F, SvxResId(RID_SUBSETSTR_HIRAGANA) );
1081  break;
1082  case UBLOCK_KATAKANA:
1083  aAllSubsets.emplace_back( 0x30A0, 0x30FF, SvxResId(RID_SUBSETSTR_KATAKANA) );
1084  break;
1085  case UBLOCK_BOPOMOFO:
1086  aAllSubsets.emplace_back( 0x3100, 0x312F, SvxResId(RID_SUBSETSTR_BOPOMOFO) );
1087  break;
1088  case UBLOCK_HANGUL_COMPATIBILITY_JAMO:
1089  aAllSubsets.emplace_back( 0x3130, 0x318F, SvxResId(RID_SUBSETSTR_HANGUL_COMPAT_JAMO) );
1090  break;
1091  case UBLOCK_KANBUN:
1092  aAllSubsets.emplace_back( 0x3190, 0x319F, SvxResId(RID_SUBSETSTR_KANBUN) );
1093  break;
1094  case UBLOCK_BOPOMOFO_EXTENDED:
1095  aAllSubsets.emplace_back( 0x31A0, 0x31BF, SvxResId(RID_SUBSETSTR_BOPOMOFO_EXTENDED) );
1096  break;
1097  case UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS:
1098  aAllSubsets.emplace_back( 0x3200, 0x32FF, SvxResId(RID_SUBSETSTR_ENCLOSED_CJK_LETTERS) );
1099  break;
1100  case UBLOCK_CJK_COMPATIBILITY:
1101  aAllSubsets.emplace_back( 0x3300, 0x33FF, SvxResId(RID_SUBSETSTR_CJK_COMPATIBILITY) );
1102  break;
1103  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A:
1104  aAllSubsets.emplace_back( 0x3400, 0x4DBF, SvxResId(RID_SUBSETSTR_CJK_EXT_A_UNIFIED_IDGRAPH) );
1105  break;
1106  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS:
1107  aAllSubsets.emplace_back( 0x4E00, 0x9FA5, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDGRAPH) );
1108  break;
1109  case UBLOCK_YI_SYLLABLES:
1110  aAllSubsets.emplace_back( 0xA000, 0xA48F, SvxResId(RID_SUBSETSTR_YI_SYLLABLES) );
1111  break;
1112  case UBLOCK_YI_RADICALS:
1113  aAllSubsets.emplace_back( 0xA490, 0xA4CF, SvxResId(RID_SUBSETSTR_YI_RADICALS) );
1114  break;
1115  case UBLOCK_HANGUL_SYLLABLES:
1116  aAllSubsets.emplace_back( 0xAC00, 0xD7AF, SvxResId(RID_SUBSETSTR_HANGUL) );
1117  break;
1118  case UBLOCK_PRIVATE_USE_AREA:
1119  aAllSubsets.emplace_back( 0xE000, 0xF8FF, SvxResId(RID_SUBSETSTR_PRIVATE_USE_AREA) );
1120  break;
1121  case UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS:
1122  aAllSubsets.emplace_back( 0xF900, 0xFAFF, SvxResId(RID_SUBSETSTR_CJK_COMPAT_IDGRAPHS) );
1123  break;
1124  case UBLOCK_ALPHABETIC_PRESENTATION_FORMS:
1125  aAllSubsets.emplace_back( 0xFB00, 0xFB4F, SvxResId(RID_SUBSETSTR_ALPHA_PRESENTATION) );
1126  break;
1127  case UBLOCK_ARABIC_PRESENTATION_FORMS_A:
1128  aAllSubsets.emplace_back( 0xFB50, 0xFDFF, SvxResId(RID_SUBSETSTR_ARABIC_PRESENT_A) );
1129  break;
1130  case UBLOCK_COMBINING_HALF_MARKS:
1131  aAllSubsets.emplace_back( 0xFE20, 0xFE2F, SvxResId(RID_SUBSETSTR_COMBINING_HALF_MARKS) );
1132  break;
1133  case UBLOCK_CJK_COMPATIBILITY_FORMS:
1134  aAllSubsets.emplace_back( 0xFE30, 0xFE4F, SvxResId(RID_SUBSETSTR_CJK_COMPAT_FORMS) );
1135  break;
1136  case UBLOCK_SMALL_FORM_VARIANTS:
1137  aAllSubsets.emplace_back( 0xFE50, 0xFE6F, SvxResId(RID_SUBSETSTR_SMALL_FORM_VARIANTS) );
1138  break;
1139  case UBLOCK_ARABIC_PRESENTATION_FORMS_B:
1140  aAllSubsets.emplace_back( 0xFE70, 0xFEFF, SvxResId(RID_SUBSETSTR_ARABIC_PRESENT_B) );
1141  break;
1142  case UBLOCK_SPECIALS:
1143  aAllSubsets.emplace_back( 0xFFF0, 0xFFFF, SvxResId(RID_SUBSETSTR_SPECIALS) );
1144  break;
1145  case UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS:
1146  aAllSubsets.emplace_back( 0xFF00, 0xFFEF, SvxResId(RID_SUBSETSTR_HALFW_FULLW_FORMS) );
1147  break;
1148  case UBLOCK_OLD_ITALIC:
1149  aAllSubsets.emplace_back( 0x10300, 0x1032F, SvxResId(RID_SUBSETSTR_OLD_ITALIC) );
1150  break;
1151  case UBLOCK_GOTHIC:
1152  aAllSubsets.emplace_back( 0x10330, 0x1034F, SvxResId(RID_SUBSETSTR_GOTHIC) );
1153  break;
1154  case UBLOCK_DESERET:
1155  aAllSubsets.emplace_back( 0x10400, 0x1044F, SvxResId(RID_SUBSETSTR_DESERET) );
1156  break;
1157  case UBLOCK_BYZANTINE_MUSICAL_SYMBOLS:
1158  aAllSubsets.emplace_back( 0x1D000, 0x1D0FF, SvxResId(RID_SUBSETSTR_BYZANTINE_MUSICAL_SYMBOLS) );
1159  break;
1160  case UBLOCK_MUSICAL_SYMBOLS:
1161  aAllSubsets.emplace_back( 0x1D100, 0x1D1FF, SvxResId(RID_SUBSETSTR_MUSICAL_SYMBOLS) );
1162  break;
1163  case UBLOCK_MATHEMATICAL_ALPHANUMERIC_SYMBOLS:
1164  aAllSubsets.emplace_back( 0x1D400, 0x1D7FF, SvxResId(RID_SUBSETSTR_MATHEMATICAL_ALPHANUMERIC_SYMBOLS) );
1165  break;
1166  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B:
1167  aAllSubsets.emplace_back( 0x20000, 0x2A6DF, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B) );
1168  break;
1169  case UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT:
1170  aAllSubsets.emplace_back( 0x2F800, 0x2FA1F, SvxResId(RID_SUBSETSTR_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT) );
1171  break;
1172  case UBLOCK_TAGS:
1173  aAllSubsets.emplace_back( 0xE0000, 0xE007F, SvxResId(RID_SUBSETSTR_TAGS) );
1174  break;
1175  case UBLOCK_CYRILLIC_SUPPLEMENTARY:
1176  aAllSubsets.emplace_back( 0x0500, 0x052F, SvxResId(RID_SUBSETSTR_CYRILLIC_SUPPLEMENTARY) );
1177  break;
1178  case UBLOCK_TAGALOG:
1179  aAllSubsets.emplace_back( 0x1700, 0x171F, SvxResId(RID_SUBSETSTR_TAGALOG) );
1180  break;
1181  case UBLOCK_HANUNOO:
1182  aAllSubsets.emplace_back( 0x1720, 0x173F, SvxResId(RID_SUBSETSTR_HANUNOO) );
1183  break;
1184  case UBLOCK_BUHID:
1185  aAllSubsets.emplace_back( 0x1740, 0x175F, SvxResId(RID_SUBSETSTR_BUHID) );
1186  break;
1187  case UBLOCK_TAGBANWA:
1188  aAllSubsets.emplace_back( 0x1760, 0x177F, SvxResId(RID_SUBSETSTR_TAGBANWA) );
1189  break;
1190  case UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A:
1191  aAllSubsets.emplace_back( 0x27C0, 0x27EF, SvxResId(RID_SUBSETSTR_MISC_MATH_SYMS_A) );
1192  break;
1193  case UBLOCK_SUPPLEMENTAL_ARROWS_A:
1194  aAllSubsets.emplace_back( 0x27F0, 0x27FF, SvxResId(RID_SUBSETSTR_SUPPL_ARROWS_A) );
1195  break;
1196  case UBLOCK_SUPPLEMENTAL_ARROWS_B:
1197  aAllSubsets.emplace_back( 0x2900, 0x297F, SvxResId(RID_SUBSETSTR_SUPPL_ARROWS_B) );
1198  break;
1199  case UBLOCK_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B:
1200  aAllSubsets.emplace_back( 0x2980, 0x29FF, SvxResId(RID_SUBSETSTR_MISC_MATH_SYMS_B) );
1201  break;
1202  case UBLOCK_SUPPLEMENTAL_MATHEMATICAL_OPERATORS:
1203  aAllSubsets.emplace_back( 0x2A00, 0x2AFF, SvxResId(RID_SUBSETSTR_MISC_MATH_SYMS_B) );
1204  break;
1205  case UBLOCK_KATAKANA_PHONETIC_EXTENSIONS:
1206  aAllSubsets.emplace_back( 0x31F0, 0x31FF, SvxResId(RID_SUBSETSTR_KATAKANA_PHONETIC) );
1207  break;
1208  case UBLOCK_VARIATION_SELECTORS:
1209  aAllSubsets.emplace_back( 0xFE00, 0xFE0F, SvxResId(RID_SUBSETSTR_VARIATION_SELECTORS) );
1210  break;
1211  case UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_A:
1212  aAllSubsets.emplace_back( 0xF0000, 0xFFFFF, SvxResId(RID_SUBSETSTR_SUPPLEMENTARY_PRIVATE_USE_AREA_A) );
1213  break;
1214  case UBLOCK_SUPPLEMENTARY_PRIVATE_USE_AREA_B:
1215  aAllSubsets.emplace_back( 0x100000, 0x10FFFF, SvxResId(RID_SUBSETSTR_SUPPLEMENTARY_PRIVATE_USE_AREA_B) );
1216  break;
1217  case UBLOCK_LIMBU:
1218  aAllSubsets.emplace_back( 0x1900, 0x194F, SvxResId(RID_SUBSETSTR_LIMBU) );
1219  break;
1220  case UBLOCK_TAI_LE:
1221  aAllSubsets.emplace_back( 0x1950, 0x197F, SvxResId(RID_SUBSETSTR_TAI_LE) );
1222  break;
1223  case UBLOCK_KHMER_SYMBOLS:
1224  aAllSubsets.emplace_back( 0x19E0, 0x19FF, SvxResId(RID_SUBSETSTR_KHMER_SYMBOLS) );
1225  break;
1226  case UBLOCK_PHONETIC_EXTENSIONS:
1227  aAllSubsets.emplace_back( 0x1D00, 0x1D7F, SvxResId(RID_SUBSETSTR_PHONETIC_EXTENSIONS) );
1228  break;
1229  case UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS:
1230  aAllSubsets.emplace_back( 0x2B00, 0x2BFF, SvxResId(RID_SUBSETSTR_MISCELLANEOUS_SYMBOLS_AND_ARROWS) );
1231  break;
1232  case UBLOCK_YIJING_HEXAGRAM_SYMBOLS:
1233  aAllSubsets.emplace_back( 0x4DC0, 0x4DFF, SvxResId(RID_SUBSETSTR_YIJING_HEXAGRAM_SYMBOLS) );
1234  break;
1235  case UBLOCK_LINEAR_B_SYLLABARY:
1236  aAllSubsets.emplace_back( 0x10000, 0x1007F, SvxResId(RID_SUBSETSTR_LINEAR_B_SYLLABARY) );
1237  break;
1238  case UBLOCK_LINEAR_B_IDEOGRAMS:
1239  aAllSubsets.emplace_back( 0x10080, 0x100FF, SvxResId(RID_SUBSETSTR_LINEAR_B_IDEOGRAMS) );
1240  break;
1241  case UBLOCK_AEGEAN_NUMBERS:
1242  aAllSubsets.emplace_back( 0x10100, 0x1013F, SvxResId(RID_SUBSETSTR_AEGEAN_NUMBERS) );
1243  break;
1244  case UBLOCK_UGARITIC:
1245  aAllSubsets.emplace_back( 0x10380, 0x1039F, SvxResId(RID_SUBSETSTR_UGARITIC) );
1246  break;
1247  case UBLOCK_SHAVIAN:
1248  aAllSubsets.emplace_back( 0x10450, 0x1047F, SvxResId(RID_SUBSETSTR_SHAVIAN) );
1249  break;
1250  case UBLOCK_OSMANYA:
1251  aAllSubsets.emplace_back( 0x10480, 0x104AF, SvxResId(RID_SUBSETSTR_OSMANYA) );
1252  break;
1253  case UBLOCK_CYPRIOT_SYLLABARY:
1254  aAllSubsets.emplace_back( 0x10800, 0x1083F, SvxResId(RID_SUBSETSTR_CYPRIOT_SYLLABARY) );
1255  break;
1256  case UBLOCK_TAI_XUAN_JING_SYMBOLS:
1257  aAllSubsets.emplace_back( 0x1D300, 0x1D35F, SvxResId(RID_SUBSETSTR_TAI_XUAN_JING_SYMBOLS) );
1258  break;
1259  case UBLOCK_VARIATION_SELECTORS_SUPPLEMENT:
1260  aAllSubsets.emplace_back( 0xE0100, 0xE01EF, SvxResId(RID_SUBSETSTR_VARIATION_SELECTORS_SUPPLEMENT) );
1261  break;
1262  case UBLOCK_ANCIENT_GREEK_MUSICAL_NOTATION:
1263  aAllSubsets.emplace_back(0x1D200, 0x1D24F, SvxResId(RID_SUBSETSTR_ANCIENT_GREEK_MUSICAL_NOTATION) );
1264  break;
1265  case UBLOCK_ANCIENT_GREEK_NUMBERS:
1266  aAllSubsets.emplace_back(0x10140, 0x1018F , SvxResId(RID_SUBSETSTR_ANCIENT_GREEK_NUMBERS) );
1267  break;
1268  case UBLOCK_ARABIC_SUPPLEMENT:
1269  aAllSubsets.emplace_back(0x0750, 0x077F , SvxResId(RID_SUBSETSTR_ARABIC_SUPPLEMENT) );
1270  break;
1271  case UBLOCK_BUGINESE:
1272  aAllSubsets.emplace_back(0x1A00, 0x1A1F , SvxResId(RID_SUBSETSTR_BUGINESE) );
1273  break;
1274  case UBLOCK_CJK_STROKES:
1275  aAllSubsets.emplace_back( 0x31C0, 0x31EF, SvxResId(RID_SUBSETSTR_CJK_STROKES) );
1276  break;
1277  case UBLOCK_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT:
1278  aAllSubsets.emplace_back( 0x1DC0, 0x1DFF , SvxResId(RID_SUBSETSTR_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT) );
1279  break;
1280  case UBLOCK_COPTIC:
1281  aAllSubsets.emplace_back( 0x2C80, 0x2CFF , SvxResId(RID_SUBSETSTR_COPTIC) );
1282  break;
1283  case UBLOCK_ETHIOPIC_EXTENDED:
1284  aAllSubsets.emplace_back( 0x2D80, 0x2DDF , SvxResId(RID_SUBSETSTR_ETHIOPIC_EXTENDED) );
1285  break;
1286  case UBLOCK_ETHIOPIC_SUPPLEMENT:
1287  aAllSubsets.emplace_back( 0x1380, 0x139F, SvxResId(RID_SUBSETSTR_ETHIOPIC_SUPPLEMENT) );
1288  break;
1289  case UBLOCK_GEORGIAN_SUPPLEMENT:
1290  aAllSubsets.emplace_back( 0x2D00, 0x2D2F, SvxResId(RID_SUBSETSTR_GEORGIAN_SUPPLEMENT) );
1291  break;
1292  case UBLOCK_GLAGOLITIC:
1293  aAllSubsets.emplace_back( 0x2C00, 0x2C5F, SvxResId(RID_SUBSETSTR_GLAGOLITIC) );
1294  break;
1295  case UBLOCK_KHAROSHTHI:
1296  aAllSubsets.emplace_back( 0x10A00, 0x10A5F, SvxResId(RID_SUBSETSTR_KHAROSHTHI) );
1297  break;
1298  case UBLOCK_MODIFIER_TONE_LETTERS:
1299  aAllSubsets.emplace_back( 0xA700, 0xA71F, SvxResId(RID_SUBSETSTR_MODIFIER_TONE_LETTERS) );
1300  break;
1301  case UBLOCK_NEW_TAI_LUE:
1302  aAllSubsets.emplace_back( 0x1980, 0x19DF, SvxResId(RID_SUBSETSTR_NEW_TAI_LUE) );
1303  break;
1304  case UBLOCK_OLD_PERSIAN:
1305  aAllSubsets.emplace_back( 0x103A0, 0x103DF, SvxResId(RID_SUBSETSTR_OLD_PERSIAN) );
1306  break;
1307  case UBLOCK_PHONETIC_EXTENSIONS_SUPPLEMENT:
1308  aAllSubsets.emplace_back( 0x1D80, 0x1DBF, SvxResId(RID_SUBSETSTR_PHONETIC_EXTENSIONS_SUPPLEMENT) );
1309  break;
1310  case UBLOCK_SUPPLEMENTAL_PUNCTUATION:
1311  aAllSubsets.emplace_back( 0x2E00, 0x2E7F, SvxResId(RID_SUBSETSTR_SUPPLEMENTAL_PUNCTUATION) );
1312  break;
1313  case UBLOCK_SYLOTI_NAGRI:
1314  aAllSubsets.emplace_back( 0xA800, 0xA82F, SvxResId(RID_SUBSETSTR_SYLOTI_NAGRI) );
1315  break;
1316  case UBLOCK_TIFINAGH:
1317  aAllSubsets.emplace_back( 0x2D30, 0x2D7F, SvxResId(RID_SUBSETSTR_TIFINAGH) );
1318  break;
1319  case UBLOCK_VERTICAL_FORMS:
1320  aAllSubsets.emplace_back( 0xFE10, 0xFE1F, SvxResId(RID_SUBSETSTR_VERTICAL_FORMS) );
1321  break;
1322  case UBLOCK_NKO:
1323  aAllSubsets.emplace_back( 0x07C0, 0x07FF, SvxResId(RID_SUBSETSTR_NKO) );
1324  break;
1325  case UBLOCK_BALINESE:
1326  aAllSubsets.emplace_back( 0x1B00, 0x1B7F, SvxResId(RID_SUBSETSTR_BALINESE) );
1327  break;
1328  case UBLOCK_LATIN_EXTENDED_C:
1329  aAllSubsets.emplace_back( 0x2C60, 0x2C7F, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_C) );
1330  break;
1331  case UBLOCK_LATIN_EXTENDED_D:
1332  aAllSubsets.emplace_back( 0xA720, 0xA7FF, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_D) );
1333  break;
1334  case UBLOCK_PHAGS_PA:
1335  aAllSubsets.emplace_back( 0xA840, 0xA87F, SvxResId(RID_SUBSETSTR_PHAGS_PA) );
1336  break;
1337  case UBLOCK_PHOENICIAN:
1338  aAllSubsets.emplace_back( 0x10900, 0x1091F, SvxResId(RID_SUBSETSTR_PHOENICIAN) );
1339  break;
1340  case UBLOCK_CUNEIFORM:
1341  aAllSubsets.emplace_back( 0x12000, 0x123FF, SvxResId(RID_SUBSETSTR_CUNEIFORM) );
1342  break;
1343  case UBLOCK_CUNEIFORM_NUMBERS_AND_PUNCTUATION:
1344  aAllSubsets.emplace_back( 0x12400, 0x1247F, SvxResId(RID_SUBSETSTR_CUNEIFORM_NUMBERS_AND_PUNCTUATION) );
1345  break;
1346  case UBLOCK_COUNTING_ROD_NUMERALS:
1347  aAllSubsets.emplace_back( 0x1D360, 0x1D37F, SvxResId(RID_SUBSETSTR_COUNTING_ROD_NUMERALS) );
1348  break;
1349  case UBLOCK_SUNDANESE:
1350  aAllSubsets.emplace_back( 0x1B80, 0x1BBF, SvxResId(RID_SUBSETSTR_SUNDANESE) );
1351  break;
1352  case UBLOCK_LEPCHA:
1353  aAllSubsets.emplace_back( 0x1C00, 0x1C4F, SvxResId(RID_SUBSETSTR_LEPCHA) );
1354  break;
1355  case UBLOCK_OL_CHIKI:
1356  aAllSubsets.emplace_back( 0x1C50, 0x1C7F, SvxResId(RID_SUBSETSTR_OL_CHIKI) );
1357  break;
1358  case UBLOCK_CYRILLIC_EXTENDED_A:
1359  aAllSubsets.emplace_back( 0x2DE0, 0x2DFF, SvxResId(RID_SUBSETSTR_CYRILLIC_EXTENDED_A) );
1360  break;
1361  case UBLOCK_VAI:
1362  aAllSubsets.emplace_back( 0xA500, 0xA63F, SvxResId(RID_SUBSETSTR_VAI) );
1363  break;
1364  case UBLOCK_CYRILLIC_EXTENDED_B:
1365  aAllSubsets.emplace_back( 0xA640, 0xA69F, SvxResId(RID_SUBSETSTR_CYRILLIC_EXTENDED_B) );
1366  break;
1367  case UBLOCK_SAURASHTRA:
1368  aAllSubsets.emplace_back( 0xA880, 0xA8DF, SvxResId(RID_SUBSETSTR_SAURASHTRA) );
1369  break;
1370  case UBLOCK_KAYAH_LI:
1371  aAllSubsets.emplace_back( 0xA900, 0xA92F, SvxResId(RID_SUBSETSTR_KAYAH_LI) );
1372  break;
1373  case UBLOCK_REJANG:
1374  aAllSubsets.emplace_back( 0xA930, 0xA95F, SvxResId(RID_SUBSETSTR_REJANG) );
1375  break;
1376  case UBLOCK_CHAM:
1377  aAllSubsets.emplace_back( 0xAA00, 0xAA5F, SvxResId(RID_SUBSETSTR_CHAM) );
1378  break;
1379  case UBLOCK_ANCIENT_SYMBOLS:
1380  aAllSubsets.emplace_back( 0x10190, 0x101CF, SvxResId(RID_SUBSETSTR_ANCIENT_SYMBOLS) );
1381  break;
1382  case UBLOCK_PHAISTOS_DISC:
1383  aAllSubsets.emplace_back( 0x101D0, 0x101FF, SvxResId(RID_SUBSETSTR_PHAISTOS_DISC) );
1384  break;
1385  case UBLOCK_LYCIAN:
1386  aAllSubsets.emplace_back( 0x10280, 0x1029F, SvxResId(RID_SUBSETSTR_LYCIAN) );
1387  break;
1388  case UBLOCK_CARIAN:
1389  aAllSubsets.emplace_back( 0x102A0, 0x102DF, SvxResId(RID_SUBSETSTR_CARIAN) );
1390  break;
1391  case UBLOCK_LYDIAN:
1392  aAllSubsets.emplace_back( 0x10920, 0x1093F, SvxResId(RID_SUBSETSTR_LYDIAN) );
1393  break;
1394  case UBLOCK_MAHJONG_TILES:
1395  aAllSubsets.emplace_back( 0x1F000, 0x1F02F, SvxResId(RID_SUBSETSTR_MAHJONG_TILES) );
1396  break;
1397  case UBLOCK_DOMINO_TILES:
1398  aAllSubsets.emplace_back( 0x1F030, 0x1F09F, SvxResId(RID_SUBSETSTR_DOMINO_TILES) );
1399  break;
1400  case UBLOCK_SAMARITAN:
1401  aAllSubsets.emplace_back( 0x0800, 0x083F, SvxResId(RID_SUBSETSTR_SAMARITAN) );
1402  break;
1403  case UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED:
1404  aAllSubsets.emplace_back( 0x18B0, 0x18FF, SvxResId(RID_SUBSETSTR_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED) );
1405  break;
1406  case UBLOCK_TAI_THAM:
1407  aAllSubsets.emplace_back( 0x1A20, 0x1AAF, SvxResId(RID_SUBSETSTR_TAI_THAM) );
1408  break;
1409  case UBLOCK_VEDIC_EXTENSIONS:
1410  aAllSubsets.emplace_back( 0x1CD0, 0x1CFF, SvxResId(RID_SUBSETSTR_VEDIC_EXTENSIONS) );
1411  break;
1412  case UBLOCK_LISU:
1413  aAllSubsets.emplace_back( 0xA4D0, 0xA4FF, SvxResId(RID_SUBSETSTR_LISU) );
1414  break;
1415  case UBLOCK_BAMUM:
1416  aAllSubsets.emplace_back( 0xA6A0, 0xA6FF, SvxResId(RID_SUBSETSTR_BAMUM) );
1417  break;
1418  case UBLOCK_COMMON_INDIC_NUMBER_FORMS:
1419  aAllSubsets.emplace_back( 0xA830, 0xA83F, SvxResId(RID_SUBSETSTR_COMMON_INDIC_NUMBER_FORMS) );
1420  break;
1421  case UBLOCK_DEVANAGARI_EXTENDED:
1422  aAllSubsets.emplace_back( 0xA8E0, 0xA8FF, SvxResId(RID_SUBSETSTR_DEVANAGARI_EXTENDED) );
1423  break;
1424  case UBLOCK_HANGUL_JAMO_EXTENDED_A:
1425  aAllSubsets.emplace_back( 0xA960, 0xA97F, SvxResId(RID_SUBSETSTR_HANGUL_JAMO_EXTENDED_A) );
1426  break;
1427  case UBLOCK_JAVANESE:
1428  aAllSubsets.emplace_back( 0xA980, 0xA9DF, SvxResId(RID_SUBSETSTR_JAVANESE) );
1429  break;
1430  case UBLOCK_MYANMAR_EXTENDED_A:
1431  aAllSubsets.emplace_back( 0xAA60, 0xAA7F, SvxResId(RID_SUBSETSTR_MYANMAR_EXTENDED_A) );
1432  break;
1433  case UBLOCK_TAI_VIET:
1434  aAllSubsets.emplace_back( 0xAA80, 0xAADF, SvxResId(RID_SUBSETSTR_TAI_VIET) );
1435  break;
1436  case UBLOCK_MEETEI_MAYEK:
1437  aAllSubsets.emplace_back( 0xABC0, 0xABFF, SvxResId(RID_SUBSETSTR_MEETEI_MAYEK) );
1438  break;
1439  case UBLOCK_HANGUL_JAMO_EXTENDED_B:
1440  aAllSubsets.emplace_back( 0xD7B0, 0xD7FF, SvxResId(RID_SUBSETSTR_HANGUL_JAMO_EXTENDED_B) );
1441  break;
1442  case UBLOCK_IMPERIAL_ARAMAIC:
1443  aAllSubsets.emplace_back( 0x10840, 0x1085F, SvxResId(RID_SUBSETSTR_IMPERIAL_ARAMAIC) );
1444  break;
1445  case UBLOCK_OLD_SOUTH_ARABIAN:
1446  aAllSubsets.emplace_back( 0x10A60, 0x10A7F, SvxResId(RID_SUBSETSTR_OLD_SOUTH_ARABIAN) );
1447  break;
1448  case UBLOCK_AVESTAN:
1449  aAllSubsets.emplace_back( 0x10B00, 0x10B3F, SvxResId(RID_SUBSETSTR_AVESTAN) );
1450  break;
1451  case UBLOCK_INSCRIPTIONAL_PARTHIAN:
1452  aAllSubsets.emplace_back( 0x10B40, 0x10B5F, SvxResId(RID_SUBSETSTR_INSCRIPTIONAL_PARTHIAN) );
1453  break;
1454  case UBLOCK_INSCRIPTIONAL_PAHLAVI:
1455  aAllSubsets.emplace_back( 0x10B60, 0x10B7F, SvxResId(RID_SUBSETSTR_INSCRIPTIONAL_PAHLAVI) );
1456  break;
1457  case UBLOCK_OLD_TURKIC:
1458  aAllSubsets.emplace_back( 0x10C00, 0x10C4F, SvxResId(RID_SUBSETSTR_OLD_TURKIC) );
1459  break;
1460  case UBLOCK_RUMI_NUMERAL_SYMBOLS:
1461  aAllSubsets.emplace_back( 0x10E60, 0x10E7F, SvxResId(RID_SUBSETSTR_RUMI_NUMERAL_SYMBOLS) );
1462  break;
1463  case UBLOCK_KAITHI:
1464  aAllSubsets.emplace_back( 0x11080, 0x110CF, SvxResId(RID_SUBSETSTR_KAITHI) );
1465  break;
1466  case UBLOCK_EGYPTIAN_HIEROGLYPHS:
1467  aAllSubsets.emplace_back( 0x13000, 0x1342F, SvxResId(RID_SUBSETSTR_EGYPTIAN_HIEROGLYPHS) );
1468  break;
1469  case UBLOCK_ENCLOSED_ALPHANUMERIC_SUPPLEMENT:
1470  aAllSubsets.emplace_back( 0x1F100, 0x1F1FF, SvxResId(RID_SUBSETSTR_ENCLOSED_ALPHANUMERIC_SUPPLEMENT) );
1471  break;
1472  case UBLOCK_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT:
1473  aAllSubsets.emplace_back( 0x1F200, 0x1F2FF, SvxResId(RID_SUBSETSTR_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT) );
1474  break;
1475  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C:
1476  aAllSubsets.emplace_back( 0x2A700, 0x2B73F, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C) );
1477  break;
1478  case UBLOCK_MANDAIC:
1479  aAllSubsets.emplace_back( 0x0840, 0x085F, SvxResId(RID_SUBSETSTR_MANDAIC) );
1480  break;
1481  case UBLOCK_BATAK:
1482  aAllSubsets.emplace_back( 0x1BC0, 0x1BFF, SvxResId(RID_SUBSETSTR_BATAK) );
1483  break;
1484  case UBLOCK_ETHIOPIC_EXTENDED_A:
1485  aAllSubsets.emplace_back( 0xAB00, 0xAB2F, SvxResId(RID_SUBSETSTR_ETHIOPIC_EXTENDED_A) );
1486  break;
1487  case UBLOCK_BRAHMI:
1488  aAllSubsets.emplace_back( 0x11000, 0x1107F, SvxResId(RID_SUBSETSTR_BRAHMI) );
1489  break;
1490  case UBLOCK_BAMUM_SUPPLEMENT:
1491  aAllSubsets.emplace_back( 0x16800, 0x16A3F, SvxResId(RID_SUBSETSTR_BAMUM_SUPPLEMENT) );
1492  break;
1493  case UBLOCK_KANA_SUPPLEMENT:
1494  aAllSubsets.emplace_back( 0x1B000, 0x1B0FF, SvxResId(RID_SUBSETSTR_KANA_SUPPLEMENT) );
1495  break;
1496  case UBLOCK_PLAYING_CARDS:
1497  aAllSubsets.emplace_back( 0x1F0A0, 0x1F0FF, SvxResId(RID_SUBSETSTR_PLAYING_CARDS) );
1498  break;
1499  case UBLOCK_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS:
1500  aAllSubsets.emplace_back( 0x1F300, 0x1F5FF, SvxResId(RID_SUBSETSTR_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS) );
1501  break;
1502  case UBLOCK_EMOTICONS:
1503  aAllSubsets.emplace_back( 0x1F600, 0x1F64F, SvxResId(RID_SUBSETSTR_EMOTICONS) );
1504  break;
1505  case UBLOCK_TRANSPORT_AND_MAP_SYMBOLS:
1506  aAllSubsets.emplace_back( 0x1F680, 0x1F6FF, SvxResId(RID_SUBSETSTR_TRANSPORT_AND_MAP_SYMBOLS) );
1507  break;
1508  case UBLOCK_ALCHEMICAL_SYMBOLS:
1509  aAllSubsets.emplace_back( 0x1F700, 0x1F77F, SvxResId(RID_SUBSETSTR_ALCHEMICAL_SYMBOLS) );
1510  break;
1511  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D:
1512  aAllSubsets.emplace_back( 0x2B740, 0x2B81F, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D) );
1513  break;
1514 // Note ICU version 49 (NOT 4.9), so the MAJOR_NUM is two digits.
1515 #if U_ICU_VERSION_MAJOR_NUM >= 49
1516  case UBLOCK_ARABIC_EXTENDED_A:
1517  aAllSubsets.emplace_back( 0x08A0, 0x08FF, SvxResId(RID_SUBSETSTR_ARABIC_EXTENDED_A) );
1518  break;
1519  case UBLOCK_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS:
1520  aAllSubsets.emplace_back( 0x1EE00, 0x1EEFF, SvxResId(RID_SUBSETSTR_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS) );
1521  break;
1522  case UBLOCK_CHAKMA:
1523  aAllSubsets.emplace_back( 0x11100, 0x1114F, SvxResId(RID_SUBSETSTR_CHAKMA) );
1524  break;
1525  case UBLOCK_MEETEI_MAYEK_EXTENSIONS:
1526  aAllSubsets.emplace_back( 0xAAE0, 0xAAFF, SvxResId(RID_SUBSETSTR_MEETEI_MAYEK_EXTENSIONS) );
1527  break;
1528  case UBLOCK_MEROITIC_CURSIVE:
1529  aAllSubsets.emplace_back( 0x109A0, 0x109FF, SvxResId(RID_SUBSETSTR_MEROITIC_CURSIVE) );
1530  break;
1531  case UBLOCK_MEROITIC_HIEROGLYPHS:
1532  aAllSubsets.emplace_back( 0x10980, 0x1099F, SvxResId(RID_SUBSETSTR_MEROITIC_HIEROGLYPHS) );
1533  break;
1534  case UBLOCK_MIAO:
1535  aAllSubsets.emplace_back( 0x16F00, 0x16F9F, SvxResId(RID_SUBSETSTR_MIAO) );
1536  break;
1537  case UBLOCK_SHARADA:
1538  aAllSubsets.emplace_back( 0x11180, 0x111DF, SvxResId(RID_SUBSETSTR_SHARADA) );
1539  break;
1540  case UBLOCK_SORA_SOMPENG:
1541  aAllSubsets.emplace_back( 0x110D0, 0x110FF, SvxResId(RID_SUBSETSTR_SORA_SOMPENG) );
1542  break;
1543  case UBLOCK_SUNDANESE_SUPPLEMENT:
1544  aAllSubsets.emplace_back( 0x1CC0, 0x1CCF, SvxResId(RID_SUBSETSTR_SUNDANESE_SUPPLEMENT) );
1545  break;
1546  case UBLOCK_TAKRI:
1547  aAllSubsets.emplace_back( 0x11680, 0x116CF, SvxResId(RID_SUBSETSTR_TAKRI) );
1548  break;
1549 #endif
1550 #if U_ICU_VERSION_MAJOR_NUM >= 54
1551  case UBLOCK_BASSA_VAH:
1552  aAllSubsets.emplace_back( 0x16AD0, 0x16AFF, SvxResId(RID_SUBSETSTR_BASSA_VAH) );
1553  break;
1554  case UBLOCK_CAUCASIAN_ALBANIAN:
1555  aAllSubsets.emplace_back( 0x10530, 0x1056F, SvxResId(RID_SUBSETSTR_CAUCASIAN_ALBANIAN) );
1556  break;
1557  case UBLOCK_COPTIC_EPACT_NUMBERS:
1558  aAllSubsets.emplace_back( 0x102E0, 0x102FF, SvxResId(RID_SUBSETSTR_COPTIC_EPACT_NUMBERS) );
1559  break;
1560  case UBLOCK_COMBINING_DIACRITICAL_MARKS_EXTENDED:
1561  aAllSubsets.emplace_back( 0x1AB0, 0x1AFF, SvxResId(RID_SUBSETSTR_COMBINING_DIACRITICAL_MARKS_EXTENDED) );
1562  break;
1563  case UBLOCK_DUPLOYAN:
1564  aAllSubsets.emplace_back( 0x1BC00, 0x1BC9F, SvxResId(RID_SUBSETSTR_DUPLOYAN) );
1565  break;
1566  case UBLOCK_ELBASAN:
1567  aAllSubsets.emplace_back( 0x10500, 0x1052F, SvxResId(RID_SUBSETSTR_ELBASAN) );
1568  break;
1569  case UBLOCK_GEOMETRIC_SHAPES_EXTENDED:
1570  aAllSubsets.emplace_back( 0x1F780, 0x1F7FF, SvxResId(RID_SUBSETSTR_GEOMETRIC_SHAPES_EXTENDED) );
1571  break;
1572  case UBLOCK_GRANTHA:
1573  aAllSubsets.emplace_back( 0x11300, 0x1137F, SvxResId(RID_SUBSETSTR_GRANTHA) );
1574  break;
1575  case UBLOCK_KHOJKI:
1576  aAllSubsets.emplace_back( 0x11200, 0x1124F, SvxResId(RID_SUBSETSTR_KHOJKI) );
1577  break;
1578  case UBLOCK_KHUDAWADI:
1579  aAllSubsets.emplace_back( 0x112B0, 0x112FF, SvxResId(RID_SUBSETSTR_KHUDAWADI) );
1580  break;
1581  case UBLOCK_LATIN_EXTENDED_E:
1582  aAllSubsets.emplace_back( 0xAB30, 0xAB6F, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_E) );
1583  break;
1584  case UBLOCK_LINEAR_A:
1585  aAllSubsets.emplace_back( 0x10600, 0x1077F, SvxResId(RID_SUBSETSTR_LINEAR_A) );
1586  break;
1587  case UBLOCK_MAHAJANI:
1588  aAllSubsets.emplace_back( 0x11150, 0x1117F, SvxResId(RID_SUBSETSTR_MAHAJANI) );
1589  break;
1590  case UBLOCK_MANICHAEAN:
1591  aAllSubsets.emplace_back( 0x10AC0, 0x10AFF, SvxResId(RID_SUBSETSTR_MANICHAEAN) );
1592  break;
1593  case UBLOCK_MENDE_KIKAKUI:
1594  aAllSubsets.emplace_back( 0x1E800, 0x1E8DF, SvxResId(RID_SUBSETSTR_MENDE_KIKAKUI) );
1595  break;
1596  case UBLOCK_MODI:
1597  aAllSubsets.emplace_back( 0x11600, 0x1165F, SvxResId(RID_SUBSETSTR_MODI) );
1598  break;
1599  case UBLOCK_MRO:
1600  aAllSubsets.emplace_back( 0x16A40, 0x16A6F, SvxResId(RID_SUBSETSTR_MRO) );
1601  break;
1602  case UBLOCK_MYANMAR_EXTENDED_B:
1603  aAllSubsets.emplace_back( 0xA9E0, 0xA9FF, SvxResId(RID_SUBSETSTR_MYANMAR_EXTENDED_B) );
1604  break;
1605  case UBLOCK_NABATAEAN:
1606  aAllSubsets.emplace_back( 0x10880, 0x108AF, SvxResId(RID_SUBSETSTR_NABATAEAN) );
1607  break;
1608  case UBLOCK_OLD_NORTH_ARABIAN:
1609  aAllSubsets.emplace_back( 0x10A80, 0x10A9F, SvxResId(RID_SUBSETSTR_OLD_NORTH_ARABIAN) );
1610  break;
1611  case UBLOCK_OLD_PERMIC:
1612  aAllSubsets.emplace_back( 0x10350, 0x1037F, SvxResId(RID_SUBSETSTR_OLD_PERMIC) );
1613  break;
1614  case UBLOCK_ORNAMENTAL_DINGBATS:
1615  aAllSubsets.emplace_back( 0x1F650, 0x1F67F, SvxResId(RID_SUBSETSTR_ORNAMENTAL_DINGBATS) );
1616  break;
1617  case UBLOCK_PAHAWH_HMONG:
1618  aAllSubsets.emplace_back( 0x16B00, 0x16B8F, SvxResId(RID_SUBSETSTR_PAHAWH_HMONG) );
1619  break;
1620  case UBLOCK_PALMYRENE:
1621  aAllSubsets.emplace_back( 0x10860, 0x1087F, SvxResId(RID_SUBSETSTR_PALMYRENE) );
1622  break;
1623  case UBLOCK_PAU_CIN_HAU:
1624  aAllSubsets.emplace_back( 0x11AC0, 0x11AFF, SvxResId(RID_SUBSETSTR_PAU_CIN_HAU) );
1625  break;
1626  case UBLOCK_PSALTER_PAHLAVI:
1627  aAllSubsets.emplace_back( 0x10B80, 0x10BAF, SvxResId(RID_SUBSETSTR_PSALTER_PAHLAVI) );
1628  break;
1629  case UBLOCK_SHORTHAND_FORMAT_CONTROLS:
1630  aAllSubsets.emplace_back( 0x1BCA0, 0x1BCAF, SvxResId(RID_SUBSETSTR_SHORTHAND_FORMAT_CONTROLS) );
1631  break;
1632  case UBLOCK_SIDDHAM:
1633  aAllSubsets.emplace_back( 0x11580, 0x115FF, SvxResId(RID_SUBSETSTR_SIDDHAM) );
1634  break;
1635  case UBLOCK_SINHALA_ARCHAIC_NUMBERS:
1636  aAllSubsets.emplace_back( 0x111E0, 0x111FF, SvxResId(RID_SUBSETSTR_SINHALA_ARCHAIC_NUMBERS) );
1637  break;
1638  case UBLOCK_SUPPLEMENTAL_ARROWS_C:
1639  aAllSubsets.emplace_back( 0x1F800, 0x1F8FF, SvxResId(RID_SUBSETSTR_SUPPLEMENTAL_ARROWS_C) );
1640  break;
1641  case UBLOCK_TIRHUTA:
1642  aAllSubsets.emplace_back( 0x11480, 0x114DF, SvxResId(RID_SUBSETSTR_TIRHUTA) );
1643  break;
1644  case UBLOCK_WARANG_CITI:
1645  aAllSubsets.emplace_back( 0x118A0, 0x118FF, SvxResId(RID_SUBSETSTR_WARANG_CITI) );
1646  break;
1647 #endif
1648 #if U_ICU_VERSION_MAJOR_NUM >= 56
1649  case UBLOCK_AHOM:
1650  aAllSubsets.emplace_back( 0x11700, 0x1173F, SvxResId(RID_SUBSETSTR_AHOM) );
1651  break;
1652  case UBLOCK_ANATOLIAN_HIEROGLYPHS:
1653  aAllSubsets.emplace_back( 0x14400, 0x1467F, SvxResId(RID_SUBSETSTR_ANATOLIAN_HIEROGLYPHS) );
1654  break;
1655  case UBLOCK_CHEROKEE_SUPPLEMENT:
1656  aAllSubsets.emplace_back( 0xAB70, 0xABBF, SvxResId(RID_SUBSETSTR_CHEROKEE_SUPPLEMENT) );
1657  break;
1658  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E:
1659  aAllSubsets.emplace_back( 0x2B820, 0x2CEAF, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E) );
1660  break;
1661  case UBLOCK_EARLY_DYNASTIC_CUNEIFORM:
1662  aAllSubsets.emplace_back( 0x12480, 0x1254F, SvxResId(RID_SUBSETSTR_EARLY_DYNASTIC_CUNEIFORM) );
1663  break;
1664  case UBLOCK_HATRAN:
1665  aAllSubsets.emplace_back( 0x108E0, 0x108FF, SvxResId(RID_SUBSETSTR_HATRAN) );
1666  break;
1667  case UBLOCK_MULTANI:
1668  aAllSubsets.emplace_back( 0x11280, 0x112AF, SvxResId(RID_SUBSETSTR_MULTANI) );
1669  break;
1670  case UBLOCK_OLD_HUNGARIAN:
1671  aAllSubsets.emplace_back( 0x10C80, 0x10CFF, SvxResId(RID_SUBSETSTR_OLD_HUNGARIAN) );
1672  break;
1673  case UBLOCK_SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS:
1674  aAllSubsets.emplace_back( 0x1F900, 0x1F9FF, SvxResId(RID_SUBSETSTR_SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS) );
1675  break;
1676  case UBLOCK_SUTTON_SIGNWRITING:
1677  aAllSubsets.emplace_back( 0x1D800, 0x1DAAF, SvxResId(RID_SUBSETSTR_SUTTON_SIGNWRITING) );
1678  break;
1679 #endif
1680 #if (U_ICU_VERSION_MAJOR_NUM >= 58)
1681  case UBLOCK_ADLAM:
1682  aAllSubsets.emplace_back( 0x1E900, 0x1E95F, SvxResId(RID_SUBSETSTR_ADLAM) );
1683  break;
1684  case UBLOCK_BHAIKSUKI:
1685  aAllSubsets.emplace_back( 0x11C00, 0x11C6F, SvxResId(RID_SUBSETSTR_BHAIKSUKI) );
1686  break;
1687  case UBLOCK_CYRILLIC_EXTENDED_C:
1688  aAllSubsets.emplace_back( 0x1C80, 0x1C8F, SvxResId(RID_SUBSETSTR_CYRILLIC_EXTENDED_C) );
1689  break;
1690  case UBLOCK_GLAGOLITIC_SUPPLEMENT:
1691  aAllSubsets.emplace_back( 0x1E000, 0x1E02F, SvxResId(RID_SUBSETSTR_GLAGOLITIC_SUPPLEMENT) );
1692  break;
1693  case UBLOCK_IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION:
1694  aAllSubsets.emplace_back( 0x16FE0, 0x16FFF, SvxResId(RID_SUBSETSTR_IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION) );
1695  break;
1696  case UBLOCK_MARCHEN:
1697  aAllSubsets.emplace_back( 0x11C70, 0x11CBF, SvxResId(RID_SUBSETSTR_MARCHEN) );
1698  break;
1699  case UBLOCK_MONGOLIAN_SUPPLEMENT:
1700  aAllSubsets.emplace_back( 0x11660, 0x1167F, SvxResId(RID_SUBSETSTR_MONGOLIAN_SUPPLEMENT) );
1701  break;
1702  case UBLOCK_NEWA:
1703  aAllSubsets.emplace_back( 0x11400, 0x1147F, SvxResId(RID_SUBSETSTR_NEWA) );
1704  break;
1705  case UBLOCK_OSAGE:
1706  aAllSubsets.emplace_back( 0x104B0, 0x104FF, SvxResId(RID_SUBSETSTR_OSAGE) );
1707  break;
1708  case UBLOCK_TANGUT:
1709  aAllSubsets.emplace_back( 0x17000, 0x187FF, SvxResId(RID_SUBSETSTR_TANGUT) );
1710  break;
1711  case UBLOCK_TANGUT_COMPONENTS:
1712  aAllSubsets.emplace_back( 0x18800, 0x18AFF, SvxResId(RID_SUBSETSTR_TANGUT_COMPONENTS) );
1713  break;
1714 #endif
1715 #if (U_ICU_VERSION_MAJOR_NUM >= 60)
1716  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F:
1717  aAllSubsets.emplace_back( 0x2CEB0, 0x2EBE0, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F) );
1718  break;
1719  case UBLOCK_KANA_EXTENDED_A:
1720  aAllSubsets.emplace_back( 0x1B100, 0x1B12F, SvxResId(RID_SUBSETSTR_KANA_EXTENDED_A) );
1721  break;
1722  case UBLOCK_MASARAM_GONDI:
1723  aAllSubsets.emplace_back( 0x11D00, 0x11D5F, SvxResId(RID_SUBSETSTR_MASARAM_GONDI) );
1724  break;
1725  case UBLOCK_NUSHU:
1726  aAllSubsets.emplace_back( 0x1B170, 0x1B2FF, SvxResId(RID_SUBSETSTR_NUSHU) );
1727  break;
1728  case UBLOCK_SOYOMBO:
1729  aAllSubsets.emplace_back( 0x11A50, 0x11AAF, SvxResId(RID_SUBSETSTR_SOYOMBO) );
1730  break;
1731  case UBLOCK_SYRIAC_SUPPLEMENT:
1732  aAllSubsets.emplace_back( 0x0860, 0x086f, SvxResId(RID_SUBSETSTR_SYRIAC_SUPPLEMENT) );
1733  break;
1734  case UBLOCK_ZANABAZAR_SQUARE:
1735  aAllSubsets.emplace_back( 0x11A00, 0x11A4F, SvxResId(RID_SUBSETSTR_ZANABAZAR_SQUARE) );
1736  break;
1737 #endif
1738 #if (U_ICU_VERSION_MAJOR_NUM >= 62)
1739  case UBLOCK_CHESS_SYMBOLS:
1740  aAllSubsets.emplace_back( 0x1FA00, 0x1FA6F, SvxResId(RID_SUBSETSTR_CHESS_SYMBOLS) );
1741  break;
1742  case UBLOCK_DOGRA:
1743  aAllSubsets.emplace_back( 0x11800, 0x1184F, SvxResId(RID_SUBSETSTR_DOGRA) );
1744  break;
1745  case UBLOCK_GEORGIAN_EXTENDED:
1746  aAllSubsets.emplace_back( 0x1C90, 0x1CBF, SvxResId(RID_SUBSETSTR_GEORGIAN_EXTENDED) );
1747  break;
1748  case UBLOCK_GUNJALA_GONDI:
1749  aAllSubsets.emplace_back( 0x11D60, 0x11DAF, SvxResId(RID_SUBSETSTR_GUNJALA_GONDI) );
1750  break;
1751  case UBLOCK_HANIFI_ROHINGYA:
1752  aAllSubsets.emplace_back( 0x10D00, 0x10D3F, SvxResId(RID_SUBSETSTR_HANIFI_ROHINGYA) );
1753  break;
1754  case UBLOCK_INDIC_SIYAQ_NUMBERS:
1755  aAllSubsets.emplace_back( 0x1EC70, 0x1ECBF, SvxResId(RID_SUBSETSTR_INDIC_SIYAQ_NUMBERS) );
1756  break;
1757  case UBLOCK_MAKASAR:
1758  aAllSubsets.emplace_back( 0x11EE0, 0x11EFF, SvxResId(RID_SUBSETSTR_MAKASAR) );
1759  break;
1760  case UBLOCK_MAYAN_NUMERALS:
1761  aAllSubsets.emplace_back( 0x1D2E0, 0x1D2FF, SvxResId(RID_SUBSETSTR_MAYAN_NUMERALS) );
1762  break;
1763  case UBLOCK_MEDEFAIDRIN:
1764  aAllSubsets.emplace_back( 0x16E40, 0x16E9F, SvxResId(RID_SUBSETSTR_MEDEFAIDRIN) );
1765  break;
1766  case UBLOCK_OLD_SOGDIAN:
1767  aAllSubsets.emplace_back( 0x10F00, 0x10F2F, SvxResId(RID_SUBSETSTR_OLD_SOGDIAN) );
1768  break;
1769  case UBLOCK_SOGDIAN:
1770  aAllSubsets.emplace_back( 0x10F30, 0x10F6F, SvxResId(RID_SUBSETSTR_SOGDIAN) );
1771  break;
1772 #endif
1773 #if (U_ICU_VERSION_MAJOR_NUM >= 64)
1774  case UBLOCK_EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS:
1775  aAllSubsets.emplace_back( 0x13430, 0x1343F, SvxResId(RID_SUBSETSTR_EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS) );
1776  break;
1777  case UBLOCK_ELYMAIC:
1778  aAllSubsets.emplace_back( 0x10FE0, 0x10FFF, SvxResId(RID_SUBSETSTR_ELYMAIC) );
1779  break;
1780  case UBLOCK_NANDINAGARI:
1781  aAllSubsets.emplace_back( 0x119A0, 0x119FF, SvxResId(RID_SUBSETSTR_NANDINAGARI) );
1782  break;
1783  case UBLOCK_NYIAKENG_PUACHUE_HMONG:
1784  aAllSubsets.emplace_back( 0x1E100, 0x1E14F, SvxResId(RID_SUBSETSTR_NYIAKENG_PUACHUE_HMONG) );
1785  break;
1786  case UBLOCK_OTTOMAN_SIYAQ_NUMBERS:
1787  aAllSubsets.emplace_back( 0x1ED00, 0x1ED4F, SvxResId(RID_SUBSETSTR_OTTOMAN_SIYAQ_NUMBERS) );
1788  break;
1789  case UBLOCK_SMALL_KANA_EXTENSION:
1790  aAllSubsets.emplace_back( 0x1B130, 0x1B16F, SvxResId(RID_SUBSETSTR_SMALL_KANA_EXTENSION) );
1791  break;
1792  case UBLOCK_SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A:
1793  aAllSubsets.emplace_back( 0x1FA70, 0x1FAFF, SvxResId(RID_SUBSETSTR_SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A) );
1794  break;
1795  case UBLOCK_TAMIL_SUPPLEMENT:
1796  aAllSubsets.emplace_back( 0x11FC0, 0x11FFF, SvxResId(RID_SUBSETSTR_TAMIL_SUPPLEMENT) );
1797  break;
1798  case UBLOCK_WANCHO:
1799  aAllSubsets.emplace_back( 0x1E2C0, 0x1E2FF, SvxResId(RID_SUBSETSTR_WANCHO) );
1800  break;
1801 #endif
1802 #if (U_ICU_VERSION_MAJOR_NUM >= 66)
1803  case UBLOCK_CHORASMIAN:
1804  aAllSubsets.emplace_back( 0x10FB0, 0x10FDF, SvxResId(RID_SUBSETSTR_CHORASMIAN) );
1805  break;
1806  case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G:
1807  aAllSubsets.emplace_back( 0x30000, 0x3134F, SvxResId(RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G) );
1808  break;
1809  case UBLOCK_DIVES_AKURU:
1810  aAllSubsets.emplace_back( 0x11900, 0x1195F, SvxResId(RID_SUBSETSTR_DIVES_AKURU) );
1811  break;
1812  case UBLOCK_KHITAN_SMALL_SCRIPT:
1813  aAllSubsets.emplace_back( 0x18B00, 0x18CFF, SvxResId(RID_SUBSETSTR_KHITAN_SMALL_SCRIPT) );
1814  break;
1815  case UBLOCK_LISU_SUPPLEMENT:
1816  aAllSubsets.emplace_back( 0x11FB0, 0x11FBF, SvxResId(RID_SUBSETSTR_LISU_SUPPLEMENT) );
1817  break;
1818  case UBLOCK_SYMBOLS_FOR_LEGACY_COMPUTING:
1819  aAllSubsets.emplace_back( 0x1FB00, 0x1FBFF, SvxResId(RID_SUBSETSTR_SYMBOLS_FOR_LEGACY_COMPUTING) );
1820  break;
1821  case UBLOCK_TANGUT_SUPPLEMENT:
1822  aAllSubsets.emplace_back( 0x18D00, 0x18D7F, SvxResId(RID_SUBSETSTR_TANGUT_SUPPLEMENT) );
1823  break;
1824  case UBLOCK_YEZIDI:
1825  aAllSubsets.emplace_back( 0x10E80, 0x10EBF, SvxResId(RID_SUBSETSTR_YEZIDI) );
1826  break;
1827 #endif
1828 #if (U_ICU_VERSION_MAJOR_NUM >= 70)
1829  case UBLOCK_ARABIC_EXTENDED_B:
1830  aAllSubsets.emplace_back( 0x0870, 0x089F, SvxResId(RID_SUBSETSTR_ARABIC_EXTENDED_B) );
1831  break;
1832  case UBLOCK_CYPRO_MINOAN:
1833  aAllSubsets.emplace_back( 0x12F90, 0x12FFF, SvxResId(RID_SUBSETSTR_CYPRO_MINOAN) );
1834  break;
1835  case UBLOCK_ETHIOPIC_EXTENDED_B:
1836  aAllSubsets.emplace_back( 0x1E7E0, 0x1E7FF, SvxResId(RID_SUBSETSTR_ETHIOPIC_EXTENDED_B) );
1837  break;
1838  case UBLOCK_KANA_EXTENDED_B:
1839  aAllSubsets.emplace_back( 0x1AFF0, 0x1AFFF, SvxResId(RID_SUBSETSTR_KANA_EXTENDED_B) );
1840  break;
1841  case UBLOCK_LATIN_EXTENDED_F:
1842  aAllSubsets.emplace_back( 0x10780, 0x107BF, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_F) );
1843  break;
1844  case UBLOCK_LATIN_EXTENDED_G:
1845  aAllSubsets.emplace_back( 0x1DF00, 0x1DFFF, SvxResId(RID_SUBSETSTR_LATIN_EXTENDED_G) );
1846  break;
1847  case UBLOCK_OLD_UYGHUR:
1848  aAllSubsets.emplace_back( 0x10F70, 0x10FAF, SvxResId(RID_SUBSETSTR_OLD_UYGHUR) );
1849  break;
1850  case UBLOCK_TANGSA:
1851  aAllSubsets.emplace_back( 0x16A70, 0x16ACF, SvxResId(RID_SUBSETSTR_TANGSA) );
1852  break;
1853  case UBLOCK_TOTO:
1854  aAllSubsets.emplace_back( 0x1E290, 0x1E2BF, SvxResId(RID_SUBSETSTR_TOTO) );
1855  break;
1856  case UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A:
1857  aAllSubsets.emplace_back( 0x11AB0, 0x11ABF, SvxResId(RID_SUBSETSTR_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A) );
1858  break;
1859  case UBLOCK_VITHKUQI:
1860  aAllSubsets.emplace_back( 0x10570, 0x105BF, SvxResId(RID_SUBSETSTR_VITHKUQI) );
1861  break;
1862  case UBLOCK_ZNAMENNY_MUSICAL_NOTATION:
1863  aAllSubsets.emplace_back( 0x1CF00, 0x1CFCF, SvxResId(RID_SUBSETSTR_ZNAMENNY_MUSICAL_NOTATION) );
1864  break;
1865 #endif
1866 
1867  }
1868 
1869 #if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
1870  if (eBlock != UBLOCK_NO_BLOCK &&
1871  eBlock != UBLOCK_INVALID_CODE &&
1872  eBlock != UBLOCK_COUNT &&
1873  eBlock != UBLOCK_HIGH_SURROGATES &&
1874  eBlock != UBLOCK_HIGH_PRIVATE_USE_SURROGATES &&
1875  eBlock != UBLOCK_LOW_SURROGATES)
1876 
1877  {
1878  UBlockCode eBlockStart = ublock_getCode(aAllSubsets.back().GetRangeMin());
1879  UBlockCode eBlockEnd = ublock_getCode(aAllSubsets.back().GetRangeMax());
1880  assert(eBlockStart == eBlockEnd && eBlockStart == eBlock);
1881  }
1882 #endif
1883  }
1884 
1885  std::stable_sort(aAllSubsets.begin(), aAllSubsets.end());
1886  return aAllSubsets;
1887  }();
1888 
1889  maSubsets = s_aAllSubsets;
1890 }
1891 
1892 void SubsetMap::ApplyCharMap( const FontCharMapRef& rxFontCharMap )
1893 {
1894  if( !rxFontCharMap.is() )
1895  return;
1896 
1897  // remove subsets that are not matched in any range
1898  maSubsets.erase(std::remove_if(maSubsets.begin(), maSubsets.end(),
1899  [&rxFontCharMap](const Subset& rSubset) {
1900  sal_uInt32 cMin = rSubset.GetRangeMin();
1901  sal_uInt32 cMax = rSubset.GetRangeMax();
1902  int nCount = rxFontCharMap->CountCharsInRange( cMin, cMax );
1903  return nCount <= 0;
1904  }),
1905  maSubsets.end());
1906 }
1907 
1908 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bool is() const
const Color & GetTextColor() const
const Color & GetShadowColor() const
Link< SvxShowCharSet *, void > aHighHdl
Definition: charmap.hxx:124
bool GetFontCharMap(FontCharMapRef &rxFontCharMap) const
ItemsMap m_aItems
Definition: charmap.hxx:120
sal_Int32 nIndex
static sal_uInt16 GetRowPos(sal_uInt16 _nPos)
Definition: charmap.cxx:190
void SetFontSize(const Size &)
VclPtr< VirtualDevice > mxVirDev
Definition: charmap.hxx:58
virtual svx::SvxShowCharSetItem * ImplGetItem(int _nPos)
Definition: charmap.cxx:821
const OUString & GetFamilyName() const
::std::vector< Subset > SubsetVec
Definition: ucsubset.hxx:55
sal_uInt32 sal_UCS4
bool mbUpdateForeground
Definition: charmap.hxx:145
The table implementation of the vcl control.
Definition: charmapacc.hxx:70
virtual FactoryFunction GetUITestFactory() const override
Definition: charmap.cxx:57
static std::unique_ptr< UIObject > create(vcl::Window *pWindow)
Definition: uiobject.cxx:51
SubsetVec maSubsets
Definition: ucsubset.hxx:66
const Color & GetHighlightTextColor() const
std::unique_ptr< weld::ScrolledWindow > mxScrollArea
Definition: charmap.hxx:60
constexpr tools::Long Left() const
bool Contains(const Point &rPOINT) const
const SubsetVec & GetSubsetMap() const
Definition: charmap.cxx:860
uno::Reference< uno::XComponentContext > mxContext
void SetFont(const vcl::Font &rFont)
Definition: charmap.cxx:457
long Long
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
virtual bool MouseMove(const MouseEvent &rMEvt) override
Definition: charmap.cxx:166
const Color & GetFaceColor() const
std::function< std::unique_ptr< UIObject >vcl::Window *)> FactoryFunction
void SetWeight(FontWeight)
virtual void SetDrawingArea(weld::DrawingArea *pDrawingArea) override
Definition: charmap.cxx:77
bool isFavChar(const OUString &sTitle, const OUString &rFont)
Definition: charmap.cxx:208
sal_uInt16 GetCode() const
geometry::RealPoint2D maPosition
Link< SvxShowCharSet *, void > aDoubleClkHdl
Definition: charmap.hxx:121
Subset(sal_UCS4 nMin, sal_UCS4 nMax, const OUString &rName)
Definition: charmap.cxx:873
constexpr sal_uInt16 KEY_SPACE
float x
sal_Int32 nSelectedIndex
Definition: charmap.hxx:138
WEIGHT_LIGHT
FontCharMapRef mxFontCharMap
Definition: charmap.hxx:140
const Color & GetFieldTextColor() const
constexpr sal_uInt16 KEY_UP
Point maPosition
Definition: charmap.hxx:142
const Color & GetHighlightColor() const
Size const & GetOutputSizePixel() const
constexpr sal_uInt16 KEY_END
virtual void GetFocus() override
Definition: charmap.cxx:110
constexpr tools::Long Width() const
std::deque< OUString > maFavCharFontList
Definition: charmap.hxx:128
sal_uInt16 GetClicks() const
DstType sequenceToContainer(const css::uno::Sequence< SrcType > &i_Sequence)
void SetBackground()
vcl::Font maFont
Definition: charmap.hxx:59
virtual sal_Int32 getMaxCharCount() const
Definition: charmap.cxx:840
virtual sal_UCS4 GetSelectCharacter() const
Definition: charmap.cxx:637
const vcl::Font & GetFont() const
static sal_uInt32 & getSelectedChar()
Definition: charmap.cxx:51
void ContextMenuSelect(std::string_view rIdent)
Definition: charmap.cxx:239
int nCount
OUString SvxResId(TranslateId aId)
Definition: dialmgr.cxx:24
constexpr sal_uInt16 KEY_PAGEUP
const Color & GetLightColor() const
constexpr tools::Long GetWidth() const
bool GetTextBoundRect(tools::Rectangle &rRect, const OUString &rStr, sal_Int32 nBase=0, sal_Int32 nIndex=0, sal_Int32 nLen=-1, sal_uLong nLayoutWidth=0, o3tl::span< const sal_Int32 > pDXArray={}, const SalLayoutGlyphs *pGlyphs=nullptr) const
static std::shared_ptr< ConfigurationChanges > create(css::uno::Reference< css::uno::XComponentContext > const &context=comphelper::getProcessComponentContext())
sal_uInt16 GetModifier() const
int PixelToMapIndex(const Point &) const
Definition: charmap.cxx:375
void init()
Definition: charmap.cxx:92
void DrawLine(const Point &rStartPt, const Point &rEndPt)
virtual void RecalculateFont(vcl::RenderContext &rRenderContext)
Definition: charmap.cxx:645
SvxShowCharSet(std::unique_ptr< weld::ScrolledWindow > pScrollArea, const VclPtr< VirtualDevice > &rVirDev)
Definition: charmap.cxx:62
void DrawRect(const tools::Rectangle &rRect)
IMPL_LINK_NOARG(SvxShowCharSet, VscrollHdl, weld::ScrolledWindow &, void)
Definition: charmap.cxx:780
constexpr bool IsEmpty() const
virtual ~SvxShowCharSet() override
Definition: charmap.cxx:804
float y
constexpr sal_uInt16 KEY_DOWN
void SetLineColor()
bool mbRecalculateFont
Definition: charmap.hxx:144
std::deque< OUString > maFavCharList
Definition: charmap.hxx:127
tools::Long nY
Definition: charmap.hxx:133
virtual void Resize() override
Definition: charmap.cxx:105
int i
tools::Long GetTextWidth(const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
uno_Any a
virtual void SelectIndex(int index, bool bFocus=false)
Definition: charmap.cxx:686
rtl::Reference< SvxShowCharSetItemAcc > m_xItem
Definition: charmapacc.hxx:51
void DeSelect()
Definition: charmap.cxx:464
constexpr sal_uInt16 KEY_HOME
virtual void DrawChars_Impl(vcl::RenderContext &rRenderContext, int n1, int n2)
Definition: charmap.cxx:500
static sal_uInt16 GetColumnPos(sal_uInt16 _nPos)
Definition: charmap.cxx:346
uno::Reference< uno::XComponentContext > mxContext
Definition: charmap.hxx:131
constexpr tools::Long Right() const
void SetFillColor()
const Color & GetLineColor() const
void SetTextColor(const Color &rColor)
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
Definition: charmap.cxx:450
constexpr sal_uInt16 KEY_PAGEDOWN
constexpr tools::Long Top() const
virtual int LastInView() const
Definition: charmap.cxx:356
virtual bool KeyInput(const KeyEvent &) override
Definition: charmap.cxx:381
const AllSettings & GetSettings() const
FontCharMapRef const & GetFontCharMap()
Definition: charmap.cxx:845
virtual void LoseFocus() override
Definition: charmap.cxx:115
void SelectCharacter(sal_UCS4 cNew)
Definition: charmap.cxx:765
tools::Long m_nYGap
Definition: charmap.hxx:135
tools::Long nX
Definition: charmap.hxx:132
constexpr sal_uInt16 KEY_RETURN
int FirstInView() const
Definition: charmap.cxx:351
constexpr sal_uInt16 KEY_RIGHT
void SetAlignment(TextAlign)
constexpr tools::Long Bottom() const
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
css::uno::Reference< css::accessibility::XAccessible > GetAccessible()
Definition: charmapacc.cxx:59
const vcl::KeyCode & GetKeyCode() const
ALIGN_TOP
tools::Rectangle getGridRectangle(const Point &rPointUL, const Size &rOutputSize) const
Definition: charmap.cxx:470
Link< SvxShowCharSet *, void > aSelectHdl
Definition: charmap.hxx:122
weld::DrawingArea * GetDrawingArea() const
void InitSettings(vcl::RenderContext &rRenderContext)
Definition: charmap.cxx:612
static void CopyToClipboard(const OUString &str)
Definition: charmap.cxx:255
constexpr tools::Long Height() const
virtual bool MouseButtonUp(const MouseEvent &rMEvt) override
Definition: charmap.cxx:152
rtl::Reference< svx::SvxShowCharSetAcc > m_xAccessible
Definition: charmap.hxx:130
constexpr sal_uInt16 KEY_ESCAPE
void updateFavCharacterList(const OUString &rChar, const OUString &rFont)
Definition: charmap.cxx:278
void SetFont(const vcl::Font &rNewFont)
void SetTransparent(bool bTransparent)
tools::Long GetTextHeight() const
bool IsLeft() const
sal_Unicode GetCharCode() const
#define COLUMN_COUNT
Definition: charmap.hxx:46
virtual int get_text_height() const =0
tools::Long AdjustWidth(tools::Long n)
SVX_DLLPRIVATE void InitList()
Definition: charmap.cxx:878
Reference< XComponentContext > getProcessComponentContext()
const Color & GetWindowColor() const
const Point & GetPosPixel() const
tools::Long AdjustHeight(tools::Long n)
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override
Definition: charmap.cxx:814
Simple struct to hold some information about the single items of the table.
Definition: charmapacc.hxx:45
Link< SvxShowCharSet *, void > aFavClickHdl
Definition: charmap.hxx:123
virtual bool MouseButtonDown(const MouseEvent &rMEvt) override
Definition: charmap.cxx:120
bool IsRight() const
constexpr sal_uInt16 KEY_LEFT
const Subset * GetSubsetByUnicode(sal_UCS4) const
Definition: charmap.cxx:865
void getFavCharacterList()
Definition: charmap.cxx:195
const Color & GetDialogTextColor() const
SVX_DLLPRIVATE void ApplyCharMap(const FontCharMapRef &)
Definition: charmap.cxx:1892
Point MapIndexToPixel(int) const
Definition: charmap.cxx:366
void DrawText(const Point &rStartPt, const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, std::vector< tools::Rectangle > *pVector=nullptr, OUString *pDisplayText=nullptr, const SalLayoutGlyphs *pLayoutCache=nullptr)
void OutputIndex(int index)
Definition: charmap.cxx:758
void createContextMenu()
Definition: charmap.cxx:222
SubsetMap(const FontCharMapRef &)
Definition: charmap.cxx:854
virtual float get_approximate_digit_width() const =0
tools::Long m_nXGap
Definition: charmap.hxx:134
static std::unique_ptr< weld::Builder > CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false, sal_uInt64 nLOKWindowId=0)
const Color & GetFillColor() const
constexpr sal_uInt16 KEY_TAB
Link< SvxShowCharSet *, void > aPreSelectHdl
Definition: charmap.hxx:125
#define ROW_COUNT
Definition: charmap.hxx:47
css::uno::Any SAL_CALL makeAny(const SharedUNOComponent< INTERFACE, COMPONENT > &value)
bool mbUpdateBackground
Definition: charmap.hxx:146