summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorAkshay Deep <akshaydeepiitr@gmail.com>2017-06-19 11:34:48 +0530
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2017-07-06 14:36:55 +0200
commit800ac37021e3f8859a52c5eebca261a5d3bc5a11 (patch)
treee6c02dd05ce901f839d371e6290b3e78a4aad0ca /sfx2
parent47b8034efc33a1c022d4a1f8385e3739aca86442 (diff)
GSoC: Recent Charaters Toolbar Dropdown Control
Change-Id: Ib04d26fa5556e5c32db6799c16d0bbedc45504ec Reviewed-on: https://gerrit.libreoffice.org/38944 Reviewed-by: Akshay Deep <akshaydeepiitr@gmail.com> Tested-by: Akshay Deep <akshaydeepiitr@gmail.com> Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/Library_sfx.mk3
-rw-r--r--sfx2/UIConfig_sfx.mk1
-rw-r--r--sfx2/sdi/sfx.sdi18
-rw-r--r--sfx2/source/control/charmapcontrol.cxx192
-rw-r--r--sfx2/source/control/charwin.cxx213
-rw-r--r--sfx2/source/dialog/charmappopup.cxx47
-rw-r--r--sfx2/uiconfig/ui/charmapcontrol.ui236
7 files changed, 710 insertions, 0 deletions
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 16f52bab5b57..75755fb7d3bf 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -161,6 +161,8 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
sfx2/source/control/emojiview \
sfx2/source/control/emojicontrol \
sfx2/source/control/emojipopup \
+ sfx2/source/control/charmapcontrol \
+ sfx2/source/control/charwin \
sfx2/source/control/unoctitm \
sfx2/source/dialog/alienwarn \
sfx2/source/dialog/backingcomp \
@@ -168,6 +170,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
sfx2/source/dialog/basedlgs \
sfx2/source/dialog/checkin \
sfx2/source/dialog/dialoghelper \
+ sfx2/source/dialog/charmappopup \
sfx2/source/dialog/dinfdlg \
sfx2/source/dialog/dockwin \
sfx2/source/dialog/documentfontsdialog \
diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk
index c976d89369cd..b62db558fb6b 100644
--- a/sfx2/UIConfig_sfx.mk
+++ b/sfx2/UIConfig_sfx.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
sfx2/uiconfig/ui/alienwarndialog \
sfx2/uiconfig/ui/bookmarkdialog \
sfx2/uiconfig/ui/bookmarkmenu \
+ sfx2/uiconfig/ui/charmapcontrol \
sfx2/uiconfig/ui/checkin \
sfx2/uiconfig/ui/cmisinfopage \
sfx2/uiconfig/ui/cmisline \
diff --git a/sfx2/sdi/sfx.sdi b/sfx2/sdi/sfx.sdi
index c69d7699410b..a9d281bd2089 100644
--- a/sfx2/sdi/sfx.sdi
+++ b/sfx2/sdi/sfx.sdi
@@ -247,6 +247,24 @@ SfxStringItem AddDirect SID_NEWDOCDIRECT
]
+SfxVoidItem CharmapControl SID_CHARMAP_CONTROL
+
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = GID_SPECIAL;
+]
+
+
SfxVoidItem AddressBookSource SID_TEMPLATE_ADDRESSBOKSOURCE
()
[
diff --git a/sfx2/source/control/charmapcontrol.cxx b/sfx2/source/control/charmapcontrol.cxx
new file mode 100644
index 000000000000..8a2af88d63c0
--- /dev/null
+++ b/sfx2/source/control/charmapcontrol.cxx
@@ -0,0 +1,192 @@
+/* -*- 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 <comphelper/propertysequence.hxx>
+#include <comphelper/dispatchcommand.hxx>
+#include <officecfg/Office/Common.hxx>
+#include <sfx2/charmapcontrol.hxx>
+
+using namespace css;
+
+SfxCharmapCtrl::SfxCharmapCtrl(sal_uInt16 nId, const css::uno::Reference< css::frame::XFrame >& rFrame)
+ : SfxPopupWindow(nId, "charmapctrl", "sfx/ui/charmapcontrol.ui", rFrame)
+{
+ get( m_pRecentCharView[0], "viewchar1" );
+ get( m_pRecentCharView[1], "viewchar2" );
+ get( m_pRecentCharView[2], "viewchar3" );
+ get( m_pRecentCharView[3], "viewchar4" );
+ get( m_pRecentCharView[4], "viewchar5" );
+ get( m_pRecentCharView[5], "viewchar6" );
+ get( m_pRecentCharView[6], "viewchar7" );
+ get( m_pRecentCharView[7], "viewchar8" );
+ get( m_pRecentCharView[8], "viewchar9" );
+ get( m_pRecentCharView[9], "viewchar10" );
+ get( m_pRecentCharView[10], "viewchar11" );
+ get( m_pRecentCharView[11], "viewchar12" );
+ get( m_pRecentCharView[12], "viewchar13" );
+ get( m_pRecentCharView[13], "viewchar14" );
+ get( m_pRecentCharView[14], "viewchar15" );
+ get( m_pRecentCharView[15], "viewchar16" );
+ get( maDlgBtn, "specialchardlg");
+
+ for(int i = 0; i < 16; i++)
+ {
+ m_pRecentCharView[i]->setMouseClickHdl(LINK(this,SfxCharmapCtrl, RecentClickHdl));
+ m_pRecentCharView[i]->SetLoseFocusHdl(LINK(this,SfxCharmapCtrl, LoseFocusHdl));
+ }
+
+ maDlgBtn->SetClickHdl(LINK(this, SfxCharmapCtrl, OpenDlgHdl));
+
+ getRecentCharacterList();
+ updateRecentCharControl();
+}
+
+SfxCharmapCtrl::~SfxCharmapCtrl()
+{
+ disposeOnce();
+}
+
+
+void SfxCharmapCtrl::dispose()
+{
+ for(int i = 0; i < 16; i++)
+ m_pRecentCharView[i].clear();
+
+ maRecentCharList.clear();
+ maRecentCharFontList.clear();
+ maDlgBtn.clear();
+
+ SfxPopupWindow::dispose();
+}
+
+
+void SfxCharmapCtrl::getRecentCharacterList()
+{
+ //retrieve recent character list
+ css::uno::Sequence< OUString > rRecentCharList( officecfg::Office::Common::RecentCharacters::RecentCharacterList::get() );
+ for (int i = 0; i < rRecentCharList.getLength(); ++i)
+ {
+ maRecentCharList.push_back(rRecentCharList[i]);
+ }
+
+ //retrieve recent character font list
+ css::uno::Sequence< OUString > rRecentCharFontList( officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::get() );
+ for (int i = 0; i < rRecentCharFontList.getLength(); ++i)
+ {
+ maRecentCharFontList.push_back(rRecentCharFontList[i]);
+ }
+}
+
+void SfxCharmapCtrl::updateRecentCharControl()
+{
+ int i = 0;
+ for ( std::deque< OUString >::iterator it = maRecentCharList.begin(), it2 = maRecentCharFontList.begin();
+ it != maRecentCharList.end() || it2 != maRecentCharFontList.end();
+ ++it, ++it2, i++)
+ {
+ m_pRecentCharView[i]->SetText(*it);
+ vcl::Font rFont = m_pRecentCharView[i]->GetControlFont();
+ rFont.SetFamilyName( *it2 );
+ m_pRecentCharView[i]->SetFont(rFont);
+ m_pRecentCharView[i]->Show();
+ }
+
+ for(; i < 16 ; i++)
+ {
+ m_pRecentCharView[i]->SetText(OUString());
+ m_pRecentCharView[i]->Hide();
+ }
+}
+
+void SfxCharmapCtrl::updateRecentCharacterList(const OUString& sTitle, const OUString& rFont)
+{
+ auto itChar = std::find_if(maRecentCharList.begin(),
+ maRecentCharList.end(),
+ [sTitle] (const OUString & a) { return a == sTitle; });
+
+ auto itChar2 = std::find_if(maRecentCharFontList.begin(),
+ maRecentCharFontList.end(),
+ [rFont] (const OUString & a) { return a == rFont; });
+
+ // if recent char to be added is already in list, remove it
+ if( 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(comphelper::getProcessComponentContext()));
+ officecfg::Office::Common::RecentCharacters::RecentCharacterList::set(aRecentCharList, batch);
+ officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::set(aRecentCharFontList, batch);
+ batch->commit();
+
+ updateRecentCharControl();
+}
+
+
+IMPL_STATIC_LINK(SfxCharmapCtrl, LoseFocusHdl, Control&, pItem, void)
+{
+ pItem.Invalidate();
+}
+
+
+IMPL_LINK(SfxCharmapCtrl, RecentClickHdl, SvxCharView*, rView, void)
+{
+ rView->GrabFocus();
+ rView->Invalidate();
+ rView->InsertCharToDoc();
+
+ Close();
+}
+
+IMPL_LINK_NOARG(SfxCharmapCtrl, OpenDlgHdl, Button*, void)
+{
+ Close();
+
+ uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
+
+ uno::Sequence<beans::PropertyValue> aArgs(2);
+ aArgs[0].Name = OUString::fromUtf8("Symbols");
+ aArgs[0].Value <<= OUString();
+
+ aArgs[1].Name = OUString::fromUtf8("FontName");
+ aArgs[1].Value <<= OUString();
+ //shortcut to launch dialog.. call uno command with empty arguments
+ comphelper::dispatchCommand(".uno:InsertSymbol", aArgs);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/charwin.cxx b/sfx2/source/control/charwin.cxx
new file mode 100644
index 000000000000..9749543af6da
--- /dev/null
+++ b/sfx2/source/control/charwin.cxx
@@ -0,0 +1,213 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <vcl/settings.hxx>
+#include <vcl/builderfactory.hxx>
+#include <sfx2/charwin.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/dispatchcommand.hxx>
+#include <comphelper/processfactory.hxx>
+#include <sfx2/app.hxx>
+
+using namespace com::sun::star;
+
+
+SvxCharView::SvxCharView(vcl::Window* pParent)
+ : Control(pParent, WB_TABSTOP | WB_BORDER)
+ , mnY(0)
+{
+}
+
+VCL_BUILDER_FACTORY(SvxCharView)
+
+void SvxCharView::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ Control::MouseButtonDown(rMEvt);
+
+ if ( rMEvt.IsLeft() )
+ {
+ if ( !(rMEvt.GetClicks() % 2) )
+ {
+ InsertCharToDoc();
+ }
+
+ maMouseClickHdl.Call(this);
+ }
+}
+
+void SvxCharView::KeyInput( const KeyEvent& rKEvt )
+{
+ vcl::KeyCode aCode = rKEvt.GetKeyCode();
+
+ switch (aCode.GetCode())
+ {
+ case KEY_SPACE:
+ case KEY_RETURN:
+ InsertCharToDoc();
+ break;
+ }
+ Control::KeyInput(rKEvt);
+}
+
+void SvxCharView::InsertCharToDoc()
+{
+ if(GetText().isEmpty())
+ return;
+
+ uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
+
+ uno::Sequence<beans::PropertyValue> aArgs(2);
+ aArgs[0].Name = OUString::fromUtf8("Symbols");
+ aArgs[0].Value <<= GetText();
+
+ aArgs[1].Name = OUString::fromUtf8("FontName");
+ aArgs[1].Value <<= maFont.GetFamilyName();
+
+ comphelper::dispatchCommand(".uno:InsertSymbol", aArgs);
+}
+
+void SvxCharView::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
+{
+ rRenderContext.SetFont(maFont);
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ const Color aWindowTextColor(rStyleSettings.GetFieldTextColor());
+ Color aHighlightColor(rStyleSettings.GetHighlightColor());
+ Color aHighlightTextColor(rStyleSettings.GetHighlightTextColor());
+ Color aLightColor(rStyleSettings.GetLightColor());
+
+ const OUString aText = GetText();
+ const Size aSize(GetOutputSizePixel());
+
+ long nAvailWidth = aSize.Width();
+ long nWinHeight = GetOutputSizePixel().Height();
+
+ bool bGotBoundary = true;
+ bool bShrankFont = false;
+ vcl::Font aOrigFont(rRenderContext.GetFont());
+ Size aFontSize(aOrigFont.GetFontSize());
+ ::tools::Rectangle aBoundRect;
+
+ for (long nFontHeight = aFontSize.Height(); nFontHeight > 0; nFontHeight -= 1)
+ {
+ if (!rRenderContext.GetTextBoundRect( aBoundRect, aText ) || aBoundRect.IsEmpty())
+ {
+ bGotBoundary = false;
+ break;
+ }
+
+ //only shrink in the single glyph large view mode
+ long nTextWidth = aBoundRect.GetWidth();
+ if (nAvailWidth > nTextWidth)
+ break;
+ vcl::Font aFont(aOrigFont);
+ aFontSize.Height() = nFontHeight;
+ aFont.SetFontSize(aFontSize);
+ rRenderContext.SetFont(aFont);
+ mnY = (nWinHeight - GetTextHeight()) / 2;
+ bShrankFont = true;
+ }
+
+ Point aPoint(2, mnY);
+
+ if (!bGotBoundary)
+ aPoint.X() = (aSize.Width() - rRenderContext.GetTextWidth(aText)) / 2;
+ else
+ {
+ // adjust position
+ aBoundRect += aPoint;
+
+ // vertical adjustment
+ int nYLDelta = aBoundRect.Top();
+ int nYHDelta = aSize.Height() - aBoundRect.Bottom();
+ if( nYLDelta <= 0 )
+ aPoint.Y() -= nYLDelta - 1;
+ else if( nYHDelta <= 0 )
+ aPoint.Y() += nYHDelta - 1;
+
+ // centrally align glyph
+ aPoint.X() = -aBoundRect.Left() + (aSize.Width() - aBoundRect.GetWidth()) / 2;
+ }
+
+ if (HasFocus())
+ {
+ rRenderContext.SetFillColor(aHighlightColor);
+ rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), Size(GetOutputSizePixel().Width(), GetOutputSizePixel().Height())));
+
+ rRenderContext.SetTextColor(aHighlightTextColor);
+ rRenderContext.DrawText(aPoint, aText);
+ }
+ else
+ {
+ rRenderContext.SetFillColor(aLightColor);
+ rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), Size(GetOutputSizePixel().Width(), GetOutputSizePixel().Height())));
+
+ rRenderContext.SetTextColor(aWindowTextColor);
+ rRenderContext.DrawText(aPoint, aText);
+ }
+
+ if (bShrankFont)
+ rRenderContext.SetFont(aOrigFont);
+}
+
+void SvxCharView::setInsertCharHdl(const Link<SvxCharView*,void> &rLink)
+{
+ maInsertCharHdl = rLink;
+}
+
+void SvxCharView::setMouseClickHdl(const Link<SvxCharView*,void> &rLink)
+{
+ maMouseClickHdl = rLink;
+}
+
+void SvxCharView::SetFont( const vcl::Font& rFont )
+{
+ long nWinHeight = GetOutputSizePixel().Height();
+ maFont = vcl::Font(rFont);
+ maFont.SetWeight(WEIGHT_NORMAL);
+ maFont.SetAlignment(ALIGN_TOP);
+ maFont.SetFontSize(PixelToLogic(Size(0, nWinHeight / 2)));
+ maFont.SetTransparent(true);
+ Control::SetFont(maFont);
+
+ mnY = (nWinHeight - GetTextHeight()) / 2;
+
+ Invalidate();
+}
+
+Size SvxCharView::GetOptimalSize() const
+{
+ const vcl::Font &rFont = GetFont();
+ const Size rFontSize = rFont.GetFontSize();
+ long nWinHeight = LogicToPixel(rFontSize).Height() * 2;
+ return Size( GetTextWidth( GetText() ) + 2 * 12, nWinHeight );
+}
+
+void SvxCharView::Resize()
+{
+ Control::Resize();
+ SetFont(GetFont());
+}
+
+
+void SvxCharView::SetText( const OUString& rText )
+{
+ Control::SetText( rText );
+ Invalidate();
+}
diff --git a/sfx2/source/dialog/charmappopup.cxx b/sfx2/source/dialog/charmappopup.cxx
new file mode 100644
index 000000000000..49c047dc7ee5
--- /dev/null
+++ b/sfx2/source/dialog/charmappopup.cxx
@@ -0,0 +1,47 @@
+/* -*- 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 <sfx2/charmappopup.hxx>
+#include <sfx2/charmapcontrol.hxx>
+#include <unotools/viewoptions.hxx>
+#include <vcl/toolbox.hxx>
+
+SFX_IMPL_TOOLBOX_CONTROL(CharmapPopup, SfxVoidItem);
+
+CharmapPopup::CharmapPopup(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx)
+ : SfxToolBoxControl(nSlotId, nId, rTbx)
+{
+ rTbx.SetItemBits(nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits(nId));
+}
+
+CharmapPopup::~CharmapPopup()
+{
+}
+
+VclPtr<SfxPopupWindow> CharmapPopup::CreatePopupWindow()
+{
+ VclPtr<SfxCharmapCtrl> pControl = VclPtr<SfxCharmapCtrl>::Create(GetSlotId(), m_xFrame);
+
+ pControl->StartPopupMode(&GetToolBox(), FloatWinPopupFlags::GrabFocus);
+
+ SetPopupWindow(pControl);
+
+ return pControl;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/uiconfig/ui/charmapcontrol.ui b/sfx2/uiconfig/ui/charmapcontrol.ui
new file mode 100644
index 000000000000..cc96bdc63837
--- /dev/null
+++ b/sfx2/uiconfig/ui/charmapcontrol.ui
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <object class="GtkWindow" id="charmapctrl">
+ <property name="can_focus">False</property>
+ <property name="resizable">False</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">popup-menu</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="deletable">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Recent Characters</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_homogeneous">True</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar1">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar2">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar4">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar3">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar12">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar11">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar10">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar9">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar5">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar6">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar7">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar8">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar13">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar14">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">5</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar15">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">6</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="cuilo-SvxCharView" id="viewchar16">
+ <property name="width_request">35</property>
+ <property name="height_request">35</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">7</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="specialchardlg">
+ <property name="label" translatable="yes">Launch Dialog</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>