#endif // WX_PRECOMP
#include <gtk/gtk.h>
+#include "wx/gtk/private/gtk2-compat.h"
+
+#if wxUSE_LIBHILDON
+ #include <hildon-widgets/hildon-window.h>
+#endif // wxUSE_LIBHILDON
+
+#if wxUSE_LIBHILDON2
+ #include <hildon/hildon.h>
+#endif // wxUSE_LIBHILDON2
// ----------------------------------------------------------------------------
// event tables
// ----------------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
-
// ============================================================================
// implementation
// ============================================================================
wxFrame::~wxFrame()
{
- m_isBeingDeleted = true;
+ SendDestroyEvent();
+
DeleteAllBars();
}
wxFrameBase::DoGetClientSize(width, height);
+ if (m_useCachedClientSize)
+ return;
+
if (height)
{
#if wxUSE_MENUS_NATIVE
// menu bar
if (m_frameMenuBar && m_frameMenuBar->IsShown())
{
- GtkRequisition req;
- gtk_widget_size_request(m_frameMenuBar->m_widget, &req);
- *height -= req.height;
+ int h;
+ gtk_widget_get_preferred_height(m_frameMenuBar->m_widget, NULL, &h);
+#if !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
+ *height -= h;
+#endif
}
#endif // wxUSE_MENUS_NATIVE
// tool bar
if (m_frameToolBar && m_frameToolBar->IsShown())
{
- GtkRequisition req;
- gtk_widget_size_request(m_frameToolBar->m_widget, &req);
if (m_frameToolBar->IsVertical())
{
if (width)
- *width -= req.width;
+ {
+ int w;
+ gtk_widget_get_preferred_width(m_frameToolBar->m_widget, NULL, &w);
+ *width -= w;
+ }
}
else
{
if (height)
- *height -= req.height;
+ {
+ int h;
+ gtk_widget_get_preferred_height(m_frameToolBar->m_widget, NULL, &h);
+ *height -= h;
+ }
}
}
#endif // wxUSE_TOOLBAR
*height = 0;
}
+#if wxUSE_MENUS && wxUSE_ACCEL
+// Helper for wxCreateAcceleratorTableForMenuBar
+static void wxAddAccelerators(wxList& accelEntries, wxMenu* menu)
+{
+ size_t i;
+ for (i = 0; i < menu->GetMenuItems().GetCount(); i++)
+ {
+ wxMenuItem* item = (wxMenuItem*) menu->GetMenuItems().Item(i)->GetData();
+ if (item->GetSubMenu())
+ {
+ wxAddAccelerators(accelEntries, item->GetSubMenu());
+ }
+ else if (!item->GetItemLabel().IsEmpty())
+ {
+ wxAcceleratorEntry* entry = wxAcceleratorEntry::Create(item->GetItemLabel());
+ if (entry)
+ {
+ entry->Set(entry->GetFlags(), entry->GetKeyCode(), item->GetId());
+ accelEntries.Append((wxObject*) entry);
+ }
+ }
+ }
+}
+
+// Create an accelerator table consisting of all the accelerators
+// from the menubar in the given menus
+static wxAcceleratorTable wxCreateAcceleratorTableForMenuBar(wxMenuBar* menuBar)
+{
+ wxList accelEntries;
+
+ size_t i;
+ for (i = 0; i < menuBar->GetMenuCount(); i++)
+ {
+ wxAddAccelerators(accelEntries, menuBar->GetMenu(i));
+ }
+
+ size_t n = accelEntries.GetCount();
+
+ if (n == 0)
+ return wxAcceleratorTable();
+
+ wxAcceleratorEntry* entries = new wxAcceleratorEntry[n];
+
+ for (i = 0; i < accelEntries.GetCount(); i++)
+ {
+ wxAcceleratorEntry* entry = (wxAcceleratorEntry*) accelEntries.Item(i)->GetData();
+ entries[i] = (*entry);
+ delete entry;
+
+ }
+
+ wxAcceleratorTable table(n, entries);
+ delete[] entries;
+
+ return table;
+}
+#endif // wxUSE_MENUS && wxUSE_ACCEL
+
bool wxFrame::ShowFullScreen(bool show, long style)
{
if (!wxFrameBase::ShowFullScreen(show, style))
return false;
+#if wxUSE_MENUS && wxUSE_ACCEL
+ if (show && GetMenuBar())
+ {
+ wxAcceleratorTable table(wxCreateAcceleratorTableForMenuBar(GetMenuBar()));
+ if (table.IsOk())
+ SetAcceleratorTable(table);
+ }
+#endif // wxUSE_MENUS && wxUSE_ACCEL
+
wxWindow* const bar[] = {
#if wxUSE_MENUS
m_frameMenuBar,
return true;
}
-void wxFrame::OnInternalIdle()
+bool wxFrame::SendIdleEvents(wxIdleEvent& event)
{
- wxFrameBase::OnInternalIdle();
+ bool needMore = wxFrameBase::SendIdleEvents(event);
-#if wxUSE_MENUS_NATIVE
- if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
-#endif // wxUSE_MENUS_NATIVE
+#if wxUSE_MENUS
+ if (m_frameMenuBar && m_frameMenuBar->SendIdleEvents(event))
+ needMore = true;
+#endif
#if wxUSE_TOOLBAR
- if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
+ if (m_frameToolBar && m_frameToolBar->SendIdleEvents(event))
+ needMore = true;
#endif
#if wxUSE_STATUSBAR
- if (m_frameStatusBar)
- {
- m_frameStatusBar->OnInternalIdle();
-
- // There may be controls in the status bar that
- // need to be updated
- for ( wxWindowList::compatibility_iterator node = m_frameStatusBar->GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *child = node->GetData();
- child->OnInternalIdle();
- }
- }
+ if (m_frameStatusBar && m_frameStatusBar->SendIdleEvents(event))
+ needMore = true;
#endif
+
+ return needMore;
}
// ----------------------------------------------------------------------------
if ( m_frameMenuBar )
{
- m_frameMenuBar->UnsetInvokingWindow( this );
-
- gtk_widget_ref( m_frameMenuBar->m_widget );
+#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2
+ hildon_window_set_menu(HILDON_WINDOW(m_widget), NULL);
+#else // !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
+ g_object_ref( m_frameMenuBar->m_widget );
gtk_container_remove( GTK_CONTAINER(m_mainWidget), m_frameMenuBar->m_widget );
+#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 /!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
}
wxFrameBase::DetachMenuBar();
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
void wxFrame::AttachMenuBar( wxMenuBar *menuBar )
if (m_frameMenuBar)
{
- m_frameMenuBar->SetInvokingWindow( this );
-
- m_frameMenuBar->SetParent(this);
+#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2
+ hildon_window_set_menu(HILDON_WINDOW(m_widget),
+ GTK_MENU(m_frameMenuBar->m_widget));
+#else // !wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
// menubar goes into top of vbox (m_mainWidget)
gtk_box_pack_start(
GTK_BOX(m_mainWidget), menuBar->m_widget, false, false, 0);
gtk_box_reorder_child(GTK_BOX(m_mainWidget), menuBar->m_widget, 0);
- // disconnect wxWindowGTK "size_request" handler,
- // it interferes with sizing of detached GtkHandleBox
- gulong handler_id = g_signal_handler_find(
- menuBar->m_widget,
- GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA),
- g_signal_lookup("size_request", GTK_TYPE_WIDGET),
- 0, NULL, NULL, menuBar);
- if (handler_id != 0)
- g_signal_handler_disconnect(menuBar->m_widget, handler_id);
-
// reset size request to allow native sizing to work
gtk_widget_set_size_request(menuBar->m_widget, -1, -1);
gtk_widget_show( m_frameMenuBar->m_widget );
+#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2/!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_MENUS_NATIVE
{
// Vertical toolbar and m_wxwindow go into an hbox, inside the
// vbox (m_mainWidget). hbox is created on demand.
- GtkWidget* hbox = m_wxwindow->parent;
- if (!GTK_IS_HBOX(hbox))
+ GtkWidget* hbox = gtk_widget_get_parent(m_wxwindow);
+ if (hbox == m_mainWidget)
{
- hbox = gtk_hbox_new(false, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_show(hbox);
- gtk_container_add(GTK_CONTAINER(m_mainWidget), hbox);
+ gtk_box_pack_start(GTK_BOX(m_mainWidget), hbox, true, true, 0);
gtk_widget_reparent(m_wxwindow, hbox);
}
gtk_widget_reparent(toolbar->m_widget, hbox);
gtk_box_reorder_child(
GTK_BOX(m_mainWidget), toolbar->m_widget, pos);
}
-
- // disconnect wxWindowGTK "size_request" handler,
- // it interferes with sizing of detached GtkHandleBox
- gulong handler_id = g_signal_handler_find(
- toolbar->m_widget,
- GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA),
- g_signal_lookup("size_request", GTK_TYPE_WIDGET),
- 0, NULL, NULL, toolbar);
- if (handler_id != 0)
- g_signal_handler_disconnect(toolbar->m_widget, handler_id);
-
// reset size request to allow native sizing to work
gtk_widget_set_size_request(toolbar->m_widget, -1, -1);
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_TOOLBAR
gtk_box_set_child_packing(GTK_BOX(m_mainWidget),
statbar->m_widget, false, false, 0, GTK_PACK_END);
// make sure next size_allocate on statusbar causes a size event
- statbar->m_oldClientWidth = 0;
+ statbar->m_useCachedClientSize = false;
+ statbar->m_clientWidth = 0;
+ int h = -1;
+ if (statbar->m_wxwindow)
+ {
+ // statusbar is not a native widget, need to set height request
+ h = statbar->m_height;
+ }
+ gtk_widget_set_size_request(statbar->m_widget, -1, h);
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_STATUSBAR