/**
 * $Id$
 * $Revision$
 * $Author$
 * $Date$
 *
 * This file is part of The iWear Framework.
 * In particular this file is part of the Framework Output
 *
 * The iWear Framework is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by the
 * Free Software Foundation as in version 2 of the License.

 * 
 * The iWear Framework 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 General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * The iWear Framework; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __MENUTHREADEDFUNCTOR_H
#define __MENUTHREADEDFUNCTOR_H

// Standard includes
#include <string>

// iWear includes
#ifndef __FUNCTOR_H
#include <iwear/functor.h>
#endif

#ifndef __UID_H
#include <iwear/uid.h>
#endif

#ifndef __ATOMICCOUNTER_H
#include <iwear/atomiccounter.h>
#endif

#include <iwear/debugstream.h>
#include <iwear_uiservices/menufunctor.h>
namespace iwear {
namespace uiservices {

class MenuThreadedFunctor : public VoidFunctor {

public:

    MenuThreadedFunctor(MenuFunctor& functor, 
			AtomicCounter<uint32_t>& counter);
    
    virtual ~MenuThreadedFunctor(void);

    virtual void operator()(){
	// since this functor will be executed in a thread we need to ensure
	// that the counter is > 0 as long as operator() of member functor is
	// not finished!
	++counter;
//	d_dbg << ANSI_YELLOW << __FL__ << "\n\tcalling functor with counter " 
//	      << &counter << " with value " << counter << ANSI_NORMAL << endl;
	functor();
	--counter;	
	delete this;
//	d_dbg << ANSI_YELLOW << __FL__ << "\n\tFINISHED calling functor with counter " 
//	      << &counter << " with value " << counter << ANSI_NORMAL << endl;
    }

private:
    MenuFunctor& functor;
    AtomicCounter<uint32_t>& counter;
};

} // namespace uiservices
} // namespace iwear

#endif // __MENUTHREADEDFUNCTOR_H

