diff options
Diffstat (limited to 'sc/source/ui/pagedlg/tphfedit.cxx')
-rw-r--r-- | sc/source/ui/pagedlg/tphfedit.cxx | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/sc/source/ui/pagedlg/tphfedit.cxx b/sc/source/ui/pagedlg/tphfedit.cxx new file mode 100644 index 000000000..db2a91e5e --- /dev/null +++ b/sc/source/ui/pagedlg/tphfedit.cxx @@ -0,0 +1,274 @@ +/* -*- 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 <scitems.hxx> +#include <editeng/eeitem.hxx> + +#include <editeng/editobj.hxx> +#include <editeng/editstat.hxx> +#include <editeng/editview.hxx> +#include <editeng/adjustitem.hxx> +#include <editeng/fhgtitem.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/sfxdlg.hxx> +#include <vcl/cursor.hxx> +#include <vcl/svapp.hxx> +#include <vcl/settings.hxx> + +#include <tphfedit.hxx> +#include <editutil.hxx> +#include <global.hxx> +#include <patattr.hxx> +#include <scresid.hxx> +#include <globstr.hrc> +#include <strings.hrc> +#include <tabvwsh.hxx> +#include <prevwsh.hxx> +#include <AccessibleEditObject.hxx> + +#include <scabstdlg.hxx> +#include <memory> + + +static void lcl_GetFieldData( ScHeaderFieldData& rData ) +{ + SfxViewShell* pShell = SfxViewShell::Current(); + if (pShell) + { + if (dynamic_cast<const ScTabViewShell*>( pShell) != nullptr) + static_cast<ScTabViewShell*>(pShell)->FillFieldData(rData); + else if (dynamic_cast<const ScPreviewShell*>( pShell) != nullptr) + static_cast<ScPreviewShell*>(pShell)->FillFieldData(rData); + } +} + + +ScEditWindow::ScEditWindow(ScEditWindowLocation eLoc, weld::Window* pDialog) + : eLocation(eLoc) + , mbRTL(ScGlobal::IsSystemRTL()) + , mpDialog(pDialog) + , pAcc(nullptr) +{ +} + +void ScEditWindow::makeEditEngine() +{ + m_xEditEngine.reset(new ScHeaderEditEngine(EditEngine::CreatePool())); +} + +ScHeaderEditEngine* ScEditWindow::GetEditEngine() const +{ + return static_cast<ScHeaderEditEngine*>(m_xEditEngine.get()); +} + +void ScEditWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + OutputDevice& rDevice = pDrawingArea->get_ref_device(); + Size aSize = rDevice.LogicToPixel(Size(80, 120), MapMode(MapUnit::MapAppFont)); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + + WeldEditView::SetDrawingArea(pDrawingArea); + + ScHeaderFieldData aData; + lcl_GetFieldData(aData); + // fields + GetEditEngine()->SetData(aData); + if (mbRTL) + m_xEditEngine->SetDefaultHorizontalTextDirection(EEHorizontalTextDirection::R2L); + + if (pAcc) + { + OUString sName; + switch (eLocation) + { + case Left: + sName = ScResId(STR_ACC_LEFTAREA_NAME); + break; + case Center: + sName = ScResId(STR_ACC_CENTERAREA_NAME); + break; + case Right: + sName = ScResId(STR_ACC_RIGHTAREA_NAME); + break; + } + + pAcc->InitAcc(nullptr, m_xEditView.get(), nullptr, + sName, pDrawingArea->get_tooltip_text()); + } +} + +ScEditWindow::~ScEditWindow() +{ + // delete Accessible object before deleting EditEngine and EditView + if (pAcc) + { + css::uno::Reference< css::accessibility::XAccessible > xTemp = xAcc; + if (xTemp.is()) + pAcc->dispose(); + } +} + +void ScEditWindow::SetNumType(SvxNumType eNumType) +{ + ScHeaderEditEngine* pEditEngine = GetEditEngine(); + pEditEngine->SetNumType(eNumType); + pEditEngine->UpdateFields(); +} + +std::unique_ptr<EditTextObject> ScEditWindow::CreateTextObject() +{ + // reset paragraph attributes + // (GetAttribs at creation of format dialog always returns the set items) + + const SfxItemSet& rEmpty = m_xEditEngine->GetEmptyItemSet(); + sal_Int32 nParCnt = m_xEditEngine->GetParagraphCount(); + for (sal_Int32 i=0; i<nParCnt; i++) + m_xEditEngine->SetParaAttribs( i, rEmpty ); + + return m_xEditEngine->CreateTextObject(); +} + +void ScEditWindow::SetFont( const ScPatternAttr& rPattern ) +{ + auto pSet = std::make_unique<SfxItemSet>( m_xEditEngine->GetEmptyItemSet() ); + rPattern.FillEditItemSet( pSet.get() ); + // FillEditItemSet adjusts font height to 1/100th mm, + // but for header/footer twips is needed, as in the PatternAttr: + pSet->Put( rPattern.GetItem(ATTR_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT) ); + pSet->Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CJK) ); + pSet->Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT).CloneSetWhich(EE_CHAR_FONTHEIGHT_CTL) ); + if (mbRTL) + pSet->Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) ); + GetEditEngine()->SetDefaults( std::move(pSet) ); +} + +void ScEditWindow::SetText( const EditTextObject& rTextObject ) +{ + GetEditEngine()->SetTextCurrentDefaults(rTextObject); +} + +void ScEditWindow::InsertField( const SvxFieldItem& rFld ) +{ + m_xEditView->InsertField( rFld ); +} + +void ScEditWindow::SetCharAttributes() +{ + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + + SfxViewShell* pViewSh = SfxViewShell::Current(); + + ScTabViewShell* pTabViewSh = dynamic_cast<ScTabViewShell*>( SfxViewShell::Current() ); + + OSL_ENSURE( pDocSh, "Current DocShell not found" ); + OSL_ENSURE( pViewSh, "Current ViewShell not found" ); + + if ( pDocSh && pViewSh ) + { + if(pTabViewSh!=nullptr) pTabViewSh->SetInFormatDialog(true); + + SfxItemSet aSet( m_xEditView->GetAttribs() ); + + ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); + + ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateScCharDlg( + mpDialog, &aSet, pDocSh, false)); + pDlg->SetText( ScResId( STR_TEXTATTRS ) ); + if ( pDlg->Execute() == RET_OK ) + { + aSet.ClearItem(); + aSet.Put( *pDlg->GetOutputItemSet() ); + m_xEditView->SetAttribs( aSet ); + } + + if(pTabViewSh!=nullptr) pTabViewSh->SetInFormatDialog(false); + } +} + +bool ScEditWindow::KeyInput( const KeyEvent& rKEvt ) +{ + sal_uInt16 nKey = rKEvt.GetKeyCode().GetModifier() + + rKEvt.GetKeyCode().GetCode(); + + if ( nKey == KEY_TAB || nKey == KEY_TAB + KEY_SHIFT ) + { + return false; + } + else if ( !m_xEditView->PostKeyEvent( rKEvt ) ) + { + return false; + } + else if ( !rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsShift() && + rKEvt.GetKeyCode().IsMod2() && rKEvt.GetKeyCode().GetCode() == KEY_DOWN ) + { + aObjectSelectLink.Call(*this); + return true; + } + return true; +} + +void ScEditWindow::GetFocus() +{ + assert(m_GetFocusLink); + m_GetFocusLink(*this); + + css::uno::Reference< css::accessibility::XAccessible > xTemp = xAcc; + if (xTemp.is() && pAcc) + { + pAcc->GotFocus(); + } + else + pAcc = nullptr; + + WeldEditView::GetFocus(); +} + +void ScEditWindow::LoseFocus() +{ + css::uno::Reference< css::accessibility::XAccessible > xTemp = xAcc; + if (xTemp.is() && pAcc) + { + pAcc->LostFocus(); + } + else + pAcc = nullptr; + WeldEditView::LoseFocus(); +} + +bool ScEditWindow::MouseButtonDown(const MouseEvent& rMEvt) +{ + bool bHadFocus = HasFocus(); + bool bRet = WeldEditView::MouseButtonDown(rMEvt); + if (!bHadFocus) + { + assert(HasFocus()); + GetFocus(); + } + return bRet; +} + +css::uno::Reference< css::accessibility::XAccessible > ScEditWindow::CreateAccessible() +{ + pAcc = new ScAccessibleEditControlObject(this); + css::uno::Reference< css::accessibility::XAccessible > xAccessible = pAcc; + xAcc = xAccessible; + return pAcc; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |