diff options
Diffstat (limited to 'sd/source/ui/presenter/PresenterTextView.cxx')
-rwxr-xr-x | sd/source/ui/presenter/PresenterTextView.cxx | 645 |
1 files changed, 645 insertions, 0 deletions
diff --git a/sd/source/ui/presenter/PresenterTextView.cxx b/sd/source/ui/presenter/PresenterTextView.cxx new file mode 100755 index 000000000000..ba90a92939ca --- /dev/null +++ b/sd/source/ui/presenter/PresenterTextView.cxx @@ -0,0 +1,645 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_sd.hxx" + +#include "PresenterTextView.hxx" + +#include <i18npool/mslangid.hxx> +#include <cppcanvas/vclfactory.hxx> +#include <svl/itempool.hxx> +#include <svl/itemset.hxx> +#include <unotools/linguprops.hxx> +#include <unotools/lingucfg.hxx> +#include <editeng/colritem.hxx> +#include <editeng/editeng.hxx> +#include <editeng/editstat.hxx> +#include <editeng/eeitem.hxx> +#include <editeng/fhgtitem.hxx> +#include <editeng/fontitem.hxx> +#include <svx/xflclit.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/svapp.hxx> +#include <vcl/virdev.hxx> +#include <com/sun/star/awt/FontDescriptor.hpp> +#include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/rendering/XSpriteCanvas.hpp> +#include <com/sun/star/util/Color.hpp> +#include <com/sun/star/i18n/ScriptType.hpp> + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using ::rtl::OUString; + +namespace sd { namespace presenter { + +//===== Service =============================================================== + +Reference<XInterface> SAL_CALL PresenterTextViewService_createInstance ( + const Reference<XComponentContext>& rxContext) +{ + return Reference<XInterface>(static_cast<XWeak*>(new PresenterTextView(rxContext))); +} + + + + +::rtl::OUString PresenterTextViewService_getImplementationName (void) throw(RuntimeException) +{ + return OUString::createFromAscii("com.sun.star.comp.Draw.PresenterTextView"); +} + + + + +Sequence<rtl::OUString> SAL_CALL PresenterTextViewService_getSupportedServiceNames (void) + throw (RuntimeException) +{ + static const ::rtl::OUString sServiceName( + ::rtl::OUString::createFromAscii("com.sun.star.drawing.PresenterTextView")); + return Sequence<rtl::OUString>(&sServiceName, 1); +} + + + +//===== PresenterTextView::Implementation ===================================== + +class PresenterTextView::Implementation +{ +public: + const OUString msTextPropertyName; + const OUString msBitmapPropertyName; + const OUString msSizePropertyName; + const OUString msBackgroundColorPropertyName; + const OUString msTextColorPropertyName; + const OUString msFontDescriptorPropertyName; + const OUString msTopPropertyName; + const OUString msTopRelativePropertyName; + const OUString msTotalHeightPropertyName; + + Implementation (void); + ~Implementation (void); + + void SetCanvas (const cppcanvas::CanvasSharedPtr& rCanvas); + void SetSize (const Size aSize); + void SetBackgroundColor (const Color aColor); + void SetTextColor (const Color aColor); + void SetFontDescriptor (const awt::FontDescriptor& rFontDescriptor); + sal_Int32 GetTop (void) const; + void SetTop (const sal_Int32 nTop); + void SetText (const OUString& Text); + sal_Int32 ParseDistance (const OUString& rsDistance) const; + Reference<rendering::XBitmap> GetBitmap (void); + sal_Int32 GetTotalHeight (void); + +private: + Reference<rendering::XBitmap> mxBitmap; + cppcanvas::CanvasSharedPtr mpCanvas; + VirtualDevice* mpOutputDevice; + EditEngine* mpEditEngine; + SfxItemPool* mpEditEngineItemPool; + Size maSize; + Color maBackgroundColor; + Color maTextColor; + String msText; + sal_Int32 mnTop; + sal_Int32 mnTotalHeight; + + EditEngine * GetEditEngine (void); + EditEngine* CreateEditEngine (void); + void CheckTop (void); +}; + + + + +//===== PresenterTextView ===================================================== + +PresenterTextView::PresenterTextView (const Reference<XComponentContext>& rxContext) + : PresenterTextViewInterfaceBase(), + mpImplementation(new Implementation()) +{ + (void)rxContext; +} + + + + +PresenterTextView::~PresenterTextView (void) +{ +} + + + + +void SAL_CALL PresenterTextView::disposing (void) +{ + mpImplementation.reset(); +} + + + + +//----- XInitialization ------------------------------------------------------- + +void SAL_CALL PresenterTextView::initialize (const Sequence<Any>& rArguments) + throw (Exception, RuntimeException) +{ + ThrowIfDisposed(); + + if (rArguments.getLength() == 1) + { + try + { + Reference<rendering::XBitmapCanvas> xCanvas (rArguments[0], UNO_QUERY_THROW); + if (xCanvas.is()) + { + mpImplementation->SetCanvas( + cppcanvas::VCLFactory::getInstance().createCanvas(xCanvas)); + } + } + catch (RuntimeException&) + { + throw; + } + } + else + { + throw RuntimeException( + OUString::createFromAscii("PresenterTextView: invalid number of arguments"), + static_cast<XWeak*>(this)); + } +} + + + + +//----------------------------------------------------------------------------- + +Any PresenterTextView::GetPropertyValue (const OUString& rsPropertyName) +{ + ThrowIfDisposed(); + + if (rsPropertyName == mpImplementation->msBitmapPropertyName) + { + return Any(mpImplementation->GetBitmap()); + } + else if (rsPropertyName == mpImplementation->msTopPropertyName) + { + return Any(mpImplementation->GetTop()); + } + else if (rsPropertyName == mpImplementation->msTotalHeightPropertyName) + { + return Any(mpImplementation->GetTotalHeight()); + } + + return Any(); +} + + + + +Any PresenterTextView::SetPropertyValue ( + const ::rtl::OUString& rsPropertyName, + const css::uno::Any& rValue) +{ + ThrowIfDisposed(); + + Any aOldValue; + if (rsPropertyName == mpImplementation->msTextPropertyName) + { + OUString sText; + if (rValue >>= sText) + mpImplementation->SetText(sText); + } + else if (rsPropertyName == mpImplementation->msSizePropertyName) + { + awt::Size aSize; + if (rValue >>= aSize) + mpImplementation->SetSize(Size(aSize.Width,aSize.Height)); + } + else if (rsPropertyName == mpImplementation->msBackgroundColorPropertyName) + { + util::Color aColor = util::Color(); + if (rValue >>= aColor) + mpImplementation->SetBackgroundColor(Color(aColor)); + } + else if (rsPropertyName == mpImplementation->msTextColorPropertyName) + { + util::Color aColor = util::Color(); + if (rValue >>= aColor) + mpImplementation->SetTextColor(Color(aColor)); + } + else if (rsPropertyName == mpImplementation->msFontDescriptorPropertyName) + { + awt::FontDescriptor aFontDescriptor; + if (rValue >>= aFontDescriptor) + mpImplementation->SetFontDescriptor(aFontDescriptor); + } + else if (rsPropertyName == mpImplementation->msTopPropertyName) + { + sal_Int32 nTop = 0; + if (rValue >>= nTop) + mpImplementation->SetTop(nTop); + } + else if (rsPropertyName == mpImplementation->msTopRelativePropertyName) + { + OUString sDistance; + if (rValue >>= sDistance) + mpImplementation->SetTop( + mpImplementation->GetTop() + + mpImplementation->ParseDistance(sDistance)); + } + return aOldValue; +} + + + + +void PresenterTextView::ThrowIfDisposed (void) + throw (::com::sun::star::lang::DisposedException) +{ + if (PresenterTextViewInterfaceBase::rBHelper.bDisposed + || PresenterTextViewInterfaceBase::rBHelper.bInDispose + || mpImplementation.get()==NULL) + { + throw lang::DisposedException ( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( + "PresenterTextView object has already been disposed")), + static_cast<uno::XWeak*>(this)); + } +} + + + + +//===== PresenterTextView::Implementation ===================================== + +PresenterTextView::Implementation::Implementation (void) + : msTextPropertyName(OUString::createFromAscii("Text")), + msBitmapPropertyName(OUString::createFromAscii("Bitmap")), + msSizePropertyName(OUString::createFromAscii("Size")), + msBackgroundColorPropertyName(OUString::createFromAscii("BackgroundColor")), + msTextColorPropertyName(OUString::createFromAscii("TextColor")), + msFontDescriptorPropertyName(OUString::createFromAscii("FontDescriptor")), + msTopPropertyName(OUString::createFromAscii("Top")), + msTopRelativePropertyName(OUString::createFromAscii("RelativeTop")), + msTotalHeightPropertyName(OUString::createFromAscii("TotalHeight")), + mxBitmap(), + mpCanvas(), + mpOutputDevice(new VirtualDevice(*Application::GetDefaultDevice(), 0, 0)), + mpEditEngine(NULL), + mpEditEngineItemPool(EditEngine::CreatePool()), + maSize(100,100), + maBackgroundColor(0xffffffff), + maTextColor(0x00000000), + msText(), + mnTop(0), + mnTotalHeight(-1) +{ + mpOutputDevice->SetMapMode(MAP_PIXEL); + + GetEditEngine(); +} + + + + +PresenterTextView::Implementation::~Implementation (void) +{ + delete mpEditEngine; + SfxItemPool::Free(mpEditEngineItemPool); + delete mpOutputDevice; +} + + + + +EditEngine * PresenterTextView::Implementation::GetEditEngine (void) +{ + if (mpEditEngine == NULL) + mpEditEngine = CreateEditEngine (); + return mpEditEngine; +} + + + + +EditEngine* PresenterTextView::Implementation::CreateEditEngine (void) +{ + EditEngine* pEditEngine = mpEditEngine; + if (pEditEngine == NULL) + { + // + // set fonts to be used + // + SvtLinguOptions aOpt; + SvtLinguConfig().GetOptions( aOpt ); + // + struct FontDta { + INT16 nFallbackLang; + INT16 nLang; + USHORT nFontType; + USHORT nFontInfoId; + } aTable[3] = + { + // info to get western font to be used + { LANGUAGE_ENGLISH_US, LANGUAGE_NONE, + DEFAULTFONT_SERIF, EE_CHAR_FONTINFO }, + // info to get CJK font to be used + { LANGUAGE_JAPANESE, LANGUAGE_NONE, + DEFAULTFONT_CJK_TEXT, EE_CHAR_FONTINFO_CJK }, + // info to get CTL font to be used + { LANGUAGE_ARABIC_SAUDI_ARABIA, LANGUAGE_NONE, + DEFAULTFONT_CTL_TEXT, EE_CHAR_FONTINFO_CTL } + }; + aTable[0].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN); + aTable[1].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CJK, ::com::sun::star::i18n::ScriptType::ASIAN); + aTable[2].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CTL, ::com::sun::star::i18n::ScriptType::COMPLEX); + // + for (int i = 0; i < 3; ++i) + { + const FontDta &rFntDta = aTable[i]; + LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ? + rFntDta.nFallbackLang : rFntDta.nLang; + Font aFont = Application::GetDefaultDevice()->GetDefaultFont( + rFntDta.nFontType, nLang, DEFAULTFONT_FLAGS_ONLYONE); + mpEditEngineItemPool->SetPoolDefaultItem( + SvxFontItem( + aFont.GetFamily(), + aFont.GetName(), + aFont.GetStyleName(), + aFont.GetPitch(), + aFont.GetCharSet(), + rFntDta.nFontInfoId)); + } + + + pEditEngine = new EditEngine (mpEditEngineItemPool); + + pEditEngine->EnableUndo (TRUE); + pEditEngine->SetDefTab (USHORT( + Application::GetDefaultDevice()->GetTextWidth( + UniString::CreateFromAscii("XXXX")))); + + pEditEngine->SetControlWord( + (pEditEngine->GetControlWord() + | EE_CNTRL_AUTOINDENTING) & + (~EE_CNTRL_UNDOATTRIBS) & + (~EE_CNTRL_PASTESPECIAL)); + + pEditEngine->SetWordDelimiters ( + UniString::CreateFromAscii(" .=+-*/(){}[];\"")); + pEditEngine->SetRefMapMode (MAP_PIXEL); + pEditEngine->SetPaperSize (Size(800, 0)); + pEditEngine->EraseVirtualDevice(); + pEditEngine->ClearModifyFlag(); + } + + return pEditEngine; +} + + + + +void PresenterTextView::Implementation::SetCanvas (const cppcanvas::CanvasSharedPtr& rpCanvas) +{ + mpCanvas = rpCanvas; + mxBitmap = NULL; +} + + + + +void PresenterTextView::Implementation::SetSize (const Size aSize) +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + + maSize = aSize; + mpEditEngine->SetPaperSize(maSize); + mnTotalHeight = -1; + mxBitmap = NULL; +} + + + + +void PresenterTextView::Implementation::SetBackgroundColor (const Color aColor) +{ + maBackgroundColor = aColor; + mxBitmap = NULL; + + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing"); + mpEditEngine->SetBackgroundColor(aColor); + mpEditEngine->EnableAutoColor(FALSE); + mpEditEngine->ForceAutoColor(FALSE); +} + + + + +void PresenterTextView::Implementation::SetTextColor (const Color aColor) +{ + maTextColor = aColor; + mxBitmap = NULL; + + DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing"); + mpEditEngineItemPool->SetPoolDefaultItem(SvxColorItem(aColor, EE_CHAR_COLOR)); +} + + + + +void PresenterTextView::Implementation::SetFontDescriptor ( + const awt::FontDescriptor& rFontDescriptor) +{ + mxBitmap = NULL; + + DBG_ASSERT(mpEditEngineItemPool!=NULL, "EditEngineItemPool missing"); + + const sal_Int32 nFontHeight = rFontDescriptor.Height; + + SvxFontHeightItem aFontHeight( + Application::GetDefaultDevice()->LogicToPixel( + Size(0, nFontHeight), MapMode (MAP_POINT)).Height(), + 100, + EE_CHAR_FONTHEIGHT); + mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight); + aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CJK); + mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight); + aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CTL); + mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight); + + SvxFontItem aSvxFontItem (EE_CHAR_FONTINFO); + aSvxFontItem.GetFamilyName() = rFontDescriptor.Name; + mpEditEngineItemPool->SetPoolDefaultItem(aSvxFontItem); + + mnTotalHeight = -1; + mxBitmap = NULL; + + CheckTop(); + mnTotalHeight = -1; +} + + + + +sal_Int32 PresenterTextView::Implementation::GetTop (void) const +{ + return mnTop; +} + + + + +void PresenterTextView::Implementation::SetTop (const sal_Int32 nTop) +{ + if (nTop == mnTop) + return; + + mnTop = nTop; + mxBitmap = NULL; + CheckTop(); +} + + + + +void PresenterTextView::Implementation::SetText (const OUString& rText) +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + msText = rText; + mpEditEngine->SetPaperSize(maSize); + mnTotalHeight = -1; + mxBitmap = NULL; +} + + + + +sal_Int32 PresenterTextView::Implementation::ParseDistance (const OUString& rsDistance) const +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + sal_Int32 nDistance (0); + if (rsDistance.endsWithAsciiL("px", 2)) + { + nDistance = rsDistance.copy(0,rsDistance.getLength()-2).toInt32(); + } + else if (rsDistance.endsWithAsciiL("l", 1)) + { + const sal_Int32 nLines (rsDistance.copy(0,rsDistance.getLength()-1).toInt32()); + // Take the height of the first line as the height of every line. + const sal_uInt32 nFirstLineHeight (mpEditEngine->GetLineHeight(0,0)); + nDistance = nFirstLineHeight * nLines; + } + + return nDistance; +} + + + + +Reference<rendering::XBitmap> PresenterTextView::Implementation::GetBitmap (void) +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + + if ( ! mxBitmap.is()) + { + if (mpOutputDevice != NULL) + delete mpOutputDevice; + mpOutputDevice = new VirtualDevice(*Application::GetDefaultDevice(), 0, 0); + mpOutputDevice->SetMapMode(MAP_PIXEL); + mpOutputDevice->SetOutputSizePixel(maSize, TRUE); + mpOutputDevice->SetLineColor(); + mpOutputDevice->SetFillColor(); + mpOutputDevice->SetBackground(Wallpaper()); + mpOutputDevice->Erase(); + + MapMode aMapMode (mpOutputDevice->GetMapMode()); + aMapMode.SetOrigin(Point(0,0)); + mpOutputDevice->SetMapMode(aMapMode); + const Rectangle aWindowBox (Point(0,0), maSize); + mpOutputDevice->DrawRect(aWindowBox); + + mpEditEngine->Clear(); + mpEditEngine->SetText(msText); + mpEditEngine->SetPaperSize(maSize); + + mpEditEngine->Draw(mpOutputDevice, aWindowBox, Point(0,mnTop)); + + const BitmapEx aBitmap (mpOutputDevice->GetBitmapEx(Point(0,0), maSize)); + mxBitmap = cppcanvas::VCLFactory::getInstance().createBitmap( + mpCanvas, + aBitmap + )->getUNOBitmap(); + } + return mxBitmap; +} + + + + +sal_Int32 PresenterTextView::Implementation::GetTotalHeight (void) +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + + if (mnTotalHeight < 0) + { + if ( ! mxBitmap.is()) + GetBitmap(); + mnTotalHeight = mpEditEngine->GetTextHeight(); + } + return mnTotalHeight; +} + + + + +void PresenterTextView::Implementation::CheckTop (void) +{ + DBG_ASSERT(mpEditEngine!=NULL, "EditEngine missing"); + + if (mnTotalHeight < 0) + mnTotalHeight = mpEditEngine->GetTextHeight(); + if (mpEditEngine!=NULL && mnTop >= mnTotalHeight) + mnTop = mnTotalHeight - mpEditEngine->GetLineHeight(0,0); + + if (mnTotalHeight < maSize.Height()) + mnTop = 0; + + if (mnTotalHeight - mnTop < maSize.Height()) + mnTop = mnTotalHeight - maSize.Height(); + + if (mnTop < 0) + mnTop = 0; +} + + +} } // end of namespace ::sd::presenter |