summaryrefslogtreecommitdiff
path: root/sd/source/ui/tools/IconCache.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/tools/IconCache.cxx')
-rw-r--r--sd/source/ui/tools/IconCache.cxx133
1 files changed, 133 insertions, 0 deletions
diff --git a/sd/source/ui/tools/IconCache.cxx b/sd/source/ui/tools/IconCache.cxx
new file mode 100644
index 000000000000..12e7b6b52e95
--- /dev/null
+++ b/sd/source/ui/tools/IconCache.cxx
@@ -0,0 +1,133 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+#include "tools/IconCache.hxx"
+
+#include "sdresid.hxx"
+#include <hash_map>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+
+namespace sd {
+
+//===== IconCache::Implementation =============================================
+
+class IconCache::Implementation
+{
+private:
+ friend class IconCache;
+
+ /** This pointer holds a valid reference from first time that
+ IconCache::Instance() is called to the end of the sd module when the
+ cache is destroyed from SdGlobalResourceContainer.
+ */
+ static IconCache* mpInstance;
+
+ typedef ::std::hash_map<USHORT,Image> ImageContainer;
+ ImageContainer maContainer;
+
+ Image GetIcon (USHORT nResourceId);
+};
+
+IconCache* IconCache::Implementation::mpInstance = NULL;
+
+
+
+Image IconCache::Implementation::GetIcon (USHORT nResourceId)
+{
+ Image aResult;
+ ImageContainer::iterator iImage;
+ iImage = maContainer.find (nResourceId);
+ if (iImage == maContainer.end())
+ {
+ aResult = Image(BitmapEx(SdResId(nResourceId)));
+ maContainer[nResourceId] = aResult;
+ }
+ else
+ aResult = iImage->second;
+ return aResult;
+}
+
+
+
+
+//===== IconCache =============================================================
+
+//static
+IconCache& IconCache::Instance (void)
+{
+ if (Implementation::mpInstance == NULL)
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard (aMutexFunctor());
+ if (Implementation::mpInstance == NULL)
+ {
+ IconCache* pCache = new IconCache ();
+ SdGlobalResourceContainer::Instance().AddResource (
+ ::std::auto_ptr<SdGlobalResource>(pCache));
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ Implementation::mpInstance = pCache;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+
+ DBG_ASSERT(Implementation::mpInstance!=NULL,
+ "IconCache::Instance(): instance is NULL");
+ return *Implementation::mpInstance;
+}
+
+
+
+
+Image IconCache::GetIcon (USHORT nResourceId)
+{
+ return mpImpl->GetIcon (nResourceId);
+}
+
+
+
+
+IconCache::IconCache (void)
+ : mpImpl (new Implementation())
+{
+}
+
+
+
+
+IconCache::~IconCache (void)
+{
+ // empty
+}
+
+} // end of namespace sd