diff options
Diffstat (limited to 'filter/source/pdf')
-rw-r--r-- | filter/source/pdf/impdialog.cxx | 10 | ||||
-rw-r--r-- | filter/source/pdf/impdialog.hrc | 7 | ||||
-rw-r--r-- | filter/source/pdf/impdialog.hxx | 2 | ||||
-rw-r--r-- | filter/source/pdf/impdialog.src | 15 | ||||
-rw-r--r-- | filter/source/pdf/pdfdialog.cxx | 2 | ||||
-rw-r--r-- | filter/source/pdf/pdfexport.cxx | 178 | ||||
-rw-r--r-- | filter/source/pdf/pdfexport.hxx | 1 | ||||
-rw-r--r-- | filter/source/pdf/pdffilter.cxx | 2 |
8 files changed, 142 insertions, 75 deletions
diff --git a/filter/source/pdf/impdialog.cxx b/filter/source/pdf/impdialog.cxx index 46b9835eb648..4037ba0560a8 100644 --- a/filter/source/pdf/impdialog.cxx +++ b/filter/source/pdf/impdialog.cxx @@ -79,6 +79,7 @@ ImpPDFTabDialog::ImpPDFTabDialog( Window* pParent, mbIsSkipEmptyPages( sal_True ), mnFormsType( 0 ), mbExportFormFields( sal_True ), + mbAllowDuplicateFieldNames( sal_False ), mbExportBookmarks( sal_True ), mnOpenBookmarkLevels( -1 ), @@ -192,6 +193,7 @@ ImpPDFTabDialog::ImpPDFTabDialog( Window* pParent, mbExportFormFields = maConfigItem.ReadBool( OUString( RTL_CONSTASCII_USTRINGPARAM( "ExportFormFields" ) ), sal_True ); if ( ( mnFormsType < 0 ) || ( mnFormsType > 3 ) ) mnFormsType = 0; + mbAllowDuplicateFieldNames = maConfigItem.ReadBool( OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowDuplicateFieldNames" ) ), sal_False ); //prepare values for the Viewer tab page mbHideViewerToolbar = maConfigItem.ReadBool( OUString( RTL_CONSTASCII_USTRINGPARAM( "HideViewerToolbar" ) ), sal_False ); @@ -323,6 +325,7 @@ Sequence< PropertyValue > ImpPDFTabDialog::GetFilterData() */ maConfigItem.WriteInt32( OUString( RTL_CONSTASCII_USTRINGPARAM( "FormsType" ) ), mnFormsType ); maConfigItem.WriteBool( OUString( RTL_CONSTASCII_USTRINGPARAM( "ExportFormFields" ) ), mbExportFormFields ); + maConfigItem.WriteBool( OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowDuplicateFieldNames" ) ), mbAllowDuplicateFieldNames ); if( GetTabPage( RID_PDF_TAB_VPREFER ) ) ( ( ImpPDFTabViewerPage* )GetTabPage( RID_PDF_TAB_VPREFER ) )->GetFilterConfigItem( this ); @@ -432,6 +435,7 @@ ImpPDFTabGeneralPage::ImpPDFTabGeneralPage( Window* pParent, mbExportFormFieldsUserSelection( sal_False ), maFtFormsFormat( this, ResId( FT_FORMSFORMAT, *paResMgr ) ), maLbFormsFormat( this, ResId( LB_FORMSFORMAT, *paResMgr ) ), + maCbAllowDuplicateFieldNames( this, ResId( CB_ALLOWDUPLICATEFIELDNAMES, *paResMgr ) ), maCbExportBookmarks( this, ResId( CB_EXPORTBOOKMARKS, *paResMgr ) ), maCbExportNotes( this, ResId( CB_EXPORTNOTES, *paResMgr ) ), @@ -531,6 +535,8 @@ void ImpPDFTabGeneralPage::SetFilterConfigItem( const ImpPDFTabDialog* paParent maLbFormsFormat.SelectEntryPos( (sal_uInt16)paParent->mnFormsType ); maLbFormsFormat.Enable( paParent->mbExportFormFields ); + maCbAllowDuplicateFieldNames.Check( paParent->mbAllowDuplicateFieldNames ); + maCbAllowDuplicateFieldNames.Enable( paParent->mbExportFormFields ); if ( mbIsPresentation ) maCbExportNotes.Check( paParent->mbExportNotesBoth ); @@ -605,6 +611,7 @@ void ImpPDFTabGeneralPage::GetFilterConfigItem( ImpPDFTabDialog* paParent ) * ever be an additional form submit format this could get invalid. */ paParent->mnFormsType = (sal_Int32) maLbFormsFormat.GetSelectEntryPos(); + paParent->mbAllowDuplicateFieldNames = maCbAllowDuplicateFieldNames.IsChecked(); } // ----------------------------------------------------------------------------- @@ -628,6 +635,7 @@ IMPL_LINK( ImpPDFTabGeneralPage, TogglePagesHdl, void*, EMPTYARG ) IMPL_LINK( ImpPDFTabGeneralPage, ToggleExportFormFieldsHdl, void*, EMPTYARG ) { maLbFormsFormat.Enable( maCbExportFormFields.IsChecked() ); + maCbAllowDuplicateFieldNames.Enable( maCbExportFormFields.IsChecked() ); return 0; } @@ -680,6 +688,7 @@ IMPL_LINK( ImpPDFTabGeneralPage, ToggleExportPDFAHdl, void*, EMPTYARG ) sal_Bool bPDFA1Sel = maCbPDFA1b.IsChecked(); maFtFormsFormat.Enable( !bPDFA1Sel ); maLbFormsFormat.Enable( !bPDFA1Sel ); + maCbAllowDuplicateFieldNames.Enable( !bPDFA1Sel ); if(bPDFA1Sel) { //store the values of subordinate controls @@ -1165,6 +1174,7 @@ void ImpPDFTabSecurityPage::ImplPwdPushButton( const String & i_rDlgTitle, Strin aPwdDialog.SetMinLen( 0 ); aPwdDialog.ShowExtras( SHOWEXTRAS_CONFIRM ); aPwdDialog.SetText( i_rDlgTitle ); + aPwdDialog.AllowAsciiOnly(); if( aPwdDialog.Execute() == RET_OK ) //OK issued get password and set it io_rDestPassword = aPwdDialog.GetPassword(); enablePermissionControls(); diff --git a/filter/source/pdf/impdialog.hrc b/filter/source/pdf/impdialog.hrc index 23089f1419e9..91ff6a662ae3 100644 --- a/filter/source/pdf/impdialog.hrc +++ b/filter/source/pdf/impdialog.hrc @@ -83,10 +83,11 @@ #define CB_EXPORTFORMFIELDS 20 #define FT_FORMSFORMAT 21 #define LB_FORMSFORMAT 22 -#define CB_EXPORTEMPTYPAGES 23 -#define CB_ADDSTREAM 24 +#define CB_ALLOWDUPLICATEFIELDNAMES 23 +#define CB_EXPORTEMPTYPAGES 24 +#define CB_ADDSTREAM 25 -#define CB_PDFA_1B_SELECT 25 +#define CB_PDFA_1B_SELECT 26 #define FL_OLD_PAGES 51 #define RB_OLD_ALL 52 diff --git a/filter/source/pdf/impdialog.hxx b/filter/source/pdf/impdialog.hxx index 7ace316ac1eb..e1cb794cf4a3 100644 --- a/filter/source/pdf/impdialog.hxx +++ b/filter/source/pdf/impdialog.hxx @@ -103,6 +103,7 @@ protected: sal_Bool mbAddStream; sal_Int32 mnFormsType; sal_Bool mbExportFormFields; + sal_Bool mbAllowDuplicateFieldNames; sal_Bool mbExportBookmarks; sal_Int32 mnOpenBookmarkLevels; @@ -192,6 +193,7 @@ class ImpPDFTabGeneralPage : public SfxTabPage sal_Bool mbExportFormFieldsUserSelection; FixedText maFtFormsFormat; ListBox maLbFormsFormat; + CheckBox maCbAllowDuplicateFieldNames; CheckBox maCbExportBookmarks; CheckBox maCbExportNotes; diff --git a/filter/source/pdf/impdialog.src b/filter/source/pdf/impdialog.src index 00abf5b5ebd4..f47a6219c313 100644 --- a/filter/source/pdf/impdialog.src +++ b/filter/source/pdf/impdialog.src @@ -196,23 +196,30 @@ TabPage RID_PDF_TAB_GENER < "XML" ; > ; }; }; + CheckBox CB_ALLOWDUPLICATEFIELDNAMES + { + Pos = MAP_APPFONT( 30, 178 ); + Size = MAP_APPFONT( 128, 10 ); + TabStop = TRUE; + Text [ en-US ] = "Allow duplicate field ~names"; + }; CheckBox CB_EXPORTBOOKMARKS { - Pos = MAP_APPFONT ( 12 , 180 ) ; + Pos = MAP_APPFONT ( 12 , 190 ) ; Size = MAP_APPFONT ( 158 , 10 ) ; TabStop = TRUE ; Text[ en-US ] = "Export ~bookmarks"; }; CheckBox CB_EXPORTNOTES { - Pos = MAP_APPFONT ( 12 , 193 ) ; + Pos = MAP_APPFONT ( 12 , 203 ) ; Size = MAP_APPFONT ( 158 , 10 ) ; TabStop = TRUE ; Text[ en-US ] = "~Export comments"; }; CheckBox CB_EXPORTEMPTYPAGES { - Pos = MAP_APPFONT ( 12 , 206 ) ; + Pos = MAP_APPFONT ( 12 , 216 ) ; Size = MAP_APPFONT ( 158 , 16 ) ; TabStop = TRUE ; WordBreak = TRUE ; @@ -220,7 +227,7 @@ TabPage RID_PDF_TAB_GENER }; CheckBox CB_ADDSTREAM { - Pos = MAP_APPFONT ( 12 , 224 ) ; + Pos = MAP_APPFONT ( 12 , 235 ) ; Size = MAP_APPFONT ( 158 , 10 ) ; TabStop = TRUE ; Text[ en-US ] = "Create ~hybrid file"; diff --git a/filter/source/pdf/pdfdialog.cxx b/filter/source/pdf/pdfdialog.cxx index 78ee2f82dbc5..765741630ea9 100644 --- a/filter/source/pdf/pdfdialog.cxx +++ b/filter/source/pdf/pdfdialog.cxx @@ -35,7 +35,7 @@ #include "impdialog.hxx" #include <vcl/svapp.hxx> #include <vcl/dialog.hxx> -#include <svtools/solar.hrc> +#include <svl/solar.hrc> #include <com/sun/star/view/XRenderable.hpp> using namespace ::rtl; diff --git a/filter/source/pdf/pdfexport.cxx b/filter/source/pdf/pdfexport.cxx index deb7429e743a..ab746ff725e8 100644 --- a/filter/source/pdf/pdfexport.cxx +++ b/filter/source/pdf/pdfexport.cxx @@ -51,10 +51,10 @@ #include <unotools/processfactory.hxx> #include <svtools/FilterConfigItem.hxx> #include <svtools/filter.hxx> -#include <svtools/solar.hrc> +#include <svl/solar.hrc> #include <comphelper/string.hxx> -#include <svtools/saveopt.hxx> // only for testing of relative saving options in PDF +#include <unotools/saveopt.hxx> // only for testing of relative saving options in PDF #include <vcl/graphictools.hxx> #include <com/sun/star/beans/XPropertySet.hpp> @@ -131,6 +131,7 @@ PDFExport::PDFExport( const Reference< XComponent >& rxSrcDoc, Reference< task:: mnQuality ( 90 ), mnFormsFormat ( 0 ), mbExportFormFields ( sal_True ), + mbAllowDuplicateFieldNames ( sal_False ), mnProgressValue ( 0 ), mbRemoveTransparencies ( sal_False ), mbWatermark ( sal_False ), @@ -462,6 +463,8 @@ sal_Bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue rFilterData[ nData ].Value >>= mbExportFormFields; else if ( rFilterData[ nData ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "FormsType" ) ) ) rFilterData[ nData ].Value >>= mnFormsFormat; + else if ( rFilterData[ nData ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "AllowDuplicateFieldNames" ) ) ) + rFilterData[ nData ].Value >>= mbAllowDuplicateFieldNames; //viewer properties else if ( rFilterData[ nData ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "HideViewerToolbar" ) ) ) rFilterData[ nData ].Value >>= mbHideViewerToolbar; @@ -707,6 +710,7 @@ sal_Bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue aContext.SubmitFormat = PDFWriter::FDF; break; } + aContext.AllowDuplicateFieldNames = mbAllowDuplicateFieldNames; //get model Reference< frame::XModel > xModel( mxSrcDoc, UNO_QUERY ); @@ -1209,71 +1213,83 @@ sal_Bool PDFExport::ImplWriteActions( PDFWriter& rWriter, PDFExtOutDevData* pPDF const Size& rSize= pA->GetSize(); const Gradient& rTransparenceGradient = pA->GetGradient(); - const Size aDstSizeTwip( rDummyVDev.PixelToLogic( rDummyVDev.LogicToPixel( rSize ), MAP_TWIP ) ); - sal_Int32 nMaxBmpDPI = mbUseLosslessCompression ? 300 : 72; - if ( mbReduceImageResolution ) + // special case constant alpha value + if( rTransparenceGradient.GetStartColor() == rTransparenceGradient.GetEndColor() ) { - if ( nMaxBmpDPI > mnMaxImageResolution ) - nMaxBmpDPI = mnMaxImageResolution; + const Color aTransCol( rTransparenceGradient.GetStartColor() ); + const USHORT nTransPercent = aTransCol.GetLuminance() * 100 / 255; + rWriter.BeginTransparencyGroup(); + ImplWriteActions( rWriter, NULL, aTmpMtf, rDummyVDev ); + rWriter.EndTransparencyGroup( Rectangle( rPos, rSize ), nTransPercent ); } - const sal_Int32 nPixelX = (sal_Int32)((double)aDstSizeTwip.Width() * (double)nMaxBmpDPI / 1440.0); - const sal_Int32 nPixelY = (sal_Int32)((double)aDstSizeTwip.Height() * (double)nMaxBmpDPI / 1440.0); - if ( nPixelX && nPixelY ) + else { - Size aDstSizePixel( nPixelX, nPixelY ); - VirtualDevice* pVDev = new VirtualDevice; - if( pVDev->SetOutputSizePixel( aDstSizePixel ) ) + const Size aDstSizeTwip( rDummyVDev.PixelToLogic( rDummyVDev.LogicToPixel( rSize ), MAP_TWIP ) ); + sal_Int32 nMaxBmpDPI = mbUseLosslessCompression ? 300 : 72; + if ( mbReduceImageResolution ) { - Bitmap aPaint, aMask; - AlphaMask aAlpha; - Point aPoint; - - MapMode aMapMode( rDummyVDev.GetMapMode() ); - aMapMode.SetOrigin( aPoint ); - pVDev->SetMapMode( aMapMode ); - Size aDstSize( pVDev->PixelToLogic( aDstSizePixel ) ); - - Point aMtfOrigin( aTmpMtf.GetPrefMapMode().GetOrigin() ); - if ( aMtfOrigin.X() || aMtfOrigin.Y() ) - aTmpMtf.Move( -aMtfOrigin.X(), -aMtfOrigin.Y() ); - double fScaleX = (double)aDstSize.Width() / (double)aTmpMtf.GetPrefSize().Width(); - double fScaleY = (double)aDstSize.Height() / (double)aTmpMtf.GetPrefSize().Height(); - if( fScaleX != 1.0 || fScaleY != 1.0 ) - aTmpMtf.Scale( fScaleX, fScaleY ); - aTmpMtf.SetPrefMapMode( aMapMode ); - - // create paint bitmap - aTmpMtf.WindStart(); - aTmpMtf.Play( pVDev, aPoint, aDstSize ); - aTmpMtf.WindStart(); - - pVDev->EnableMapMode( FALSE ); - aPaint = pVDev->GetBitmap( aPoint, aDstSizePixel ); - pVDev->EnableMapMode( TRUE ); - - // create mask bitmap - pVDev->SetLineColor( COL_BLACK ); - pVDev->SetFillColor( COL_BLACK ); - pVDev->DrawRect( Rectangle( aPoint, aDstSize ) ); - pVDev->SetDrawMode( DRAWMODE_WHITELINE | DRAWMODE_WHITEFILL | DRAWMODE_WHITETEXT | - DRAWMODE_WHITEBITMAP | DRAWMODE_WHITEGRADIENT ); - aTmpMtf.WindStart(); - aTmpMtf.Play( pVDev, aPoint, aDstSize ); - aTmpMtf.WindStart(); - pVDev->EnableMapMode( FALSE ); - aMask = pVDev->GetBitmap( aPoint, aDstSizePixel ); - pVDev->EnableMapMode( TRUE ); - - // create alpha mask from gradient - pVDev->SetDrawMode( DRAWMODE_GRAYGRADIENT ); - pVDev->DrawGradient( Rectangle( aPoint, aDstSize ), rTransparenceGradient ); - pVDev->SetDrawMode( DRAWMODE_DEFAULT ); - pVDev->EnableMapMode( FALSE ); - pVDev->DrawMask( aPoint, aDstSizePixel, aMask, Color( COL_WHITE ) ); - aAlpha = pVDev->GetBitmap( aPoint, aDstSizePixel ); - ImplWriteBitmapEx( rWriter, rDummyVDev, rPos, rSize, BitmapEx( aPaint, aAlpha ) ); + if ( nMaxBmpDPI > mnMaxImageResolution ) + nMaxBmpDPI = mnMaxImageResolution; + } + const sal_Int32 nPixelX = (sal_Int32)((double)aDstSizeTwip.Width() * (double)nMaxBmpDPI / 1440.0); + const sal_Int32 nPixelY = (sal_Int32)((double)aDstSizeTwip.Height() * (double)nMaxBmpDPI / 1440.0); + if ( nPixelX && nPixelY ) + { + Size aDstSizePixel( nPixelX, nPixelY ); + VirtualDevice* pVDev = new VirtualDevice; + if( pVDev->SetOutputSizePixel( aDstSizePixel ) ) + { + Bitmap aPaint, aMask; + AlphaMask aAlpha; + Point aPoint; + + MapMode aMapMode( rDummyVDev.GetMapMode() ); + aMapMode.SetOrigin( aPoint ); + pVDev->SetMapMode( aMapMode ); + Size aDstSize( pVDev->PixelToLogic( aDstSizePixel ) ); + + Point aMtfOrigin( aTmpMtf.GetPrefMapMode().GetOrigin() ); + if ( aMtfOrigin.X() || aMtfOrigin.Y() ) + aTmpMtf.Move( -aMtfOrigin.X(), -aMtfOrigin.Y() ); + double fScaleX = (double)aDstSize.Width() / (double)aTmpMtf.GetPrefSize().Width(); + double fScaleY = (double)aDstSize.Height() / (double)aTmpMtf.GetPrefSize().Height(); + if( fScaleX != 1.0 || fScaleY != 1.0 ) + aTmpMtf.Scale( fScaleX, fScaleY ); + aTmpMtf.SetPrefMapMode( aMapMode ); + + // create paint bitmap + aTmpMtf.WindStart(); + aTmpMtf.Play( pVDev, aPoint, aDstSize ); + aTmpMtf.WindStart(); + + pVDev->EnableMapMode( FALSE ); + aPaint = pVDev->GetBitmap( aPoint, aDstSizePixel ); + pVDev->EnableMapMode( TRUE ); + + // create mask bitmap + pVDev->SetLineColor( COL_BLACK ); + pVDev->SetFillColor( COL_BLACK ); + pVDev->DrawRect( Rectangle( aPoint, aDstSize ) ); + pVDev->SetDrawMode( DRAWMODE_WHITELINE | DRAWMODE_WHITEFILL | DRAWMODE_WHITETEXT | + DRAWMODE_WHITEBITMAP | DRAWMODE_WHITEGRADIENT ); + aTmpMtf.WindStart(); + aTmpMtf.Play( pVDev, aPoint, aDstSize ); + aTmpMtf.WindStart(); + pVDev->EnableMapMode( FALSE ); + aMask = pVDev->GetBitmap( aPoint, aDstSizePixel ); + pVDev->EnableMapMode( TRUE ); + + // create alpha mask from gradient + pVDev->SetDrawMode( DRAWMODE_GRAYGRADIENT ); + pVDev->DrawGradient( Rectangle( aPoint, aDstSize ), rTransparenceGradient ); + pVDev->SetDrawMode( DRAWMODE_DEFAULT ); + pVDev->EnableMapMode( FALSE ); + pVDev->DrawMask( aPoint, aDstSizePixel, aMask, Color( COL_WHITE ) ); + aAlpha = pVDev->GetBitmap( aPoint, aDstSizePixel ); + ImplWriteBitmapEx( rWriter, rDummyVDev, rPos, rSize, BitmapEx( aPaint, aAlpha ) ); + } + delete pVDev; } - delete pVDev; } } break; @@ -1349,7 +1365,6 @@ sal_Bool PDFExport::ImplWriteActions( PDFWriter& rWriter, PDFExtOutDevData* pPDF PolyPolygon aEndArrow; double fTransparency( aStroke.getTransparency() ); double fStrokeWidth( aStroke.getStrokeWidth() ); - SvtGraphicStroke::JoinType eJT( aStroke.getJoinType() ); SvtGraphicStroke::DashArray aDashArray; aStroke.getStartArrow( aStartArrow ); @@ -1359,8 +1374,6 @@ sal_Bool PDFExport::ImplWriteActions( PDFWriter& rWriter, PDFExtOutDevData* pPDF bSkipSequence = sal_True; if ( aStartArrow.Count() || aEndArrow.Count() ) bSkipSequence = sal_False; - if ( (sal_uInt32)eJT > 2 ) - bSkipSequence = sal_False; if ( aDashArray.size() && ( fStrokeWidth != 0.0 ) && ( fTransparency == 0.0 ) ) bSkipSequence = sal_False; if ( bSkipSequence ) @@ -1388,7 +1401,40 @@ sal_Bool PDFExport::ImplWriteActions( PDFWriter& rWriter, PDFExtOutDevData* pPDF break; } aInfo.m_aDashArray = aDashArray; - rWriter.DrawPolyLine( aPath, aInfo ); + + if(SvtGraphicStroke::joinNone == aStroke.getJoinType() + && fStrokeWidth > 0.0) + { + // emulate no edge rounding by handling single edges + const sal_uInt16 nPoints(aPath.GetSize()); + const bool bCurve(aPath.HasFlags()); + + for(sal_uInt16 a(0); a + 1 < nPoints; a++) + { + if(bCurve + && POLY_NORMAL != aPath.GetFlags(a + 1) + && a + 2 < nPoints + && POLY_NORMAL != aPath.GetFlags(a + 2) + && a + 3 < nPoints) + { + const Polygon aSnippet(4, + aPath.GetConstPointAry() + a, + aPath.GetConstFlagAry() + a); + rWriter.DrawPolyLine( aSnippet, aInfo ); + a += 2; + } + else + { + const Polygon aSnippet(2, + aPath.GetConstPointAry() + a); + rWriter.DrawPolyLine( aSnippet, aInfo ); + } + } + } + else + { + rWriter.DrawPolyLine( aPath, aInfo ); + } } } else if ( pA->GetComment().Equals( "XPATHFILL_SEQ_BEGIN" ) ) diff --git a/filter/source/pdf/pdfexport.hxx b/filter/source/pdf/pdfexport.hxx index 1d61a8fe8d86..cfe70a4ff0af 100644 --- a/filter/source/pdf/pdfexport.hxx +++ b/filter/source/pdf/pdfexport.hxx @@ -77,6 +77,7 @@ private: sal_Int32 mnQuality; sal_Int32 mnFormsFormat; sal_Bool mbExportFormFields; + sal_Bool mbAllowDuplicateFieldNames; sal_Int32 mnProgressValue; sal_Bool mbRemoveTransparencies; diff --git a/filter/source/pdf/pdffilter.cxx b/filter/source/pdf/pdffilter.cxx index eea108d39187..631b90021ea5 100644 --- a/filter/source/pdf/pdffilter.cxx +++ b/filter/source/pdf/pdffilter.cxx @@ -35,7 +35,7 @@ #include "pdfexport.hxx" #include <vcl/svapp.hxx> #include <vcl/window.hxx> -#include <svtools/outstrm.hxx> +#include <svl/outstrm.hxx> #include <svtools/FilterConfigItem.hxx> // ------------- |