Add _Control History
authorHeeJu Kang <mobum.kang@samsung.com>
Sat, 10 Aug 2013 06:38:39 +0000 (15:38 +0900)
committerHeeJu Kang <mobum.kang@samsung.com>
Sat, 10 Aug 2013 06:38:39 +0000 (15:38 +0900)
Change-Id: I89792b0533a38afc43eed725800b3182a97a5a03
Signed-off-by: HeeJu Kang <mobum.kang@samsung.com>
src/ui/FUi_ControlManager.cpp
src/ui/inc/FUi_ControlManager.h

index 010ec24..062d34d 100644 (file)
@@ -233,6 +233,13 @@ _ControlManager::Register(_Control* pObject)
                __pAllControlList->Add(pObject);
        }
 
+       _HistoryInfo* pHistoryInfo = new (std::nothrow) _HistoryInfo(pObject);
+       SysTryReturn(NID_SHELL, pHistoryInfo, _ControlHandle(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
+
+       pHistoryInfo->SetBacktrace(*pObject->__pNewBacktrace.get());
+
+       AddHistory(__pNewHistory, pHistoryInfo);
+
        return __objectManager.Register(*pObject);
 }
 
@@ -250,6 +257,13 @@ _ControlManager::Release(const _ControlHandle& handle)
                __pAllControlList->Remove(pObject);
        }
 
+       _HistoryInfo* pHistoryInfo = new (std::nothrow) _HistoryInfo(pObject);
+       SysTryReturn(NID_SHELL, pHistoryInfo, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
+
+       pHistoryInfo->SetBacktrace(*pObject->__pDeleteBacktrace.get());
+
+       AddHistory(__pDeleteHistory, pHistoryInfo);
+
        return __objectManager.Unregister(handle);
 }
 
@@ -311,6 +325,8 @@ _ControlManager::_ControlManager(void) // [ToDo] exception check.
        , __screenDpi(0)
        , __pClipboardOwner(null)
        , __pControlManagerEventListenerList(new (std::nothrow) LinkedListT<_IControlManagerEventListener*>)
