diff --git a/Sources/Buffer/BufferManager.cpp b/Sources/Buffer/BufferManager.cpp index ffce9b8..0e6ebbc 100644 --- a/Sources/Buffer/BufferManager.cpp +++ b/Sources/Buffer/BufferManager.cpp @@ -62,8 +62,8 @@ BufferManager::~BufferManager(void) EDN_INFO("~BufferManager::RemoveAll();"); RemoveAll(); // clear The list of Buffer - EDN_INFO("~BufferManager::listBuffer.clear();"); - listBuffer.clear(); + EDN_INFO("~BufferManager::listBuffer.Clear();"); + listBuffer.Clear(); EDN_INFO("~BufferManager::delete(BufferNotExiste);"); delete(BufferNotExiste); } @@ -73,6 +73,9 @@ void BufferManager::OnMessage(int32_t id, int32_t dataID) { switch (id) { + case EDN_MSG__BUFFER_CHANGE_CURRENT: + m_idSelected = dataID; + break; case EDN_MSG__NEW: { int32_t newOne = Create(); @@ -81,6 +84,49 @@ void BufferManager::OnMessage(int32_t id, int32_t dataID) } } break; + case EDN_MSG__BUFF_ID_CLOSE: + // Check buffer existence + if(true == Exist(dataID)) { + // Get the new display buffer + if (m_idSelected == dataID) { + // Try previous buffer + int32_t destBuffer = -1; + for(int32_t ii=dataID-1; ii >= 0; ii--) { + if (true == Exist(ii) ) { + destBuffer = ii; + break; + } + } + //EDN_DEBUG("new buffer selected : ?? " << destBuffer); + // try next buffer + if (-1 == destBuffer) { + for(int32_t ii=dataID+1; ii < listBuffer.Size(); ii++) { + if (true == Exist(ii) ) { + destBuffer = ii; + break; + } + } + } + //EDN_DEBUG("new buffer selected : ?? " << destBuffer); + // set it to the currect display + SendMessage(EDN_MSG__CURRENT_CHANGE_BUFFER_ID, destBuffer); + } + //EDN_DEBUG("Remove : " << dataID); + // Remove requested buffer + Remove(dataID); + } + break; + case EDN_MSG__BUFF_ID_SAVE: + // Check buffer existence + if(true == Exist(dataID)) { + // If no name ==> request a Gui display ... + if (Get(dataID)->HaveName() == false) { + SendMessage(EDN_MSG__GUI_SHOW_SAVE_AS, dataID); + } else { + Get(dataID)->Save(); + } + } + break; } } @@ -101,7 +147,7 @@ void BufferManager::OnMessage(int32_t id, int32_t dataID) void BufferManager::RemoveAll(void) { int32_t i; - for (i=0; i<(int32_t)listBuffer.size(); i++) { + for (i=0; i " << listBuffer.size()); + EDN_ERROR("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.Size()); } return BufferNotExiste; } @@ -179,7 +225,7 @@ bool BufferManager::Exist(int32_t BufferID) return false; } // check if the Buffer existed - if (BufferID < (int32_t)listBuffer.size()) { + if (BufferID < listBuffer.Size()) { // check if the buffer already existed if (NULL != listBuffer[BufferID]) { return true; @@ -193,7 +239,7 @@ int32_t BufferManager::GetId(Edn::String &filename) { int32_t iii; // check if the Buffer existed - for (iii=0; iii < (int32_t)listBuffer.size(); iii++) { + for (iii=0; iii < listBuffer.Size(); iii++) { // check if the buffer already existed if (NULL != listBuffer[iii]) { if ( listBuffer[iii]->GetName() == filename) { @@ -216,7 +262,7 @@ bool BufferManager::Exist(Edn::String &filename) // return the number of buffer (open in the past) if 5 buffer open and 4 close ==> return 5 uint32_t BufferManager::Size(void) { - return listBuffer.size(); + return listBuffer.Size(); } @@ -234,7 +280,7 @@ bool BufferManager::Remove(int32_t BufferID) return false; } // check if the Buffer existed - if (BufferID < (int32_t)listBuffer.size()) { + if (BufferID < listBuffer.Size()) { // check if the buffer already existed if (NULL != listBuffer[BufferID]) { // TODO : Check if it saved... @@ -253,7 +299,7 @@ bool BufferManager::Remove(int32_t BufferID) return false; } } else { - EDN_INFO("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.size()); + EDN_INFO("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.Size()); return false; } } @@ -269,7 +315,7 @@ bool BufferManager::Remove(int32_t BufferID) int32_t BufferManager::WitchBuffer(int32_t iEmeElement) { int32_t i; - for (i=0; i<(int32_t)listBuffer.size(); i++) { + for (i=0; i -#include class BufferManager: public Singleton, public MsgBroadcast { @@ -65,7 +63,7 @@ class BufferManager: public Singleton, public MsgBroadcast private: - std::vector listBuffer; //!< element List of the char Elements + Edn::VectorType listBuffer; //!< element List of the char Elements void RemoveAll(void); //!< remove all buffer int32_t m_idSelected; diff --git a/Sources/CustumWidget/BufferView/BufferView.cpp b/Sources/CustumWidget/BufferView/BufferView.cpp index 881cad4..b31e101 100644 --- a/Sources/CustumWidget/BufferView/BufferView.cpp +++ b/Sources/CustumWidget/BufferView/BufferView.cpp @@ -188,7 +188,7 @@ gboolean BufferView::CB_displayDraw( GtkWidget *widget, GdkEventExpose *event, g -// sur : émis lors du premier affichage de la GtkDrawingArea +// sur : émis lors du premier affichage de la GtkDrawingArea gboolean BufferView::CB_displayInit( GtkWidget *widget, gpointer data) { BufferView * self = reinterpret_cast(data); @@ -245,12 +245,77 @@ gint BufferView::CB_keyboardEvent( GtkWidget *widget, GdkEventKey *event, gpoint //BufferView * self = reinterpret_cast(data); if(event->type == GDK_KEY_PRESS) { - gtk_widget_queue_draw( widget ); + gtk_widget_queue_draw( widget ); } return true; } +void BufferView::OnPopupEventShow(GtkWidget *menuitem, gpointer data) +{ + BufferView * self = reinterpret_cast(data); + self->SendMessage(EDN_MSG__CURRENT_CHANGE_BUFFER_ID, self->m_contectMenuSelectID); +} + +void BufferView::OnPopupEventClose(GtkWidget *menuitem, gpointer data) +{ + BufferView * self = reinterpret_cast(data); + self->SendMessage(EDN_MSG__BUFF_ID_CLOSE, self->m_contectMenuSelectID); +} + +void BufferView::OnPopupEventSave(GtkWidget *menuitem, gpointer data) +{ + BufferView * self = reinterpret_cast(data); + self->SendMessage(EDN_MSG__BUFF_ID_SAVE, self->m_contectMenuSelectID); +} + +void BufferView::OnPopupEventSaveAs(GtkWidget *menuitem, gpointer data) +{ + BufferView * self = reinterpret_cast(data); + self->SendMessage(EDN_MSG__GUI_SHOW_SAVE_AS, self->m_contectMenuSelectID); +} + + +void BufferView::ViewPopupMenu(GtkWidget *parrent, GdkEventButton *event, int32_t BufferID) +{ + // Save the slected buffer + m_contectMenuSelectID = BufferID; + if (m_bufferManager->Exist(m_contectMenuSelectID)) { + GtkWidget *menu, *menuitem; + menu = gtk_menu_new(); + menuitem = gtk_menu_item_new_with_label("Show"); + g_signal_connect( G_OBJECT(menuitem), "activate", G_CALLBACK(OnPopupEventShow), this); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + if (true == m_bufferManager->Get(m_contectMenuSelectID)->HaveName()) { + if (true == m_bufferManager->Get(m_contectMenuSelectID)->IsModify()) { + menuitem = gtk_menu_item_new_with_label("Save"); + g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(OnPopupEventSave), this); + } else { + menuitem = gtk_menu_item_new_with_label("Force Save"); + g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(OnPopupEventSave), this); + } + } + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + menuitem = gtk_menu_item_new_with_label("Save As ..."); + g_signal_connect( G_OBJECT(menuitem), "activate", G_CALLBACK(OnPopupEventSaveAs), this); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + menuitem = gtk_menu_item_new_with_label("Close"); + g_signal_connect( G_OBJECT(menuitem), "activate", G_CALLBACK(OnPopupEventClose), this); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show_all(menu); + // Note: event can be NULL here when called from view_onPopupMenu; + // gdk_event_get_time() accepts a NULL argument + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + (event != NULL) ? event->button : 0, + gdk_event_get_time((GdkEvent*)event)); + } else { + EDN_ERROR("Buffer does not Exist !!! " << m_contectMenuSelectID); + } +} + + + + gint BufferView::CB_mouseButtonEvent(GtkWidget *widget, GdkEventButton *event, gpointer data) { BufferView * self = reinterpret_cast(data); @@ -294,6 +359,8 @@ gint BufferView::CB_mouseButtonEvent(GtkWidget *widget, GdkEventButton *event, g uint32_t fontHeight = Display::GetFontHeight(); int32_t selectBuf = self->m_bufferManager->WitchBuffer((event->y / fontHeight) + 1); if ( 0 <= selectBuf) { + self->ViewPopupMenu(widget, event, selectBuf); + /* old methode ==> must not be remove ==> create to generate better menu... // TODO : Find a simple methode int32_t windowsPosX, windowsPosY; gtk_window_get_position(GTK_WINDOW(gtk_widget_get_toplevel(widget)), &windowsPosX, &windowsPosY); @@ -302,8 +369,9 @@ gint BufferView::CB_mouseButtonEvent(GtkWidget *widget, GdkEventButton *event, g gtk_widget_translate_coordinates(widget, gtk_widget_get_toplevel(widget), 0, 0, &widgetPosX, &widgetPosY); //EDN_INFO("widgetPosX=" << widgetPosX << " widgetPosY=" << widgetPosY); self->m_menuContext->Show(self->m_shawableAreaX+2+widgetPosX+windowsPosX, ((int32_t)(event->y / fontHeight)*fontHeight)+(fontHeight/2)+widgetPosY+windowsPosY, false); + */ } else { - self->m_menuContext->Hide(); + //self->m_menuContext->Hide(); } } } else { diff --git a/Sources/CustumWidget/BufferView/BufferView.h b/Sources/CustumWidget/BufferView/BufferView.h index c108243..2a0ef36 100644 --- a/Sources/CustumWidget/BufferView/BufferView.h +++ b/Sources/CustumWidget/BufferView/BufferView.h @@ -55,9 +55,14 @@ class BufferView : public MsgBroadcast static gint CB_mouseMotionEvent( GtkWidget *widget, GdkEventMotion *event, gpointer data); static void CB_EventOnBufferManager(gpointer data); + static void OnPopupEventShow(GtkWidget *menuitem, gpointer data); + static void OnPopupEventClose(GtkWidget *menuitem, gpointer data); + static void OnPopupEventSave(GtkWidget *menuitem, gpointer data); + static void OnPopupEventSaveAs(GtkWidget *menuitem, gpointer data); private: + void ViewPopupMenu(GtkWidget *parrent, GdkEventButton *event, int32_t BufferID); // main windows widget : GtkWidget * m_widget; // récupération des proprieter général... @@ -67,6 +72,7 @@ class BufferView : public MsgBroadcast int32_t m_shawableAreaX; int32_t m_shawableAreaY; int32_t m_selectedID; + int32_t m_contectMenuSelectID; }; diff --git a/Sources/CustumWidget/CodeView/CodeView.cpp b/Sources/CustumWidget/CodeView/CodeView.cpp index de3de8b..5049089 100644 --- a/Sources/CustumWidget/CodeView/CodeView.cpp +++ b/Sources/CustumWidget/CodeView/CodeView.cpp @@ -105,11 +105,7 @@ void CodeView::OnMessage(int32_t id, int32_t dataID) SendMessage(EDN_MSG__BUFFER_CHANGE_CURRENT, m_bufferID); break; case EDN_MSG__CURRENT_SAVE: - if (m_bufferManager->Get(m_bufferID)->HaveName() == false) { - SendMessage(EDN_MSG__GUI_SHOW_SAVE_AS, m_bufferID); - } else { - m_bufferManager->Get(m_bufferID)->Save(); - } + SendMessage(EDN_MSG__BUFF_ID_SAVE, m_bufferID); break; case EDN_MSG__CURRENT_SAVE_AS: SendMessage(EDN_MSG__GUI_SHOW_SAVE_AS, m_bufferID); @@ -165,9 +161,7 @@ void CodeView::OnMessage(int32_t id, int32_t dataID) case EDN_MSG__CURRENT_REPLACE_ALL: break; case EDN_MSG__CURRENT_CLOSE: - m_bufferManager->Remove(m_bufferID); - m_bufferID = -1; - SendMessage(EDN_MSG__BUFFER_CHANGE_CURRENT, m_bufferID); + SendMessage(EDN_MSG__BUFF_ID_CLOSE, m_bufferID); break; case EDN_MSG__CURRENT_UNDO: m_bufferManager->Get(m_bufferID)->Undo();