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
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_basctl.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski #include "dlgedfac.hxx"
29*b1cdbd2cSJim Jagielski #include "dlgedobj.hxx"
30*b1cdbd2cSJim Jagielski #include <dlgeddef.hxx>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/ScrollBarOrientation.hpp>
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
39*b1cdbd2cSJim Jagielski
DlgEdFactory()40*b1cdbd2cSJim Jagielski DlgEdFactory::DlgEdFactory()
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski SdrObjFactory::InsertMakeObjectHdl( LINK(this, DlgEdFactory, MakeObject) );
43*b1cdbd2cSJim Jagielski }
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
46*b1cdbd2cSJim Jagielski
~DlgEdFactory()47*b1cdbd2cSJim Jagielski DlgEdFactory::~DlgEdFactory()
48*b1cdbd2cSJim Jagielski {
49*b1cdbd2cSJim Jagielski SdrObjFactory::RemoveMakeObjectHdl( LINK(this, DlgEdFactory, MakeObject) );
50*b1cdbd2cSJim Jagielski }
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
53*b1cdbd2cSJim Jagielski
IMPL_LINK(DlgEdFactory,MakeObject,SdrObjFactory *,pObjFactory)54*b1cdbd2cSJim Jagielski IMPL_LINK( DlgEdFactory, MakeObject, SdrObjFactory *, pObjFactory )
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski static sal_Bool bNeedsInit = sal_True;
57*b1cdbd2cSJim Jagielski static uno::Reference< lang::XMultiServiceFactory > xDialogSFact;
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielski if( bNeedsInit )
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
62*b1cdbd2cSJim Jagielski uno::Reference< container::XNameContainer > xC( xMSF->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ), uno::UNO_QUERY );
63*b1cdbd2cSJim Jagielski if( xC.is() )
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski uno::Reference< lang::XMultiServiceFactory > xModFact( xC, uno::UNO_QUERY );
66*b1cdbd2cSJim Jagielski xDialogSFact = xModFact;
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski bNeedsInit = sal_False;
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski if( (pObjFactory->nInventor == DlgInventor) &&
72*b1cdbd2cSJim Jagielski (pObjFactory->nIdentifier >= OBJ_DLG_PUSHBUTTON) &&
73*b1cdbd2cSJim Jagielski (pObjFactory->nIdentifier <= OBJ_DLG_TREECONTROL) )
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski switch( pObjFactory->nIdentifier )
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski case OBJ_DLG_PUSHBUTTON:
78*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlButtonModel") , xDialogSFact );
79*b1cdbd2cSJim Jagielski break;
80*b1cdbd2cSJim Jagielski case OBJ_DLG_RADIOBUTTON:
81*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlRadioButtonModel") , xDialogSFact );
82*b1cdbd2cSJim Jagielski break;
83*b1cdbd2cSJim Jagielski case OBJ_DLG_CHECKBOX:
84*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlCheckBoxModel") , xDialogSFact );
85*b1cdbd2cSJim Jagielski break;
86*b1cdbd2cSJim Jagielski case OBJ_DLG_LISTBOX:
87*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlListBoxModel") , xDialogSFact );
88*b1cdbd2cSJim Jagielski break;
89*b1cdbd2cSJim Jagielski case OBJ_DLG_COMBOBOX:
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski DlgEdObj* pNew = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlComboBoxModel") , xDialogSFact );
92*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = pNew;
93*b1cdbd2cSJim Jagielski try
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPSet(pNew->GetUnoControlModel(), uno::UNO_QUERY);
96*b1cdbd2cSJim Jagielski if (xPSet.is())
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski sal_Bool bB = sal_True;
99*b1cdbd2cSJim Jagielski xPSet->setPropertyValue( DLGED_PROP_DROPDOWN, uno::Any(&bB,::getBooleanCppuType()));
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski catch(...)
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski } break;
106*b1cdbd2cSJim Jagielski case OBJ_DLG_GROUPBOX:
107*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlGroupBoxModel") , xDialogSFact );
108*b1cdbd2cSJim Jagielski break;
109*b1cdbd2cSJim Jagielski case OBJ_DLG_EDIT:
110*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlEditModel") , xDialogSFact );
111*b1cdbd2cSJim Jagielski break;
112*b1cdbd2cSJim Jagielski case OBJ_DLG_FIXEDTEXT:
113*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlFixedTextModel") , xDialogSFact );
114*b1cdbd2cSJim Jagielski break;
115*b1cdbd2cSJim Jagielski case OBJ_DLG_IMAGECONTROL:
116*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlImageControlModel") , xDialogSFact );
117*b1cdbd2cSJim Jagielski break;
118*b1cdbd2cSJim Jagielski case OBJ_DLG_PROGRESSBAR:
119*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlProgressBarModel") , xDialogSFact );
120*b1cdbd2cSJim Jagielski break;
121*b1cdbd2cSJim Jagielski case OBJ_DLG_HSCROLLBAR:
122*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlScrollBarModel") , xDialogSFact );
123*b1cdbd2cSJim Jagielski break;
124*b1cdbd2cSJim Jagielski case OBJ_DLG_VSCROLLBAR:
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski DlgEdObj* pNew = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlScrollBarModel") , xDialogSFact );
127*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = pNew;
128*b1cdbd2cSJim Jagielski // set vertical orientation
129*b1cdbd2cSJim Jagielski try
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPSet(pNew->GetUnoControlModel(), uno::UNO_QUERY);
132*b1cdbd2cSJim Jagielski if (xPSet.is())
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski uno::Any aValue;
135*b1cdbd2cSJim Jagielski aValue <<= (sal_Int32) ::com::sun::star::awt::ScrollBarOrientation::VERTICAL;
136*b1cdbd2cSJim Jagielski xPSet->setPropertyValue( DLGED_PROP_ORIENTATION, aValue );
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski }
139*b1cdbd2cSJim Jagielski catch(...)
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski } break;
143*b1cdbd2cSJim Jagielski case OBJ_DLG_HFIXEDLINE:
144*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlFixedLineModel") , xDialogSFact );
145*b1cdbd2cSJim Jagielski break;
146*b1cdbd2cSJim Jagielski case OBJ_DLG_VFIXEDLINE:
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski DlgEdObj* pNew = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlFixedLineModel") , xDialogSFact );
149*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = pNew;
150*b1cdbd2cSJim Jagielski // set vertical orientation
151*b1cdbd2cSJim Jagielski try
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPSet(pNew->GetUnoControlModel(), uno::UNO_QUERY);
154*b1cdbd2cSJim Jagielski if (xPSet.is())
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski uno::Any aValue;
157*b1cdbd2cSJim Jagielski aValue <<= (sal_Int32) 1;
158*b1cdbd2cSJim Jagielski xPSet->setPropertyValue( DLGED_PROP_ORIENTATION, aValue );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski catch(...)
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski } break;
165*b1cdbd2cSJim Jagielski case OBJ_DLG_DATEFIELD:
166*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlDateFieldModel") , xDialogSFact );
167*b1cdbd2cSJim Jagielski break;
168*b1cdbd2cSJim Jagielski case OBJ_DLG_TIMEFIELD:
169*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlTimeFieldModel") , xDialogSFact );
170*b1cdbd2cSJim Jagielski break;
171*b1cdbd2cSJim Jagielski case OBJ_DLG_NUMERICFIELD:
172*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlNumericFieldModel") , xDialogSFact );
173*b1cdbd2cSJim Jagielski break;
174*b1cdbd2cSJim Jagielski case OBJ_DLG_CURRENCYFIELD:
175*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlCurrencyFieldModel") , xDialogSFact );
176*b1cdbd2cSJim Jagielski break;
177*b1cdbd2cSJim Jagielski case OBJ_DLG_FORMATTEDFIELD:
178*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlFormattedFieldModel") , xDialogSFact );
179*b1cdbd2cSJim Jagielski break;
180*b1cdbd2cSJim Jagielski case OBJ_DLG_PATTERNFIELD:
181*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlPatternFieldModel") , xDialogSFact );
182*b1cdbd2cSJim Jagielski break;
183*b1cdbd2cSJim Jagielski case OBJ_DLG_FILECONTROL:
184*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlFileControlModel") , xDialogSFact );
185*b1cdbd2cSJim Jagielski break;
186*b1cdbd2cSJim Jagielski case OBJ_DLG_TREECONTROL:
187*b1cdbd2cSJim Jagielski DlgEdObj* pNew = new DlgEdObj( ::rtl::OUString::createFromAscii("com.sun.star.awt.tree.TreeControlModel") , xDialogSFact );
188*b1cdbd2cSJim Jagielski pObjFactory->pNewObj = pNew;
189*b1cdbd2cSJim Jagielski /*
190*b1cdbd2cSJim Jagielski try
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPSet(pNew->GetUnoControlModel(), uno::UNO_QUERY);
193*b1cdbd2cSJim Jagielski if (xPSet.is())
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski // first create a data model for our tree control
196*b1cdbd2cSJim Jagielski Reference< XComponentContext > xComponentContext;
197*b1cdbd2cSJim Jagielski
198*b1cdbd2cSJim Jagielski Reference< XPropertySet > xPropSet( xInterface, UNO_QUERY );
199*b1cdbd2cSJim Jagielski xPropSet->getPropertyValue( OUString::createFromAscii("DefaultContext") ) >>= xComponentContext;
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski // gets the service manager from the office
202*b1cdbd2cSJim Jagielski Reference< XMultiComponentFactory > xMultiComponentFactoryServer( xComponentContext->getServiceManager() );
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski // gets the TreeDataModel
206*b1cdbd2cSJim Jagielski Reference< XMutableTreeDataModel > xTreeDataModel;
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski xTreeDataModel = Reference< XMutableTreeDataModel >(
209*b1cdbd2cSJim Jagielski xMultiComponentFactoryServer->createInstanceWithContext(
210*b1cdbd2cSJim Jagielski OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.tree.MutableTreeDataModel" ) ), xComponentContext ), UNO_QUERY_THROW );
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim Jagielski // now fill it with some sample data
213*b1cdbd2cSJim Jagielski const OUString sRoot( RTL_CONSTASCII_USTRINGPARAM( "Root" ) );
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski Reference< XMutableTreeNode > xNode( mxTreeDataModel->createNode( sRoot, false ), UNO_QUERY_THROW );
216*b1cdbd2cSJim Jagielski xNode->setDataValue( sRoot );
217*b1cdbd2cSJim Jagielski xNode->setExpandedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_down.png" ) ) );
218*b1cdbd2cSJim Jagielski xNode->setCollapsedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_right.png" ) ) );
219*b1cdbd2cSJim Jagielski
220*b1cdbd2cSJim Jagielski const OUString sNode_1( RTL_CONSTASCII_USTRINGPARAM( "Node_1" ) );
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski Reference< XMutableTreeNode > xChildNode_1( mxTreeDataModel->createNode( sNode_1, true ), UNO_QUERY_THROW );
223*b1cdbd2cSJim Jagielski xChildNode_1->setDataValue( sNode_1 );
224*b1cdbd2cSJim Jagielski xChildNode_1->setExpandedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_down.png" ) ) );
225*b1cdbd2cSJim Jagielski xChildNode_1->setCollapsedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_right.png" ) ) );
226*b1cdbd2cSJim Jagielski
227*b1cdbd2cSJim Jagielski xNode->appendChild( xChildNode_1 );
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski const OUString sNode_1_1( RTL_CONSTASCII_USTRINGPARAM( "Node_1_1" ) );
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski Reference< XMutableTreeNode > xChildNode_1_1( mxTreeDataModel->createNode( sNode_1_1, false ), UNO_QUERY_THROW );
232*b1cdbd2cSJim Jagielski xChildNode_1_1->setDataValue( sNode_1_1 );
233*b1cdbd2cSJim Jagielski xChildNode_1_1->setExpandedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_down.png" ) ) );
234*b1cdbd2cSJim Jagielski xChildNode_1_1->setCollapsedGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM( "private:graphicrepository/sd/res/triangle_right.png" ) ) );
235*b1cdbd2cSJim Jagielski
236*b1cdbd2cSJim Jagielski xChildNode_1->appendChild( xChildNode_1_1 );
237*b1cdbd2cSJim Jagielski
238*b1cdbd2cSJim Jagielski const OUString sNode_1_1( RTL_CONSTASCII_USTRINGPARAM( "Node_2" ) );
239*b1cdbd2cSJim Jagielski
240*b1cdbd2cSJim Jagielski Reference< XMutableTreeNode > xChildNode_2( mxTreeDataModel->createNode( sNode_2, false ), UNO_QUERY_THROW );
241*b1cdbd2cSJim Jagielski xChildNode_2->setDataValue( sNode_2 );
242*b1cdbd2cSJim Jagielski xChildNode_2->setNodeGraphicURL( OUString( RTL_CONSTASCII_USTRINGPARAM("private:graphicrepository/sw/imglst/nc20010.png") ) );
243*b1cdbd2cSJim Jagielski xNode->appendChild( xChildNode_2 );
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski xTreeDataModel->setRoot( xNode );
246*b1cdbd2cSJim Jagielski
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim Jagielski const OUString sDataModel( RTL_CONSTASCII_USTRINGPARAM( "DataModel" ) );
249*b1cdbd2cSJim Jagielski
250*b1cdbd2cSJim Jagielski xPSet->setPropertyValue( sDataModel, xTreeDataModel );
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski catch(...)
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski }*/
256*b1cdbd2cSJim Jagielski break;
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski }
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski return 0;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski
263*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
264*b1cdbd2cSJim Jagielski
265