diff --git a/Sources/libewol/ewol/EObject.cpp b/Sources/libewol/ewol/EObject.cpp index b6d827f0..70ce7666 100644 --- a/Sources/libewol/ewol/EObject.cpp +++ b/Sources/libewol/ewol/EObject.cpp @@ -26,6 +26,99 @@ #include #include + +#undef __class__ +#define __class__ "ewol::EObjectMessageMultiCast" + +extern "C" { + typedef struct { + const char* message; + ewol::EObject* object; + } messageList_ts; +}; + + +// internal element of the widget manager : +static etk::VectorType m_messageList; // all widget allocated ==> all time increment ... never removed ... + + +void ewol::EObjectMessageMultiCast::Init(void) +{ + EWOL_INFO("EObject message Multi-Cast"); + m_messageList.Clear(); +} + + +void ewol::EObjectMessageMultiCast::UnInit(void) +{ + EWOL_INFO("EObject message Multi-Cast"); + m_messageList.Clear(); +} + + +static void MultiCastAdd(ewol::EObject* object, const char* const message) +{ + if (NULL == object) { + EWOL_ERROR("Add with NULL object"); + return; + } + if (NULL == message) { + EWOL_ERROR("Add with NULL Message"); + return; + } + messageList_ts tmpMessage; + tmpMessage.object = object; + tmpMessage.message = message; + m_messageList.PushBack(tmpMessage); + EWOL_DEBUG("SendMulticast ADD listener :" << object->GetId() << " on \"" << message << "\"" ); +} + + +static void MultiCastRm(ewol::EObject* object) +{ + if (NULL == object) { + EWOL_ERROR("Rm with NULL object"); + return; + } + // send the message at all registered widget ... + for (int32_t iii=m_messageList.Size(); iii>=0; iii--) { + if(m_messageList[iii].object == object) { + EWOL_DEBUG("SendMulticast RM listener :" << object->GetId()); + m_messageList[iii].message = NULL; + m_messageList[iii].object = NULL; + m_messageList.Erase(iii); + } + } +} + +static void MultiCastSend(ewol::EObject* object, const char* const message, etk::UString& data) +{ + EWOL_DEBUG("SendMulticast message \"" << message << "\" data=\"" << data << "\" to :"); + + // send the message at all registered widget ... + for (int32_t iii=0; iii namespace ewol { + namespace EObjectMessageMultiCast { + void Init( void); + void UnInit(void); + void AnonymousSend(const char* const messageId, etk::UString& data); + }; + class EObject; /** @@ -86,6 +92,29 @@ namespace ewol { * @return --- */ void GenerateEventId(const char * generateEventId); + + /** + * @brief Generate Multicast event on all EObject requested the event + * @param[in] messageId Event Id that is generated + * @param[in] data Interger which is transform in etk::UString + * @return --- + */ + void SendMultiCast(const char* const messageId, int32_t data); + + /** + * @brief Generate Multicast event on all EObject requested the event + * @param[in] messageId Event Id that is generated + * @param[in] data String that is send at all the destinations + * @return --- + */ + void SendMultiCast(const char* const messageId, etk::UString& data); + + /** + * @brief Register of the arrival of a Multicast message + * @param[in] messageId Event Id waiting for... + * @return --- + */ + void RegisterMultiCast(const char* const messageId); public: /** * @brief Register an EObject over an other to get event on the second... diff --git a/Sources/libewol/ewol/EObjectMessageMulticast.cpp b/Sources/libewol/ewol/EObjectMessageMulticast.cpp deleted file mode 100644 index 31991bda..00000000 --- a/Sources/libewol/ewol/EObjectMessageMulticast.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/** - ******************************************************************************* - * @file ewol/WidgetMessageMultiCast.cpp - * @brief basic ewol Widget Message Multi-cast (Sources) - * @author Edouard DUPIN - * @date 31/01/2012 - * @par Project - * ewol - * - * @par Copyright - * Copyright 2011 Edouard DUPIN, all right reserved - * - * This software is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY. - * - * Licence summary : - * You can modify and redistribute the sources code and binaries. - * You can send me the bug-fix - * - * Term of the licence in in the file licence.txt. - * - ******************************************************************************* - */ - -#include -#include - -#undef __class__ -#define __class__ "ewol::EObjectMessageMultiCast" - -extern "C" { - typedef struct { - const char* message; - ewol::EObject* object; - } messageList_ts; -}; - - -// internal element of the widget manager : -static etk::VectorType m_messageList; // all widget allocated ==> all time increment ... never removed ... - - -void ewol::EObjectMessageMultiCast::Init(void) -{ - EWOL_INFO("EObject message Multi-Cast"); -} - - -void ewol::EObjectMessageMultiCast::UnInit(void) -{ - EWOL_INFO("EObject message Multi-Cast"); - m_messageList.Clear(); -} - - -void ewol::EObjectMessageMultiCast::Add(ewol::EObject* object, const char* const message) -{ - if (NULL == object) { - EWOL_ERROR("Add with NULL object"); - return; - } - if (NULL == message) { - EWOL_ERROR("Add with NULL Message"); - return; - } - messageList_ts tmpMessage; - tmpMessage.object = object; - tmpMessage.message = message; - m_messageList.PushBack(tmpMessage); - EWOL_DEBUG("SendMulticast ADD listener :" << object->GetId() << " on \"" << message << "\"" ); -} - - -void ewol::EObjectMessageMultiCast::Rm(ewol::EObject* object) -{ - if (NULL == object) { - EWOL_ERROR("Rm with NULL object"); - return; - } - // send the message at all registered widget ... - for (int32_t iii=m_messageList.Size(); iii>=0; iii--) { - if(m_messageList[iii].object == object) { - EWOL_DEBUG("SendMulticast RM listener :" << object->GetId()); - m_messageList[iii].message = NULL; - m_messageList[iii].object = NULL; - m_messageList.Erase(iii); - } - } -} - -void ewol::EObjectMessageMultiCast::Send(ewol::EObject* object, const char* const message, int32_t data) -{ - etk::UString tmpData(data); - Send(object, message, tmpData); -} - - - -void ewol::EObjectMessageMultiCast::Send(ewol::EObject* object, const char* const message, etk::UString& data) -{ - EWOL_DEBUG("SendMulticast message \"" << message << "\" data=\"" << data << "\" to :"); - - // send the message at all registered widget ... - for (int32_t iii=0; iii destroyed object"); + m_subWidget[m_currentCreateId] = NULL; + } + for(int32_t iii=m_popUpWidgetList[m_currentCreateId].Size(); iii>=0; iii--) { + if(m_popUpWidgetList[m_currentCreateId][iii] == removeObject) { + EWOL_DEBUG("Remove Pop-up [" << iii << "] element of the windows ==> destroyed object"); + m_popUpWidgetList[m_currentCreateId][iii] = NULL; + m_popUpWidgetList[m_currentCreateId].Erase(iii); + } + } + if (m_keyBoardwidget == removeObject) { + EWOL_DEBUG("Remove Keyboard element of the windows ==> destroyed object"); + m_keyBoardwidget = NULL; + } +} + + diff --git a/Sources/libewol/ewol/Windows.h b/Sources/libewol/ewol/Windows.h index d3d9e5e5..21e5cd80 100644 --- a/Sources/libewol/ewol/Windows.h +++ b/Sources/libewol/ewol/Windows.h @@ -69,6 +69,7 @@ namespace ewol { private: ewol::Widget* m_subWidget[NB_BOUBLE_BUFFER]; etk::VectorType m_popUpWidgetList[NB_BOUBLE_BUFFER]; + // TODO : Add flip flop ... ewol::Keyboard* m_keyBoardwidget; public: void SetSubWidget(ewol::Widget * widget); @@ -81,6 +82,13 @@ namespace ewol { void KeyboardShow(ewol::keyboardMode_te mode); void KeyboardHide(void); virtual void OnFlipFlopEvent(void); + /** + * @brief Inform object that an other object is removed ... + * @param[in] removeObject Pointer on the EObject remeved ==> the user must remove all reference on this EObject + * @note : Sub classes must call this class + * @return --- + */ + virtual void OnObjectRemove(ewol::EObject * removeObject); }; }; diff --git a/Sources/libewol/ewol/base/MainThread.cpp b/Sources/libewol/ewol/base/MainThread.cpp index e7e2fa7a..3bca19d9 100644 --- a/Sources/libewol/ewol/base/MainThread.cpp +++ b/Sources/libewol/ewol/base/MainThread.cpp @@ -102,7 +102,8 @@ static void* BaseAppEntry(void* param) pthread_getschedparam(pthread_self(), &policy, &pr); EWOL_INFO("Child Thread Up PL" << policy << " PRI" << pr.sched_priority); //The result Set */ - + + ewol::EObjectMessageMultiCast::Init(); ewol::widgetManager::Init(); ewol::texture::Init(); ewol::theme::Init(); @@ -195,6 +196,7 @@ static void* BaseAppEntry(void* param) ewol::texture::UnInit(); ewol::UnInitFont(); ewol::widgetManager::UnInit(); + ewol::EObjectMessageMultiCast::UnInit(); ewol::theme::UnInit(); EWOL_DEBUG("==> Un-Init BThread (END)"); pthread_exit(NULL); diff --git a/Sources/libewol/ewol/base/gui.cpp b/Sources/libewol/ewol/base/gui.cpp index 603c2c69..e46b0d03 100644 --- a/Sources/libewol/ewol/base/gui.cpp +++ b/Sources/libewol/ewol/base/gui.cpp @@ -74,6 +74,7 @@ void EWOL_NativeRegenerateDisplay(void) gui_uniqueWindows->OnRegenerateDisplay(); ewol::widgetManager::DoubleBufferLock(); gui_uniqueWindows->OnFlipFlopEvent(); + ewol::widgetManager::SetDoubleBufferNeedDraw(); ewol::widgetManager::DoubleBufferUnLock(); } } diff --git a/Sources/libewol/ewol/widget/ContextMenu.cpp b/Sources/libewol/ewol/widget/ContextMenu.cpp index 59fbb25d..8fb307f6 100644 --- a/Sources/libewol/ewol/widget/ContextMenu.cpp +++ b/Sources/libewol/ewol/widget/ContextMenu.cpp @@ -29,7 +29,7 @@ #include #undef __class__ -#define __class__ "ewol::ContextMenu" +#define __class__ "ContextMenu" ewol::ContextMenu::ContextMenu(void) { @@ -57,28 +57,25 @@ ewol::ContextMenu::ContextMenu(void) ewol::ContextMenu::~ContextMenu(void) { - /* SubWidgetRemove(); - */ } bool ewol::ContextMenu::CalculateSize(etkFloat_t availlableX, etkFloat_t availlableY) { - /* EWOL_DEBUG("CalculateSize(" << availlableX << "," << availlableY << ")"); // pop-up fill all the display : m_size.x = availlableX; m_size.y = availlableY; - if (NULL != m_subWidget) { + if (NULL != m_subWidget[m_currentCreateId]) { coord2D_ts subWidgetSize; coord2D_ts subWidgetOrigin; - subWidgetSize = m_subWidget->GetMinSize(); - if (true == m_subWidget->CanExpentX()) { + subWidgetSize = m_subWidget[m_currentCreateId]->GetMinSize(); + if (true == m_subWidget[m_currentCreateId]->CanExpentX()) { subWidgetSize.x = m_size.x; } - if (true == m_subWidget->CanExpentY()) { + if (true == m_subWidget[m_currentCreateId]->CanExpentY()) { subWidgetSize.y = m_size.y; } int32_t minWidth = 100; @@ -128,32 +125,29 @@ bool ewol::ContextMenu::CalculateSize(etkFloat_t availlableX, etkFloat_t availla } break; } - m_subWidget->SetOrigin(subWidgetOrigin.x, subWidgetOrigin.y); - m_subWidget->CalculateSize(subWidgetSize.x, subWidgetSize.y); + m_subWidget[m_currentCreateId]->SetOrigin(subWidgetOrigin.x, subWidgetOrigin.y); + m_subWidget[m_currentCreateId]->CalculateSize(subWidgetSize.x, subWidgetSize.y); } MarkToReedraw(); - */ return true; } bool ewol::ContextMenu::CalculateMinSize(void) { - /* EWOL_DEBUG("CalculateMinSize"); m_userExpendX=false; m_userExpendY=false; m_minSize.x = 50.0; m_minSize.y = 50.0; - if (NULL != m_subWidget) { - m_subWidget->CalculateMinSize(); - coord2D_ts tmpSize = m_subWidget->GetMinSize(); + if (NULL != m_subWidget[m_currentCreateId]) { + m_subWidget[m_currentCreateId]->CalculateMinSize(); + coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetMinSize(); m_minSize.x = tmpSize.x; m_minSize.y = tmpSize.y; } EWOL_DEBUG("CalculateMinSize(" << m_minSize.x << "," << m_minSize.y << ")"); MarkToReedraw(); - */ return true; } @@ -175,41 +169,34 @@ void ewol::ContextMenu::SetExpendY(bool newExpend) void ewol::ContextMenu::SubWidgetSet(ewol::Widget* newWidget) { - /* if (NULL == newWidget) { return; } - m_subWidget = newWidget; - newWidget->SetParrent(this); - */ + m_subWidget[m_currentCreateId] = newWidget; } void ewol::ContextMenu::SubWidgetRemove(void) { - /* - if (NULL != m_subWidget) { - ewol::widgetManager::MarkWidgetToBeRemoved(m_subWidget); - m_subWidget = NULL; + if (NULL != m_subWidget[m_currentCreateId]) { + m_subWidget[m_currentCreateId]->MarkToRemove(); + m_subWidget[m_currentCreateId] = NULL; } - */ } bool ewol::ContextMenu::OnDraw(void) { - /* + EWOL_DEBUG("On Draw " << m_currentDrawId); ewol::Drawable::OnDraw(); - if (NULL != m_subWidget) { - m_subWidget->GenDraw(); + if (NULL != m_subWidget[m_currentDrawId]) { + m_subWidget[m_currentDrawId]->GenDraw(); } - */ return true; } void ewol::ContextMenu::OnRegenerateDisplay(void) { - /* if (true == NeedRedraw()) { } // generate a white background and take gray on other surfaces @@ -217,9 +204,9 @@ void ewol::ContextMenu::OnRegenerateDisplay(void) ewol::OObject2DColored * BGOObjects = new ewol::OObject2DColored(); AddOObject(BGOObjects); - if (NULL != m_subWidget) { - coord2D_ts tmpSize = m_subWidget->GetSize(); - coord2D_ts tmpOrigin = m_subWidget->GetOrigin(); + if (NULL != m_subWidget[m_currentCreateId]) { + coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetSize(); + coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId]->GetOrigin(); // display border ... BGOObjects->SetColor(m_colorBorder); @@ -250,23 +237,21 @@ void ewol::ContextMenu::OnRegenerateDisplay(void) BGOObjects->SetColor(m_colorBackGroung); BGOObjects->Rectangle(tmpOrigin.x, tmpOrigin.y, tmpSize.x, tmpSize.y); } - if (NULL != m_subWidget) { - m_subWidget->OnRegenerateDisplay(); + if (NULL != m_subWidget[m_currentCreateId]) { + m_subWidget[m_currentCreateId]->OnRegenerateDisplay(); } - */ } bool ewol::ContextMenu::OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos) { - /* - if (NULL != m_subWidget) { - coord2D_ts tmpSize = m_subWidget->GetSize(); - coord2D_ts tmpOrigin = m_subWidget->GetOrigin(); + if (NULL != m_subWidget[m_currentCreateId]) { + coord2D_ts tmpSize = m_subWidget[m_currentCreateId]->GetSize(); + coord2D_ts tmpOrigin = m_subWidget[m_currentCreateId]->GetOrigin(); if( (tmpOrigin.x <= pos.local.x && tmpOrigin.x + tmpSize.x >= pos.local.x) && (tmpOrigin.y <= pos.local.y && tmpOrigin.y + tmpSize.y >= pos.local.y) ) { - return m_subWidget->GenEventInput(IdInput, typeEvent, pos.abs); + return m_subWidget[m_currentCreateId]->GenEventInput(IdInput, typeEvent, pos.abs); } else { //EWOL_INFO("Event ouside the context menu"); if (IdInput > 0) { @@ -278,23 +263,36 @@ bool ewol::ContextMenu::OnEventInput(int32_t IdInput, eventInputType_te typeEven || typeEvent == ewol::EVENT_INPUT_TYPE_UP || typeEvent == ewol::EVENT_INPUT_TYPE_ENTER || typeEvent == ewol::EVENT_INPUT_TYPE_LEAVE ) { - ewol::RmPopUp(GetWidgetId()); + // Auto-remove ... + MarkToRemove(); } } } - } - */ return true; } void ewol::ContextMenu::SetPositionMark(markPosition_te position, coord2D_ts arrowPos) { - /* EWOL_DEBUG("set context menu at the position : (" << arrowPos.x << "," << arrowPos.y << ")"); m_arrawBorder = position; m_arrowPos = arrowPos; MarkToReedraw(); - */ } + +void ewol::ContextMenu::OnFlipFlopEvent(void) +{ + EWOL_DEBUG("Flip-Flop"); + bool needFlipFlop = m_needFlipFlop; + // call herited classes + ewol::Drawable::OnFlipFlopEvent(); + // internal saving + if (true == needFlipFlop) { + m_subWidget[m_currentCreateId] = m_subWidget[m_currentDrawId]; + } + // in every case, we propagate the flip-flop EVENT + if (NULL != m_subWidget[m_currentDrawId]) { + m_subWidget[m_currentDrawId]->OnFlipFlopEvent(); + } +} \ No newline at end of file diff --git a/Sources/libewol/ewol/widget/ContextMenu.h b/Sources/libewol/ewol/widget/ContextMenu.h index 88c63d65..9172d890 100644 --- a/Sources/libewol/ewol/widget/ContextMenu.h +++ b/Sources/libewol/ewol/widget/ContextMenu.h @@ -56,7 +56,7 @@ namespace ewol { coord2D_ts m_arrowPos; etkFloat_t m_offset; markPosition_te m_arrawBorder; - ewol::Widget* m_subWidget; + ewol::Widget* m_subWidget[NB_BOUBLE_BUFFER]; public: void SubWidgetSet(ewol::Widget* newWidget); void SubWidgetRemove(void); @@ -67,6 +67,7 @@ namespace ewol { virtual void OnRegenerateDisplay(void); public: virtual bool OnEventInput(int32_t IdInput, eventInputType_te typeEvent, eventPosition_ts pos); + virtual void OnFlipFlopEvent(void); }; }; diff --git a/Sources/libewol/ewol/widget/Drawable.h b/Sources/libewol/ewol/widget/Drawable.h index 1925b3a9..d36ee0f8 100644 --- a/Sources/libewol/ewol/widget/Drawable.h +++ b/Sources/libewol/ewol/widget/Drawable.h @@ -30,7 +30,7 @@ namespace ewol { - class Drawable : virtual public ewol::Widget { + class Drawable : public ewol::Widget { public: Drawable(void); virtual ~Drawable(void); diff --git a/Sources/libewol/ewol/widget/List.cpp b/Sources/libewol/ewol/widget/List.cpp index 5ff07f18..7a70dbb5 100644 --- a/Sources/libewol/ewol/widget/List.cpp +++ b/Sources/libewol/ewol/widget/List.cpp @@ -50,7 +50,14 @@ ewol::List::List(void) ewol::List::~List(void) { - + //clean all the object + for (int32_t jjj=0; jjj= m_listOObject[m_currentCreateId].Size() ) { + m_listOObject[m_currentCreateId].PushBack(newObject); + } else { + m_listOObject[m_currentCreateId].Insert(pos, newObject); + } + m_needFlipFlop = true; +} + + +void ewol::List::ClearOObjectList(void) +{ + for (int32_t iii=0; iiiDraw(); + } + } + return true; +} + + + + void ewol::List::OnRegenerateDisplay(void) { if (true == NeedRedraw()) { diff --git a/Sources/libewol/ewol/widget/List.h b/Sources/libewol/ewol/widget/List.h index 5d0b58a6..69fd293d 100644 --- a/Sources/libewol/ewol/widget/List.h +++ b/Sources/libewol/ewol/widget/List.h @@ -31,7 +31,7 @@ #include namespace ewol { - class List :public ewol::WidgetScrooled, ewol::Drawable + class List :public ewol::WidgetScrooled { public: List(void); @@ -39,6 +39,15 @@ namespace ewol { virtual ~List(void); virtual bool CalculateMinSize(void); void SetLabel(etk::UString newLabel); + // Drawing capabilities .... + private: + etk::VectorType m_listOObject[NB_BOUBLE_BUFFER]; //!< generic element to display... + public: + void AddOObject(ewol::OObject* newObject, int32_t pos=-1); + void ClearOObjectList(void); + protected: + virtual bool OnDraw(void); + // list properties ... private: int32_t m_paddingSizeX; int32_t m_paddingSizeY; diff --git a/Sources/libewol/ewol/widget/Menu.cpp b/Sources/libewol/ewol/widget/Menu.cpp index 53170d4d..557e37b4 100644 --- a/Sources/libewol/ewol/widget/Menu.cpp +++ b/Sources/libewol/ewol/widget/Menu.cpp @@ -25,7 +25,7 @@ #include -#include +#include #include #include #include @@ -37,8 +37,8 @@ ewol::Menu::Menu(void) { - m_staticPointer = NULL; - m_widgetPopUp = NULL; + m_staticId = 0; + m_widgetContextMenu = NULL; } ewol::Menu::~Menu(void) @@ -68,7 +68,6 @@ void ewol::Menu::SubWidgetUnLink(ewol::Widget* newWidget) void ewol::Menu::Clear(void) { - /* for( int32_t iii=0; iii < m_listElement.Size(); iii++) { if (m_listElement[iii] != NULL) { delete(m_listElement[iii]); @@ -76,7 +75,6 @@ void ewol::Menu::Clear(void) } } m_listElement.Clear(); - */ } int32_t ewol::Menu::AddTitle(etk::UString label, etk::UString image, const char * generateEvent, const etk::UString message) @@ -86,7 +84,6 @@ int32_t ewol::Menu::AddTitle(etk::UString label, etk::UString image, const char int32_t ewol::Menu::Add(int32_t parent, etk::UString label, etk::UString image, const char * generateEvent, const etk::UString message) { -/* ewol::MenuElement * tmpObject = new ewol::MenuElement(); if (NULL == tmpObject) { EWOL_ERROR("Allocation problem"); @@ -94,7 +91,7 @@ int32_t ewol::Menu::Add(int32_t parent, etk::UString label, etk::UString image, } tmpObject->m_localId = m_staticId++; tmpObject->m_parentId = parent; - tmpObject->m_widgetId = -1; + tmpObject->m_widgetPointer = NULL; tmpObject->m_label = label; tmpObject->m_image = image; tmpObject->m_generateEvent = generateEvent; @@ -108,12 +105,10 @@ int32_t ewol::Menu::Add(int32_t parent, etk::UString label, etk::UString image, return tmpObject->m_localId;; } ewol::SizerHori::SubWidgetAdd(myButton); - myButton->ExternLinkOnEvent(ewolEventButtonPressed, GetWidgetId(), ewolEventButtonPressed); - tmpObject->m_widgetId = myButton->GetWidgetId(); + myButton->RegisterOnEvent(this, ewolEventButtonPressed, ewolEventButtonPressed); + tmpObject->m_widgetPointer = myButton; } return tmpObject->m_localId; -*/ - return 0; } void ewol::Menu::AddSpacer(void) @@ -122,25 +117,37 @@ void ewol::Menu::AddSpacer(void) } -bool ewol::Menu::OnEventAreaExternal(int32_t widgetID, const char * generateEventId, const char * data, etkFloat_t x, etkFloat_t y) +/** + * @brief Receive a message from an other EObject with a specific eventId and data + * @param[in] CallerObject Pointer on the EObject that information came from + * @param[in] eventId Message registered by this class + * @param[in] data Data registered by this class + * @return --- + */ +void ewol::Menu::OnReceiveMessage(ewol::EObject * CallerObject, const char * eventId, etk::UString data) { /* - if (true == ewol::SizerHori::OnEventAreaExternal(widgetID, generateEventId, data, x, y)) { + if (true == ewol::SizerHori::OnReceiveMessage(CallerObject, eventId, data)) { return true; } */ - /* - if (NULL==data && generateEventId==ewolEventButtonPressed) { + if (eventId == ewolEventButtonPressed) { for(int32_t iii=0; iiim_widgetId) { - // 2 posible case + if (CallerObject == m_listElement[iii]->m_widgetPointer) { + // 2 posible case (have a message or have a child ... if (m_listElement[iii]->m_generateEvent != NULL) { - // TODO : Later ... - //ewol::widgetMessageMultiCast::Send(GetWidgetId(), m_listElement[iii]->m_generateEvent, m_listElement[iii]->m_message); - m_widgetPopUp->MarkToRemove(); - m_widgetPopUp = NULL; - return true; - } else { + EWOL_DEBUG("Menu ==> Generate Event"); + // Send a multicast event ... + SendMultiCast(m_listElement[iii]->m_generateEvent, m_listElement[iii]->m_message); + /* + if (NULL != m_widgetContextMenu) { + m_widgetContextMenu->MarkToRemove(); + } + */ + m_widgetContextMenu = NULL; + return; + } else{ + EWOL_DEBUG("Menu ==> Load Sub Menu"); bool findChild = false; for(int32_t jjj=0; jjjm_localId == m_listElement[jjj]->m_parentId) { @@ -150,19 +157,17 @@ bool ewol::Menu::OnEventAreaExternal(int32_t widgetID, const char * generateEven } if (false == findChild) { EWOL_WARNING("Event on menu element with no child an no event... label=" << m_listElement[iii]->m_label); - return false; + return; } // create a context menu : - ewol::ContextMenu * tmpWidget = new ewol::ContextMenu(); - if (NULL == tmpWidget) { + m_widgetContextMenu = new ewol::ContextMenu(); + if (NULL == m_widgetContextMenu) { EWOL_ERROR("Allocation Error"); - return false; + return; } // Get the button widget : coord2D_ts newPosition; - newPosition.x = x; - newPosition.y = y; - ewol::Widget * eventFromWidget = ewol::widgetManager::Get(widgetID); + ewol::Widget * eventFromWidget = static_cast(CallerObject); if (NULL != eventFromWidget) { coord2D_ts tmpOri = eventFromWidget->GetOrigin(); coord2D_ts tmpSize = eventFromWidget->GetSize(); @@ -171,7 +176,7 @@ bool ewol::Menu::OnEventAreaExternal(int32_t widgetID, const char * generateEven newPosition.y = tmpOri.y + tmpSize.y; } - tmpWidget->SetPositionMark(ewol::CONTEXT_MENU_MARK_TOP, newPosition ); + m_widgetContextMenu->SetPositionMark(ewol::CONTEXT_MENU_MARK_TOP, newPosition ); ewol::SizerVert * mySizerVert = NULL; ewol::Button * myButton = NULL; @@ -179,7 +184,7 @@ bool ewol::Menu::OnEventAreaExternal(int32_t widgetID, const char * generateEven mySizerVert = new ewol::SizerVert(); mySizerVert->LockExpendContamination(true); // set it in the pop-up-system : - tmpWidget->SubWidgetSet(mySizerVert); + m_widgetContextMenu->SubWidgetSet(mySizerVert); for(int32_t jjj=0; jjjm_localId == m_listElement[jjj]->m_parentId) { @@ -195,13 +200,10 @@ bool ewol::Menu::OnEventAreaExternal(int32_t widgetID, const char * generateEven mySizerVert->SubWidgetAdd(myButton); } } - m_staticPointer = tmpWidget; - ewol::PopUpWidgetPush(m_staticPointer); + ewol::PopUpWidgetPush(m_widgetContextMenu); } - return true; + return; } } } - */ - return false; } diff --git a/Sources/libewol/ewol/widget/Menu.h b/Sources/libewol/ewol/widget/Menu.h index b83152bc..fcf1b881 100644 --- a/Sources/libewol/ewol/widget/Menu.h +++ b/Sources/libewol/ewol/widget/Menu.h @@ -30,6 +30,7 @@ #include #include #include +#include namespace ewol { @@ -55,15 +56,22 @@ namespace ewol { virtual void SubWidgetUnLink(ewol::Widget* newWidget); private: etk::VectorType m_listElement; - ewol::EObject* m_staticPointer; - ewol::EObject* m_widgetPopUp; + int32_t m_staticId; // unique ID for every element of the menu ... + ewol::ContextMenu* m_widgetContextMenu; public: void Clear(void); int32_t AddTitle(etk::UString label, etk::UString image="", const char * generateEvent = NULL, const etk::UString message = ""); int32_t Add(int32_t parent, etk::UString label, etk::UString image="", const char * generateEvent = NULL, const etk::UString message = ""); void AddSpacer(void); - virtual bool OnEventAreaExternal(int32_t widgetID, const char * generateEventId, const char * data, etkFloat_t x, etkFloat_t y); + /** + * @brief Receive a message from an other EObject with a specific eventId and data + * @param[in] CallerObject Pointer on the EObject that information came from + * @param[in] eventId Message registered by this class + * @param[in] data Data registered by this class + * @return --- + */ + virtual void OnReceiveMessage(ewol::EObject * CallerObject, const char * eventId, etk::UString data); }; }; diff --git a/Sources/libewol/ewol/widget/SizerHori.cpp b/Sources/libewol/ewol/widget/SizerHori.cpp index e7804bff..d11740e3 100644 --- a/Sources/libewol/ewol/widget/SizerHori.cpp +++ b/Sources/libewol/ewol/widget/SizerHori.cpp @@ -28,7 +28,7 @@ #include #undef __class__ -#define __class__ "ewol::SizerHori" +#define __class__ "SizerHori" ewol::SizerHori::SizerHori(void) { diff --git a/Sources/libewol/ewol/widget/WidgetScrolled.h b/Sources/libewol/ewol/widget/WidgetScrolled.h index e920512b..34c67d45 100644 --- a/Sources/libewol/ewol/widget/WidgetScrolled.h +++ b/Sources/libewol/ewol/widget/WidgetScrolled.h @@ -41,7 +41,7 @@ namespace ewol { #endif }highSpeedMode_te; - class WidgetScrooled : virtual public ewol::Widget + class WidgetScrooled : public ewol::Widget { protected: coord2D_ts m_originScrooled; diff --git a/Sources/libewol/ewol/widgetMeta/FileChooser.cpp b/Sources/libewol/ewol/widgetMeta/FileChooser.cpp index d1e12617..a925d7cf 100644 --- a/Sources/libewol/ewol/widgetMeta/FileChooser.cpp +++ b/Sources/libewol/ewol/widgetMeta/FileChooser.cpp @@ -472,7 +472,7 @@ ewol::FileChooser::~FileChooser(void) void ewol::FileChooser::SetTitle(etk::UString label) { /* - ewol::Label * tmpWidget = dynamic_cast(ewol::widgetManager::Get(m_widgetTitleId)); + ewol::Label * tmpWidget = static_cast(ewol::widgetManager::Get(m_widgetTitleId)); if (NULL == tmpWidget) { return; } @@ -483,7 +483,7 @@ void ewol::FileChooser::SetTitle(etk::UString label) void ewol::FileChooser::SetValidateLabel(etk::UString label) { /* - ewol::Button * tmpWidget = dynamic_cast(ewol::widgetManager::Get(m_widgetValidateId)); + ewol::Button * tmpWidget = static_cast(ewol::widgetManager::Get(m_widgetValidateId)); if (NULL == tmpWidget) { return; } @@ -494,7 +494,7 @@ void ewol::FileChooser::SetValidateLabel(etk::UString label) void ewol::FileChooser::SetCancelLabel(etk::UString label) { /* - ewol::Button * tmpWidget = dynamic_cast(ewol::widgetManager::Get(m_widgetCancelId)); + ewol::Button * tmpWidget = static_cast(ewol::widgetManager::Get(m_widgetCancelId)); if (NULL == tmpWidget) { return; } @@ -514,7 +514,7 @@ void ewol::FileChooser::SetFileName(etk::UString filename) { /* m_file = filename; - ewol::Entry * tmpWidget = dynamic_cast(ewol::widgetManager::Get(m_widgetCurrentFileNameId)); + ewol::Entry * tmpWidget = static_cast(ewol::widgetManager::Get(m_widgetCurrentFileNameId)); if (NULL == tmpWidget) { return; } @@ -534,7 +534,7 @@ bool ewol::FileChooser::OnEventAreaExternal(int32_t widgetID, const char * gener return true; } else if (ewolEventFileChooserEntryFile == generateEventId) { //==> change the file name - ewol::Entry * tmpWidget = dynamic_cast(ewol::widgetManager::Get(m_widgetCurrentFileNameId)); + ewol::Entry * tmpWidget = static_cast(ewol::widgetManager::Get(m_widgetCurrentFileNameId)); if (NULL != tmpWidget) { m_file = tmpWidget->GetValue(); } @@ -551,7 +551,7 @@ bool ewol::FileChooser::OnEventAreaExternal(int32_t widgetID, const char * gener return true; } else if (ewolEventFileChooserSelectFolder == generateEventId) { //==> this is an internal event ... - FileChooserFolderList * myListFolder = dynamic_cast(ewol::widgetManager::Get(m_widgetListFolderId)); + FileChooserFolderList * myListFolder = static_cast(ewol::widgetManager::Get(m_widgetListFolderId)); etk::UString tmpString = myListFolder->GetSelectedLine(); EWOL_DEBUG(" old PATH : \"" << m_folder << "\" + \"" << tmpString << "\""); m_folder = m_folder + tmpString; @@ -576,7 +576,7 @@ bool ewol::FileChooser::OnEventAreaExternal(int32_t widgetID, const char * gener return true; } else if (ewolEventFileChooserSelectFile == generateEventId) { m_hasSelectedFile = true; - FileChooserFileList * myListFile = dynamic_cast(ewol::widgetManager::Get(m_widgetListFileId)); + FileChooserFileList * myListFile = static_cast(ewol::widgetManager::Get(m_widgetListFileId)); etk::UString file = myListFile->GetSelectedLine(); SetFileName(file); GenEventInputExternal(generateEventId, x, y); @@ -596,10 +596,10 @@ bool ewol::FileChooser::OnEventAreaExternal(int32_t widgetID, const char * gener void ewol::FileChooser::UpdateCurrentFolder(void) { /* - FileChooserFileList * myListFile = dynamic_cast(ewol::widgetManager::Get(m_widgetListFileId)); - FileChooserFolderList * myListFolder = dynamic_cast(ewol::widgetManager::Get(m_widgetListFolderId)); - ewol::Entry * myEntry = dynamic_cast(ewol::widgetManager::Get(m_widgetCurrentFolderId)); - ewol::CheckBox * myhidenFiles = dynamic_cast(ewol::widgetManager::Get(m_widgetCheckBoxId)); + FileChooserFileList * myListFile = static_cast(ewol::widgetManager::Get(m_widgetListFileId)); + FileChooserFolderList * myListFolder = static_cast(ewol::widgetManager::Get(m_widgetListFolderId)); + ewol::Entry * myEntry = static_cast(ewol::widgetManager::Get(m_widgetCurrentFolderId)); + ewol::CheckBox * myhidenFiles = static_cast(ewol::widgetManager::Get(m_widgetCheckBoxId)); myListFile->ClearElements(); myListFolder->ClearElements(); diff --git a/Sources/libewol/ewol/widgetMeta/Keyboard.cpp b/Sources/libewol/ewol/widgetMeta/Keyboard.cpp index a5d64e98..01f93924 100644 --- a/Sources/libewol/ewol/widgetMeta/Keyboard.cpp +++ b/Sources/libewol/ewol/widgetMeta/Keyboard.cpp @@ -191,7 +191,7 @@ bool ewol::Keyboard::OnEventAreaExternal(int32_t widgetID, const char * generate /* EWOL_INFO("Receive Event from the Keyboard ... : widgetid=" << widgetID << "\"" << generateEventId << "\" ==> internalEvent=\"" << data << "\"" ); if (ewolEventKeyEvent == generateEventId) { - ewol::Button * bt = dynamic_cast(ewol::widgetManager::Get(widgetID)); + ewol::Button * bt = static_cast(ewol::widgetManager::Get(widgetID)); EWOL_DEBUG("kbevent : \"" << bt->GetLabel() << "\""); etk::UString data = bt->GetLabel(); if (data == "DEL") { diff --git a/Sources/libewol/file.mk b/Sources/libewol/file.mk index ae65bcb5..6898b44c 100644 --- a/Sources/libewol/file.mk +++ b/Sources/libewol/file.mk @@ -7,7 +7,6 @@ FILE_LIST = ewol/ewol.cpp \ ewol/Debug.cpp \ ewol/EObject.cpp \ ewol/EObjectManager.cpp \ - ewol/EObjectMessageMulticast.cpp \ ewol/OObject.cpp \ ewol/OObject/2DText.cpp \ ewol/OObject/2DTextColored.cpp \