/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FormControlHelper.hxx" #include #include namespace writerfilter { namespace dmapper { using namespace ::com::sun::star; struct FormControlHelper::FormControlHelper_Impl { FieldId m_eFieldId; awt::Size aSize; uno::Reference rDrawPage; uno::Reference rForm; uno::Reference rFormComponent; uno::Reference rServiceFactory; uno::Reference rTextDocument; uno::Reference getDrawPage(); uno::Reference getServiceFactory(); uno::Reference getForm(); uno::Reference getFormComps(); }; uno::Reference FormControlHelper::FormControlHelper_Impl::getDrawPage() { if (! rDrawPage.is()) { uno::Reference xDrawPageSupplier(rTextDocument, uno::UNO_QUERY); if (xDrawPageSupplier.is()) rDrawPage = xDrawPageSupplier->getDrawPage(); } return rDrawPage; } uno::Reference FormControlHelper::FormControlHelper_Impl::getServiceFactory() { if (! rServiceFactory.is()) rServiceFactory = uno::Reference(rTextDocument, uno::UNO_QUERY); return rServiceFactory; } uno::Reference FormControlHelper::FormControlHelper_Impl::getForm() { if (! rForm.is()) { uno::Reference xFormsSupplier(getDrawPage(), uno::UNO_QUERY); if (xFormsSupplier.is()) { uno::Reference xFormsNamedContainer(xFormsSupplier->getForms()); static ::rtl::OUString sDOCXForm(RTL_CONSTASCII_USTRINGPARAM("DOCX-Standard")); ::rtl::OUString sFormName(sDOCXForm); sal_uInt16 nUnique = 0; while (xFormsNamedContainer->hasByName(sFormName)) { ++nUnique; sFormName = sDOCXForm; sFormName += ::rtl::OUString::valueOf(nUnique); } uno::Reference xForm(getServiceFactory()->createInstance (::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.form.component.Form")))); if (xForm.is()) { uno::Reference xFormProperties(xForm, uno::UNO_QUERY); uno::Any aAny(sFormName); static ::rtl::OUString sName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name"))); xFormProperties->setPropertyValue(sName, aAny); } rForm = uno::Reference(xForm, uno::UNO_QUERY); uno::Reference xForms(xFormsNamedContainer, uno::UNO_QUERY); uno::Any aAny(xForm); xForms->insertByIndex(xForms->getCount(), aAny); } } return rForm; } uno::Reference FormControlHelper::FormControlHelper_Impl::getFormComps() { uno::Reference xIndexContainer(getForm(), uno::UNO_QUERY); return xIndexContainer; } FormControlHelper::FormControlHelper(FieldId eFieldId, uno::Reference rTextDocument, FFDataHandler::Pointer_t pFFData) : m_pFFData(pFFData), m_pImpl(new FormControlHelper_Impl) { m_pImpl->m_eFieldId = eFieldId; m_pImpl->rTextDocument = rTextDocument; } FormControlHelper::~FormControlHelper() { } bool FormControlHelper::createCheckbox(uno::Reference xTextRange, const ::rtl::OUString & rControlName) { if ( !m_pFFData ) return false; uno::Reference xServiceFactory(m_pImpl->getServiceFactory()); if (! xServiceFactory.is()) return false; uno::Reference xInterface = xServiceFactory->createInstance (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.form.component.CheckBox"))); if (!xInterface.is()) return false; m_pImpl->rFormComponent = uno::Reference(xInterface, uno::UNO_QUERY); if (!m_pImpl->rFormComponent.is()) return false; uno::Reference xPropSet(xInterface, uno::UNO_QUERY); sal_uInt32 nCheckBoxHeight = 16 * m_pFFData->getCheckboxHeight(); if (m_pFFData->getCheckboxAutoHeight()) { uno::Reference xTextRangeProps(xTextRange, uno::UNO_QUERY); try { static ::rtl::OUString sCharHeight(RTL_CONSTASCII_USTRINGPARAM("CharHeight")); float fCheckBoxHeight = 0.0; xTextRangeProps->getPropertyValue(sCharHeight) >>= fCheckBoxHeight; nCheckBoxHeight = static_cast(floor(fCheckBoxHeight * 35.3)); } catch (beans::UnknownPropertyException &) { } } m_pImpl->aSize.Width = nCheckBoxHeight; m_pImpl->aSize.Height = m_pImpl->aSize.Width; uno::Any aAny; if (!m_pFFData->getStatusText().isEmpty()) { aAny <<= m_pFFData->getStatusText(); xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpText")), aAny); } aAny <<= m_pFFData->getCheckboxChecked(); xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultState")), aAny); if (!m_pFFData->getHelpText().isEmpty()) { aAny <<= m_pFFData->getHelpText(); xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpF1Text")), aAny); } aAny <<= rControlName; xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name")), aAny); return true; } bool FormControlHelper::processField(uno::Reference xFormField) { bool bRes = true; uno::Reference xNameCont = xFormField->getParameters(); uno::Reference xNamed( xFormField, uno::UNO_QUERY ); if ( m_pFFData && xNamed.is() && xNameCont.is() ) { if (m_pImpl->m_eFieldId == FIELD_FORMTEXT ) { xFormField->setFieldType( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMTEXT))); if ( !m_pFFData->getName().isEmpty() ) { xNamed->setName( m_pFFData->getName() ); } } else if (m_pImpl->m_eFieldId == FIELD_FORMCHECKBOX ) { xFormField->setFieldType( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMCHECKBOX))); uno::Reference xPropSet(xFormField, uno::UNO_QUERY); uno::Any aAny; aAny <<= m_pFFData->getCheckboxChecked(); if ( xPropSet.is() ) xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Checked")), aAny); rtl::OUString sName; } else if (m_pImpl->m_eFieldId == FIELD_FORMDROPDOWN ) { xFormField->setFieldType( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN))); uno::Sequence< rtl::OUString > sItems; sItems.realloc( m_pFFData->getDropDownEntries().size() ); ::std::copy( m_pFFData->getDropDownEntries().begin(), m_pFFData->getDropDownEntries().end(), ::comphelper::stl_begin(sItems)); if ( sItems.getLength() ) { if ( xNameCont->hasByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_LISTENTRY)) ) ) xNameCont->replaceByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_LISTENTRY)), uno::makeAny( sItems ) ); else xNameCont->insertByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_LISTENTRY)), uno::makeAny( sItems ) ); sal_Int32 nResult = m_pFFData->getDropDownResult().toInt32(); if ( nResult ) { if ( xNameCont->hasByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_RESULT)) ) ) xNameCont->replaceByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_RESULT)), uno::makeAny( nResult ) ); else xNameCont->insertByName( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(ODF_FORMDROPDOWN_RESULT)), uno::makeAny( nResult ) ); } } } } else bRes = false; return bRes; } bool FormControlHelper::insertControl(uno::Reference xTextRange) { bool bCreated = false; if ( !m_pFFData ) return false; uno::Reference xFormCompsByName(m_pImpl->getForm(), uno::UNO_QUERY); uno::Reference xFormComps(m_pImpl->getFormComps()); if (! xFormComps.is()) return false; static ::rtl::OUString sControl(RTL_CONSTASCII_USTRINGPARAM("Control")); sal_Int32 nControl = 0; bool bDone = false; ::rtl::OUString sControlName; do { ::rtl::OUString sTmp(sControl); sTmp += ::rtl::OUString::valueOf(nControl); nControl++; if (! xFormCompsByName->hasByName(sTmp)) { sControlName = sTmp; bDone = true; } } while (! bDone); switch (m_pImpl->m_eFieldId) { case FIELD_FORMCHECKBOX: bCreated = createCheckbox(xTextRange, sControlName); break; default: break; } if (!bCreated) return false; uno::Any aAny(m_pImpl->rFormComponent); xFormComps->insertByIndex(xFormComps->getCount(), aAny); if (! m_pImpl->getServiceFactory().is()) return false; uno::Reference xInterface = m_pImpl->getServiceFactory()->createInstance (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.ControlShape"))); if (! xInterface.is()) return false; uno::Reference xShape(xInterface, uno::UNO_QUERY); if (! xShape.is()) return false; xShape->setSize(m_pImpl->aSize); uno::Reference xShapeProps(xShape, uno::UNO_QUERY); sal_uInt16 nTmp = text::TextContentAnchorType_AS_CHARACTER; aAny <<= nTmp; static const ::rtl::OUString sAnchorType(RTL_CONSTASCII_USTRINGPARAM("AnchorType")); xShapeProps->setPropertyValue(sAnchorType, aAny); static const ::rtl::OUString sVertOrient(RTL_CONSTASCII_USTRINGPARAM("VertOrient")); nTmp = text::VertOrientation::CENTER; aAny <<= nTmp; xShapeProps->setPropertyValue(sVertOrient, aAny); aAny <<= xTextRange; static const ::rtl::OUString sTextRange(RTL_CONSTASCII_USTRINGPARAM("TextRange")); xShapeProps->setPropertyValue(sTextRange, aAny); uno::Reference xControlShape(xShape, uno::UNO_QUERY); uno::Reference xControlModel(m_pImpl->rFormComponent, uno::UNO_QUERY); xControlShape->setControl(xControlModel); m_pImpl->getDrawPage()->add(xShape); return true; } }} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */