summaryrefslogtreecommitdiff
path: root/svx/source/core/graphichelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/core/graphichelper.cxx')
-rw-r--r--svx/source/core/graphichelper.cxx178
1 files changed, 178 insertions, 0 deletions
diff --git a/svx/source/core/graphichelper.cxx b/svx/source/core/graphichelper.cxx
new file mode 100644
index 000000000000..faec3b27970d
--- /dev/null
+++ b/svx/source/core/graphichelper.cxx
@@ -0,0 +1,178 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <tools/string.hxx>
+#include <svx/graphichelper.hxx>
+#include <unotools/pathoptions.hxx>
+#include <svtools/filter.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/xoutbmp.hxx>
+#include <sfx2/filedlghelper.hxx>
+
+#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
+#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::sfx2;
+
+void GraphicHelper::GetPreferedExtension( String &rExtension, const Graphic &rGraphic )
+{
+ // propose the "best" filter using the native-info, if applicable
+ const sal_Char* pExtension = "png";
+ switch( const_cast<Graphic&>( rGraphic ).GetLink().GetType() )
+ {
+ case GFX_LINK_TYPE_NATIVE_GIF:
+ pExtension = "gif";
+ break;
+ case GFX_LINK_TYPE_NATIVE_TIF:
+ pExtension = "tif";
+ break;
+ case GFX_LINK_TYPE_NATIVE_WMF:
+ pExtension = "wmf";
+ break;
+ case GFX_LINK_TYPE_NATIVE_MET:
+ pExtension = "met";
+ break;
+ case GFX_LINK_TYPE_NATIVE_PCT:
+ pExtension = "pct";
+ break;
+ case GFX_LINK_TYPE_NATIVE_JPG:
+ pExtension = "jpg";
+ break;
+ default:
+ break;
+ }
+ rExtension.AssignAscii( pExtension );
+}
+
+String GraphicHelper::ExportGraphic( const Graphic &rGraphic, const String &rGrfName )
+{
+ SvtPathOptions aPathOpt;
+ String sGrfPath( aPathOpt.GetGraphicPath() );
+
+ FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION, 0 );
+ Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
+
+ INetURLObject aPath;
+ aPath.SetSmartURL( sGrfPath );
+
+ // fish out the graphic's name
+ String aName = rGrfName;
+ printf("Name: %s\n", aName.GetBuffer());
+
+ //aDlgHelper.SetTitle( SW_RESSTR(STR_EXPORT_GRAFIK_TITLE));
+ aDlgHelper.SetTitle( String("Title") );
+ aDlgHelper.SetDisplayDirectory( aPath.GetMainURL(INetURLObject::DECODE_TO_IURI) );
+ INetURLObject aURL;
+ aURL.SetSmartURL( aName );
+ aDlgHelper.SetFileName( aURL.GetName() );
+
+ GraphicFilter& rGF = GraphicFilter::GetGraphicFilter();
+ const sal_uInt16 nCount = rGF.GetExportFormatCount();
+
+ String aExt( aURL.GetExtension() );
+ if( !aExt.Len() )
+ GetPreferedExtension( aExt, rGraphic );
+
+ aExt.ToLowerAscii();
+ sal_uInt16 nDfltFilter = USHRT_MAX;
+
+ Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
+
+ for ( sal_uInt16 i = 0; i < nCount; i++ )
+ {
+ xFltMgr->appendFilter( rGF.GetExportFormatName( i ), rGF.GetExportWildcard( i ) );
+ if ( COMPARE_EQUAL == aExt.CompareIgnoreCaseToAscii(rGF.GetExportFormatShortName( i ).ToLowerAscii() ))
+ nDfltFilter = i;
+ }
+ if ( USHRT_MAX == nDfltFilter )
+ {
+ // "wrong" extension?
+ GetPreferedExtension( aExt, rGraphic );
+ for ( sal_uInt16 i = 0; i < nCount; ++i )
+ if ( aExt == rGF.GetExportFormatShortName( i ).ToLowerAscii() )
+ {
+ nDfltFilter = i;
+ break;
+ }
+ }
+
+ if( USHRT_MAX != nDfltFilter )
+ {
+ xFltMgr->setCurrentFilter( rGF.GetExportFormatName( nDfltFilter ) ) ;
+
+ if( aDlgHelper.Execute() == ERRCODE_NONE )
+ {
+ String sPath( xFP->getFiles().getConstArray()[0] );
+ // remember used path - please don't optimize away!
+ aPath.SetSmartURL( sPath);
+ sGrfPath = aPath.GetPath();
+
+ if( rGrfName.Len() &&
+ nDfltFilter == rGF.GetExportFormatNumber( xFltMgr->getCurrentFilter()))
+ {
+ // try to save the original graphic
+ SfxMedium aIn( rGrfName, STREAM_READ | STREAM_NOCREATE );
+ if( aIn.GetInStream() && !aIn.GetInStream()->GetError() )
+ {
+ SfxMedium aOut( sPath, STREAM_WRITE | STREAM_SHARE_DENYNONE);
+ if( aOut.GetOutStream() && !aOut.GetOutStream()->GetError())
+ {
+ *aOut.GetOutStream() << *aIn.GetInStream();
+ if ( 0 == aIn.GetError() )
+ {
+ aOut.Close();
+ aOut.Commit();
+ if ( 0 == aOut.GetError() )
+ return sPath;
+ }
+ }
+ }
+ }
+
+ sal_uInt16 nFilter;
+ if ( !xFltMgr->getCurrentFilter().isEmpty() && rGF.GetExportFormatCount() )
+ nFilter = rGF.GetExportFormatNumber( xFltMgr->getCurrentFilter() );
+ else
+ nFilter = GRFILTER_FORMAT_DONTKNOW;
+ String aFilter( rGF.GetExportFormatShortName( nFilter ) );
+ XOutBitmap::WriteGraphic( rGraphic, sPath, aFilter,
+ XOUTBMP_DONT_EXPAND_FILENAME|
+ XOUTBMP_DONT_ADD_EXTENSION|
+ XOUTBMP_USE_NATIVE_IF_POSSIBLE );
+ return sPath;
+ }
+ }
+ return String();
+}
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */