summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-01-05 14:09:17 +0000
committerCaolán McNamara <caolanm@redhat.com>2017-01-05 15:00:54 +0000
commit3cd39b91f872ca32b09a362de2cb0efaf0e2ba3b (patch)
tree43cdb5f4e075c00eb6b63648ed825a1281192e8e /framework
parent4f5cd607e30633ca51263c2f45c4753e8990302f (diff)
move ImageList to framework
this can probably be replaced by a std::*map<Image> Change-Id: Ic36c5f406f5ea51cb9ff135858e319e0877179c7
Diffstat (limited to 'framework')
-rw-r--r--framework/Library_fwk.mk3
-rw-r--r--framework/source/uiconfiguration/ImageArrayData.cxx91
-rw-r--r--framework/source/uiconfiguration/ImageList.cxx317
-rw-r--r--framework/source/uiconfiguration/ImplImageList.cxx73
-rw-r--r--framework/source/uiconfiguration/image.h67
5 files changed, 551 insertions, 0 deletions
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index 1eaf49756fb0..f5b8f23fe978 100644
--- a/framework/Library_fwk.mk
+++ b/framework/Library_fwk.mk
@@ -114,6 +114,9 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\
framework/source/services/taskcreatorsrv \
framework/source/services/urltransformer \
framework/source/uiconfiguration/CommandImageResolver \
+ framework/source/uiconfiguration/ImageArrayData \
+ framework/source/uiconfiguration/ImageList \
+ framework/source/uiconfiguration/ImplImageList \
framework/source/uiconfiguration/globalsettings \
framework/source/uiconfiguration/graphicnameaccess \
framework/source/uiconfiguration/imagemanager \
diff --git a/framework/source/uiconfiguration/ImageArrayData.cxx b/framework/source/uiconfiguration/ImageArrayData.cxx
new file mode 100644
index 000000000000..6ebfc0928fdf
--- /dev/null
+++ b/framework/source/uiconfiguration/ImageArrayData.cxx
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <vcl/outdev.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/alpha.hxx>
+#include <vcl/window.hxx>
+#include <vcl/bitmapaccess.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/image.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/ImageTree.hxx>
+
+#include <image.h>
+#include <memory>
+
+#if OSL_DEBUG_LEVEL > 0
+#include <rtl/strbuf.hxx>
+#endif
+
+ImageAryData::ImageAryData( const ImageAryData& rData ) :
+ maName( rData.maName ),
+ mnId( rData.mnId ),
+ maBitmapEx( rData.maBitmapEx )
+{
+}
+
+ImageAryData::ImageAryData( const OUString &aName,
+ sal_uInt16 nId, const BitmapEx &aBitmap )
+ : maName( aName ), mnId( nId ), maBitmapEx( aBitmap )
+{
+}
+
+ImageAryData::~ImageAryData()
+{
+}
+
+ImageAryData& ImageAryData::operator=( const ImageAryData& rData )
+{
+ maName = rData.maName;
+ mnId = rData.mnId;
+ maBitmapEx = rData.maBitmapEx;
+
+ return *this;
+}
+
+void ImageAryData::Load(const OUString &rPrefix)
+{
+ OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme();
+
+ OUString aFileName = rPrefix;
+ aFileName += maName;
+
+ bool bSuccess = ImageTree::get().loadImage(aFileName, aIconTheme, maBitmapEx, true);
+
+ if (bSuccess)
+ {}
+#if OSL_DEBUG_LEVEL > 0
+ else
+ {
+ OStringBuffer aMessage;
+ aMessage.append( "ImageAryData::Load: failed to load image '" );
+ aMessage.append( OUStringToOString( aFileName, RTL_TEXTENCODING_UTF8 ).getStr() );
+ aMessage.append( "'" );
+ aMessage.append( " from icon theme '" );
+ aMessage.append( OUStringToOString( aIconTheme, RTL_TEXTENCODING_UTF8 ).getStr() );
+ aMessage.append( "'" );
+ OSL_FAIL( aMessage.makeStringAndClear().getStr() );
+ }
+#endif
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uiconfiguration/ImageList.cxx b/framework/source/uiconfiguration/ImageList.cxx
new file mode 100644
index 000000000000..6610c51c3216
--- /dev/null
+++ b/framework/source/uiconfiguration/ImageList.cxx
@@ -0,0 +1,317 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <osl/file.hxx>
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <tools/rc.h>
+#include <tools/rc.hxx>
+#include <tools/resmgr.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/image.hxx>
+#include <vcl/imagerepository.hxx>
+#include <vcl/ImageTree.hxx>
+#include <image.h>
+
+ImageList::ImageList()
+{
+}
+
+ImageList::ImageList(const std::vector< OUString >& rNameVector,
+ const OUString& rPrefix)
+{
+ SAL_INFO( "vcl", "vcl: ImageList::ImageList(const vector< OUString >& ..." );
+
+ ImplInit( sal::static_int_cast< sal_uInt16 >( rNameVector.size() ), Size() );
+
+ mpImplData->maPrefix = rPrefix;
+ for( size_t i = 0; i < rNameVector.size(); ++i )
+ {
+ mpImplData->AddImage( rNameVector[ i ], static_cast< sal_uInt16 >( i ) + 1, BitmapEx() );
+ }
+}
+
+void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize )
+{
+ mpImplData.reset(new ImplImageList);
+ mpImplData->maImages.reserve( nItems );
+ mpImplData->maImageSize = rSize;
+}
+
+// FIXME: Rather a performance hazard
+BitmapEx ImageList::GetAsHorizontalStrip() const
+{
+ Size aSize( mpImplData->maImageSize );
+ sal_uInt16 nCount = GetImageCount();
+ if( !nCount )
+ return BitmapEx();
+ aSize.Width() *= nCount;
+
+ // Load any stragglers
+ for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
+ {
+ ImageAryData *pData = mpImplData->maImages[ nIdx ];
+ if( pData->IsLoadable() )
+ pData->Load( mpImplData->maPrefix );
+ }
+
+ BitmapEx aTempl = mpImplData->maImages[ 0 ]->maBitmapEx;
+ BitmapEx aResult;
+ Bitmap aPixels( aSize, aTempl.GetBitmap().GetBitCount() );
+ if( aTempl.IsAlpha() )
+ aResult = BitmapEx( aPixels, AlphaMask( aSize ) );
+ else if( aTempl.IsTransparent() )
+ aResult = BitmapEx( aPixels, Bitmap( aSize, aTempl.GetMask().GetBitCount() ) );
+ else
+ aResult = BitmapEx( aPixels );
+
+ Rectangle aSrcRect( Point( 0, 0 ), mpImplData->maImageSize );
+ for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
+ {
+ Rectangle aDestRect( Point( nIdx * mpImplData->maImageSize.Width(), 0 ),
+ mpImplData->maImageSize );
+ ImageAryData *pData = mpImplData->maImages[ nIdx ];
+ aResult.CopyPixel( aDestRect, aSrcRect, &pData->maBitmapEx);
+ }
+
+ return aResult;
+}
+
+void ImageList::InsertFromHorizontalStrip( const BitmapEx &rBitmapEx,
+ const std::vector< OUString > &rNameVector )
+{
+ sal_uInt16 nItems = sal::static_int_cast< sal_uInt16 >( rNameVector.size() );
+
+ if (!nItems)
+ return;
+
+ Size aSize( rBitmapEx.GetSizePixel() );
+ DBG_ASSERT (rBitmapEx.GetSizePixel().Width() % nItems == 0,
+ "ImageList::InsertFromHorizontalStrip - very odd size");
+ aSize.Width() /= nItems;
+ ImplInit( nItems, aSize );
+
+ for (sal_uInt16 nIdx = 0; nIdx < nItems; nIdx++)
+ {
+ BitmapEx aBitmap( rBitmapEx, Point( nIdx * aSize.Width(), 0 ), aSize );
+ mpImplData->AddImage( rNameVector[ nIdx ], nIdx + 1, aBitmap );
+ }
+}
+
+sal_uInt16 ImageList::ImplGetImageId( const OUString& rImageName ) const
+{
+ ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
+ if( pImg )
+ return pImg->mnId;
+ else
+ return 0;
+}
+
+void ImageList::AddImage( const OUString& rImageName, const Image& rImage )
+{
+ SAL_WARN_IF( GetImagePos( rImageName ) != IMAGELIST_IMAGE_NOTFOUND, "vcl", "ImageList::AddImage() - ImageName already exists" );
+
+ if( !mpImplData )
+ ImplInit( 0, rImage.GetSizePixel() );
+
+ mpImplData->AddImage( rImageName, GetImageCount() + 1,
+ rImage.GetBitmapEx() );
+}
+
+void ImageList::ReplaceImage( const OUString& rImageName, const Image& rImage )
+{
+ const sal_uInt16 nId = ImplGetImageId( rImageName );
+
+ if( nId )
+ {
+ //Just replace the bitmap rather than doing RemoveImage / AddImage
+ //which breaks index-based iteration.
+ ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
+ pImg->maBitmapEx = rImage.GetBitmapEx();
+ }
+}
+
+void ImageList::RemoveImage( sal_uInt16 nId )
+{
+ for( size_t i = 0; i < mpImplData->maImages.size(); ++i )
+ {
+ if( mpImplData->maImages[ i ]->mnId == nId )
+ {
+ mpImplData->RemoveImage( static_cast< sal_uInt16 >( i ) );
+ break;
+ }
+ }
+}
+
+Image ImageList::GetImage( sal_uInt16 nId ) const
+{
+ Image aRet;
+
+ if (mpImplData)
+ {
+ for (ImageAryData* pImageData : mpImplData->maImages)
+ {
+ if (pImageData->mnId == nId)
+ {
+ if (pImageData->IsLoadable())
+ pImageData->Load(mpImplData->maPrefix);
+ aRet = Image(pImageData->maBitmapEx);
+ }
+ }
+ }
+
+ if (!aRet)
+ {
+ BitmapEx rBitmap;
+ bool bResult = vcl::ImageRepository::loadDefaultImage(rBitmap);
+ if (bResult)
+ aRet = Image(rBitmap);
+ }
+
+ return aRet;
+}
+
+Image ImageList::GetImage( const OUString& rImageName ) const
+{
+ if( mpImplData )
+ {
+ ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
+
+ if( pImg )
+ {
+ if( pImg->IsLoadable() )
+ pImg->Load( mpImplData->maPrefix );
+ return Image( pImg->maBitmapEx );
+ }
+ }
+
+ return Image();
+}
+
+sal_uInt16 ImageList::GetImageCount() const
+{
+ return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0;
+}
+
+sal_uInt16 ImageList::GetImagePos( sal_uInt16 nId ) const
+{
+
+ if( mpImplData && nId )
+ {
+ for( size_t i = 0; i < mpImplData->maImages.size(); ++i )
+ {
+ if (mpImplData->maImages[ i ]->mnId == nId)
+ return static_cast< sal_uInt16 >( i );
+ }
+ }
+
+ return IMAGELIST_IMAGE_NOTFOUND;
+}
+
+bool ImageList::HasImageForId( sal_uInt16 nId ) const
+{
+ return GetImagePos( nId ) != IMAGELIST_IMAGE_NOTFOUND;
+}
+
+sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const
+{
+ if( mpImplData && !rImageName.isEmpty() )
+ {
+ for( size_t i = 0; i < mpImplData->maImages.size(); i++ )
+ {
+ if (mpImplData->maImages[i]->maName == rImageName)
+ return static_cast< sal_uInt16 >( i );
+ }
+ }
+
+ return IMAGELIST_IMAGE_NOTFOUND;
+}
+
+sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const
+{
+ if( mpImplData && (nPos < GetImageCount()) )
+ return mpImplData->maImages[ nPos ]->mnId;
+
+ return 0;
+}
+
+OUString ImageList::GetImageName( sal_uInt16 nPos ) const
+{
+ if( mpImplData && (nPos < GetImageCount()) )
+ return mpImplData->maImages[ nPos ]->maName;
+
+ return OUString();
+}
+
+void ImageList::GetImageNames( std::vector< OUString >& rNames ) const
+{
+ SAL_INFO( "vcl", "vcl: ImageList::GetImageNames" );
+
+ rNames = std::vector< OUString >();
+
+ if( mpImplData )
+ {
+ for(const ImageAryData* pImage : mpImplData->maImages)
+ {
+ const OUString& rName( pImage->maName );
+ if( !rName.isEmpty())
+ rNames.push_back( rName );
+ }
+ }
+}
+
+Size ImageList::GetImageSize() const
+{
+ Size aRet;
+
+ if( mpImplData )
+ {
+ aRet = mpImplData->maImageSize;
+
+ // force load of 1st image to see - uncommon case.
+ if( aRet.Width() == 0 && aRet.Height() == 0 &&
+ !mpImplData->maImages.empty() )
+ {
+ Image aTmp = GetImage( mpImplData->maImages[ 0 ]->mnId );
+ aRet = mpImplData->maImageSize = aTmp.GetSizePixel();
+ }
+ }
+ return aRet;
+}
+
+bool ImageList::operator==( const ImageList& rImageList ) const
+{
+ bool bRet = false;
+
+ if( rImageList.mpImplData == mpImplData )
+ bRet = true;
+ else if( !rImageList.mpImplData || !mpImplData )
+ bRet = false;
+ else if( rImageList.GetImageCount() == GetImageCount() &&
+ rImageList.mpImplData->maImageSize == mpImplData->maImageSize )
+ bRet = true; // strange semantic
+
+ return bRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uiconfiguration/ImplImageList.cxx b/framework/source/uiconfiguration/ImplImageList.cxx
new file mode 100644
index 000000000000..f1a0d94973c8
--- /dev/null
+++ b/framework/source/uiconfiguration/ImplImageList.cxx
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <vcl/outdev.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/alpha.hxx>
+#include <vcl/window.hxx>
+#include <vcl/bitmapaccess.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/image.hxx>
+#include <vcl/settings.hxx>
+
+#include <image.h>
+#include <memory>
+
+ImplImageList::ImplImageList()
+{
+}
+
+ImplImageList::ImplImageList( const ImplImageList &aSrc )
+ : maPrefix(aSrc.maPrefix)
+ , maImageSize(aSrc.maImageSize)
+{
+ maImages.reserve( aSrc.maImages.size() );
+ for ( std::vector<ImageAryData *>::const_iterator aIt = aSrc.maImages.begin(), aEnd = aSrc.maImages.end(); aIt != aEnd; ++aIt )
+ {
+ ImageAryData* pAryData = new ImageAryData( **aIt );
+ maImages.push_back( pAryData );
+ if( !pAryData->maName.isEmpty() )
+ maNameHash [ pAryData->maName ] = pAryData;
+ }
+}
+
+ImplImageList::~ImplImageList()
+{
+ for ( std::vector<ImageAryData *>::iterator aIt = maImages.begin(), aEnd = maImages.end(); aIt != aEnd; ++aIt )
+ delete *aIt;
+}
+
+void ImplImageList::AddImage( const OUString &aName,
+ sal_uInt16 nId, const BitmapEx &aBitmapEx )
+{
+ ImageAryData *pImg = new ImageAryData( aName, nId, aBitmapEx );
+ maImages.push_back( pImg );
+ if( !aName.isEmpty() )
+ maNameHash [ aName ] = pImg;
+}
+
+void ImplImageList::RemoveImage( sal_uInt16 nPos )
+{
+ ImageAryData *pImg = maImages[ nPos ];
+ if( !pImg->maName.isEmpty() )
+ maNameHash.erase( pImg->maName );
+ maImages.erase( maImages.begin() + nPos );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uiconfiguration/image.h b/framework/source/uiconfiguration/image.h
new file mode 100644
index 000000000000..9b0542f1462f
--- /dev/null
+++ b/framework/source/uiconfiguration/image.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef FRAMEWORK_SOURCE_UICONFIGURATION_IMAGE_H
+#define FRAMEWORK_SOURCE_UICONFIGURATION_IMAGE_H
+
+#include <vcl/bitmapex.hxx>
+
+#include <unordered_map>
+#include <vector>
+
+struct ImageAryData
+{
+ OUString maName;
+ // Images identified by either name, or by id
+ sal_uInt16 mnId;
+ BitmapEx maBitmapEx;
+
+ ImageAryData( const OUString &aName,
+ sal_uInt16 nId, const BitmapEx &aBitmap );
+ ImageAryData( const ImageAryData& rData );
+ ~ImageAryData();
+
+ bool IsLoadable() { return maBitmapEx.IsEmpty() && !maName.isEmpty(); }
+ void Load(const OUString &rPrefix);
+
+ ImageAryData& operator=( const ImageAryData& rData );
+};
+
+struct ImplImageList
+{
+ typedef std::unordered_map< OUString, ImageAryData *, OUStringHash >
+ ImageAryDataNameHash;
+
+ std::vector<ImageAryData *> maImages;
+ ImageAryDataNameHash maNameHash;
+ OUString maPrefix;
+ Size maImageSize;
+
+ ImplImageList();
+ ImplImageList( const ImplImageList &aSrc );
+ ~ImplImageList();
+
+ void AddImage( const OUString &aName,
+ sal_uInt16 nId, const BitmapEx &aBitmapEx );
+ void RemoveImage( sal_uInt16 nPos );
+};
+
+#endif // INCLUDED_VCL_INC_IMAGE_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */