Kaydet (Commit) 710a3941 authored tarafından Akshay Deep's avatar Akshay Deep Kaydeden (comit) Samuel Mehrbrodt

GSoC: Glyph View and Recent Characters Control in Special Characters dialog

Change-Id: Ia55f3fefe7c14327cff2e996ab0038dc52f9b017
Reviewed-on: https://gerrit.libreoffice.org/37496Reviewed-by: 's avatarSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
Tested-by: 's avatarSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
üst cacb75aa
......@@ -91,6 +91,7 @@ $(eval $(call gb_Library_add_exception_objects,cui,\
cui/source/dialogs/about \
cui/source/dialogs/colorpicker \
cui/source/dialogs/cuicharmap \
cui/source/dialogs/charwin \
cui/source/dialogs/cuifmsearch \
cui/source/dialogs/cuigaldlg \
cui/source/dialogs/cuigrfflt \
......
/* -*- 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 "charwin.hxx"
#include <comphelper/propertysequence.hxx>
#include <comphelper/dispatchcommand.hxx>
#include <sfx2/app.hxx>
#include "cuicharmap.hxx"
#include "macroass.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 )
{
if ( rMEvt.IsLeft() )
{
maMouseClickHdl.Call(this);
if ( !(rMEvt.GetClicks() % 2) )
{
InsertCharToDoc();
}
}
Control::MouseButtonDown(rMEvt);
}
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();
}
......@@ -32,7 +32,10 @@ SAL_DLLPUBLIC_EXPORT bool GetSpecialCharsForEdit(vcl::Window* i_pParent, const v
aDlg->SetCharFont(i_rFont);
if ( aDlg->Execute() == RET_OK )
{
o_rResult = aDlg->GetCharacters();
sal_UCS4 cChar = aDlg->GetChar();
// using the new UCS4 constructor
OUString aOUStr( &cChar, 1 );
o_rResult = aOUStr;
bRet = true;
}
return bRet;
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_CUI_SOURCE_INC_CHARWIN_HXX
#define INCLUDED_CUI_SOURCE_INC_CHARWIN_HXX
#include <vcl/ctrl.hxx>
class SvxCharView : public Control
{
public:
SvxCharView(vcl::Window* pParent);
void SetFont( const vcl::Font& rFont );
void SetText( const OUString& rText ) override;
void InsertCharToDoc();
virtual void Resize() override;
virtual Size GetOptimalSize() const override;
void setInsertCharHdl(const Link<SvxCharView*,void> &rLink);
void setMouseClickHdl(const Link<SvxCharView*,void> &rLink);
protected:
virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) override;
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual void KeyInput( const KeyEvent& rKEvt ) override;
private:
long mnY;
vcl::Font maFont;
Link<SvxCharView*, void> maInsertCharHdl;
Link<SvxCharView*, void> maMouseClickHdl;
};
#endif
......@@ -26,7 +26,9 @@
#include <vcl/lstbox.hxx>
#include <sfx2/basedlgs.hxx>
#include <svx/charmap.hxx>
#include "charwin.hxx"
using namespace ::com::sun::star;
class SubsetMap;
#define CHARMAP_MAXLEN 32
......@@ -68,22 +70,26 @@ private:
void init();
VclPtr<SvxShowCharSet> m_pShowSet;
VclPtr<Edit> m_pShowText;
VclPtr<PushButton> m_pOKBtn;
VclPtr<FixedText> m_pFontText;
VclPtr<ListBox> m_pFontLB;
VclPtr<FixedText> m_pSubsetText;
VclPtr<ListBox> m_pSubsetLB;
VclPtr<FixedText> m_pSymbolText;
VclPtr<SvxShowText> m_pShowChar;
VclPtr<Edit> m_pHexCodeText;
VclPtr<Edit> m_pDecimalCodeText;
VclPtr<SvxCharView> m_pRecentCharView[16];
vcl::Font aFont;
bool bOne;
const SubsetMap* pSubsetMap;
std::deque<OUString> maRecentCharList;
std::deque<OUString> maRecentCharFontList;
uno::Reference< uno::XComponentContext > mxContext;
enum class Radix : sal_Int16 {decimal = 10, hexadecimal=16};
DECL_LINK(OKHdl, Button*, void);
DECL_LINK(FontSelectHdl, ListBox&, void);
DECL_LINK(SubsetSelectHdl, ListBox&, void);
DECL_LINK(CharDoubleClickHdl, SvxShowCharSet*,void);
......@@ -92,6 +98,9 @@ private:
DECL_LINK(CharPreSelectHdl, SvxShowCharSet*, void);
DECL_LINK(DecimalCodeChangeHdl, Edit&, void);
DECL_LINK(HexCodeChangeHdl, Edit&, void);
DECL_LINK(RecentClickHdl, SvxCharView*, void);
DECL_LINK(InsertClickHdl, Button*, void);
DECL_STATIC_LINK(SvxCharacterMap, LoseFocusHdl, Control&, void);
static void fillAllSubsets(ListBox &rListBox);
void selectCharByCode(Radix radix);
......@@ -99,6 +108,7 @@ private:
public:
SvxCharacterMap( vcl::Window* pParent, bool bOne=true, const SfxItemSet* pSet=nullptr );
virtual ~SvxCharacterMap() override;
virtual short Execute() override;
virtual void dispose() override;
void DisableFontSelection();
......@@ -109,9 +119,11 @@ public:
void SetChar( sal_UCS4 );
sal_UCS4 GetChar() const;
OUString GetCharacters() const;
void getRecentCharacterList(); //gets both recent char and recent char font list
void updateRecentCharacterList(const OUString& rChar, const OUString& rFont);
virtual short Execute() override;
void updateRecentCharControl();
void insertCharToDoc(const OUString& sChar);
};
#endif
......
......@@ -815,6 +815,9 @@
<glade-widget-class title="Show Text" name="cuilo-SvxShowText"
generic-name="ShowText" parent="GtkDrawingArea"
icon-name="widget-gtk-drawingarea"/>
<glade-widget-class title="Char Win" name="cuilo-SvxCharView"
generic-name="ShowText" parent="GtkDrawingArea"
icon-name="widget-gtk-drawingarea"/>
<glade-widget-class title="Notebook switching tabs depending on context" name="sfxlo-NotebookbarTabControl"
generic-name="NotebookbarTabControl" parent="GtkNotebook"
icon-name="widget-gtk-notebook"/>
......
......@@ -3476,6 +3476,23 @@
<value/>
</prop>
</group>
<group oor:name="RecentCharacters">
<info>
<desc>Contains recent characters</desc>
</info>
<prop oor:name="RecentCharacterList" oor:type="oor:string-list" oor:nillable="false">
<info>
<desc>List of Recent characters</desc>
</info>
<value/>
</prop>
<prop oor:name="RecentCharacterFontList" oor:type="oor:string-list" oor:nillable="false">
<info>
<desc>List of Recent character font</desc>
</info>
<value/>
</prop>
</group>
<group oor:name="Help">
<info>
<desc>Contains settings that specify the common help settings.</desc>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment