1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #include "vbadocumentproperties.hxx"
24*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
25*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentInfoSupplier.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/NamedValue.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyContainer.hpp>
30*b1cdbd2cSJim Jagielski #include <ooo/vba/word/WdBuiltInProperty.hpp>
31*b1cdbd2cSJim Jagielski #include <ooo/vba/office/MsoDocProperties.hpp>
32*b1cdbd2cSJim Jagielski #include <memory>
33*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
34*b1cdbd2cSJim Jagielski #include "wordvbahelper.hxx"
35*b1cdbd2cSJim Jagielski #include "fesh.hxx"
36*b1cdbd2cSJim Jagielski #include "docsh.hxx"
37*b1cdbd2cSJim Jagielski using namespace ::ooo::vba;
38*b1cdbd2cSJim Jagielski using namespace css;
39*b1cdbd2cSJim Jagielski 
lcl_toMSOPropType(const uno::Type & aType)40*b1cdbd2cSJim Jagielski sal_Int8 lcl_toMSOPropType( const uno::Type& aType ) throw ( lang::IllegalArgumentException )
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski     sal_Int16 msoType = office::MsoDocProperties::msoPropertyTypeString;
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     switch ( aType.getTypeClass() )
45*b1cdbd2cSJim Jagielski     {
46*b1cdbd2cSJim Jagielski         case uno::TypeClass_BOOLEAN:
47*b1cdbd2cSJim Jagielski             msoType =  office::MsoDocProperties::msoPropertyTypeBoolean;
48*b1cdbd2cSJim Jagielski             break;
49*b1cdbd2cSJim Jagielski         case uno::TypeClass_FLOAT:
50*b1cdbd2cSJim Jagielski             msoType =  office::MsoDocProperties::msoPropertyTypeFloat;
51*b1cdbd2cSJim Jagielski             break;
52*b1cdbd2cSJim Jagielski         case uno::TypeClass_STRUCT: // Assume date
53*b1cdbd2cSJim Jagielski             msoType =  office::MsoDocProperties::msoPropertyTypeDate;
54*b1cdbd2cSJim Jagielski             break;
55*b1cdbd2cSJim Jagielski         case  uno::TypeClass_BYTE:
56*b1cdbd2cSJim Jagielski         case  uno::TypeClass_SHORT:
57*b1cdbd2cSJim Jagielski         case  uno::TypeClass_LONG:
58*b1cdbd2cSJim Jagielski         case  uno::TypeClass_HYPER:
59*b1cdbd2cSJim Jagielski             msoType =  office::MsoDocProperties::msoPropertyTypeNumber;
60*b1cdbd2cSJim Jagielski             break;
61*b1cdbd2cSJim Jagielski         default:
62*b1cdbd2cSJim Jagielski             throw lang::IllegalArgumentException();
63*b1cdbd2cSJim Jagielski     }
64*b1cdbd2cSJim Jagielski     return msoType;
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski class PropertGetSetHelper
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski protected:
70*b1cdbd2cSJim Jagielski     uno::Reference< frame::XModel > m_xModel;
71*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > mxProps;
72*b1cdbd2cSJim Jagielski public:
PropertGetSetHelper(const uno::Reference<frame::XModel> & xModel)73*b1cdbd2cSJim Jagielski     PropertGetSetHelper( const uno::Reference< frame::XModel >& xModel ):m_xModel( xModel )
74*b1cdbd2cSJim Jagielski     {
75*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentInfoSupplier > xDocInfoSupp( m_xModel, uno::UNO_QUERY_THROW );
76*b1cdbd2cSJim Jagielski         mxProps.set( xDocInfoSupp->getDocumentInfo(), uno::UNO_QUERY_THROW );
77*b1cdbd2cSJim Jagielski     }
~PropertGetSetHelper()78*b1cdbd2cSJim Jagielski     virtual ~PropertGetSetHelper() {}
79*b1cdbd2cSJim Jagielski     virtual uno::Any getPropertyValue( const rtl::OUString& rPropName ) = 0;
80*b1cdbd2cSJim Jagielski     virtual void setPropertyValue( const rtl::OUString& rPropName, const uno::Any& aValue ) = 0;
getUnoProperties()81*b1cdbd2cSJim Jagielski     virtual uno::Reference< beans::XPropertySet > getUnoProperties() { return mxProps; }
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski };
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski class BuiltinPropertyGetSetHelper : public PropertGetSetHelper
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski public:
BuiltinPropertyGetSetHelper(const uno::Reference<frame::XModel> & xModel)88*b1cdbd2cSJim Jagielski     BuiltinPropertyGetSetHelper( const uno::Reference< frame::XModel >& xModel ) :PropertGetSetHelper( xModel )
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski     }
getPropertyValue(const rtl::OUString & rPropName)91*b1cdbd2cSJim Jagielski     virtual uno::Any getPropertyValue( const rtl::OUString& rPropName )
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski         if ( rPropName.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("EditingDuration" ) ) ) )
94*b1cdbd2cSJim Jagielski         {
95*b1cdbd2cSJim Jagielski             sal_Int32 nSecs = 0;
96*b1cdbd2cSJim Jagielski             mxProps->getPropertyValue( rPropName ) >>= nSecs;
97*b1cdbd2cSJim Jagielski             return uno::makeAny( nSecs/60 ); // minutes
98*b1cdbd2cSJim Jagielski         }
99*b1cdbd2cSJim Jagielski         return mxProps->getPropertyValue( rPropName );
100*b1cdbd2cSJim Jagielski     }
setPropertyValue(const rtl::OUString & rPropName,const uno::Any & aValue)101*b1cdbd2cSJim Jagielski     virtual void setPropertyValue( const rtl::OUString& rPropName, const uno::Any& aValue )
102*b1cdbd2cSJim Jagielski     {
103*b1cdbd2cSJim Jagielski         mxProps->setPropertyValue( rPropName, aValue );
104*b1cdbd2cSJim Jagielski     }
105*b1cdbd2cSJim Jagielski };
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski class CustomPropertyGetSetHelper : public BuiltinPropertyGetSetHelper
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski public:
CustomPropertyGetSetHelper(const uno::Reference<frame::XModel> & xModel)110*b1cdbd2cSJim Jagielski     CustomPropertyGetSetHelper( const uno::Reference< frame::XModel >& xModel ) :BuiltinPropertyGetSetHelper( xModel )
111*b1cdbd2cSJim Jagielski     {
112*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentPropertiesSupplier > xDocPropSupp( mxProps, uno::UNO_QUERY_THROW );
113*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentProperties > xDocProp( xDocPropSupp->getDocumentProperties(), uno::UNO_QUERY_THROW );
114*b1cdbd2cSJim Jagielski         mxProps.set( xDocProp->getUserDefinedProperties(), uno::UNO_QUERY_THROW );
115*b1cdbd2cSJim Jagielski     }
116*b1cdbd2cSJim Jagielski };
117*b1cdbd2cSJim Jagielski class StatisticPropertyGetSetHelper : public PropertGetSetHelper
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski     SwDocShell* mpDocShell;
120*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > mxModelProps;
121*b1cdbd2cSJim Jagielski public:
StatisticPropertyGetSetHelper(const uno::Reference<frame::XModel> & xModel)122*b1cdbd2cSJim Jagielski     StatisticPropertyGetSetHelper( const uno::Reference< frame::XModel >& xModel ) :PropertGetSetHelper( xModel ) , mpDocShell( NULL )
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski             mxModelProps.set( m_xModel, uno::UNO_QUERY_THROW );
125*b1cdbd2cSJim Jagielski             mpDocShell = word::getDocShell( xModel );
126*b1cdbd2cSJim Jagielski     }
getPropertyValue(const rtl::OUString & rPropName)127*b1cdbd2cSJim Jagielski     virtual uno::Any getPropertyValue( const rtl::OUString& rPropName )
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski         uno::Sequence< beans::NamedValue > stats;
130*b1cdbd2cSJim Jagielski         try
131*b1cdbd2cSJim Jagielski         {
132*b1cdbd2cSJim Jagielski             // Characters, ParagraphCount & WordCount are available from
133*b1cdbd2cSJim Jagielski             // the model ( and addtionally these also update the statics object )
134*b1cdbd2cSJim Jagielski             //return mxProps->getPropertyValue( rPropName );
135*b1cdbd2cSJim Jagielski             return mxModelProps->getPropertyValue( rPropName );
136*b1cdbd2cSJim Jagielski         }
137*b1cdbd2cSJim Jagielski         catch( uno::Exception& )
138*b1cdbd2cSJim Jagielski         {
139*b1cdbd2cSJim Jagielski             OSL_TRACE("Got exception");
140*b1cdbd2cSJim Jagielski         }
141*b1cdbd2cSJim Jagielski         uno::Any aReturn;
142*b1cdbd2cSJim Jagielski         if ( rPropName.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineCount")) ) ) // special processing needed
143*b1cdbd2cSJim Jagielski         {
144*b1cdbd2cSJim Jagielski             if ( mpDocShell )
145*b1cdbd2cSJim Jagielski             {
146*b1cdbd2cSJim Jagielski                 SwFEShell* pFEShell = mpDocShell->GetFEShell();
147*b1cdbd2cSJim Jagielski                 if(pFEShell)
148*b1cdbd2cSJim Jagielski                 {
149*b1cdbd2cSJim Jagielski                     aReturn <<= pFEShell->GetLineCount(sal_False);
150*b1cdbd2cSJim Jagielski                 }
151*b1cdbd2cSJim Jagielski             }
152*b1cdbd2cSJim Jagielski         }
153*b1cdbd2cSJim Jagielski         else
154*b1cdbd2cSJim Jagielski         {
155*b1cdbd2cSJim Jagielski             mxModelProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ParagraphCount") ) ) >>= stats;
156*b1cdbd2cSJim Jagielski             mxProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DocumentStatistic") ) ) >>= stats;
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski             sal_Int32 nLen = stats.getLength();
159*b1cdbd2cSJim Jagielski             bool bFound = false;
160*b1cdbd2cSJim Jagielski             for ( sal_Int32 index = 0; index < nLen && !bFound ; ++index )
161*b1cdbd2cSJim Jagielski             {
162*b1cdbd2cSJim Jagielski                 if ( rPropName.equals( stats[ index ].Name ) )
163*b1cdbd2cSJim Jagielski                 {
164*b1cdbd2cSJim Jagielski                     aReturn = stats[ index ].Value;
165*b1cdbd2cSJim Jagielski                     bFound = true;
166*b1cdbd2cSJim Jagielski                 }
167*b1cdbd2cSJim Jagielski             }
168*b1cdbd2cSJim Jagielski             if ( !bFound )
169*b1cdbd2cSJim Jagielski                 throw uno::RuntimeException(); // bad Property
170*b1cdbd2cSJim Jagielski         }
171*b1cdbd2cSJim Jagielski         return aReturn;
172*b1cdbd2cSJim Jagielski     }
173*b1cdbd2cSJim Jagielski 
setPropertyValue(const rtl::OUString & rPropName,const uno::Any & aValue)174*b1cdbd2cSJim Jagielski     virtual void setPropertyValue( const rtl::OUString& rPropName, const uno::Any& aValue )
175*b1cdbd2cSJim Jagielski     {
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski         uno::Sequence< beans::NamedValue > stats;
178*b1cdbd2cSJim Jagielski         mxProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DocumentStatistic") ) ) >>= stats;
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski         sal_Int32 nLen = stats.getLength();
181*b1cdbd2cSJim Jagielski         for ( sal_Int32 index = 0; index < nLen; ++index )
182*b1cdbd2cSJim Jagielski         {
183*b1cdbd2cSJim Jagielski             if ( rPropName.equals( stats[ index ].Name ) )
184*b1cdbd2cSJim Jagielski             {
185*b1cdbd2cSJim Jagielski                 stats[ index ].Value = aValue;
186*b1cdbd2cSJim Jagielski                 mxProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DocumentStatistic") ), uno::makeAny( stats ) );
187*b1cdbd2cSJim Jagielski                 break;
188*b1cdbd2cSJim Jagielski             }
189*b1cdbd2cSJim Jagielski         }
190*b1cdbd2cSJim Jagielski     }
191*b1cdbd2cSJim Jagielski };
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski class DocPropInfo
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski public:
196*b1cdbd2cSJim Jagielski     rtl::OUString msMSODesc;
197*b1cdbd2cSJim Jagielski     rtl::OUString msOOOPropName;
198*b1cdbd2cSJim Jagielski     boost::shared_ptr< PropertGetSetHelper > mpPropGetSetHelper;
199*b1cdbd2cSJim Jagielski 
createDocPropInfo(const rtl::OUString & sDesc,const rtl::OUString & sPropName,boost::shared_ptr<PropertGetSetHelper> & rHelper)200*b1cdbd2cSJim Jagielski     static DocPropInfo createDocPropInfo( const rtl::OUString& sDesc, const rtl::OUString& sPropName, boost::shared_ptr< PropertGetSetHelper >& rHelper )
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         return createDocPropInfo( rtl::OUStringToOString( sDesc, RTL_TEXTENCODING_UTF8 ).getStr(), rtl::OUStringToOString( sPropName, RTL_TEXTENCODING_UTF8 ).getStr(), rHelper );
203*b1cdbd2cSJim Jagielski     }
204*b1cdbd2cSJim Jagielski 
createDocPropInfo(const sal_Char * sDesc,const sal_Char * sPropName,boost::shared_ptr<PropertGetSetHelper> & rHelper)205*b1cdbd2cSJim Jagielski     static DocPropInfo createDocPropInfo( const sal_Char* sDesc, const sal_Char* sPropName, boost::shared_ptr< PropertGetSetHelper >& rHelper )
206*b1cdbd2cSJim Jagielski     {
207*b1cdbd2cSJim Jagielski         DocPropInfo aItem;
208*b1cdbd2cSJim Jagielski         aItem.msMSODesc = rtl::OUString::createFromAscii( sDesc );
209*b1cdbd2cSJim Jagielski         aItem.msOOOPropName = rtl::OUString::createFromAscii( sPropName );
210*b1cdbd2cSJim Jagielski         aItem.mpPropGetSetHelper = rHelper;
211*b1cdbd2cSJim Jagielski         return aItem;
212*b1cdbd2cSJim Jagielski     }
getValue()213*b1cdbd2cSJim Jagielski     uno::Any getValue()
214*b1cdbd2cSJim Jagielski     {
215*b1cdbd2cSJim Jagielski         if ( mpPropGetSetHelper.get() )
216*b1cdbd2cSJim Jagielski             return mpPropGetSetHelper->getPropertyValue( msOOOPropName );
217*b1cdbd2cSJim Jagielski         return uno::Any();
218*b1cdbd2cSJim Jagielski     }
setValue(const uno::Any & rValue)219*b1cdbd2cSJim Jagielski     void setValue( const uno::Any& rValue )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         if ( mpPropGetSetHelper.get() )
222*b1cdbd2cSJim Jagielski             mpPropGetSetHelper->setPropertyValue( msOOOPropName, rValue );
223*b1cdbd2cSJim Jagielski     }
getUnoProperties()224*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > getUnoProperties()
225*b1cdbd2cSJim Jagielski     {
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xProps;
228*b1cdbd2cSJim Jagielski         if ( mpPropGetSetHelper.get() )
229*b1cdbd2cSJim Jagielski             return mpPropGetSetHelper->getUnoProperties();
230*b1cdbd2cSJim Jagielski         return xProps;
231*b1cdbd2cSJim Jagielski     }
232*b1cdbd2cSJim Jagielski };
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski typedef std::hash_map< sal_Int32, DocPropInfo > MSOIndexToOODocPropInfo;
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski class BuiltInIndexHelper
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski     MSOIndexToOODocPropInfo m_docPropInfoMap;
240*b1cdbd2cSJim Jagielski     BuiltInIndexHelper();
241*b1cdbd2cSJim Jagielski public:
BuiltInIndexHelper(const uno::Reference<frame::XModel> & xModel)242*b1cdbd2cSJim Jagielski     BuiltInIndexHelper( const uno::Reference< frame::XModel >& xModel )
243*b1cdbd2cSJim Jagielski     {
244*b1cdbd2cSJim Jagielski         boost::shared_ptr< PropertGetSetHelper > aStandardHelper( new BuiltinPropertyGetSetHelper( xModel ) );
245*b1cdbd2cSJim Jagielski         boost::shared_ptr< PropertGetSetHelper > aUsingStatsHelper( new StatisticPropertyGetSetHelper( xModel ) );
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyTitle ] = DocPropInfo::createDocPropInfo( "Title", "Title", aStandardHelper );
248*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertySubject ] = DocPropInfo::createDocPropInfo( "Subject", "Subject", aStandardHelper );
249*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyAuthor ] = DocPropInfo::createDocPropInfo( "Author", "Author", aStandardHelper );
250*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyKeywords ] = DocPropInfo::createDocPropInfo( "Keywords", "Keywords", aStandardHelper );
251*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyComments ] = DocPropInfo::createDocPropInfo( "Comments", "Description", aStandardHelper );
252*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyTemplate ] = DocPropInfo::createDocPropInfo( "Template", "Template", aStandardHelper );
253*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyLastAuthor ] = DocPropInfo::createDocPropInfo( "Last author", "ModifiedBy", aStandardHelper ); // doesn't seem to exist - throw or return nothing ?
254*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyRevision ] = DocPropInfo::createDocPropInfo( "Revision number", "EditingCycles", aStandardHelper ); // doesn't seem to exist - throw or return nothing ?
255*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyAppName ] = DocPropInfo::createDocPropInfo( "Application name", "Generator", aStandardHelper ); // doesn't seem to exist - throw or return nothing ?
256*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyTimeLastPrinted ] = DocPropInfo::createDocPropInfo( "Last print date", "PrintDate", aStandardHelper ); // doesn't seem to exist - throw or return nothing ?
257*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyTimeCreated ] = DocPropInfo::createDocPropInfo( "Creation date", "CreationDate", aStandardHelper );
258*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyTimeLastSaved ] = DocPropInfo::createDocPropInfo( "Last save time", "ModifyDate", aStandardHelper );
259*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyVBATotalEdit ] = DocPropInfo::createDocPropInfo( "Total editing time", "EditingDuration", aStandardHelper ); // Not sure if this is correct
260*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyPages ] = DocPropInfo::createDocPropInfo( "Number of pages", "PageCount", aUsingStatsHelper ); // special handling required ?
261*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyWords ] = DocPropInfo::createDocPropInfo( "Number of words", "WordCount", aUsingStatsHelper ); // special handling require ?
262*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyCharacters ] = DocPropInfo::createDocPropInfo( "Number of characters", "CharacterCount", aUsingStatsHelper ); // special handling required ?
263*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertySecurity ] = DocPropInfo::createDocPropInfo( "Security", "", aStandardHelper ); // doesn't seem to exist
264*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyCategory ] = DocPropInfo::createDocPropInfo( "Category", "Category", aStandardHelper ); // hacked in
265*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyFormat ] = DocPropInfo::createDocPropInfo( "Format", "", aStandardHelper ); // doesn't seem to exist
266*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyManager ] = DocPropInfo::createDocPropInfo( "Manager", "Manager", aStandardHelper ); // hacked in
267*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyCompany ] = DocPropInfo::createDocPropInfo( "Company", "Company", aStandardHelper ); // hacked in
268*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyBytes ] = DocPropInfo::createDocPropInfo( "Number of bytes", "", aStandardHelper ); // doesn't seem to exist - size on disk exists ( for an already saved document ) perhaps it will do ( or we need something else )
269*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyLines ] = DocPropInfo::createDocPropInfo( "Number of lines", "LineCount", aUsingStatsHelper ); // special handling
270*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyParas ] = DocPropInfo::createDocPropInfo( "Number of paragraphs", "ParagraphCount", aUsingStatsHelper ); // special handling
271*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertySlides ] = DocPropInfo::createDocPropInfo( "Number of slides", "" , aStandardHelper ); // doesn't seem to exist
272*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyNotes ] = DocPropInfo::createDocPropInfo( "Number of notes", "", aStandardHelper ); // doesn't seem to exist
273*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyHiddenSlides ] = DocPropInfo::createDocPropInfo("Number of hidden Slides", "", aStandardHelper  ); // doesn't seem to exist
274*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyMMClips ] = DocPropInfo::createDocPropInfo( "Number of multimedia clips", "", aStandardHelper ); // doesn't seem to exist
275*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyHyperlinkBase ] = DocPropInfo::createDocPropInfo( "Hyperlink base", "AutoloadURL", aStandardHelper );
276*b1cdbd2cSJim Jagielski         m_docPropInfoMap[ word::WdBuiltInProperty::wdPropertyCharsWSpaces ] = DocPropInfo::createDocPropInfo( "Number of characters (with spaces)", "", aStandardHelper ); // doesn't seem to be supported
277*b1cdbd2cSJim Jagielski     }
278*b1cdbd2cSJim Jagielski 
getDocPropInfoMap()279*b1cdbd2cSJim Jagielski     MSOIndexToOODocPropInfo& getDocPropInfoMap() { return m_docPropInfoMap; }
280*b1cdbd2cSJim Jagielski };
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski typedef InheritedHelperInterfaceImpl1< ooo::vba::XDocumentProperty > SwVbaDocumentProperty_BASE;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski class SwVbaBuiltInDocumentProperty : public SwVbaDocumentProperty_BASE
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski protected:
288*b1cdbd2cSJim Jagielski     DocPropInfo mPropInfo;
289*b1cdbd2cSJim Jagielski public:
290*b1cdbd2cSJim Jagielski     SwVbaBuiltInDocumentProperty(  const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const DocPropInfo& rInfo );
291*b1cdbd2cSJim Jagielski     // XDocumentProperty
292*b1cdbd2cSJim Jagielski     virtual void SAL_CALL Delete(  ) throw (script::BasicErrorException, uno::RuntimeException);
293*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getName(  ) throw (script::BasicErrorException, uno::RuntimeException);
294*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setName( const ::rtl::OUString& Name ) throw (script::BasicErrorException, uno::RuntimeException);
295*b1cdbd2cSJim Jagielski     virtual ::sal_Int8 SAL_CALL getType(  ) throw (script::BasicErrorException, uno::RuntimeException);
296*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setType( ::sal_Int8 Type ) throw (script::BasicErrorException, uno::RuntimeException);
297*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL getLinkToContent(  ) throw (script::BasicErrorException, uno::RuntimeException);
298*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setLinkToContent( ::sal_Bool LinkToContent ) throw (script::BasicErrorException, uno::RuntimeException);
299*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL getValue(  ) throw (script::BasicErrorException, uno::RuntimeException);
300*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setValue( const uno::Any& Value ) throw (script::BasicErrorException, uno::RuntimeException);
301*b1cdbd2cSJim Jagielski     virtual rtl::OUString SAL_CALL getLinkSource(  ) throw (script::BasicErrorException, uno::RuntimeException);
302*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setLinkSource( const rtl::OUString& LinkSource ) throw (script::BasicErrorException, uno::RuntimeException);
303*b1cdbd2cSJim Jagielski     //XDefaultProperty
getDefaultPropertyName()304*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getDefaultPropertyName(  ) throw (uno::RuntimeException) { return rtl::OUString::createFromAscii("Value"); }
305*b1cdbd2cSJim Jagielski     // XHelperInterface
306*b1cdbd2cSJim Jagielski     virtual rtl::OUString& getServiceImplName();
307*b1cdbd2cSJim Jagielski     virtual uno::Sequence<rtl::OUString> getServiceNames();
308*b1cdbd2cSJim Jagielski };
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski class SwVbaCustomDocumentProperty : public SwVbaBuiltInDocumentProperty
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski public:
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     SwVbaCustomDocumentProperty(  const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const DocPropInfo& rInfo );
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL getLinkToContent(  ) throw (script::BasicErrorException, uno::RuntimeException);
317*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setLinkToContent( ::sal_Bool LinkToContent ) throw (script::BasicErrorException, uno::RuntimeException);
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski     virtual rtl::OUString SAL_CALL getLinkSource(  ) throw (script::BasicErrorException, uno::RuntimeException);
320*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setLinkSource( const rtl::OUString& LinkSource ) throw (script::BasicErrorException, uno::RuntimeException);
321*b1cdbd2cSJim Jagielski     virtual void SAL_CALL Delete(  ) throw (script::BasicErrorException, uno::RuntimeException);
322*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setName( const ::rtl::OUString& Name ) throw (script::BasicErrorException, uno::RuntimeException);
323*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setType( ::sal_Int8 Type ) throw (script::BasicErrorException, uno::RuntimeException);
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski };
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 
SwVbaCustomDocumentProperty(const uno::Reference<ov::XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const DocPropInfo & rInfo)328*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::SwVbaCustomDocumentProperty(  const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const DocPropInfo& rInfo ) : SwVbaBuiltInDocumentProperty( xParent, xContext, rInfo )
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski sal_Bool
getLinkToContent()333*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::getLinkToContent(  ) throw (script::BasicErrorException, uno::RuntimeException)
334*b1cdbd2cSJim Jagielski {
335*b1cdbd2cSJim Jagielski     // #FIXME we need to store the link content somewhere
336*b1cdbd2cSJim Jagielski     return sal_False;
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski void
setLinkToContent(sal_Bool)340*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::setLinkToContent( sal_Bool /*bLinkContent*/ ) throw (script::BasicErrorException, uno::RuntimeException)
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski rtl::OUString
getLinkSource()345*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::getLinkSource(  ) throw (script::BasicErrorException, uno::RuntimeException)
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski     // #FIXME we need to store the link content somewhere
348*b1cdbd2cSJim Jagielski     return rtl::OUString();;
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski void
setLinkSource(const rtl::OUString &)352*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::setLinkSource( const rtl::OUString& /*rsLinkContent*/ ) throw (script::BasicErrorException, uno::RuntimeException)
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski     // #FIXME we need to store the link source somewhere
355*b1cdbd2cSJim Jagielski }
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski void SAL_CALL
setName(const::rtl::OUString &)358*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::setName( const ::rtl::OUString& /*Name*/ ) throw (script::BasicErrorException, uno::RuntimeException)
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski     // setName on existing property ?
361*b1cdbd2cSJim Jagielski     // #FIXME
362*b1cdbd2cSJim Jagielski     // do we need to delete existing property and create a new one?
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski void SAL_CALL
setType(::sal_Int8)366*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::setType( ::sal_Int8 /*Type*/ ) throw (script::BasicErrorException, uno::RuntimeException)
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     // setType, do we need to do a conversion?
369*b1cdbd2cSJim Jagielski     // #FIXME the underlying value needs to be changed to the new type
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski void SAL_CALL
Delete()373*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperty::Delete(  ) throw (script::BasicErrorException, uno::RuntimeException)
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertyContainer > xContainer( mPropInfo.getUnoProperties(), uno::UNO_QUERY_THROW );
376*b1cdbd2cSJim Jagielski     xContainer->removeProperty( getName() );
377*b1cdbd2cSJim Jagielski }
378*b1cdbd2cSJim Jagielski 
SwVbaBuiltInDocumentProperty(const uno::Reference<ov::XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const DocPropInfo & rInfo)379*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::SwVbaBuiltInDocumentProperty( const uno::Reference< ov::XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const DocPropInfo& rInfo ) : SwVbaDocumentProperty_BASE( xParent, xContext ), mPropInfo( rInfo )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski void SAL_CALL
Delete()384*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::Delete(  ) throw (script::BasicErrorException, uno::RuntimeException)
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski     // not valid for Builtin
387*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL
getName()391*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getName(  ) throw (script::BasicErrorException, uno::RuntimeException)
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski     return mPropInfo.msMSODesc;
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski void SAL_CALL
setName(const rtl::OUString &)397*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::setName( const rtl::OUString& ) throw (script::BasicErrorException, uno::RuntimeException)
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski     // not valid for Builtin
400*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski ::sal_Int8 SAL_CALL
getType()404*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getType(  ) throw (script::BasicErrorException, uno::RuntimeException)
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski     return lcl_toMSOPropType( getValue().getValueType() );
407*b1cdbd2cSJim Jagielski }
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski void SAL_CALL
setType(::sal_Int8)410*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::setType( ::sal_Int8 /*Type*/ ) throw (script::BasicErrorException, uno::RuntimeException)
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski     // not valid for Builtin
413*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL
getLinkToContent()417*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getLinkToContent(  ) throw (script::BasicErrorException, uno::RuntimeException)
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski     return sal_False; // built-in always false
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski void SAL_CALL
setLinkToContent(::sal_Bool)423*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::setLinkToContent( ::sal_Bool /*LinkToContent*/ ) throw (script::BasicErrorException, uno::RuntimeException)
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski     // not valid for Builtin
426*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski uno::Any SAL_CALL
getValue()430*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getValue(  ) throw (script::BasicErrorException, uno::RuntimeException)
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski     uno::Any aRet = mPropInfo.getValue();
433*b1cdbd2cSJim Jagielski     if ( !aRet.hasValue() )
434*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
435*b1cdbd2cSJim Jagielski     return aRet;
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski void SAL_CALL
setValue(const uno::Any & Value)439*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::setValue( const uno::Any& Value ) throw (script::BasicErrorException, uno::RuntimeException)
440*b1cdbd2cSJim Jagielski {
441*b1cdbd2cSJim Jagielski     mPropInfo.setValue( Value );
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL
getLinkSource()445*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getLinkSource(  ) throw (script::BasicErrorException, uno::RuntimeException)
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski     // not valid for Builtin
448*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
449*b1cdbd2cSJim Jagielski }
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski void SAL_CALL
setLinkSource(const rtl::OUString &)452*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::setLinkSource( const rtl::OUString& /*LinkSource*/ ) throw (script::BasicErrorException, uno::RuntimeException)
453*b1cdbd2cSJim Jagielski {
454*b1cdbd2cSJim Jagielski     // not valid for Builtin
455*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski rtl::OUString&
getServiceImplName()459*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getServiceImplName()
460*b1cdbd2cSJim Jagielski {
461*b1cdbd2cSJim Jagielski     static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("SwVbaBuiltinDocumentProperty") );
462*b1cdbd2cSJim Jagielski     return sImplName;
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString>
getServiceNames()466*b1cdbd2cSJim Jagielski SwVbaBuiltInDocumentProperty::getServiceNames()
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski     static uno::Sequence< rtl::OUString > aServiceNames;
469*b1cdbd2cSJim Jagielski     if ( aServiceNames.getLength() == 0 )
470*b1cdbd2cSJim Jagielski     {
471*b1cdbd2cSJim Jagielski         aServiceNames.realloc( 1 );
472*b1cdbd2cSJim Jagielski         aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.word.DocumentProperty" ) );
473*b1cdbd2cSJim Jagielski     }
474*b1cdbd2cSJim Jagielski     return aServiceNames;
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper3< com::sun::star::container::XIndexAccess
477*b1cdbd2cSJim Jagielski         ,com::sun::star::container::XNameAccess
478*b1cdbd2cSJim Jagielski         ,com::sun::star::container::XEnumerationAccess
479*b1cdbd2cSJim Jagielski         > PropertiesImpl_BASE;
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski typedef std::hash_map< sal_Int32, uno::Reference< XDocumentProperty > > DocProps;
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper1< com::sun::star::container::XEnumeration > DocPropEnumeration_BASE;
484*b1cdbd2cSJim Jagielski class DocPropEnumeration : public DocPropEnumeration_BASE
485*b1cdbd2cSJim Jagielski {
486*b1cdbd2cSJim Jagielski     DocProps mDocProps;
487*b1cdbd2cSJim Jagielski     DocProps::iterator mIt;
488*b1cdbd2cSJim Jagielski public:
489*b1cdbd2cSJim Jagielski 
DocPropEnumeration(const DocProps & rProps)490*b1cdbd2cSJim Jagielski     DocPropEnumeration( const DocProps& rProps ) : mDocProps( rProps ), mIt( mDocProps.begin() ) {}
hasMoreElements()491*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasMoreElements(  ) throw (uno::RuntimeException)
492*b1cdbd2cSJim Jagielski     {
493*b1cdbd2cSJim Jagielski         return mIt != mDocProps.end();
494*b1cdbd2cSJim Jagielski     }
nextElement()495*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL nextElement(  ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
496*b1cdbd2cSJim Jagielski     {
497*b1cdbd2cSJim Jagielski         if ( !hasMoreElements() )
498*b1cdbd2cSJim Jagielski             throw container::NoSuchElementException();
499*b1cdbd2cSJim Jagielski         return uno::makeAny( mIt++->second );
500*b1cdbd2cSJim Jagielski     }
501*b1cdbd2cSJim Jagielski };
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski typedef std::hash_map< rtl::OUString, uno::Reference< XDocumentProperty >, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > DocPropsByName;
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski class BuiltInPropertiesImpl : public PropertiesImpl_BASE
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski protected:
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski     uno::Reference< XHelperInterface > m_xParent;
510*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext > m_xContext;
511*b1cdbd2cSJim Jagielski     uno::Reference< frame::XModel > m_xModel;
512*b1cdbd2cSJim Jagielski     uno::Reference< document::XDocumentInfo > m_xOOOBuiltIns;
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski     DocProps mDocProps;
515*b1cdbd2cSJim Jagielski     DocPropsByName mNamedDocProps;
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski     public:
BuiltInPropertiesImpl(const uno::Reference<XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<frame::XModel> & xModel)518*b1cdbd2cSJim Jagielski     BuiltInPropertiesImpl( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xModel ) : m_xParent( xParent ), m_xContext( xContext ), m_xModel( xModel )
519*b1cdbd2cSJim Jagielski     {
520*b1cdbd2cSJim Jagielski     	BuiltInIndexHelper builtIns( m_xModel );
521*b1cdbd2cSJim Jagielski         for ( sal_Int32 index = word::WdBuiltInProperty::wdPropertyTitle; index <= word::WdBuiltInProperty::wdPropertyCharsWSpaces; ++index )
522*b1cdbd2cSJim Jagielski         {
523*b1cdbd2cSJim Jagielski             mDocProps[ index ] = new SwVbaBuiltInDocumentProperty( xParent, xContext, builtIns.getDocPropInfoMap()[ index ] );
524*b1cdbd2cSJim Jagielski             mNamedDocProps[ mDocProps[ index ]->getName() ] = mDocProps[ index ];
525*b1cdbd2cSJim Jagielski         }
526*b1cdbd2cSJim Jagielski     }
527*b1cdbd2cSJim Jagielski // XIndexAccess
getCount()528*b1cdbd2cSJim Jagielski     virtual ::sal_Int32 SAL_CALL getCount(  ) throw (uno::RuntimeException)
529*b1cdbd2cSJim Jagielski     {
530*b1cdbd2cSJim Jagielski         return mDocProps.size();
531*b1cdbd2cSJim Jagielski     }
getByIndex(::sal_Int32 Index)532*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException )
533*b1cdbd2cSJim Jagielski     {
534*b1cdbd2cSJim Jagielski         // correct the correct by the base class for 1 based indices
535*b1cdbd2cSJim Jagielski         DocProps::iterator it = mDocProps.find( ++Index );
536*b1cdbd2cSJim Jagielski         if ( it == mDocProps.end() )
537*b1cdbd2cSJim Jagielski             throw lang::IndexOutOfBoundsException();
538*b1cdbd2cSJim Jagielski         return uno::makeAny( it->second  );
539*b1cdbd2cSJim Jagielski     }
getByName(const::rtl::OUString & aName)540*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
541*b1cdbd2cSJim Jagielski     {
542*b1cdbd2cSJim Jagielski         if ( !hasByName( aName ) )
543*b1cdbd2cSJim Jagielski 		throw container::NoSuchElementException();
544*b1cdbd2cSJim Jagielski         DocPropsByName::iterator it = mNamedDocProps.find( aName );
545*b1cdbd2cSJim Jagielski         return uno::Any( it->second );
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski     }
getElementNames()548*b1cdbd2cSJim Jagielski     virtual uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw (uno::RuntimeException)
549*b1cdbd2cSJim Jagielski     {
550*b1cdbd2cSJim Jagielski         uno::Sequence< rtl::OUString > aNames( getCount() );
551*b1cdbd2cSJim Jagielski         rtl::OUString* pName = aNames.getArray();
552*b1cdbd2cSJim Jagielski         DocPropsByName::iterator it_end = mNamedDocProps.end();
553*b1cdbd2cSJim Jagielski         for(  DocPropsByName::iterator it = mNamedDocProps.begin(); it != it_end; ++it, ++pName )
554*b1cdbd2cSJim Jagielski            *pName = it->first;
555*b1cdbd2cSJim Jagielski         return aNames;
556*b1cdbd2cSJim Jagielski     }
557*b1cdbd2cSJim Jagielski 
hasByName(const::rtl::OUString & aName)558*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (uno::RuntimeException)
559*b1cdbd2cSJim Jagielski     {
560*b1cdbd2cSJim Jagielski         DocPropsByName::iterator it = mNamedDocProps.find( aName );
561*b1cdbd2cSJim Jagielski         if ( it == mNamedDocProps.end() )
562*b1cdbd2cSJim Jagielski             return sal_False;
563*b1cdbd2cSJim Jagielski         return sal_True;
564*b1cdbd2cSJim Jagielski     }
565*b1cdbd2cSJim Jagielski // XElementAccess
getElementType()566*b1cdbd2cSJim Jagielski     virtual uno::Type SAL_CALL getElementType(  ) throw (uno::RuntimeException)
567*b1cdbd2cSJim Jagielski     {
568*b1cdbd2cSJim Jagielski         return  XDocumentProperty::static_type(0);
569*b1cdbd2cSJim Jagielski     }
hasElements()570*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasElements(  ) throw (uno::RuntimeException)
571*b1cdbd2cSJim Jagielski     {
572*b1cdbd2cSJim Jagielski         return mDocProps.size() > 0;
573*b1cdbd2cSJim Jagielski     }
createEnumeration()574*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL createEnumeration(  ) throw (uno::RuntimeException)
575*b1cdbd2cSJim Jagielski     {
576*b1cdbd2cSJim Jagielski         return new DocPropEnumeration( mDocProps );
577*b1cdbd2cSJim Jagielski     }
578*b1cdbd2cSJim Jagielski };
579*b1cdbd2cSJim Jagielski 
SwVbaBuiltinDocumentProperties(const uno::Reference<XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<frame::XModel> & xModel)580*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::SwVbaBuiltinDocumentProperties( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xModel ) : SwVbaDocumentproperties_BASE( xParent, xContext,  uno::Reference< container::XIndexAccess >( new BuiltInPropertiesImpl( xParent, xContext, xModel ) ) ), m_xModel( xModel )
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski uno::Reference< XDocumentProperty > SAL_CALL
Add(const::rtl::OUString &,::sal_Bool,::sal_Int8,const uno::Any &,const uno::Any &)585*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::Add( const ::rtl::OUString& /*Name*/, ::sal_Bool /*LinkToContent*/, ::sal_Int8 /*Type*/, const uno::Any& /*value*/, const uno::Any& /*LinkSource*/ ) throw (script::BasicErrorException, uno::RuntimeException)
586*b1cdbd2cSJim Jagielski {
587*b1cdbd2cSJim Jagielski     throw uno::RuntimeException(
588*b1cdbd2cSJim Jagielski         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("not supported for Builtin properties") ), uno::Reference< uno::XInterface >() );
589*b1cdbd2cSJim Jagielski }
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski // XEnumerationAccess
592*b1cdbd2cSJim Jagielski uno::Type SAL_CALL
getElementType()593*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::getElementType() throw (uno::RuntimeException)
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski     return  XDocumentProperty::static_type(0);
596*b1cdbd2cSJim Jagielski }
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski uno::Reference< container::XEnumeration > SAL_CALL
createEnumeration()599*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::createEnumeration() throw (uno::RuntimeException)
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski     uno::Reference< container::XEnumerationAccess > xEnumAccess( m_xIndexAccess, uno::UNO_QUERY_THROW );
602*b1cdbd2cSJim Jagielski     return xEnumAccess->createEnumeration();
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski // ScVbaCollectionBaseImpl
606*b1cdbd2cSJim Jagielski uno::Any
createCollectionObject(const uno::Any & aSource)607*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::createCollectionObject( const uno::Any& aSource )
608*b1cdbd2cSJim Jagielski {
609*b1cdbd2cSJim Jagielski     // pass through
610*b1cdbd2cSJim Jagielski     return aSource;
611*b1cdbd2cSJim Jagielski }
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski // XHelperInterface
614*b1cdbd2cSJim Jagielski rtl::OUString&
getServiceImplName()615*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::getServiceImplName()
616*b1cdbd2cSJim Jagielski {
617*b1cdbd2cSJim Jagielski     static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("SwVbaBuiltinDocumentProperties") );
618*b1cdbd2cSJim Jagielski     return sImplName;
619*b1cdbd2cSJim Jagielski }
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString>
getServiceNames()622*b1cdbd2cSJim Jagielski SwVbaBuiltinDocumentProperties::getServiceNames()
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski     static uno::Sequence< rtl::OUString > aServiceNames;
625*b1cdbd2cSJim Jagielski     if ( aServiceNames.getLength() == 0 )
626*b1cdbd2cSJim Jagielski     {
627*b1cdbd2cSJim Jagielski         aServiceNames.realloc( 1 );
628*b1cdbd2cSJim Jagielski         aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.word.DocumentProperties" ) );
629*b1cdbd2cSJim Jagielski     }
630*b1cdbd2cSJim Jagielski     return aServiceNames;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski class CustomPropertiesImpl : public PropertiesImpl_BASE
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski     uno::Reference< XHelperInterface > m_xParent;
636*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext > m_xContext;
637*b1cdbd2cSJim Jagielski     uno::Reference< frame::XModel > m_xModel;
638*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > mxUserDefinedProp;
639*b1cdbd2cSJim Jagielski     boost::shared_ptr< PropertGetSetHelper > mpPropGetSetHelper;
640*b1cdbd2cSJim Jagielski public:
CustomPropertiesImpl(const uno::Reference<XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<frame::XModel> & xModel)641*b1cdbd2cSJim Jagielski     CustomPropertiesImpl( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xModel ) : m_xParent( xParent ), m_xContext( xContext ), m_xModel( xModel )
642*b1cdbd2cSJim Jagielski     {
643*b1cdbd2cSJim Jagielski         // suck in the document( custom ) properties
644*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentInfoSupplier > xDocInfoSupp( m_xModel, uno::UNO_QUERY_THROW );
645*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentPropertiesSupplier > xDocPropSupp( xDocInfoSupp->getDocumentInfo(), uno::UNO_QUERY_THROW );
646*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentProperties > xDocProp( xDocPropSupp->getDocumentProperties(), uno::UNO_QUERY_THROW );
647*b1cdbd2cSJim Jagielski         mxUserDefinedProp.set( xDocProp->getUserDefinedProperties(), uno::UNO_QUERY_THROW );
648*b1cdbd2cSJim Jagielski         mpPropGetSetHelper.reset( new CustomPropertyGetSetHelper( m_xModel ) );
649*b1cdbd2cSJim Jagielski     };
650*b1cdbd2cSJim Jagielski     // XIndexAccess
getCount()651*b1cdbd2cSJim Jagielski     virtual ::sal_Int32 SAL_CALL getCount(  ) throw (uno::RuntimeException)
652*b1cdbd2cSJim Jagielski     {
653*b1cdbd2cSJim Jagielski         return mxUserDefinedProp->getPropertySetInfo()->getProperties().getLength();
654*b1cdbd2cSJim Jagielski     }
655*b1cdbd2cSJim Jagielski 
getByIndex(::sal_Int32 Index)656*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException )
657*b1cdbd2cSJim Jagielski     {
658*b1cdbd2cSJim Jagielski         uno::Sequence< beans::Property > aProps = mxUserDefinedProp->getPropertySetInfo()->getProperties();
659*b1cdbd2cSJim Jagielski         if ( Index >= aProps.getLength() )
660*b1cdbd2cSJim Jagielski             throw lang::IndexOutOfBoundsException();
661*b1cdbd2cSJim Jagielski         // How to determine type e.g Date? ( com.sun.star.util.DateTime )
662*b1cdbd2cSJim Jagielski         DocPropInfo aPropInfo = DocPropInfo::createDocPropInfo( aProps[ Index ].Name, aProps[ Index ].Name, mpPropGetSetHelper );
663*b1cdbd2cSJim Jagielski         return uno::makeAny( uno::Reference< XDocumentProperty >( new SwVbaCustomDocumentProperty( m_xParent, m_xContext, aPropInfo ) ) );
664*b1cdbd2cSJim Jagielski     }
665*b1cdbd2cSJim Jagielski 
getByName(const::rtl::OUString & aName)666*b1cdbd2cSJim Jagielski     virtual uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
667*b1cdbd2cSJim Jagielski     {
668*b1cdbd2cSJim Jagielski         if ( !hasByName( aName ) )
669*b1cdbd2cSJim Jagielski             throw container::NoSuchElementException();
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski         DocPropInfo aPropInfo = DocPropInfo::createDocPropInfo( aName, aName, mpPropGetSetHelper );
672*b1cdbd2cSJim Jagielski         return uno::makeAny( uno::Reference< XDocumentProperty >( new SwVbaCustomDocumentProperty( m_xParent, m_xContext, aPropInfo ) ) );
673*b1cdbd2cSJim Jagielski     }
674*b1cdbd2cSJim Jagielski 
getElementNames()675*b1cdbd2cSJim Jagielski     virtual uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw (uno::RuntimeException)
676*b1cdbd2cSJim Jagielski     {
677*b1cdbd2cSJim Jagielski         uno::Sequence< beans::Property > aProps = mxUserDefinedProp->getPropertySetInfo()->getProperties();
678*b1cdbd2cSJim Jagielski         uno::Sequence< rtl::OUString > aNames( aProps.getLength() );
679*b1cdbd2cSJim Jagielski         rtl::OUString* pString = aNames.getArray();
680*b1cdbd2cSJim Jagielski         rtl::OUString* pEnd = ( pString + aNames.getLength() );
681*b1cdbd2cSJim Jagielski         beans::Property* pProp = aProps.getArray();
682*b1cdbd2cSJim Jagielski         for ( ; pString != pEnd; ++pString, ++pProp )
683*b1cdbd2cSJim Jagielski             *pString = pProp->Name;
684*b1cdbd2cSJim Jagielski         return aNames;
685*b1cdbd2cSJim Jagielski     }
686*b1cdbd2cSJim Jagielski 
hasByName(const::rtl::OUString & aName)687*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (uno::RuntimeException)
688*b1cdbd2cSJim Jagielski     {
689*b1cdbd2cSJim Jagielski         OSL_TRACE("hasByName(%s) returns %d", rtl::OUStringToOString( aName, RTL_TEXTENCODING_UTF8 ).getStr(), mxUserDefinedProp->getPropertySetInfo()->hasPropertyByName( aName ) );
690*b1cdbd2cSJim Jagielski         return mxUserDefinedProp->getPropertySetInfo()->hasPropertyByName( aName );
691*b1cdbd2cSJim Jagielski     }
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski     // XElementAccess
getElementType()694*b1cdbd2cSJim Jagielski     virtual uno::Type SAL_CALL getElementType(  ) throw (uno::RuntimeException)
695*b1cdbd2cSJim Jagielski     {
696*b1cdbd2cSJim Jagielski         return  XDocumentProperty::static_type(0);
697*b1cdbd2cSJim Jagielski     }
698*b1cdbd2cSJim Jagielski 
hasElements()699*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasElements(  ) throw (uno::RuntimeException)
700*b1cdbd2cSJim Jagielski     {
701*b1cdbd2cSJim Jagielski         return getCount() > 0;
702*b1cdbd2cSJim Jagielski     }
703*b1cdbd2cSJim Jagielski 
createEnumeration()704*b1cdbd2cSJim Jagielski     virtual uno::Reference< container::XEnumeration > SAL_CALL createEnumeration(  ) throw (uno::RuntimeException)
705*b1cdbd2cSJim Jagielski     {
706*b1cdbd2cSJim Jagielski         // create a map of properties ( the key doesn't matter )
707*b1cdbd2cSJim Jagielski         OSL_TRACE("Creating an enumeration");
708*b1cdbd2cSJim Jagielski         sal_Int32 key = 0;
709*b1cdbd2cSJim Jagielski         sal_Int32 nElem =  getCount();
710*b1cdbd2cSJim Jagielski         DocProps simpleDocPropSnapShot;
711*b1cdbd2cSJim Jagielski         for ( ; key < nElem; ++key )
712*b1cdbd2cSJim Jagielski              simpleDocPropSnapShot[ key ].set( getByIndex( key ), uno::UNO_QUERY_THROW );
713*b1cdbd2cSJim Jagielski         OSL_TRACE("After creating the enumeration");
714*b1cdbd2cSJim Jagielski         return  new DocPropEnumeration( simpleDocPropSnapShot );
715*b1cdbd2cSJim Jagielski     }
716*b1cdbd2cSJim Jagielski 
addProp(const::rtl::OUString & Name,::sal_Int8,const uno::Any & Value)717*b1cdbd2cSJim Jagielski     void addProp( const ::rtl::OUString& Name, ::sal_Int8 /*Type*/, const uno::Any& Value )
718*b1cdbd2cSJim Jagielski     {
719*b1cdbd2cSJim Jagielski         sal_Int16 attributes = 128;
720*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertyContainer > xContainer( mxUserDefinedProp, uno::UNO_QUERY_THROW );
721*b1cdbd2cSJim Jagielski         // TODO fixme, perform the necessary Type Value conversions
722*b1cdbd2cSJim Jagielski         xContainer->addProperty( Name, attributes, Value );
723*b1cdbd2cSJim Jagielski     }
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski };
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 
SwVbaCustomDocumentProperties(const uno::Reference<XHelperInterface> & xParent,const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<frame::XModel> & xModel)728*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperties::SwVbaCustomDocumentProperties( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< frame::XModel >& xModel ) : SwVbaBuiltinDocumentProperties( xParent, xContext, xModel )
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski     // replace the m_xIndexAccess implementation ( we need a virtual init )
731*b1cdbd2cSJim Jagielski     m_xIndexAccess.set( new CustomPropertiesImpl( xParent, xContext, xModel ) );
732*b1cdbd2cSJim Jagielski     m_xNameAccess.set( m_xIndexAccess, uno::UNO_QUERY_THROW );
733*b1cdbd2cSJim Jagielski }
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski uno::Reference< XDocumentProperty > SAL_CALL
Add(const::rtl::OUString & Name,::sal_Bool LinkToContent,::sal_Int8 Type,const uno::Any & Value,const uno::Any & LinkSource)736*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperties::Add( const ::rtl::OUString& Name, ::sal_Bool LinkToContent, ::sal_Int8 Type, const uno::Any& Value, const uno::Any& LinkSource ) throw (script::BasicErrorException, uno::RuntimeException)
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski     CustomPropertiesImpl* pCustomProps = dynamic_cast< CustomPropertiesImpl* > ( m_xIndexAccess.get() );
739*b1cdbd2cSJim Jagielski     uno::Reference< XDocumentProperty > xDocProp;
740*b1cdbd2cSJim Jagielski     if ( pCustomProps )
741*b1cdbd2cSJim Jagielski     {
742*b1cdbd2cSJim Jagielski         rtl::OUString sLinkSource;
743*b1cdbd2cSJim Jagielski         pCustomProps->addProp( Name, Type, Value );
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski         xDocProp.set( m_xNameAccess->getByName( Name ), uno::UNO_QUERY_THROW );
746*b1cdbd2cSJim Jagielski         xDocProp->setLinkToContent( LinkToContent );
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski         if ( LinkSource >>= sLinkSource )
749*b1cdbd2cSJim Jagielski            xDocProp->setLinkSource( sLinkSource );
750*b1cdbd2cSJim Jagielski     }
751*b1cdbd2cSJim Jagielski     return xDocProp;
752*b1cdbd2cSJim Jagielski }
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski // XHelperInterface
755*b1cdbd2cSJim Jagielski rtl::OUString&
getServiceImplName()756*b1cdbd2cSJim Jagielski SwVbaCustomDocumentProperties::getServiceImplName()
757*b1cdbd2cSJim Jagielski {
758*b1cdbd2cSJim Jagielski     static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("SwVbaCustomDocumentProperties") );
759*b1cdbd2cSJim Jagielski     return sImplName;
760*b1cdbd2cSJim Jagielski }
761