1*2a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2a97ec55SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2a97ec55SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2a97ec55SAndrew Rist  * distributed with this work for additional information
6*2a97ec55SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2a97ec55SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2a97ec55SAndrew Rist  * "License"); you may not use this file except in compliance
9*2a97ec55SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2a97ec55SAndrew Rist  *
11*2a97ec55SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist  *
13*2a97ec55SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2a97ec55SAndrew Rist  * software distributed under the License is distributed on an
15*2a97ec55SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2a97ec55SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2a97ec55SAndrew Rist  * specific language governing permissions and limitations
18*2a97ec55SAndrew Rist  * under the License.
19*2a97ec55SAndrew Rist  *
20*2a97ec55SAndrew Rist  *************************************************************/
21*2a97ec55SAndrew Rist 
22*2a97ec55SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include "editpropertyhandler.hxx"
27cdf0e10cSrcweir #include "formstrings.hxx"
28cdf0e10cSrcweir #include "formmetadata.hxx"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir /** === begin UNO includes === **/
31cdf0e10cSrcweir #include <com/sun/star/inspection/XObjectInspectorUI.hpp>
32cdf0e10cSrcweir /** === end UNO includes === **/
33cdf0e10cSrcweir #include <tools/debug.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #define TEXTTYPE_SINGLELINE     0
36cdf0e10cSrcweir #define TEXTTYPE_MULTILINE      1
37cdf0e10cSrcweir #define TEXTTYPE_RICHTEXT       2
38cdf0e10cSrcweir 
39cdf0e10cSrcweir //------------------------------------------------------------------------
createRegistryInfo_EditPropertyHandler()40cdf0e10cSrcweir extern "C" void SAL_CALL createRegistryInfo_EditPropertyHandler()
41cdf0e10cSrcweir {
42cdf0e10cSrcweir     ::pcr::EditPropertyHandler::registerImplementation();
43cdf0e10cSrcweir }
44cdf0e10cSrcweir 
45cdf0e10cSrcweir //........................................................................
46cdf0e10cSrcweir namespace pcr
47cdf0e10cSrcweir {
48cdf0e10cSrcweir //........................................................................
49cdf0e10cSrcweir 
50cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
51cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
52cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
53cdf0e10cSrcweir     using namespace ::com::sun::star::script;
54cdf0e10cSrcweir     using namespace ::com::sun::star::frame;
55cdf0e10cSrcweir     using namespace ::com::sun::star::inspection;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir     //====================================================================
58cdf0e10cSrcweir 	//= EditPropertyHandler
59cdf0e10cSrcweir 	//====================================================================
DBG_NAME(EditPropertyHandler)60cdf0e10cSrcweir     DBG_NAME( EditPropertyHandler )
61cdf0e10cSrcweir 	//--------------------------------------------------------------------
62cdf0e10cSrcweir     EditPropertyHandler::EditPropertyHandler( const Reference< XComponentContext >& _rxContext )
63cdf0e10cSrcweir         :EditPropertyHandler_Base( _rxContext )
64cdf0e10cSrcweir     {
65cdf0e10cSrcweir         DBG_CTOR( EditPropertyHandler, NULL );
66cdf0e10cSrcweir     }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	//--------------------------------------------------------------------
~EditPropertyHandler()69cdf0e10cSrcweir     EditPropertyHandler::~EditPropertyHandler( )
70cdf0e10cSrcweir     {
71cdf0e10cSrcweir         DBG_DTOR( EditPropertyHandler, NULL );
72cdf0e10cSrcweir     }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     //--------------------------------------------------------------------
getImplementationName_static()75cdf0e10cSrcweir     ::rtl::OUString SAL_CALL EditPropertyHandler::getImplementationName_static(  ) throw (RuntimeException)
76cdf0e10cSrcweir     {
77cdf0e10cSrcweir         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.EditPropertyHandler" ) );
78cdf0e10cSrcweir     }
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     //--------------------------------------------------------------------
getSupportedServiceNames_static()81cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL EditPropertyHandler::getSupportedServiceNames_static(  ) throw (RuntimeException)
82cdf0e10cSrcweir     {
83cdf0e10cSrcweir         Sequence< ::rtl::OUString > aSupported( 1 );
84cdf0e10cSrcweir         aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.EditPropertyHandler" ) );
85cdf0e10cSrcweir         return aSupported;
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     //--------------------------------------------------------------------
getPropertyValue(const::rtl::OUString & _rPropertyName)89cdf0e10cSrcweir     Any SAL_CALL EditPropertyHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
92cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir         Any aReturn;
95cdf0e10cSrcweir         try
96cdf0e10cSrcweir         {
97cdf0e10cSrcweir             switch ( nPropId )
98cdf0e10cSrcweir             {
99cdf0e10cSrcweir             case PROPERTY_ID_SHOW_SCROLLBARS:
100cdf0e10cSrcweir             {
101cdf0e10cSrcweir                 sal_Bool bHasVScroll = sal_False;
102cdf0e10cSrcweir                 m_xComponent->getPropertyValue( PROPERTY_VSCROLL ) >>= bHasVScroll;
103cdf0e10cSrcweir                 sal_Bool bHasHScroll = sal_False;
104cdf0e10cSrcweir                 m_xComponent->getPropertyValue( PROPERTY_HSCROLL ) >>= bHasHScroll;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir                 aReturn <<= (sal_Int32)( ( bHasVScroll ? 2 : 0 ) + ( bHasHScroll ? 1 : 0 ) );
107cdf0e10cSrcweir             }
108cdf0e10cSrcweir             break;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir             case PROPERTY_ID_TEXTTYPE:
111cdf0e10cSrcweir             {
112cdf0e10cSrcweir                 sal_Int32 nTextType = TEXTTYPE_SINGLELINE;
113cdf0e10cSrcweir                 sal_Bool bRichText = sal_False;
114cdf0e10cSrcweir                 OSL_VERIFY( m_xComponent->getPropertyValue( PROPERTY_RICHTEXT ) >>= bRichText );
115cdf0e10cSrcweir                 if ( bRichText )
116cdf0e10cSrcweir                     nTextType = TEXTTYPE_RICHTEXT;
117cdf0e10cSrcweir                 else
118cdf0e10cSrcweir                 {
119cdf0e10cSrcweir                     sal_Bool bMultiLine = sal_False;
120cdf0e10cSrcweir                     OSL_VERIFY( m_xComponent->getPropertyValue( PROPERTY_MULTILINE ) >>= bMultiLine );
121cdf0e10cSrcweir                     if ( bMultiLine )
122cdf0e10cSrcweir                         nTextType = TEXTTYPE_MULTILINE;
123cdf0e10cSrcweir                     else
124cdf0e10cSrcweir                         nTextType = TEXTTYPE_SINGLELINE;
125cdf0e10cSrcweir                 }
126cdf0e10cSrcweir                 aReturn <<= nTextType;
127cdf0e10cSrcweir             }
128cdf0e10cSrcweir             break;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             default:
132cdf0e10cSrcweir                 DBG_ERROR( "EditPropertyHandler::getPropertyValue: cannot handle this property!" );
133cdf0e10cSrcweir                 break;
134cdf0e10cSrcweir             }
135cdf0e10cSrcweir         }
136cdf0e10cSrcweir         catch( const Exception& )
137cdf0e10cSrcweir         {
138cdf0e10cSrcweir         	OSL_ENSURE( sal_False, "EditPropertyHandler::getPropertyValue: caught an exception!" );
139cdf0e10cSrcweir         }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         return aReturn;
142cdf0e10cSrcweir     }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     //--------------------------------------------------------------------
setPropertyValue(const::rtl::OUString & _rPropertyName,const Any & _rValue)145cdf0e10cSrcweir     void SAL_CALL EditPropertyHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
146cdf0e10cSrcweir     {
147cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
148cdf0e10cSrcweir         PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
149cdf0e10cSrcweir 
150cdf0e10cSrcweir         try
151cdf0e10cSrcweir         {
152cdf0e10cSrcweir             switch ( nPropId )
153cdf0e10cSrcweir             {
154cdf0e10cSrcweir             case PROPERTY_ID_SHOW_SCROLLBARS:
155cdf0e10cSrcweir             {
156cdf0e10cSrcweir                 sal_Int32 nScrollbars = 0;
157cdf0e10cSrcweir                 _rValue >>= nScrollbars;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir                 sal_Bool bHasVScroll = 0 != ( nScrollbars & 2 );
160cdf0e10cSrcweir                 sal_Bool bHasHScroll = 0 != ( nScrollbars & 1 );
161cdf0e10cSrcweir 
162cdf0e10cSrcweir                 m_xComponent->setPropertyValue( PROPERTY_VSCROLL, makeAny( (sal_Bool)bHasVScroll ) );
163cdf0e10cSrcweir                 m_xComponent->setPropertyValue( PROPERTY_HSCROLL, makeAny( (sal_Bool)bHasHScroll ) );
164cdf0e10cSrcweir             }
165cdf0e10cSrcweir             break;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir             case PROPERTY_ID_TEXTTYPE:
168cdf0e10cSrcweir             {
169cdf0e10cSrcweir                 sal_Bool bMultiLine = sal_False;
170cdf0e10cSrcweir                 sal_Bool bRichText = sal_False;
171cdf0e10cSrcweir                 sal_Int32 nTextType = TEXTTYPE_SINGLELINE;
172cdf0e10cSrcweir                 OSL_VERIFY( _rValue >>= nTextType );
173cdf0e10cSrcweir                 switch ( nTextType )
174cdf0e10cSrcweir                 {
175cdf0e10cSrcweir                 case TEXTTYPE_SINGLELINE: bMultiLine = bRichText = sal_False; break;
176cdf0e10cSrcweir                 case TEXTTYPE_MULTILINE:  bMultiLine = sal_True; bRichText = sal_False; break;
177cdf0e10cSrcweir                 case TEXTTYPE_RICHTEXT:   bMultiLine = sal_True; bRichText = sal_True; break;
178cdf0e10cSrcweir                 default:
179cdf0e10cSrcweir                     OSL_ENSURE( sal_False, "EditPropertyHandler::setPropertyValue: invalid text type!" );
180cdf0e10cSrcweir                 }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir                 m_xComponent->setPropertyValue( PROPERTY_MULTILINE, makeAny( bMultiLine ) );
183cdf0e10cSrcweir                 m_xComponent->setPropertyValue( PROPERTY_RICHTEXT, makeAny( bRichText ) );
184cdf0e10cSrcweir             }
185cdf0e10cSrcweir             break;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir             default:
188cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "EditPropertyHandler::setPropertyValue: cannot handle this id!" );
189cdf0e10cSrcweir             }
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir         catch( const Exception& )
192cdf0e10cSrcweir         {
193cdf0e10cSrcweir         	OSL_ENSURE( sal_False, "EditPropertyHandler::setPropertyValue: caught an exception!" );
194cdf0e10cSrcweir         }
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     //--------------------------------------------------------------------
implHaveBothScrollBarProperties() const198cdf0e10cSrcweir     bool EditPropertyHandler::implHaveBothScrollBarProperties() const
199cdf0e10cSrcweir     {
200cdf0e10cSrcweir         // have a "Scrollbars" property if the object supports both "HScroll" and "VScroll"
201cdf0e10cSrcweir         Reference< XPropertySetInfo > xPSI;
202cdf0e10cSrcweir         if ( m_xComponent.is() )
203cdf0e10cSrcweir             xPSI = m_xComponent->getPropertySetInfo();
204cdf0e10cSrcweir 
205cdf0e10cSrcweir         return xPSI.is()
206cdf0e10cSrcweir             && xPSI->hasPropertyByName( PROPERTY_HSCROLL )
207cdf0e10cSrcweir             && xPSI->hasPropertyByName( PROPERTY_VSCROLL );
208cdf0e10cSrcweir     }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     //--------------------------------------------------------------------
implHaveTextTypeProperty() const211cdf0e10cSrcweir     bool EditPropertyHandler::implHaveTextTypeProperty() const
212cdf0e10cSrcweir     {
213cdf0e10cSrcweir         // have a "Scrollbars" property if the object supports both "HScroll" and "VScroll"
214cdf0e10cSrcweir         Reference< XPropertySetInfo > xPSI;
215cdf0e10cSrcweir         if ( m_xComponent.is() )
216cdf0e10cSrcweir             xPSI = m_xComponent->getPropertySetInfo();
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         return xPSI.is()
219cdf0e10cSrcweir             && xPSI->hasPropertyByName( PROPERTY_RICHTEXT )
220cdf0e10cSrcweir             && xPSI->hasPropertyByName( PROPERTY_MULTILINE );
221cdf0e10cSrcweir     }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     //--------------------------------------------------------------------
doDescribeSupportedProperties() const224cdf0e10cSrcweir     Sequence< Property > SAL_CALL EditPropertyHandler::doDescribeSupportedProperties() const
225cdf0e10cSrcweir     {
226cdf0e10cSrcweir         ::std::vector< Property > aProperties;
227cdf0e10cSrcweir 
228cdf0e10cSrcweir         if ( implHaveBothScrollBarProperties() )
229cdf0e10cSrcweir             addInt32PropertyDescription( aProperties, PROPERTY_SHOW_SCROLLBARS );
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         if ( implHaveTextTypeProperty() )
232cdf0e10cSrcweir             addInt32PropertyDescription( aProperties, PROPERTY_TEXTTYPE );
233cdf0e10cSrcweir 
234cdf0e10cSrcweir         if ( aProperties.empty() )
235cdf0e10cSrcweir             return Sequence< Property >();
236cdf0e10cSrcweir         return Sequence< Property >( &(*aProperties.begin()), aProperties.size() );
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     //--------------------------------------------------------------------
getSupersededProperties()240cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL EditPropertyHandler::getSupersededProperties( ) throw (RuntimeException)
241cdf0e10cSrcweir     {
242cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
243cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aSuperseded;
244cdf0e10cSrcweir         if ( implHaveBothScrollBarProperties() )
245cdf0e10cSrcweir         {
246cdf0e10cSrcweir             aSuperseded.push_back( PROPERTY_HSCROLL );
247cdf0e10cSrcweir             aSuperseded.push_back( PROPERTY_VSCROLL );
248cdf0e10cSrcweir         }
249cdf0e10cSrcweir         if ( implHaveTextTypeProperty() )
250cdf0e10cSrcweir         {
251cdf0e10cSrcweir             aSuperseded.push_back( PROPERTY_RICHTEXT );
252cdf0e10cSrcweir             aSuperseded.push_back( PROPERTY_MULTILINE );
253cdf0e10cSrcweir         }
254cdf0e10cSrcweir         if ( aSuperseded.empty() )
255cdf0e10cSrcweir             return Sequence< ::rtl::OUString >();
256cdf0e10cSrcweir         return Sequence< ::rtl::OUString >( &(*aSuperseded.begin()), aSuperseded.size() );
257cdf0e10cSrcweir     }
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     //--------------------------------------------------------------------
getActuatingProperties()260cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL EditPropertyHandler::getActuatingProperties( ) throw (RuntimeException)
261cdf0e10cSrcweir     {
262cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
263cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aInterestingActuatingProps;
264cdf0e10cSrcweir         if ( implHaveTextTypeProperty() )
265cdf0e10cSrcweir             aInterestingActuatingProps.push_back( PROPERTY_TEXTTYPE );
266cdf0e10cSrcweir         aInterestingActuatingProps.push_back( PROPERTY_MULTILINE );
267cdf0e10cSrcweir         return Sequence< ::rtl::OUString >( &(*aInterestingActuatingProps.begin()), aInterestingActuatingProps.size() );;
268cdf0e10cSrcweir     }
269cdf0e10cSrcweir 
270cdf0e10cSrcweir     //--------------------------------------------------------------------
actuatingPropertyChanged(const::rtl::OUString & _rActuatingPropertyName,const Any & _rNewValue,const Any &,const Reference<XObjectInspectorUI> & _rxInspectorUI,sal_Bool)271cdf0e10cSrcweir     void SAL_CALL EditPropertyHandler::actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& _rNewValue, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool ) throw (NullPointerException, RuntimeException)
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         if ( !_rxInspectorUI.is() )
274cdf0e10cSrcweir             throw NullPointerException();
275cdf0e10cSrcweir 
276cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
277cdf0e10cSrcweir         PropertyId nActuatingPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) );
278cdf0e10cSrcweir         switch ( nActuatingPropId )
279cdf0e10cSrcweir         {
280cdf0e10cSrcweir         case PROPERTY_ID_TEXTTYPE:
281cdf0e10cSrcweir         {
282cdf0e10cSrcweir             sal_Int32 nTextType = TEXTTYPE_SINGLELINE;
283cdf0e10cSrcweir             getPropertyValue( PROPERTY_TEXTTYPE ) >>= nTextType;
284cdf0e10cSrcweir 
285cdf0e10cSrcweir             if ( impl_isSupportedProperty_nothrow( PROPERTY_ID_WORDBREAK ) )
286cdf0e10cSrcweir                 _rxInspectorUI->enablePropertyUI( PROPERTY_WORDBREAK,   nTextType == TEXTTYPE_RICHTEXT );
287cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_MAXTEXTLEN,      nTextType != TEXTTYPE_RICHTEXT );
288cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_ECHO_CHAR,       nTextType == TEXTTYPE_SINGLELINE );
289cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_FONT,            nTextType != TEXTTYPE_RICHTEXT );
290cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_ALIGN,           nTextType != TEXTTYPE_RICHTEXT );
291cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_DEFAULT_TEXT,    nTextType != TEXTTYPE_RICHTEXT );
292cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_SHOW_SCROLLBARS, nTextType != TEXTTYPE_SINGLELINE );
293cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_LINEEND_FORMAT,  nTextType != TEXTTYPE_SINGLELINE );
294cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_VERTICAL_ALIGN,  nTextType == TEXTTYPE_SINGLELINE );
295cdf0e10cSrcweir 
296cdf0e10cSrcweir             _rxInspectorUI->showCategory( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Data" ) ), nTextType != TEXTTYPE_RICHTEXT );
297cdf0e10cSrcweir         }
298cdf0e10cSrcweir         break;
299cdf0e10cSrcweir 
300cdf0e10cSrcweir         case PROPERTY_ID_MULTILINE:
301cdf0e10cSrcweir         {
302cdf0e10cSrcweir             sal_Bool bIsMultiline = sal_False;
303cdf0e10cSrcweir             _rNewValue >>= bIsMultiline;
304cdf0e10cSrcweir 
305cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_SHOW_SCROLLBARS, bIsMultiline );
306cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_ECHO_CHAR, !bIsMultiline );
307cdf0e10cSrcweir             _rxInspectorUI->enablePropertyUI( PROPERTY_LINEEND_FORMAT, bIsMultiline );
308cdf0e10cSrcweir         }
309cdf0e10cSrcweir         break;
310cdf0e10cSrcweir 
311cdf0e10cSrcweir         default:
312cdf0e10cSrcweir             OSL_ENSURE( sal_False, "EditPropertyHandler::actuatingPropertyChanged: cannot handle this id!" );
313cdf0e10cSrcweir         }
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir 
316cdf0e10cSrcweir //........................................................................
317cdf0e10cSrcweir }   // namespace pcr
318cdf0e10cSrcweir //........................................................................
319cdf0e10cSrcweir 
320