| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #include <ooo/vba/office/MsoArrowheadStyle.hpp> |
| #include <ooo/vba/office/MsoArrowheadLength.hpp> |
| #include <ooo/vba/office/MsoArrowheadWidth.hpp> |
| #include <ooo/vba/office/MsoLineDashStyle.hpp> |
| #include <com/sun/star/drawing/LineStyle.hpp> |
| #include <com/sun/star/drawing/LineDash.hpp> |
| #include "vbalineformat.hxx" |
| #include "vbacolorformat.hxx" |
| |
| using namespace ooo::vba; |
| using namespace com::sun::star; |
| |
| ScVbaLineFormat::ScVbaLineFormat( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< drawing::XShape > xShape ) : ScVbaLineFormat_BASE( xParent, xContext ), m_xShape( xShape ) |
| { |
| m_xPropertySet.set( xShape, uno::UNO_QUERY_THROW ); |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineSolid; |
| m_nLineWeight = 1; |
| } |
| |
| sal_Int32 |
| ScVbaLineFormat::calculateArrowheadSize() |
| { |
| return 0; |
| } |
| |
| sal_Int32 |
| ScVbaLineFormat::convertLineStartEndNameToArrowheadStyle( rtl::OUString sLineName ) |
| { |
| sal_Int32 nLineType = office::MsoArrowheadStyle::msoArrowheadNone; |
| if (sLineName.equals(rtl::OUString::createFromAscii("Small Arrow")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Arrow")) || |
| sLineName.equals(rtl::OUString::createFromAscii("msArrowEnd")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Double Arrow"))) |
| { |
| // msoArrowheadTriangle |
| nLineType = office::MsoArrowheadStyle::msoArrowheadTriangle; |
| } |
| else if (sLineName.equals(rtl::OUString::createFromAscii("Square 45")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Square")) || |
| sLineName.equals(rtl::OUString::createFromAscii("msArrowDiamondEnd"))) |
| { |
| // msoArrowheadDiamond |
| nLineType = office::MsoArrowheadStyle::msoArrowheadDiamond; |
| } |
| else if (sLineName.equals(rtl::OUString::createFromAscii("Circle")) || |
| sLineName.equals(rtl::OUString::createFromAscii("msArrowOvalEnd")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Dimension Lines")) ) |
| { |
| // msoArrowheadOval |
| nLineType = office::MsoArrowheadStyle::msoArrowheadOval; |
| } |
| else if (sLineName.equals(rtl::OUString::createFromAscii("Arrow concave")) || |
| sLineName.equals(rtl::OUString::createFromAscii("msArrowStealthEnd"))) |
| { |
| // msoArrowheadStealth |
| nLineType = office::MsoArrowheadStyle::msoArrowheadStealth; |
| } |
| else if (sLineName.equals(rtl::OUString::createFromAscii("Rounded short Arrow")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Rounded large Arrow")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Symmetric Arrow")) || |
| sLineName.equals(rtl::OUString::createFromAscii("msArrowOpenEnd")) || |
| sLineName.equals(rtl::OUString::createFromAscii("Line Arrow"))) |
| { |
| // msoArrowheadOpen |
| nLineType = office::MsoArrowheadStyle::msoArrowheadOpen; |
| } |
| else |
| { |
| // msoArrowheadNone |
| nLineType = office::MsoArrowheadStyle::msoArrowheadNone; |
| } |
| return nLineType; |
| } |
| |
| rtl::OUString |
| ScVbaLineFormat::convertArrowheadStyleToLineStartEndName( sal_Int32 nArrowheadStyle ) throw (uno::RuntimeException) |
| { |
| switch( nArrowheadStyle ) |
| { |
| case office::MsoArrowheadStyle::msoArrowheadNone: |
| return rtl::OUString(rtl::OUString::createFromAscii( "" ) ); |
| case office::MsoArrowheadStyle::msoArrowheadStealth: |
| return rtl::OUString::createFromAscii( "Arrow concave" ); |
| case office::MsoArrowheadStyle::msoArrowheadOpen: |
| return rtl::OUString::createFromAscii("Line Arrow" ); |
| case office::MsoArrowheadStyle::msoArrowheadOval: |
| return rtl::OUString::createFromAscii("Circle" ); |
| case office::MsoArrowheadStyle::msoArrowheadDiamond: |
| return rtl::OUString::createFromAscii( "Square 45" ); |
| case office::MsoArrowheadStyle::msoArrowheadTriangle: |
| return rtl::OUString::createFromAscii( "Arrow" ); |
| default: |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Invalid Arrow Style!"), uno::Reference< uno::XInterface >() ); |
| } |
| } |
| |
| // Attributes |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getBeginArrowheadStyle() throw (uno::RuntimeException) |
| { |
| sal_Int32 nLineType = office::MsoArrowheadStyle::msoArrowheadNone; |
| rtl::OUString sLineName; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineStartName" ) ) >>= sLineName; |
| if( ( sLineName.getLength() > 7 ) && ( sLineName.indexOf( rtl::OUString::createFromAscii( "msArray" ) ) ) != -1 ) |
| { |
| sal_Int32 nIndex = sLineName.indexOf( rtl::OUString::createFromAscii(" ") ); |
| rtl::OUString sName = sLineName.copy( 0, nIndex ); |
| //sal_Int32 nSize = sLineName.copy( nIndex + 1 ).toInt32(); |
| nLineType = convertLineStartEndNameToArrowheadStyle( sName ); |
| } |
| else |
| { |
| nLineType = convertLineStartEndNameToArrowheadStyle( sLineName ); |
| } |
| return nLineType; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setBeginArrowheadStyle( sal_Int32 _beginarrowheadstyle ) throw (uno::RuntimeException) |
| { |
| rtl::OUString sArrayName = convertArrowheadStyleToLineStartEndName( _beginarrowheadstyle ); |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineStartName" ), uno::makeAny( sArrayName ) ); |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getBeginArrowheadLength() throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setBeginArrowheadLength( sal_Int32 /*_beginarrowheadlength*/ ) throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getBeginArrowheadWidth() throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setBeginArrowheadWidth( sal_Int32 /*_beginarrowheadwidth*/ ) throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getEndArrowheadStylel() throw (uno::RuntimeException) |
| { |
| return 0; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setEndArrowheadStylel( sal_Int32 /*_endarrowheadstylel*/ ) throw (uno::RuntimeException) |
| { |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getEndArrowheadLength() throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setEndArrowheadLength( sal_Int32 /*_endarrowheadlength*/ ) throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getEndArrowheadWidth() throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setEndArrowheadWidth( sal_Int32 /*_endarrowheadwidth*/ ) throw (uno::RuntimeException) |
| { |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Property 'EndArrowheadWidth' is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| |
| double SAL_CALL |
| ScVbaLineFormat::getWeight() throw (uno::RuntimeException) |
| { |
| sal_Int32 nLineWidth=0; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineWidth") ) >>= nLineWidth; |
| double dLineWidth = Millimeter::getInPoints( nLineWidth ); |
| return dLineWidth; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setWeight( double _weight ) throw (uno::RuntimeException) |
| { |
| if( _weight < 0 ) |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("Parameter: Must be positv."), uno::Reference< uno::XInterface >() ); |
| if( _weight == 0 ) |
| _weight = 0.5; |
| m_nLineWeight = _weight; |
| Millimeter aMillimeter; |
| aMillimeter.setInPoints( _weight ); |
| |
| sal_Int32 nLineWidth = static_cast<sal_Int32>( aMillimeter.getInHundredthsOfOneMillimeter() ); |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineWidth" ), uno::makeAny( nLineWidth ) ); |
| setDashStyle( m_nLineDashStyle ); |
| } |
| |
| sal_Bool SAL_CALL |
| ScVbaLineFormat::getVisible() throw (uno::RuntimeException) |
| { |
| drawing::LineStyle aLineStyle; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ) ) >>= aLineStyle; |
| if( aLineStyle == drawing::LineStyle_NONE ) |
| { |
| return sal_False; |
| } |
| return sal_True; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setVisible( sal_Bool _visible ) throw (uno::RuntimeException) |
| { |
| drawing::LineStyle aLineStyle; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ) ) >>= aLineStyle; |
| if( !_visible ) |
| { |
| aLineStyle = drawing::LineStyle_NONE; |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ), uno::makeAny( aLineStyle ) ); |
| } |
| else |
| { |
| if( aLineStyle == drawing::LineStyle_NONE ) |
| { |
| setDashStyle( m_nLineDashStyle ); |
| } |
| } |
| } |
| |
| double SAL_CALL |
| ScVbaLineFormat::getTransparency() throw (uno::RuntimeException) |
| { |
| sal_Int16 nTransparency = 0; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineTransparence" ) ) >>= nTransparency; |
| double fTransparency = static_cast<double>( nTransparency ); |
| return fTransparency / 100; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setTransparency( double _transparency ) throw (uno::RuntimeException) |
| { |
| sal_Int16 nTransparency = static_cast<sal_Int16>( _transparency * 100 ); |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineTransparence" ), uno::makeAny( nTransparency ) ); |
| } |
| |
| sal_Int16 SAL_CALL |
| ScVbaLineFormat::getStyle() throw (uno::RuntimeException) |
| { |
| //OpenOffice.org only supports one LineStyle (other than the DashStyles) |
| //Therefore we can only return the SingleLine |
| return 1; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setStyle( sal_Int16 /*_style */) throw (uno::RuntimeException) |
| { |
| //OpenOffice.org only supports one LineStyle (other than the DashStyles) |
| //Therefore we do not set the LineStyle, because it maybe is already set |
| //to Dashed or Single Line. Setting the 'Visible' or 'DashStyle' properties |
| //will be done with the according methods. |
| } |
| |
| sal_Int32 SAL_CALL |
| ScVbaLineFormat::getDashStyle() throw (uno::RuntimeException) |
| { |
| drawing::LineStyle eLineStyle; |
| //LineStyle integer in Xray |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ) ) >>= eLineStyle; |
| if( eLineStyle == drawing::LineStyle_SOLID ) |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineSolid; |
| else |
| { |
| drawing::LineDash aLineDash; |
| m_xPropertySet->getPropertyValue( rtl::OUString::createFromAscii( "LineDash" ) ) >>= aLineDash; |
| if( aLineDash.Dots == 0 ) |
| { |
| //LineDash |
| //LineLongDash |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineDash; |
| if( aLineDash.Distance > 0 && ( aLineDash.DashLen / aLineDash.Distance > 1 ) ) |
| { |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineLongDash; |
| } |
| } |
| else if( aLineDash.Dots == 1 ) |
| { |
| // LineDashDot |
| // LineLongDashDot |
| // LineSquareDot |
| // LineRoundDot ! not supported |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineDashDot; |
| if( aLineDash.Dashes == 0 ) |
| { |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineSquareDot; |
| } |
| else |
| { |
| if( aLineDash.Distance > 0 && ( aLineDash.DashLen / aLineDash.Distance > 1 ) ) |
| { |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineLongDashDot; |
| } |
| } |
| } |
| else if( aLineDash.Dots == 2 ) |
| { |
| // LineDashDotDot |
| m_nLineDashStyle = office::MsoLineDashStyle::msoLineDashDotDot; |
| } |
| } |
| |
| return m_nLineDashStyle; |
| } |
| |
| void SAL_CALL |
| ScVbaLineFormat::setDashStyle( sal_Int32 _dashstyle ) throw (uno::RuntimeException) |
| { |
| m_nLineDashStyle = _dashstyle; |
| if( _dashstyle == office::MsoLineDashStyle::msoLineSolid ) |
| { |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ), uno::makeAny( drawing::LineStyle_SOLID )); |
| } |
| else |
| { |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineStyle" ), uno::makeAny( drawing::LineStyle_DASH ) ); |
| drawing::LineDash pLineDash; |
| Millimeter aMillimeter( m_nLineWeight ); |
| sal_Int32 nPixel = static_cast< sal_Int32 >( aMillimeter.getInHundredthsOfOneMillimeter() ); |
| switch( _dashstyle ) |
| { |
| case office::MsoLineDashStyle::msoLineDashDot: |
| pLineDash.Dots = 1; |
| pLineDash.DotLen = nPixel; |
| pLineDash.Dashes = 1; |
| pLineDash.DashLen = 5 * nPixel; |
| pLineDash.Distance = 4 * nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineLongDashDot: |
| pLineDash.Dots = 1; |
| pLineDash.DotLen = nPixel; |
| pLineDash.Dashes = 1; |
| pLineDash.DashLen = 10 * nPixel; |
| pLineDash.Distance = 4 * nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineDash: |
| pLineDash.Dots = 0; |
| pLineDash.DotLen = 0; |
| pLineDash.Dashes = 1; |
| pLineDash.DashLen = 6 * nPixel; |
| pLineDash.Distance = 4 * nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineDashDotDot: |
| pLineDash.Dots = 2; |
| pLineDash.DotLen = nPixel; |
| pLineDash.Dashes = 1; |
| pLineDash.DashLen = 10 * nPixel; |
| pLineDash.Distance = 3 * nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineLongDash: |
| pLineDash.Dots = 0; |
| pLineDash.DotLen = 0; |
| pLineDash.Dashes = 1; |
| pLineDash.DashLen = 10 * nPixel; |
| pLineDash.Distance = 4 * nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineSquareDot: |
| pLineDash.Dots = 1; |
| pLineDash.DotLen = nPixel; |
| pLineDash.Dashes = 0; |
| pLineDash.DashLen = 0; |
| pLineDash.Distance = nPixel; |
| break; |
| case office::MsoLineDashStyle::msoLineRoundDot: |
| pLineDash.Dots = 1; |
| pLineDash.DotLen = nPixel; |
| pLineDash.Dashes = 0; |
| pLineDash.DashLen = 0; |
| pLineDash.Distance = nPixel; |
| break; |
| default: |
| throw uno::RuntimeException( rtl::OUString::createFromAscii("this MsoLineDashStyle is not supported."), uno::Reference< uno::XInterface >() ); |
| } |
| m_xPropertySet->setPropertyValue( rtl::OUString::createFromAscii( "LineDash" ), uno::makeAny( pLineDash ) ); |
| } |
| } |
| |
| // Methods |
| uno::Reference< msforms::XColorFormat > SAL_CALL |
| ScVbaLineFormat::BackColor() throw (uno::RuntimeException) |
| { |
| return uno::Reference< msforms::XColorFormat >( new ScVbaColorFormat( getParent(), mxContext, this, m_xShape, ::ColorFormatType::LINEFORMAT_BACKCOLOR ) ); |
| } |
| |
| uno::Reference< msforms::XColorFormat > SAL_CALL |
| ScVbaLineFormat::ForeColor() throw (uno::RuntimeException) |
| { |
| return uno::Reference< msforms::XColorFormat >( new ScVbaColorFormat( getParent(), mxContext, this, m_xShape, ::ColorFormatType::LINEFORMAT_FORECOLOR ) ); |
| } |
| |
| |
| rtl::OUString& |
| ScVbaLineFormat::getServiceImplName() |
| { |
| static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaLineFormat") ); |
| return sImplName; |
| } |
| |
| uno::Sequence< rtl::OUString > |
| ScVbaLineFormat::getServiceNames() |
| { |
| static uno::Sequence< rtl::OUString > aServiceNames; |
| if ( aServiceNames.getLength() == 0 ) |
| { |
| aServiceNames.realloc( 1 ); |
| aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.msform.LineFormat" ) ); |
| } |
| return aServiceNames; |
| } |
| |
| |