+       , __pNewHistory(null)
+       , __pDeleteHistory(null)
 {
        result r =  _CoordinateInfo::GetAppCoordinateSystem(__isCoordinateSystemLogical, __logicalCoordinateSystem, __logicalBaseScreenSize);
        SysTryReturnVoidResult(NID_UI, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] System error occurred.");
@@ -329,6 +345,18 @@ _ControlManager::_ControlManager(void) // [ToDo] exception check.
 
        _EcoreEvas::CreateInstanceN();
 
+       __pNewHistory = new (std::nothrow) ArrayListT<_HistoryInfo*>;
+       SysTryReturnVoidResult(NID_SHELL, __pNewHistory, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
+
+       r = __pNewHistory->Construct();
+       SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       __pDeleteHistory = new (std::nothrow) ArrayListT<_HistoryInfo*>;
+       SysTryReturnVoidResult(NID_SHELL, __pDeleteHistory, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
+
+       r = __pDeleteHistory->Construct();
+       SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
        __pWindowList = new (std::nothrow)LinkedListT<_Window*>;
        SysTryCatch(NID_UI, __pWindowList, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
 
@@ -417,6 +445,18 @@ _ControlManager::~_ControlManager(void)
                __pGestureList = null;
        }
 
+       if (__pNewHistory)
+       {
+               delete __pNewHistory;
+               __pNewHistory = null;
+       }
+
+       if (__pDeleteHistory)
+       {
+               delete __pDeleteHistory;
+               __pDeleteHistory = null;
+       }
+
        DestroyEcoreEvasMgr();
 
        _IndicatorManager::ReleaseInstance();
@@ -1756,17 +1796,17 @@ void
 _ControlManager::OnSettingChanged(Tizen::Base::String& key)
 {
        const wchar_t* FONT_TYPE = L"http://tizen.org/setting/font.type";
-        const wchar_t* LOCALE_COUNTRY = L"http://tizen.org/setting/locale.country";
-        const wchar_t* LOCALE_LANGUAGE = L"http://tizen.org/setting/locale.language";
+       const wchar_t* LOCALE_COUNTRY = L"http://tizen.org/setting/locale.country";
+       const wchar_t* LOCALE_LANGUAGE = L"http://tizen.org/setting/locale.language";
 
-         if (key == FONT_TYPE || key == LOCALE_COUNTRY || key == LOCALE_LANGUAGE)
+       if (key == FONT_TYPE || key == LOCALE_COUNTRY || key == LOCALE_LANGUAGE)
        {
                _FontImpl::UpdateDefaultFont(key);
                __isSystemFontChanged = true;
                struct _Visitor
-               : public _Control::Visitor
+                       : public _Control::Visitor
                {
-                        virtual _Control::VisitType Visit(_Control& control)
+                       virtual _Control::VisitType Visit(_Control& control)
                        {
                                control.GetFallbackFont();
                                _IControlDelegate& delegate = control.GetControlDelegate();
@@ -1803,7 +1843,7 @@ _ControlManager::OnSettingChanged(Tizen::Base::String& key)
                IEnumeratorT<_TouchGestureDetector*>* pEnumerator = __pGestureList->GetEnumeratorN();
                SysTryReturnVoidResult(NID_UI, pEnumerator, E_SYSTEM, "[E_SYSTEM] System error occurred.")
 
-               int duration = static_cast<int>(elm_config_longpress_timeout_get() * 1000);
+                       int duration = static_cast<int>(elm_config_longpress_timeout_get() * 1000);
                if (duration == 0)
                {
                        duration = 500;
@@ -1823,7 +1863,7 @@ _ControlManager::OnSettingChanged(Tizen::Base::String& key)
                        {
                                _TouchLongPressGestureDetector* pGestureLongPress= dynamic_cast<_TouchLongPressGestureDetector*>(const_cast<_TouchGestureDetector*>(pGestureDetector));
                                SysTryReturnVoidResult(NID_UI, pGestureLongPress, E_SYSTEM, "[E_SYSTEM] System error occurred.")
-                               pGestureLongPress->SetDuration(duration);
+                                       pGestureLongPress->SetDuration(duration);
                        }
                }
 
@@ -1831,4 +1871,46 @@ _ControlManager::OnSettingChanged(Tizen::Base::String& key)
        }
 }
 
+void
+_ControlManager::AddHistory(ArrayListT<_HistoryInfo*>* pHistoryList, _HistoryInfo* pHistoryInfo)
+{
+       SysTryReturnVoidResult(NID_SHELL, pHistoryList, E_INVALID_ARG, "[E_INVALID_ARG].");
+       SysTryReturnVoidResult(NID_SHELL, pHistoryInfo, E_INVALID_ARG, "[E_INVALID_ARG].");
+
+       const int COUNT_MAX = 500;
+
+       int count = pHistoryList->GetCount();
+       if (count > COUNT_MAX)
+       {
+               _HistoryInfo* pInfo = null;
+               pHistoryList->GetAt(0, pInfo);
+               delete pInfo;
+
+               pHistoryList->RemoveAt(0);
+       }
+
+       pHistoryList->Add(pHistoryInfo);
+}
+
+_ControlManager::_HistoryInfo::_HistoryInfo(_Control* pControl)
+       : __pControl(pControl)
+       , __pBacktrace(new (std::nothrow) ArrayListT<void*>)
+{
+}
+
+_ControlManager::_HistoryInfo::~_HistoryInfo(void)
+{
+       if (__pBacktrace)
+       {
+               delete __pBacktrace;
+               __pBacktrace = null;
+       }
+}
+
+void
+_ControlManager::_HistoryInfo::SetBacktrace(Tizen::Base::Collection::ArrayListT<void*>& backtrace)
+{
+       __pBacktrace->Construct(backtrace);
+}
+
 }} // Tizen::Ui
index 2453f2a..b77a9e4 100644 (file)
@@ -170,6 +170,25 @@ private:
 
        virtual void OnSettingChanged(Tizen::Base::String& key);
 
+       class _HistoryInfo
+       {
+       public:
+               _HistoryInfo(_Control* pControl);
+               ~_HistoryInfo(void);
+
+               void SetBacktrace(Tizen::Base::Collection::ArrayListT<void*>& backtrace);
+
+       private:
+               _HistoryInfo(const _HistoryInfo& rhs);
+               _HistoryInfo& operator =(const _HistoryInfo& rhs);
+
+       private:
+               _Control* __pControl;
+               Tizen::Base::Collection::ArrayListT<void*>* __pBacktrace;
+       };
+
+       void AddHistory(Tizen::Base::Collection::ArrayListT<_HistoryInfo*>* pHistoryList, _HistoryInfo* pHistoryInfo);
+
 private:
        Tizen::Base::_ObjectManagerT <_Control> __objectManager;
        Tizen::Base::Collection::LinkedListT<_Window*>* __pWindowList;
@@ -196,6 +215,9 @@ private:
        int __screenDpi;
        _Window* __pClipboardOwner;
        std::unique_ptr<Tizen::Base::Collection::IListT<_IControlManagerEventListener*> > __pControlManagerEventListenerList;
+
+       Tizen::Base::Collection::ArrayListT<_HistoryInfo*>* __pNewHistory;
+       Tizen::Base::Collection::ArrayListT<_HistoryInfo*>* __pDeleteHistory;
 }; // _ControlManager
 
 }} // Tizen::Ui