/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include #include #include // DBG_* #include // DBG_UNHANDLED_EXCEPTION #include namespace rptui { using namespace ::com::sun::star; FormattedFieldBeautifier::FormattedFieldBeautifier(const OReportController& _aController) :m_rReportController(_aController) ,m_nTextColor(0xffffffff) { } Color FormattedFieldBeautifier::getTextColor() { if (m_nTextColor == Color(0xffffffff)) { svtools::ExtendedColorConfig aConfig; m_nTextColor = aConfig.GetColorValue(CFG_REPORTDESIGNER, DBTEXTBOXBOUNDCONTENT).getColor(); } return m_nTextColor; } FormattedFieldBeautifier::~FormattedFieldBeautifier() { } void FormattedFieldBeautifier::setPlaceholderText( const uno::Reference< uno::XInterface >& _rxComponent ) { OUString sDataField; try { uno::Reference< report::XFormattedField > xControlModel( _rxComponent, uno::UNO_QUERY ); if ( xControlModel.is() ) { sDataField = xControlModel->getDataField(); if ( !sDataField.isEmpty() ) { ReportFormula aFormula( sDataField ); bool bSet = true; if ( aFormula.getType() == ReportFormula::Field ) { const OUString& sColumnName = aFormula.getFieldName(); OUString sLabel = m_rReportController.getColumnLabel_throw(sColumnName); if ( !sLabel.isEmpty() ) { sDataField = "=" + sLabel; bSet = false; } } if ( bSet ) sDataField = aFormula.getEqualUndecoratedContent(); } setPlaceholderText( getVclWindowPeer( xControlModel.get() ), sDataField ); } } catch (const uno::Exception &) { DBG_UNHANDLED_EXCEPTION("reportdesign"); } } void FormattedFieldBeautifier::setPlaceholderText( const uno::Reference< awt::XVclWindowPeer >& _xVclWindowPeer, const OUString& _rText ) { OSL_ENSURE( _xVclWindowPeer.is(), "FormattedFieldBeautifier::setPlaceholderText: invalid peer!" ); if ( !_xVclWindowPeer.is() ) throw uno::RuntimeException(); // the actual text _xVclWindowPeer->setProperty(PROPERTY_TEXT, uno::makeAny(_rText)); // the text color _xVclWindowPeer->setProperty(PROPERTY_TEXTCOLOR, uno::makeAny(getTextColor())); // font->italic uno::Any aFontDescriptor = _xVclWindowPeer->getProperty(PROPERTY_FONTDESCRIPTOR); awt::FontDescriptor aFontDescriptorStructure; aFontDescriptor >>= aFontDescriptorStructure; aFontDescriptorStructure.Slant = css::awt::FontSlant_ITALIC; _xVclWindowPeer->setProperty(PROPERTY_FONTDESCRIPTOR, uno::makeAny(aFontDescriptorStructure)); } void FormattedFieldBeautifier::notifyPropertyChange( const beans::PropertyChangeEvent& _rEvent ) { if ( _rEvent.PropertyName != "DataField" ) // not interested in return; setPlaceholderText( _rEvent.Source ); } void FormattedFieldBeautifier::handle( const uno::Reference< uno::XInterface >& _rxElement ) { setPlaceholderText( _rxElement ); } void FormattedFieldBeautifier::notifyElementInserted( const uno::Reference< uno::XInterface >& _rxElement ) { handle( _rxElement ); } uno::Reference FormattedFieldBeautifier::getVclWindowPeer(const uno::Reference< report::XReportComponent >& _xComponent) { uno::Reference xVclWindowPeer; std::shared_ptr pModel = m_rReportController.getSdrModel(); uno::Reference xSection(_xComponent->getSection()); if ( xSection.is() ) { OReportPage *pPage = pModel->getPage(xSection); const size_t nIndex = pPage->getIndexOf(_xComponent); if (nIndex < pPage->GetObjCount() ) { SdrObject *pObject = pPage->GetObj(nIndex); OUnoObject* pUnoObj = dynamic_cast(pObject); if ( pUnoObj ) // this doesn't need to be done for shapes { OSectionWindow* pSectionWindow = m_rReportController.getSectionWindow(xSection); if (pSectionWindow != nullptr) { OReportSection& aOutputDevice = pSectionWindow->getReportSection(); // OutputDevice OSectionView& aSdrView = aOutputDevice.getSectionView(); // SdrView uno::Reference xControl = pUnoObj->GetUnoControl(aSdrView, aOutputDevice); xVclWindowPeer.set( xControl->getPeer(), uno::UNO_QUERY); } } } } return xVclWindowPeer; } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */