Use shared_ptr for OpenGLPrograms, and hide its copy constructor.

Change-Id: Ia1352105acef1ededaf876a224ebc277121d6942
diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index 80f785f..d2216e4 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -274,7 +274,7 @@ private:
        OUString fragmentShader;
        OString preamble;
    };
    boost::ptr_map<ProgramKey, OpenGLProgram> maPrograms;
    std::map<ProgramKey, boost::shared_ptr<OpenGLProgram> > maPrograms;
    OpenGLProgram* mpCurrentProgram;
#ifdef DBG_UTIL
    std::set<SalGraphicsImpl*> maParents;
diff --git a/vcl/inc/opengl/program.hxx b/vcl/inc/opengl/program.hxx
index 8b42dd4..438d7e3 100644
--- a/vcl/inc/opengl/program.hxx
+++ b/vcl/inc/opengl/program.hxx
@@ -39,6 +39,7 @@ private:
    TextureList     maTextures;
    bool            mbBlending;

    OpenGLProgram(const OpenGLProgram &notImplemented);
public:
    OpenGLProgram();
    ~OpenGLProgram();
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index a619f93..8d298a4 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -13,6 +13,7 @@
#include <vcl/sysdata.hxx>

#include <boost/scoped_array.hpp>
#include <boost/make_shared.hpp>
#include <vcl/pngwrite.hxx>
#include <vcl/bmpacc.hxx>
#include <vcl/graph.hxx>
@@ -1587,20 +1588,17 @@ OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const O
{
    ProgramKey aKey( rVertexShader, rFragmentShader, preamble );

    boost::ptr_map<ProgramKey, OpenGLProgram>::iterator
    std::map< ProgramKey, boost::shared_ptr<OpenGLProgram> >::iterator
        it = maPrograms.find( aKey );
    if( it != maPrograms.end() )
        return it->second;
        return it->second.get();

    OpenGLProgram* pProgram = new OpenGLProgram;
    boost::shared_ptr<OpenGLProgram> pProgram = boost::make_shared<OpenGLProgram>();
    if( !pProgram->Load( rVertexShader, rFragmentShader, preamble ) )
    {
        delete pProgram;
        return NULL;
    }

    maPrograms.insert(aKey, pProgram);
    return pProgram;
    maPrograms.insert(std::pair<ProgramKey, boost::shared_ptr<OpenGLProgram> >(aKey, pProgram));
    return pProgram.get();
}

OpenGLProgram* OpenGLContext::UseProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble )