remove singleton inheritation. 50/67850/1
authorHermet Park <hermet@hermet.pe.kr>
Thu, 28 Apr 2016 14:28:55 +0000 (23:28 +0900)
committerHermet Park <hermet@hermet.pe.kr>
Thu, 28 Apr 2016 14:28:55 +0000 (23:28 +0900)
let's simplify interfaces.

This is second step for sorting up public interfaces.

Change-Id: Ia1ab4422069bdae44f397b15b6d25c32d93d949f

src/include/efl/ui_base_overlay.h
src/include/efl/ui_base_view.h
src/include/efl/ui_base_viewmanager.h
src/include/efl/ui_base_viewmgr.h
src/include/interface/ui_iface_overlay.h
src/include/interface/ui_iface_view.h
src/include/interface/ui_iface_viewmgr.h

index 5e4abc47aaa138b765322c7e43991803c69d3ead..849743dd12a709b5057002f31ac53b10d433516e 100644 (file)
@@ -23,7 +23,7 @@ namespace efl_viewmanager
 class ui_base_viewmgr;
 class ui_base_view;
 
-class ui_base_overlay: public ui_iface_overlay<Evas_Object *, ui_base_viewmgr>
+class ui_base_overlay: public ui_iface_overlay<Evas_Object *>
 {
 protected:
        ui_base_overlay(ui_base_view *view);
index fb62a9df17b7b7386d5653216a6a2c2450f186cb..58abebd5e77193c60a8c8c2165aa32895caf8aee 100644 (file)
@@ -32,7 +32,7 @@ namespace efl_viewmanager
  *  @warning When the transitions are finished, the view must to call ui_iface_viewmgr :: _push_finished(), ui_iface_viewmgr :: _pop_finished() in order that
  *           The ui_iface_viewmgr keeps the view states exactly.
  */
-class ui_base_view: public ui_iface_view<Evas_Object *, ui_base_viewmgr>
+class ui_base_view: public ui_iface_view<Evas_Object *>
 {
        friend class ui_base_viewmgr;
 
index 2115d6f5f9d303ba1561195b42645076b69ff59c..0576ab553022c36965112d2e11f02b9724eadcd8 100644 (file)
@@ -24,7 +24,7 @@
 #include "ui_base_viewmgr.h"
 #include "ui_base_view.h"
 
-#define UI_BASE_VIEWMGR ui_base_viewmgr::get_instance()
+#define UI_BASE_VIEWMGR dynamic_cast<ui_base_viewmgr *>(ui_iface_viewmgr<Evas_Object *>::get_instance())
 
 using namespace efl_viewmanager;
 
index 729d9a23aadd2324fc7e0180f3f2f52939dc8a66..e5052093e4431a3c1ee84c84e4fe30eac8eaa1b3 100644 (file)
@@ -40,7 +40,7 @@ class ui_base_view;
  *
  *  @warning viewmgr will remove all containing views when it's destroyed.
  */
-class ui_base_viewmgr: public ui_iface_viewmgr<Evas_Object *, ui_base_viewmgr>
+class ui_base_viewmgr: public ui_iface_viewmgr<Evas_Object *>
 {
        friend class ui_base_view;
 
index 076c21bf406a9ae0ba2a68e545dba842ca3603f0..960ac22953a5d3cd2698bf59b8b1754034697e94 100644 (file)
 namespace ui_viewmanager
 {
 
-template<typename T, typename T2>
+template<typename T>
 class ui_iface_view;
 
-template<typename T, typename T2>
+template<typename T>
 class ui_iface_overlay: public ui_iface_rotatable
 {
 private:
-       ui_iface_view<T, T2> *view;
+       ui_iface_view<T> *view;
        T content;
 
 protected:
-       ui_iface_overlay(ui_iface_view<T, T2> *view);
+       ui_iface_overlay(ui_iface_view<T> *view);
        virtual ~ui_iface_overlay();
 
 public:
        virtual bool set_content(T content);
        virtual T unset_content();
-       ui_iface_view<T, T2> *get_view();
+       ui_iface_view<T> *get_view();
        virtual T get_content();
        virtual void on_back();
        virtual bool activate() = 0;
@@ -46,46 +46,46 @@ public:
 };
 
 
-template<typename T, typename T2>
-ui_iface_overlay<T, T2>::ui_iface_overlay(ui_iface_view<T, T2> *view)
+template<typename T>
+ui_iface_overlay<T>::ui_iface_overlay(ui_iface_view<T> *view)
                : view(view), content(NULL)
 {
 }
 
-template<typename T, typename T2>
-ui_iface_overlay<T, T2>::~ui_iface_overlay()
+template<typename T>
+ui_iface_overlay<T>::~ui_iface_overlay()
 {
 }
 
-template<typename T, typename T2>
-bool ui_iface_overlay<T, T2>::set_content(T content)
+template<typename T>
+bool ui_iface_overlay<T>::set_content(T content)
 {
        this->content = content;
        return true;
 }
 
-template<typename T, typename T2>
-T ui_iface_overlay<T, T2>::unset_content()
+template<typename T>
+T ui_iface_overlay<T>::unset_content()
 {
        T prev = this->content;
        this->content = NULL;
        return prev;
 }
 
-template<typename T, typename T2>
-T ui_iface_overlay<T, T2>::get_content()
+template<typename T>
+T ui_iface_overlay<T>::get_content()
 {
        return this->content;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2> *ui_iface_overlay<T, T2>::get_view()
+template<typename T>
+ui_iface_view<T> *ui_iface_overlay<T>::get_view()
 {
        return this->view;
 }
 
-template<typename T, typename T2>
-void ui_iface_overlay<T, T2>::on_back()
+template<typename T>
+void ui_iface_overlay<T>::on_back()
 {
        this->deactivate();
 }
index 4deda6a85b32afd587bfee2cb2ce7a4f0a5c54ea..754e549ea42ac4fbeb57a1f78e38f84ddbc67af2 100644 (file)
@@ -23,7 +23,7 @@ using namespace std;
 
 namespace ui_viewmanager {
 
-template<typename T, typename T2>
+template<typename T>
 class ui_iface_viewmgr;
 
 /**
@@ -39,16 +39,16 @@ class ui_iface_viewmgr;
  *  @warning When the transitions are finished, the view must to call ui_iface_viewmgr :: _push_finished(), ui_iface_viewmgr :: _pop_finished() in order that
  *           The ui_iface_viewmgr keeps the view states exactly.
  */
-template<typename T, typename T2>
+template<typename T>
 class ui_iface_view : public ui_iface_rotatable
 {
-       friend class ui_iface_viewmgr<T, T2>;
+       friend class ui_iface_viewmgr<T>;
 
 private:
        T content;                              ///< A content instance for a screen as a view.
        string name;                            ///< View name.
        string transition_style;                ///< View transition style name.
-       ui_iface_viewmgr<T, T2> *viewmgr;           ///< Viewmgr which this view belongs to.
+       ui_iface_viewmgr<T> *viewmgr;           ///< Viewmgr which this view belongs to.
        ui_view_state state;                    ///< View state.
        ui_view_indicator indicator;            ///< View indicator mode.
        bool event_block;                       ///< State of event block.
@@ -123,7 +123,7 @@ protected:
        /** @brief Return a viewmgr which this view is belonging to.
         */
        //FIXME: Is it necessary?
-       ui_iface_viewmgr<T, T2> *get_viewmgr();
+       ui_iface_viewmgr<T> *get_viewmgr();
 
        /** @brief This is for replacing or setting a content of the view.
         *
@@ -233,32 +233,32 @@ public:
 };
 
 
-template<typename T, typename T2>
-bool ui_iface_view<T, T2>::get_event_block()
+template<typename T>
+bool ui_iface_view<T>::get_event_block()
 {
        return this->event_block;
 }
 
-template<typename T, typename T2>
-ui_iface_viewmgr<T, T2> *ui_iface_view<T, T2>::get_viewmgr()
+template<typename T>
+ui_iface_viewmgr<T> *ui_iface_view<T>::get_viewmgr()
 {
        return this->viewmgr;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::set_event_block(bool block)
+template<typename T>
+void ui_iface_view<T>::set_event_block(bool block)
 {
        this->event_block = block;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_load()
+template<typename T>
+void ui_iface_view<T>::on_load()
 {
        this->state = UI_VIEW_STATE_LOAD;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_unload()
+template<typename T>
+void ui_iface_view<T>::on_unload()
 {
        this->state = UI_VIEW_STATE_UNLOAD;
        if (this->get_removable_content())
@@ -268,132 +268,132 @@ void ui_iface_view<T, T2>::on_unload()
        }
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_activate()
+template<typename T>
+void ui_iface_view<T>::on_activate()
 {
        this->state = UI_VIEW_STATE_ACTIVATE;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_deactivate()
+template<typename T>
+void ui_iface_view<T>::on_deactivate()
 {
        this->state = UI_VIEW_STATE_DEACTIVATE;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_pause()
+template<typename T>
+void ui_iface_view<T>::on_pause()
 {
        this->state = UI_VIEW_STATE_PAUSE;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_resume()
+template<typename T>
+void ui_iface_view<T>::on_resume()
 {
        this->state = UI_VIEW_STATE_ACTIVATE;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_destroy()
+template<typename T>
+void ui_iface_view<T>::on_destroy()
 {
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2>::ui_iface_view(const char *name)
+template<typename T>
+ui_iface_view<T>::ui_iface_view(const char *name)
                : content(NULL), name(string(name ? name : "")), transition_style(string("default")), viewmgr(NULL), state(UI_VIEW_STATE_LOAD),
                  indicator(UI_VIEW_INDICATOR_DEFAULT), event_block(false), removable_content(true)
 {
        this->state = UI_VIEW_STATE_UNLOAD;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2>::~ui_iface_view()
+template<typename T>
+ui_iface_view<T>::~ui_iface_view()
 {
        this->viewmgr->remove_view(this);
 }
 
-template<typename T, typename T2>
-bool ui_iface_view<T, T2>::set_content(T content)
+template<typename T>
+bool ui_iface_view<T>::set_content(T content)
 {
        this->content = content;
        return true;
 }
 
-template<typename T, typename T2>
-T ui_iface_view<T, T2>::unset_content()
+template<typename T>
+T ui_iface_view<T>::unset_content()
 {
        T prev = this->content;
        this->content = NULL;
        return prev;
 }
 
-template<typename T, typename T2>
-bool ui_iface_view<T, T2>::set_transition_style(const char *style)
+template<typename T>
+bool ui_iface_view<T>::set_transition_style(const char *style)
 {
        this->transition_style.assign(style);
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_view<T, T2>::set_name(const char *name)
+template<typename T>
+bool ui_iface_view<T>::set_name(const char *name)
 {
        this->name.assign(name);
        return true;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::set_removable_content(bool removable)
+template<typename T>
+void ui_iface_view<T>::set_removable_content(bool removable)
 {
        this->removable_content = removable;
 
        //FIXME: If this api is called on unload state? should we remove content right now?
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::set_indicator(ui_view_indicator indicator)
+template<typename T>
+void ui_iface_view<T>::set_indicator(ui_view_indicator indicator)
 {
        this->indicator = indicator;
 }
 
-template<typename T, typename T2>
-const char *ui_iface_view<T, T2>::get_transition_style()
+template<typename T>
+const char *ui_iface_view<T>::get_transition_style()
 {
        return this->transition_style.c_str();
 }
 
-template<typename T, typename T2>
-const char *ui_iface_view<T, T2>::get_name()
+template<typename T>
+const char *ui_iface_view<T>::get_name()
 {
        return this->name.c_str();
 }
 
-template<typename T, typename T2>
-T ui_iface_view<T, T2>::get_content()
+template<typename T>
+T ui_iface_view<T>::get_content()
 {
        return this->content;
 }
 
-template<typename T, typename T2>
-ui_view_state ui_iface_view<T, T2>::get_state()
+template<typename T>
+ui_view_state ui_iface_view<T>::get_state()
 {
        return this->state;
 }
 
-template<typename T, typename T2>
-bool ui_iface_view<T, T2>::get_removable_content()
+template<typename T>
+bool ui_iface_view<T>::get_removable_content()
 {
        return this->removable_content;
 }
 
-template<typename T, typename T2>
-ui_view_indicator ui_iface_view<T, T2>::get_indicator()
+template<typename T>
+ui_view_indicator ui_iface_view<T>::get_indicator()
 {
        return this->indicator;
 }
 
-template<typename T, typename T2>
-void ui_iface_view<T, T2>::on_back()
+template<typename T>
+void ui_iface_view<T>::on_back()
 {
-       ui_iface_viewmgr<T, T2> *viewmgr = this->get_viewmgr();
+       ui_iface_viewmgr<T> *viewmgr = this->get_viewmgr();
        if (!viewmgr)
        {
                LOGE("Failed to get a viewmgr, view =%p", this);
index 0da1bc8e651e0f280b675380e2726d91f0843402..30d23c159aa08dd24e66af7add77f3b59d0bf7da 100644 (file)
@@ -23,7 +23,7 @@ using namespace std;
 
 namespace ui_viewmanager {
 
-template<typename T, typename T2>
+template<typename T>
 class ui_iface_view;
 
 /**
@@ -38,16 +38,17 @@ class ui_iface_view;
  *
  *  @warning viewmgr will remove all containing views when it's destroyed.
  */
-template<typename T, typename T2>
-class ui_iface_viewmgr: public singleton<T2>
+template<typename T>
+class ui_iface_viewmgr
 {
-       friend class ui_iface_view<T, T2>;
+       friend class ui_iface_view<T>;
 
 private:
-       static bool soft_key;                  //If system doesn't support HW back key, then this value is @c true.
-       static bool event_block;               //Event block on view transition. This value should be configurable by system.
-       list<ui_iface_view<T, T2> *> view_list;    //View list.
-       bool activated;                        //Activated status of this viewmgr.
+       static ui_iface_viewmgr<T> *inst;
+       static bool soft_key;                      //If system doesn't support HW back key, then this value is @c true.
+       static bool event_block;                   //Event block on view transition. This value should be configurable by system.
+       list<ui_iface_view<T> *> view_list;        //View list.
+       bool activated;                            //Activated status of this viewmgr.
 
        /**
         *  @brief Connect a given view to this viewmgr.
@@ -59,7 +60,7 @@ private:
         *  @warning If the given view is already connected to a viewmgr, this call will be failed.
         *  @see disconnect_view()
         */
-       bool connect_view(ui_iface_view<T, T2> *view);
+       bool connect_view(ui_iface_view<T> *view);
 
        /**
         *  @brief Disconnect a given view from this viewmgr.
@@ -70,7 +71,7 @@ private:
         *
         *  @see connect_view()
         */
-       bool disconnect_view(ui_iface_view<T, T2> *view);
+       bool disconnect_view(ui_iface_view<T> *view);
 
        /**
         *  @brief Toggle event blocking to the given view.
@@ -82,7 +83,7 @@ private:
         *  @param view A view to toggle event blocking.
         *  @param block @c true is blocking event, otherwise @c false.
         */
-       void set_event_block(ui_iface_view<T, T2> *view, bool block);
+       void set_event_block(ui_iface_view<T> *view, bool block);
 
 protected:
        /**
@@ -94,7 +95,7 @@ protected:
         *
         *  @warning This function must be called when push transition is finished.
         */
-       bool push_view_finished(ui_iface_view<T, T2> *view);
+       bool push_view_finished(ui_iface_view<T> *view);
 
        /**
         *  @brief This function is designed for finishing process for pop transition.
@@ -107,22 +108,7 @@ protected:
         *
         *  @warning This function must be called when push transition is finished.
         */
-       bool pop_view_finished(ui_iface_view<T, T2> *view);
-
-//FIXME: Necessary?
-#if 0
-       /**
-        *  @brief Return a list of views which this viewmgr has.
-        *
-        *  @return a pointer of list of views.
-        *
-        *  @warning Don't modify this view list.
-        */
-       const list<ui_iface_view<T, T2>*>* const get_view_list()
-       {
-               return &this->view_list;
-       }
-#endif
+       bool pop_view_finished(ui_iface_view<T> *view);
 
        /**
         *  @brief Push a new view into this viewmgr. This function is used for when application switches a current view to a new one.
@@ -141,7 +127,7 @@ protected:
         *  @see insert_view_after()
         *  @see pop_view()
         */
-       ui_iface_view<T, T2> *push_view(ui_iface_view<T, T2> *view);
+       ui_iface_view<T> *push_view(ui_iface_view<T> *view);
 
        /**
         *  @brief Pop the top(last) view from this viewmgr view list.
@@ -166,7 +152,7 @@ protected:
         *
         *  @return @c true on success or @c false otherwise.
         */
-       bool insert_view_before(ui_iface_view<T, T2> *view, ui_iface_view<T, T2> *before);
+       bool insert_view_before(ui_iface_view<T> *view, ui_iface_view<T> *before);
 
        /**
         *  @brief Insert a view in this viewmgr view list. Specifically, insert a given @p view right after of the given view, @after.
@@ -176,7 +162,7 @@ protected:
         *
         *  @return @c true on success or @c false otherwise.
         */
-       bool insert_view_after(ui_iface_view<T, T2> *view, ui_iface_view<T, T2> *after);
+       bool insert_view_after(ui_iface_view<T> *view, ui_iface_view<T> *after);
 
        /**
         *  @brief Remove the given view from this viewmgr view list.
@@ -189,7 +175,7 @@ protected:
         *  @see insert_view_after()
         *  @see push_view()
         */
-       bool remove_view(ui_iface_view<T, T2> *view);
+       bool remove_view(ui_iface_view<T> *view);
 
        /**
         *  @brief Return a view which is matched with the index @p idx.
@@ -205,7 +191,7 @@ protected:
         *  @see get_view_index()
         *  @see get_view_count()
         */
-       ui_iface_view<T, T2>* get_view(unsigned int idx);
+       ui_iface_view<T>* get_view(unsigned int idx);
 
        /**
         *  @brief Return a view which is matched with the @p name.
@@ -219,14 +205,14 @@ protected:
         *
         *  @see ui_iface_view::set_name()
         */
-       ui_iface_view<T, T2> *get_view(const char *name);
+       ui_iface_view<T> *get_view(const char *name);
 
        /**
         *  @brief Return a last(top) view.
         *
         *  @return The view which is last view of the viewmgr view list.
         */
-       ui_iface_view<T, T2> *get_last_view();
+       ui_iface_view<T> *get_last_view();
 
        /**
         *  @brief Return a view index(page) number of the given view.
@@ -238,7 +224,7 @@ protected:
         *
         *  @warning The index number of views are variable since the view list is variable.
         */
-       int get_view_index(const ui_iface_view<T, T2> *view);
+       int get_view_index(const ui_iface_view<T> *view);
 
        ///Constructor.
        ui_iface_viewmgr();
@@ -300,20 +286,23 @@ public:
         *  @return @c true if soft key is required, @c false otherwise.
         */
        static bool need_soft_key();
+       static ui_iface_viewmgr<T>* get_instance();
 };
 
 
-#define VIEW_ITR typename list<ui_iface_view<T, T2> *>::iterator
-#define VIEW_RITR typename list<ui_iface_view<T, T2> *>::reverse_iterator
+template<typename T> ui_iface_viewmgr<T> *ui_iface_viewmgr<T>::inst = NULL;
+
+#define VIEW_ITR typename list<ui_iface_view<T> *>::iterator
+#define VIEW_RITR typename list<ui_iface_view<T> *>::reverse_iterator
 
 //FIXME: Read system profile to decide whether support software key or not.
-template<typename T, typename T2> bool ui_iface_viewmgr<T, T2>::soft_key = true;
+template<typename T> bool ui_iface_viewmgr<T>::soft_key = true;
 //FIXME: Read system profile to decide whether support event block or not.
-template<typename T, typename T2> bool ui_iface_viewmgr<T, T2>::event_block = true;
+template<typename T> bool ui_iface_viewmgr<T>::event_block = true;
 
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::insert_view_after(ui_iface_view<T, T2> *view, ui_iface_view<T, T2> *after)
+template<typename T>
+bool ui_iface_viewmgr<T>::insert_view_after(ui_iface_view<T> *view, ui_iface_view<T> *after)
 {
        VIEW_ITR it;
 
@@ -354,14 +343,14 @@ bool ui_iface_viewmgr<T, T2>::insert_view_after(ui_iface_view<T, T2> *view, ui_i
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::need_soft_key()
+template<typename T>
+bool ui_iface_viewmgr<T>::need_soft_key()
 {
-       return ui_iface_viewmgr<T, T2>::soft_key;
+       return ui_iface_viewmgr<T>::soft_key;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::connect_view(ui_iface_view<T, T2> *view)
+template<typename T>
+bool ui_iface_viewmgr<T>::connect_view(ui_iface_view<T> *view)
 {
        //FIXME: If user call a set_viewmgr() before, It should not return false.
        /*
@@ -376,25 +365,25 @@ bool ui_iface_viewmgr<T, T2>::connect_view(ui_iface_view<T, T2> *view)
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::disconnect_view(ui_iface_view<T, T2> *view)
+template<typename T>
+bool ui_iface_viewmgr<T>::disconnect_view(ui_iface_view<T> *view)
 {
        if (!view->viewmgr) return false;
        view->viewmgr = NULL;
        return true;
 }
 
-template<typename T, typename T2>
-void ui_iface_viewmgr<T, T2>::set_event_block(ui_iface_view<T, T2> *view, bool block)
+template<typename T>
+void ui_iface_viewmgr<T>::set_event_block(ui_iface_view<T> *view, bool block)
 {
        if (!ui_iface_viewmgr::event_block) return;
        view->set_event_block(block);
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::push_view_finished(ui_iface_view<T, T2> *view)
+template<typename T>
+bool ui_iface_viewmgr<T>::push_view_finished(ui_iface_view<T> *view)
 {
-       ui_iface_view<T, T2> *last = this->view_list.back();
+       ui_iface_view<T> *last = this->view_list.back();
 
        //The previous view has been pushed. This should be unload.
        if (last != view)
@@ -410,10 +399,10 @@ bool ui_iface_viewmgr<T, T2>::push_view_finished(ui_iface_view<T, T2> *view)
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::pop_view_finished(ui_iface_view<T, T2> *view)
+template<typename T>
+bool ui_iface_viewmgr<T>::pop_view_finished(ui_iface_view<T> *view)
 {
-       ui_iface_view<T, T2> *last = this->view_list.back();
+       ui_iface_view<T> *last = this->view_list.back();
 
        //This view has been popped. It should be destroyed.
        if (last == view)
@@ -431,25 +420,25 @@ bool ui_iface_viewmgr<T, T2>::pop_view_finished(ui_iface_view<T, T2> *view)
        return true;
 }
 
-template<typename T, typename T2>
-ui_iface_viewmgr<T, T2>::ui_iface_viewmgr(const ui_iface_viewmgr<T, T2>& viewmgr)
+template<typename T>
+ui_iface_viewmgr<T>::ui_iface_viewmgr(const ui_iface_viewmgr<T>& viewmgr)
 {
-
 }
 
-template<typename T, typename T2>
-ui_iface_viewmgr<T, T2>::ui_iface_viewmgr()
-               : singleton<T2>(), activated(false)
+template<typename T>
+ui_iface_viewmgr<T>::ui_iface_viewmgr()
+               : activated(false)
 {
+       ui_iface_viewmgr<T>::inst = this;
 }
 
-template<typename T, typename T2>
-ui_iface_viewmgr<T, T2>::~ui_iface_viewmgr()
+template<typename T>
+ui_iface_viewmgr<T>::~ui_iface_viewmgr()
 {
        //Terminate views
        for (VIEW_RITR it = this->view_list.rbegin(); it != this->view_list.rend(); it++)
        {
-               ui_iface_view<T, T2> *view = *it;
+               ui_iface_view<T> *view = *it;
                view->on_deactivate();
                view->on_unload();
                view->on_destroy();
@@ -458,10 +447,12 @@ ui_iface_viewmgr<T, T2>::~ui_iface_viewmgr()
 
        //FIXME: Window is destroyed. Terminate Application!
        ui_app_exit();
+
+       ui_iface_viewmgr::inst = NULL;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::push_view(ui_iface_view<T, T2> *view)
+template<typename T>
+ui_iface_view<T> *ui_iface_viewmgr<T>::push_view(ui_iface_view<T> *view)
 {
        if (!view)
        {
@@ -475,7 +466,7 @@ ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::push_view(ui_iface_view<T, T2> *v
                return NULL;
        }
 
-       ui_iface_view<T, T2> *pview;
+       ui_iface_view<T> *pview;
 
        //Previous view
        if (this->view_list.size() > 0)
@@ -502,8 +493,8 @@ ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::push_view(ui_iface_view<T, T2> *v
        return view;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::pop_view()
+template<typename T>
+bool ui_iface_viewmgr<T>::pop_view()
 {
        //FIXME: No more view?
        if (this->get_view_count() == 0)
@@ -516,7 +507,7 @@ bool ui_iface_viewmgr<T, T2>::pop_view()
        if (this->get_view_count() == 1)
        {
                //destroy viewmgr?
-               ui_iface_view<T, T2>*view = this->view_list.back();
+               ui_iface_view<T>*view = this->view_list.back();
                view->on_deactivate();
                view->on_unload();
                view->on_destroy();
@@ -526,7 +517,7 @@ bool ui_iface_viewmgr<T, T2>::pop_view()
        }
 
        //last page to be popped.
-       ui_iface_view<T, T2>*view = this->view_list.back();
+       ui_iface_view<T>*view = this->view_list.back();
        view->on_deactivate();
        this->set_event_block(view, true);
 
@@ -534,7 +525,7 @@ bool ui_iface_viewmgr<T, T2>::pop_view()
        //Make this getter method? or define instance?
        //previous page is to be an active page.
        auto nx = prev(this->view_list.end(), 2);
-       ui_iface_view<T, T2>*pview = *nx;
+       ui_iface_view<T>*pview = *nx;
        pview->on_load();
        pview->on_deactivate();
        this->set_event_block(pview, true);
@@ -542,8 +533,8 @@ bool ui_iface_viewmgr<T, T2>::pop_view()
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::insert_view_before(ui_iface_view<T, T2> *view, ui_iface_view<T, T2> *before)
+template<typename T>
+bool ui_iface_viewmgr<T>::insert_view_before(ui_iface_view<T> *view, ui_iface_view<T> *before)
 {
        VIEW_ITR it;
 
@@ -579,8 +570,8 @@ bool ui_iface_viewmgr<T, T2>::insert_view_before(ui_iface_view<T, T2> *view, ui_
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::remove_view(ui_iface_view<T, T2> *view)
+template<typename T>
+bool ui_iface_viewmgr<T>::remove_view(ui_iface_view<T> *view)
 {
        this->view_list.remove(view);
        this->disconnect_view(view);
@@ -589,8 +580,8 @@ bool ui_iface_viewmgr<T, T2>::remove_view(ui_iface_view<T, T2> *view)
        return true;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::get_view(unsigned int idx)
+template<typename T>
+ui_iface_view<T> *ui_iface_viewmgr<T>::get_view(unsigned int idx)
 {
        if (idx < 0 || idx >= this->view_list.size())
        {
@@ -602,8 +593,8 @@ ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::get_view(unsigned int idx)
        return *it;
 }
 
-template<typename T, typename T2>
-int ui_iface_viewmgr<T, T2>::get_view_index(const ui_iface_view<T, T2> *view)
+template<typename T>
+int ui_iface_viewmgr<T>::get_view_index(const ui_iface_view<T> *view)
 {
        int idx = 0;
 
@@ -616,15 +607,15 @@ int ui_iface_viewmgr<T, T2>::get_view_index(const ui_iface_view<T, T2> *view)
        return -1;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::get_last_view()
+template<typename T>
+ui_iface_view<T> *ui_iface_viewmgr<T>::get_last_view()
 {
        int cnt = this->get_view_count();
        return this->get_view(cnt - 1);
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::activate()
+template<typename T>
+bool ui_iface_viewmgr<T>::activate()
 {
        if (this->activated) return false;
        if (this->get_view_count() == 0) return false;
@@ -632,33 +623,39 @@ bool ui_iface_viewmgr<T, T2>::activate()
        return true;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::deactivate()
+template<typename T>
+bool ui_iface_viewmgr<T>::deactivate()
 {
        if (!this->activated) return false;
        this->activated = false;
        return true;
 }
 
-template<typename T, typename T2>
-ui_iface_view<T, T2> *ui_iface_viewmgr<T, T2>::get_view(const char *name)
+template<typename T>
+ui_iface_view<T> *ui_iface_viewmgr<T>::get_view(const char *name)
 {
        //FIXME: ...
        return NULL;
 }
 
-template<typename T, typename T2>
-bool ui_iface_viewmgr<T, T2>::is_activated()
+template<typename T>
+bool ui_iface_viewmgr<T>::is_activated()
 {
        return this->activated;
 }
 
-template<typename T, typename T2>
-unsigned int ui_iface_viewmgr<T, T2>::get_view_count()
+template<typename T>
+unsigned int ui_iface_viewmgr<T>::get_view_count()
 {
        return this->view_list.size();
 }
 
+template<typename T>
+ui_iface_viewmgr<T>* ui_iface_viewmgr<T>::get_instance()
+{
+       return ui_iface_viewmgr::inst;
+}
+
 }
 
 #endif /* _UI_IFACE_VIEWMGR_H_ */