From 11e1c70d8e6aa75e2ecb660fffd61b6cfcb8ffc7 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 24 Oct 1999 16:45:01 +0000 Subject: [PATCH] Small distrib changes, Use GTK's native insert for wxListBox, Compile pacthes for AIX, wxClipboard things, Ignore wxSIZE_AUTO flags in wxDialog and wxFrame, Ignore toolbar size in wxFrame::Get/SetClientSize git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4162 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 3 +- distrib/msw/tmake/filelist.txt | 1 + docs/gtk/changes.txt | 25 +++- include/wx/gtk/listbox.h | 14 +-- include/wx/gtk1/listbox.h | 14 +-- samples/controls/controls.cpp | 4 +- samples/text/text.cpp | 2 +- src/common/parser.y | 2 +- src/common/unzip.c | 5 + src/gtk/checklst.cpp | 4 +- src/gtk/choice.cpp | 2 +- src/gtk/clipbrd.cpp | 112 +++++++++-------- src/gtk/dialog.cpp | 2 + src/gtk/dnd.cpp | 7 +- src/gtk/frame.cpp | 15 ++- src/gtk/listbox.cpp | 269 ++++++++++------------------------------- src/gtk/minifram.cpp | 1 - src/gtk1/checklst.cpp | 4 +- src/gtk1/choice.cpp | 2 +- src/gtk1/clipbrd.cpp | 112 +++++++++-------- src/gtk1/dialog.cpp | 2 + src/gtk1/dnd.cpp | 7 +- src/gtk1/frame.cpp | 15 ++- src/gtk1/listbox.cpp | 269 ++++++++++------------------------------- src/gtk1/minifram.cpp | 1 - src/iodbc/connect.c | 2 +- src/iodbc/info.c | 2 +- src/unix/dialup.cpp | 2 +- src/unix/gsocket.c | 2 +- utils/wxPython/lib/floatbar.py | 5 +- 30 files changed, 341 insertions(+), 566 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3a0bc3c..bda488d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,5 @@ # -# This file was automatically generated by tmake at 18:37, 1999/10/22 +# This file was automatically generated by tmake at 13:52, 1999/10/23 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T! # @@ -187,6 +187,7 @@ WX_HEADERS = \ confbase.h \ config.h \ control.h \ + ctrlsub.h \ cursor.h \ dataobj.h \ date.h \ diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 522a711..aa6741e 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -444,6 +444,7 @@ combobox.h W confbase.h W config.h W control.h W +ctrlsub.h W cursor.h W dataobj.h W date.h W B diff --git a/docs/gtk/changes.txt b/docs/gtk/changes.txt index d82d9eb..994e93f 100644 --- a/docs/gtk/changes.txt +++ b/docs/gtk/changes.txt @@ -17,14 +17,19 @@ Support for GTK 1.0 has been dropped. This version has been tested with GTK 1.2.3 and GTK 1.2.6 - it is known not work with some other versions. -wxChoice can now handle only either void client data -(which it will not delete on destruction) or client -data of the wxClientData type (which it will delete), +Rewritten the support for multiple-format Drag'n'Drop and +clipboard under both GTK and MSW. There are probably some +problems here and there left. + +wxListBox and wxChoice can now handle only either void +client data (which it will not delete on destruction) or +client data of the wxClientData type (which it will delete), instead of both at the same time. The same will happen -to wxListBox and wxComboBox some time. +to wxComboBox some time. Also, wxListBox can now sort its +items. Many build fixes for various platforms have been applied, -try again, poor HP-UX and *BSD users, but don't reckon +try again, poor AIX, HP-UX and *BSD users, but don't reckon with immediate success. Actually, when using GNU compilers, your chances are quite good. @@ -78,7 +83,15 @@ wxSlider, wxWindow, wxScrollBar now emit the correct events for scrolling (like page up, line up etc) instead of just "thumb-track" as before. -Corrected bug in Reparent() code. +Corrected Reparent() code. + +Corrected key accelerator code for toplevel child windows. + +Corrected cursor handling in a number of special cases. + +wxGLCanvas now waits until all expose events have been sent +and then emits its own redraw event. Also removed flicker +for wxGLCanvas and in some other places. A handler to read PCX file (in most variants) has been added. diff --git a/include/wx/gtk/listbox.h b/include/wx/gtk/listbox.h index 10b0107..8038c9c 100644 --- a/include/wx/gtk/listbox.h +++ b/include/wx/gtk/listbox.h @@ -76,14 +76,10 @@ public: // implementation from now on -#if wxUSE_DRAG_AND_DROP - void SetDropTarget( wxDropTarget *dropTarget ); -#endif - - void DisableEvents(); - void EnableEvents(); - void AppendWithoutSorting( const wxString &item ); - int GetIndex( GtkWidget *item ) const; + void GtkDisableEvents(); + void GtkEnableEvents(); + void GtkAddItem( const wxString &item, int pos=-1 ); + int GtkGetIndex( GtkWidget *item ) const; GtkWidget *GetConnectWidget(); bool IsOwnGtkWindow( GdkWindow *window ); void ApplyWidgetStyle(); @@ -94,7 +90,7 @@ public: #endif // wxUSE_TOOLTIPS GtkList *m_list; - wxList m_clientData; + wxList m_clientList; #if wxUSE_CHECKLISTBOX bool m_hasCheckBoxes; diff --git a/include/wx/gtk1/listbox.h b/include/wx/gtk1/listbox.h index 10b0107..8038c9c 100644 --- a/include/wx/gtk1/listbox.h +++ b/include/wx/gtk1/listbox.h @@ -76,14 +76,10 @@ public: // implementation from now on -#if wxUSE_DRAG_AND_DROP - void SetDropTarget( wxDropTarget *dropTarget ); -#endif - - void DisableEvents(); - void EnableEvents(); - void AppendWithoutSorting( const wxString &item ); - int GetIndex( GtkWidget *item ) const; + void GtkDisableEvents(); + void GtkEnableEvents(); + void GtkAddItem( const wxString &item, int pos=-1 ); + int GtkGetIndex( GtkWidget *item ) const; GtkWidget *GetConnectWidget(); bool IsOwnGtkWindow( GdkWindow *window ); void ApplyWidgetStyle(); @@ -94,7 +90,7 @@ public: #endif // wxUSE_TOOLTIPS GtkList *m_list; - wxList m_clientData; + wxList m_clientList; #if wxUSE_CHECKLISTBOX bool m_hasCheckBoxes; diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 2336b8c..033f8af 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -557,7 +557,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) // layout constraints panel = new wxPanel(m_notebook); - panel->SetAutoLayout( true ); + panel->SetAutoLayout( TRUE ); wxLayoutConstraints *c; c = new wxLayoutConstraints; @@ -583,7 +583,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) // sizer panel = new wxPanel(m_notebook); - panel->SetAutoLayout( true ); + panel->SetAutoLayout( TRUE ); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); diff --git a/samples/text/text.cpp b/samples/text/text.cpp index bac4d8c..4d26e23 100644 --- a/samples/text/text.cpp +++ b/samples/text/text.cpp @@ -504,7 +504,7 @@ void MyPanel::DoPasteFromClipboard() { *m_log << "Clipboard supports requested format.\n"; - if (wxTheClipboard->GetData( &data )) + if (wxTheClipboard->GetData( data )) { *m_log << "Successfully retrieved data from the clipboard.\n"; *m_multitext << data.GetText() << "\n"; diff --git a/src/common/parser.y b/src/common/parser.y index ceed318..a4ff9cc 100644 --- a/src/common/parser.y +++ b/src/common/parser.y @@ -167,7 +167,7 @@ void yyerror(char *s) #ifndef yywrap #define yywrap() 1 #endif -#else if !defined(__alpha___) && !defined(__alpha) && !defined(__ultrix) +#elif !defined(__alpha___) && !defined(__alpha) && !defined(__ultrix) int yywrap() { return 1; } #endif #elif defined(__WX_SETUP_H__) diff --git a/src/common/unzip.c b/src/common/unzip.c index 54ced0c..ea45682 100644 --- a/src/common/unzip.c +++ b/src/common/unzip.c @@ -4,9 +4,14 @@ Read unzip.h for more info */ +#if 0 +for what compiler ? #if !defined(__VISAGECPP__) # pragma warning(disable:4001) /* non standard extension used: single line comment */ #endif +#endif + + #include "wx/setup.h" #if wxUSE_ZLIB && wxUSE_ZIPSTREAM diff --git a/src/gtk/checklst.cpp b/src/gtk/checklst.cpp index de5d961..8d1d92f 100644 --- a/src/gtk/checklst.cpp +++ b/src/gtk/checklst.cpp @@ -54,7 +54,7 @@ bool wxCheckListBox::IsChecked( int index ) const wxString str = wxString(label->label,*wxConvCurrent); - return (str[1] == wxT('X')); + return (str.GetChar(1) == wxT('X')); } wxFAIL_MSG(wxT("wrong checklistbox index")); @@ -73,7 +73,7 @@ void wxCheckListBox::Check( int index, bool check ) wxString str = wxString(label->label,*wxConvCurrent); - if (check == (str[1] == wxT('X'))) return; + if (check == (str.GetChar(1) == wxT('X'))) return; if (check) str.SetChar( 1, wxT('X') ); diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index e1868bb..b772e75 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -409,7 +409,7 @@ size_t wxChoice::AppendHelper(GtkWidget *menu, const wxString& item) // don't call wxChoice::GetCount() from here because it doesn't work // if we're called from ctor (and GtkMenuShell is still NULL) - index = m_clientList.GetCount(); + index = m_clientList.GetCount() - 1; } if (GTK_WIDGET_REALIZED(m_widget)) diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 186f15b..1800ae2 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -94,6 +94,11 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), clipboard->m_waiting = FALSE; return; } + +/* + wxDataFormat clip( selection_data->selection ); + wxLogDebug( wxT("selection received for targets, clipboard %s"), clip.GetId().c_str() ); +*/ // the atoms we received, holding a list of targets (= formats) GdkAtom *atoms = (GdkAtom *)selection_data->data; @@ -101,7 +106,11 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), for (unsigned int i=0; ilength/sizeof(GdkAtom); i++) { wxDataFormat format( atoms[i] ); - + +/* + wxLogDebug( wxT("selection received for targets, format %s"), format.GetId().c_str() ); +*/ + if (format == clipboard->m_targetRequested) { clipboard->m_waiting = FALSE; @@ -199,6 +208,8 @@ selection_clear_clip( GtkWidget *WXUNUSED(widget), GdkEventSelection *event ) /* the clipboard is no longer in our hands. we can the delete clipboard data. */ if (wxTheClipboard->m_data) { + wxLogDebug( wxT("wxClipboard will get cleared" ) ); + delete wxTheClipboard->m_data; wxTheClipboard->m_data = (wxDataObject*) NULL; } @@ -398,32 +409,23 @@ bool wxClipboard::AddData( wxDataObject *data ) m_data = data; - /* This should happen automatically, but to be on the safe side */ - m_ownsClipboard = FALSE; - m_ownsPrimarySelection = FALSE; - /* get formats from wxDataObjects */ wxDataFormat *array = new wxDataFormat[ m_data->GetFormatCount() ]; m_data->GetAllFormats( array ); + + /* primary selection or clipboard */ + GdkAtom clipboard = m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY + : g_clipboardAtom; + for (size_t i = 0; i < m_data->GetFormatCount(); i++) { - GdkAtom atom = array[i]; - wxLogDebug( wxT("Clipboard Supported atom %s"), gdk_atom_name( atom ) ); - - /* Add handlers if someone requests data. We currently always - offer data to the clipboard and the primary selection. Maybe - we should make that depend on the usePrimary flag */ - - gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), - GDK_SELECTION_PRIMARY, - atom, - 0 ); /* what is info ? */ - - gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), - g_clipboardAtom, - atom, - 0 ); /* what is info ? */ + wxLogDebug( wxT("wxClipboard now supports atom %s"), array[i].GetId().c_str() ); + + gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), + clipboard, + array[i], + 0 ); /* what is info ? */ } delete[] array; @@ -434,41 +436,26 @@ bool wxClipboard::AddData( wxDataObject *data ) (gpointer) NULL ); #if wxUSE_THREADS - /* disable GUI threads */ - wxapp_uninstall_thread_wakeup(); + /* disable GUI threads */ + wxapp_uninstall_thread_wakeup(); #endif /* Tell the world we offer clipboard data */ - if (!gtk_selection_owner_set( m_clipboardWidget, - g_clipboardAtom, - GDK_CURRENT_TIME )) - { -#if wxUSE_THREADS - /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); -#endif - return FALSE; - } - m_ownsClipboard = TRUE; + bool res = (gtk_selection_owner_set( m_clipboardWidget, + clipboard, + GDK_CURRENT_TIME )); - if (!gtk_selection_owner_set( m_clipboardWidget, - GDK_SELECTION_PRIMARY, - GDK_CURRENT_TIME )) - { -#if wxUSE_THREADS - /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); -#endif - return FALSE; - } - m_ownsPrimarySelection = TRUE; + if (m_usePrimary) + m_ownsPrimarySelection = res; + else + m_ownsClipboard = res; #if wxUSE_THREADS /* re-enable GUI threads */ wxapp_install_thread_wakeup(); #endif - return TRUE; + return res; } void wxClipboard::Close() @@ -530,11 +517,36 @@ bool wxClipboard::GetData( wxDataObject& data ) { wxDataFormat format( array[i] ); - wxLogDebug( wxT("wxClipboard::GetData: request format %s"), format.GetId().c_str() ); + wxLogDebug( wxT("wxClipboard::GetData: requested format: %s"), format.GetId().c_str() ); /* is data supported by clipboard ? */ - if (!IsSupported( format )) - continue; + + /* store requested format to be asked for by callbacks */ + m_targetRequested = format; + + wxCHECK_MSG( m_targetRequested, FALSE, wxT("invalid clipboard format") ); + + m_formatSupported = FALSE; + + /* perform query. this will set m_formatSupported to + TRUE if m_targetRequested is supported. + also, we have to wait for the "answer" from the + clipboard owner which is an asynchronous process. + therefore we set m_waiting = TRUE here and wait + until the callback "targets_selection_received" + sets it to FALSE */ + + m_waiting = TRUE; + + gtk_selection_convert( m_targetsWidget, + m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY + : g_clipboardAtom, + g_targetsAtom, + GDK_CURRENT_TIME ); + + while (m_waiting) gtk_main_iteration(); + + if (!m_formatSupported) continue; /* store pointer to data object to be filled up by callbacks */ m_receivedData = &data; @@ -576,6 +588,8 @@ bool wxClipboard::GetData( wxDataObject& data ) return TRUE; } + wxLogDebug( wxT("wxClipboard::GetData: format not found") ); + /* return failure */ delete[] array; return FALSE; diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index 7cf4f75..e51c6cb 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -463,6 +463,7 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) m_height = height; } +/* if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) { if (width == -1) m_width = 80; @@ -472,6 +473,7 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { if (height == -1) m_height = 26; } +*/ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; diff --git a/src/gtk/dnd.cpp b/src/gtk/dnd.cpp index 6ab5951..fbd0ec5 100644 --- a/src/gtk/dnd.cpp +++ b/src/gtk/dnd.cpp @@ -378,10 +378,10 @@ wxDragResult wxDropTarget::OnData( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult def ) { if (!m_dataObject) - return FALSE; + return wxDragNone; if (GetMatchingPair() == (GdkAtom) 0) - return FALSE; + return wxDragNone; return GetData() ? def : wxDragNone; } @@ -401,8 +401,7 @@ GdkAtom wxDropTarget::GetMatchingPair() wxDataFormat format( formatAtom ); #ifdef __WXDEBUG__ - char *name = gdk_atom_name( formatAtom ); - wxLogDebug("Drop target: drag has format: %s", name ? name : "unnamed"); + wxLogDebug("Drop target: drag has format: %s", format.GetId().c_str() ); #endif // Debug if (m_dataObject->IsSupportedFormat( format )) diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index ab29ed1..7cbd3ec 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -543,6 +543,7 @@ void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags ) m_height = height; } +/* if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) { if (width == -1) m_width = 80; @@ -552,6 +553,7 @@ void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { if (height == -1) m_height = 26; } +*/ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; @@ -613,6 +615,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const #if wxUSE_TOOLBAR /* tool bar */ +/* if (m_frameToolBar) { if (!m_toolBarDetached) @@ -624,6 +627,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const else (*height) -= wxPLACE_HOLDER; } +*/ #endif /* mini edge */ @@ -639,6 +643,8 @@ void wxFrame::DoSetClientSize( int width, int height ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); + printf( "set size %d %d\n", width, height ); + /* menu bar */ if (m_frameMenuBar) { @@ -655,6 +661,7 @@ void wxFrame::DoSetClientSize( int width, int height ) #if wxUSE_TOOLBAR /* tool bar */ +/* if (m_frameToolBar) { if (!m_toolBarDetached) @@ -666,6 +673,7 @@ void wxFrame::DoSetClientSize( int width, int height ) else height += wxPLACE_HOLDER; } +*/ #endif DoSetSize( -1, -1, width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0 ); @@ -729,7 +737,8 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height } #if wxUSE_TOOLBAR - if (m_frameToolBar) + if ((m_frameToolBar) && + (m_frameToolBar->m_widget->parent == m_mainWidget)) { int xx = m_miniEdge; int yy = m_miniEdge + m_miniTitle; @@ -745,8 +754,8 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height if (m_toolBarDetached) hh = wxPLACE_HOLDER; m_frameToolBar->m_x = xx; m_frameToolBar->m_y = yy; - /* m_frameToolBar->m_height = hh; don't change the toolbar's height */ - m_frameToolBar->m_width = ww; + /* m_frameToolBar->m_height = hh; don't change the toolbar's reported size + m_frameToolBar->m_width = ww; */ gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), m_frameToolBar->m_widget, xx, yy, ww, hh ); diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 82b5bb2..ae049da 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -144,7 +144,7 @@ gtk_listbox_button_press_callback( GtkWidget *widget, if (!listbox->m_hasVMT) return FALSE; - int sel = listbox->GetIndex( widget ); + int sel = listbox->GtkGetIndex( widget ); #if wxUSE_CHECKLISTBOX if ((listbox->m_hasCheckBoxes) && (gdk_event->x < 15) && (gdk_event->type != GDK_2BUTTON_PRESS)) @@ -182,7 +182,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if (gdk_event->keyval != ' ') return FALSE; - int sel = listbox->GetIndex( widget ); + int sel = listbox->GtkGetIndex( widget ); wxCheckListBox *clb = (wxCheckListBox *)listbox; @@ -322,53 +322,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, for (int i = 0; i < n; i++) { + // add one by one DoAppend(choices[i]); - -#if 0 - wxString str(choices[i]); - -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - str.Prepend(CHECKBOX_STRING); - } -#endif // wxUSE_CHECKLISTBOX - - GtkWidget *list_item = gtk_list_item_new_with_label( str.mbc_str() ); - - gtk_container_add( GTK_CONTAINER(m_list), list_item ); - - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - - if (style & wxLB_MULTIPLE) - gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); - - gtk_signal_connect( GTK_OBJECT(list_item), - "button_press_event", - (GtkSignalFunc)gtk_listbox_button_press_callback, - (gpointer) this ); - - gtk_signal_connect_after( GTK_OBJECT(list_item), - "button_release_event", - (GtkSignalFunc)gtk_listbox_button_release_callback, - (gpointer) this ); - -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - gtk_signal_connect( GTK_OBJECT(list_item), - "key_press_event", - (GtkSignalFunc)gtk_listbox_key_press_callback, - (gpointer)this ); - } -#endif // wxUSE_CHECKLISTBOX - - ConnectWidget( list_item ); - - gtk_widget_show( list_item ); -#endif // 0 } m_parent->DoAddChild( this ); @@ -393,129 +348,73 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - // code elsewhere supposes we have as many items in m_clientData as items + // VZ: notice that InsertItems knows nothing about sorting, so calling it + // from outside (and not from our own Append) is likely to break + // everything + + // code elsewhere supposes we have as many items in m_clientList as items // in the listbox - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), + wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), wxT("bug in client data management") ); GList *children = m_list->children; int length = g_list_length(children); + wxCHECK_RET( pos <= length, wxT("invalid index in wxListBox::InsertItems") ); - // VZ: it seems that GTK 1.0.6 doesn't has a function to insert an item - // into a listbox at the given position, this is why we first delete - // all items after this position, then append these items and then - // reappend back the old ones. - - // VZ: notice that InsertItems knows nothing about sorting, so calling it - // from outside (and not from our own Append) is likely to break - // everything - size_t nItems = items.GetCount(); - size_t n; // loop var - - // optimise for this trivial case - if ( pos == length ) + if (pos == length) { - // no need to do anything complicated - for ( n = 0; n < nItems; n++ ) + for ( size_t n = 0; n < nItems; n++ ) { - AppendWithoutSorting(items[n]); + GtkAddItem( items[n] ); - m_clientData.Append((wxObject *)NULL); + m_clientList.Append((wxObject *)NULL); } - - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); - - return; } - - // remove the old items - wxArrayString deletedLabels; -#if wxUSE_CHECKLISTBOX - wxArrayInt deletedChecks; -#endif - - GList *child = g_list_nth( children, pos ); - for ( n = 0; child != NULL; n++, child = child->next ) + else { - // save label - GtkBin *bin = GTK_BIN( child->data ); - GtkLabel *label = GTK_LABEL( bin->child ); - - wxString str(GET_REAL_LABEL(label->label),*wxConvCurrent); - deletedLabels.Add(str); - -#if wxUSE_CHECKLISTBOX - // save check state - if ( m_hasCheckBoxes ) + wxNode *node = m_clientList.Nth( pos ); + for ( size_t n = 0; n < nItems; n++ ) { - deletedChecks.Add(((wxCheckListBox *)this)->IsChecked(pos + n)); - } -#endif // wxUSE_CHECKLISTBOX - } - - size_t nDeletedCount = n; - - gtk_list_clear_items( m_list, pos, length ); - - // now append the new items - wxNode *node = m_clientData.Item(pos); - for ( n = 0; n < nItems; n++ ) - { - AppendWithoutSorting(items[n]); - - // make sure we have the correct number of items in this list - m_clientData.Insert(node, (wxObject *)NULL); - } - - // and append the old items too - pos += nItems; // now the indices are shifted - for ( n = 0; n < nDeletedCount; n++ ) - { - AppendWithoutSorting(deletedLabels[n]); - - // the data is already correct - the indices have been rearranged in - // such manner that we now correspond to the same node as before + GtkAddItem( items[n], pos+n ); -#if wxUSE_CHECKLISTBOX - if ( m_hasCheckBoxes ) - { - ((wxCheckListBox *)this)->Check(pos + n, (bool)deletedChecks[n]); + m_clientList.Insert( node, (wxObject *)NULL ); } -#endif // wxUSE_CHECKLISTBOX } - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); + wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), + wxT("bug in client data management") ); } int wxListBox::DoAppend( const wxString& item ) { - int index; - if ( m_strings ) + if (m_strings) { // need to determine the index - index = m_strings->Add(item); - - InsertItems(1, &item, index); + int index = m_strings->Add( item ); + + // only if not at the end anyway + if (index != GetCount()) + { + GtkAddItem( item, index ); + + wxNode *node = m_clientList.Nth( index ); + m_clientList.Insert( node, (wxObject *)NULL ); + + return index; + } } - else - { - // not sorted, just append - AppendWithoutSorting(item); + + GtkAddItem(item); - m_clientData.Append((wxObject *)NULL); + m_clientList.Append((wxObject *)NULL); - index = GetCount() - 1; - } - - return index; + return GetCount() - 1; } -void wxListBox::AppendWithoutSorting( const wxString &item ) +void wxListBox::GtkAddItem( const wxString &item, int pos ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); @@ -531,7 +430,13 @@ void wxListBox::AppendWithoutSorting( const wxString &item ) list_item = gtk_list_item_new_with_label( label.mbc_str() ); - gtk_container_add( GTK_CONTAINER(m_list), list_item ); + GList *gitem_list = g_list_alloc (); + gitem_list->data = list_item; + + if (pos == -1) + gtk_list_append_items( GTK_LIST (m_list), gitem_list ); + else + gtk_list_insert_items( GTK_LIST (m_list), gitem_list, pos ); gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); @@ -569,21 +474,15 @@ void wxListBox::AppendWithoutSorting( const wxString &item ) gtk_widget_realize( list_item ); gtk_widget_realize( GTK_BIN(list_item)->child ); - //if (m_widgetStyle) ApplyWidgetStyle(); - if (m_widgetStyle) { - // Apply current widget style to the new list_item + // Apply current widget style to the new list_item + if (m_widgetStyle) + { gtk_widget_set_style( GTK_WIDGET( list_item ), m_widgetStyle ); GtkBin *bin = GTK_BIN( list_item ); GtkWidget *label = GTK_WIDGET( bin->child ); gtk_widget_set_style( label, m_widgetStyle ); } -#if wxUSE_DRAG_AND_DROP - #ifndef NEW_GTK_DND_CODE - if (m_dropTarget) m_dropTarget->RegisterWidget( list_item ); - #endif -#endif - #if wxUSE_TOOLTIPS if (m_tooltip) m_tooltip->Apply( this ); #endif @@ -615,7 +514,7 @@ void wxListBox::DoSetItemClientData( int n, void* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientData") ); node->SetData( (wxObject*) clientData ); @@ -625,7 +524,7 @@ void* wxListBox::DoGetItemClientData( int n ) const { wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_MSG( node, NULL, wxT("invalid index in wxListBox::DoGetItemClientData") ); return node->Data(); @@ -635,7 +534,7 @@ void wxListBox::DoSetItemClientObject( int n, wxClientData* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientObject") ); wxClientData *cd = (wxClientData*) node->Data(); @@ -648,7 +547,7 @@ wxClientData* wxListBox::DoGetItemClientObject( int n ) const { wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_MSG( node, (wxClientData *)NULL, wxT("invalid index in wxListBox::DoGetItemClientObject") ); @@ -666,14 +565,14 @@ void wxListBox::Clear() // destroy the data (due to Robert's idea of using wxList // and not wxList we can't just say // m_clientList.DeleteContents(TRUE) - this would crash! - wxNode *node = m_clientData.First(); + wxNode *node = m_clientList.First(); while ( node ) { delete (wxClientData *)node->Data(); node = node->Next(); } } - m_clientData.Clear(); + m_clientList.Clear(); if ( m_strings ) m_strings->Clear(); @@ -691,7 +590,7 @@ void wxListBox::Delete( int n ) gtk_list_remove_items( m_list, list ); g_list_free( list ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); if ( node ) { if ( m_clientDataItemsType == ClientData_Object ) @@ -700,7 +599,7 @@ void wxListBox::Delete( int n ) delete cd; } - m_clientData.DeleteNode( node ); + m_clientList.DeleteNode( node ); } if ( m_strings ) @@ -760,15 +659,8 @@ int wxListBox::GetCount() const { wxCHECK_MSG( m_list != NULL, -1, wxT("invalid listbox") ); - GList *child = m_list->children; - int count = 0; - while (child) - { - count++; - child = child->next; - } - - return count; + GList *children = m_list->children; + return g_list_length(children); } int wxListBox::FindString( const wxString &item ) const @@ -869,14 +761,14 @@ void wxListBox::SetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - DisableEvents(); + GtkDisableEvents(); if (select) gtk_list_select_item( m_list, n ); else gtk_list_unselect_item( m_list, n ); - EnableEvents(); + GtkEnableEvents(); } void wxListBox::DoSetFirstItem( int WXUNUSED(n) ) @@ -888,7 +780,7 @@ void wxListBox::DoSetFirstItem( int WXUNUSED(n) ) // helpers // ---------------------------------------------------------------------------- -int wxListBox::GetIndex( GtkWidget *item ) const +int wxListBox::GtkGetIndex( GtkWidget *item ) const { if (item) { @@ -916,40 +808,7 @@ void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) } #endif // wxUSE_TOOLTIPS -#if wxUSE_DRAG_AND_DROP -void wxListBox::SetDropTarget( wxDropTarget *dropTarget ) -{ - wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - -#ifndef NEW_GTK_DND_CODE - if (m_dropTarget) - { - GList *child = m_list->children; - while (child) - { - m_dropTarget->UnregisterWidget( GTK_WIDGET( child->data ) ); - child = child->next; - } - } -#endif - - wxWindow::SetDropTarget( dropTarget ); - -#ifndef NEW_GTK_DND_CODE - if (m_dropTarget) - { - GList *child = m_list->children; - while (child) - { - m_dropTarget->RegisterWidget( GTK_WIDGET( child->data ) ); - child = child->next; - } - } -#endif -} -#endif - -void wxListBox::DisableEvents() +void wxListBox::GtkDisableEvents() { GList *child = m_list->children; while (child) @@ -965,7 +824,7 @@ void wxListBox::DisableEvents() } } -void wxListBox::EnableEvents() +void wxListBox::GtkEnableEvents() { GList *child = m_list->children; while (child) diff --git a/src/gtk/minifram.cpp b/src/gtk/minifram.cpp index 9fa95cf..26a08de 100644 --- a/src/gtk/minifram.cpp +++ b/src/gtk/minifram.cpp @@ -281,7 +281,6 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title { style = style | wxSIMPLE_BORDER; style = style | wxCAPTION; - style = style | wxSYSTEM_MENU; if ((style & wxCAPTION) || (style & wxTINY_CAPTION_HORIZ) || (style & wxTINY_CAPTION_VERT)) m_miniTitle = 13; diff --git a/src/gtk1/checklst.cpp b/src/gtk1/checklst.cpp index de5d961..8d1d92f 100644 --- a/src/gtk1/checklst.cpp +++ b/src/gtk1/checklst.cpp @@ -54,7 +54,7 @@ bool wxCheckListBox::IsChecked( int index ) const wxString str = wxString(label->label,*wxConvCurrent); - return (str[1] == wxT('X')); + return (str.GetChar(1) == wxT('X')); } wxFAIL_MSG(wxT("wrong checklistbox index")); @@ -73,7 +73,7 @@ void wxCheckListBox::Check( int index, bool check ) wxString str = wxString(label->label,*wxConvCurrent); - if (check == (str[1] == wxT('X'))) return; + if (check == (str.GetChar(1) == wxT('X'))) return; if (check) str.SetChar( 1, wxT('X') ); diff --git a/src/gtk1/choice.cpp b/src/gtk1/choice.cpp index e1868bb..b772e75 100644 --- a/src/gtk1/choice.cpp +++ b/src/gtk1/choice.cpp @@ -409,7 +409,7 @@ size_t wxChoice::AppendHelper(GtkWidget *menu, const wxString& item) // don't call wxChoice::GetCount() from here because it doesn't work // if we're called from ctor (and GtkMenuShell is still NULL) - index = m_clientList.GetCount(); + index = m_clientList.GetCount() - 1; } if (GTK_WIDGET_REALIZED(m_widget)) diff --git a/src/gtk1/clipbrd.cpp b/src/gtk1/clipbrd.cpp index 186f15b..1800ae2 100644 --- a/src/gtk1/clipbrd.cpp +++ b/src/gtk1/clipbrd.cpp @@ -94,6 +94,11 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), clipboard->m_waiting = FALSE; return; } + +/* + wxDataFormat clip( selection_data->selection ); + wxLogDebug( wxT("selection received for targets, clipboard %s"), clip.GetId().c_str() ); +*/ // the atoms we received, holding a list of targets (= formats) GdkAtom *atoms = (GdkAtom *)selection_data->data; @@ -101,7 +106,11 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), for (unsigned int i=0; ilength/sizeof(GdkAtom); i++) { wxDataFormat format( atoms[i] ); - + +/* + wxLogDebug( wxT("selection received for targets, format %s"), format.GetId().c_str() ); +*/ + if (format == clipboard->m_targetRequested) { clipboard->m_waiting = FALSE; @@ -199,6 +208,8 @@ selection_clear_clip( GtkWidget *WXUNUSED(widget), GdkEventSelection *event ) /* the clipboard is no longer in our hands. we can the delete clipboard data. */ if (wxTheClipboard->m_data) { + wxLogDebug( wxT("wxClipboard will get cleared" ) ); + delete wxTheClipboard->m_data; wxTheClipboard->m_data = (wxDataObject*) NULL; } @@ -398,32 +409,23 @@ bool wxClipboard::AddData( wxDataObject *data ) m_data = data; - /* This should happen automatically, but to be on the safe side */ - m_ownsClipboard = FALSE; - m_ownsPrimarySelection = FALSE; - /* get formats from wxDataObjects */ wxDataFormat *array = new wxDataFormat[ m_data->GetFormatCount() ]; m_data->GetAllFormats( array ); + + /* primary selection or clipboard */ + GdkAtom clipboard = m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY + : g_clipboardAtom; + for (size_t i = 0; i < m_data->GetFormatCount(); i++) { - GdkAtom atom = array[i]; - wxLogDebug( wxT("Clipboard Supported atom %s"), gdk_atom_name( atom ) ); - - /* Add handlers if someone requests data. We currently always - offer data to the clipboard and the primary selection. Maybe - we should make that depend on the usePrimary flag */ - - gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), - GDK_SELECTION_PRIMARY, - atom, - 0 ); /* what is info ? */ - - gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), - g_clipboardAtom, - atom, - 0 ); /* what is info ? */ + wxLogDebug( wxT("wxClipboard now supports atom %s"), array[i].GetId().c_str() ); + + gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget), + clipboard, + array[i], + 0 ); /* what is info ? */ } delete[] array; @@ -434,41 +436,26 @@ bool wxClipboard::AddData( wxDataObject *data ) (gpointer) NULL ); #if wxUSE_THREADS - /* disable GUI threads */ - wxapp_uninstall_thread_wakeup(); + /* disable GUI threads */ + wxapp_uninstall_thread_wakeup(); #endif /* Tell the world we offer clipboard data */ - if (!gtk_selection_owner_set( m_clipboardWidget, - g_clipboardAtom, - GDK_CURRENT_TIME )) - { -#if wxUSE_THREADS - /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); -#endif - return FALSE; - } - m_ownsClipboard = TRUE; + bool res = (gtk_selection_owner_set( m_clipboardWidget, + clipboard, + GDK_CURRENT_TIME )); - if (!gtk_selection_owner_set( m_clipboardWidget, - GDK_SELECTION_PRIMARY, - GDK_CURRENT_TIME )) - { -#if wxUSE_THREADS - /* re-enable GUI threads */ - wxapp_install_thread_wakeup(); -#endif - return FALSE; - } - m_ownsPrimarySelection = TRUE; + if (m_usePrimary) + m_ownsPrimarySelection = res; + else + m_ownsClipboard = res; #if wxUSE_THREADS /* re-enable GUI threads */ wxapp_install_thread_wakeup(); #endif - return TRUE; + return res; } void wxClipboard::Close() @@ -530,11 +517,36 @@ bool wxClipboard::GetData( wxDataObject& data ) { wxDataFormat format( array[i] ); - wxLogDebug( wxT("wxClipboard::GetData: request format %s"), format.GetId().c_str() ); + wxLogDebug( wxT("wxClipboard::GetData: requested format: %s"), format.GetId().c_str() ); /* is data supported by clipboard ? */ - if (!IsSupported( format )) - continue; + + /* store requested format to be asked for by callbacks */ + m_targetRequested = format; + + wxCHECK_MSG( m_targetRequested, FALSE, wxT("invalid clipboard format") ); + + m_formatSupported = FALSE; + + /* perform query. this will set m_formatSupported to + TRUE if m_targetRequested is supported. + also, we have to wait for the "answer" from the + clipboard owner which is an asynchronous process. + therefore we set m_waiting = TRUE here and wait + until the callback "targets_selection_received" + sets it to FALSE */ + + m_waiting = TRUE; + + gtk_selection_convert( m_targetsWidget, + m_usePrimary ? (GdkAtom)GDK_SELECTION_PRIMARY + : g_clipboardAtom, + g_targetsAtom, + GDK_CURRENT_TIME ); + + while (m_waiting) gtk_main_iteration(); + + if (!m_formatSupported) continue; /* store pointer to data object to be filled up by callbacks */ m_receivedData = &data; @@ -576,6 +588,8 @@ bool wxClipboard::GetData( wxDataObject& data ) return TRUE; } + wxLogDebug( wxT("wxClipboard::GetData: format not found") ); + /* return failure */ delete[] array; return FALSE; diff --git a/src/gtk1/dialog.cpp b/src/gtk1/dialog.cpp index 7cf4f75..e51c6cb 100644 --- a/src/gtk1/dialog.cpp +++ b/src/gtk1/dialog.cpp @@ -463,6 +463,7 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) m_height = height; } +/* if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) { if (width == -1) m_width = 80; @@ -472,6 +473,7 @@ void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { if (height == -1) m_height = 26; } +*/ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; diff --git a/src/gtk1/dnd.cpp b/src/gtk1/dnd.cpp index 6ab5951..fbd0ec5 100644 --- a/src/gtk1/dnd.cpp +++ b/src/gtk1/dnd.cpp @@ -378,10 +378,10 @@ wxDragResult wxDropTarget::OnData( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult def ) { if (!m_dataObject) - return FALSE; + return wxDragNone; if (GetMatchingPair() == (GdkAtom) 0) - return FALSE; + return wxDragNone; return GetData() ? def : wxDragNone; } @@ -401,8 +401,7 @@ GdkAtom wxDropTarget::GetMatchingPair() wxDataFormat format( formatAtom ); #ifdef __WXDEBUG__ - char *name = gdk_atom_name( formatAtom ); - wxLogDebug("Drop target: drag has format: %s", name ? name : "unnamed"); + wxLogDebug("Drop target: drag has format: %s", format.GetId().c_str() ); #endif // Debug if (m_dataObject->IsSupportedFormat( format )) diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index ab29ed1..7cbd3ec 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -543,6 +543,7 @@ void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags ) m_height = height; } +/* if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) { if (width == -1) m_width = 80; @@ -552,6 +553,7 @@ void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { if (height == -1) m_height = 26; } +*/ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; @@ -613,6 +615,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const #if wxUSE_TOOLBAR /* tool bar */ +/* if (m_frameToolBar) { if (!m_toolBarDetached) @@ -624,6 +627,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const else (*height) -= wxPLACE_HOLDER; } +*/ #endif /* mini edge */ @@ -639,6 +643,8 @@ void wxFrame::DoSetClientSize( int width, int height ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); + printf( "set size %d %d\n", width, height ); + /* menu bar */ if (m_frameMenuBar) { @@ -655,6 +661,7 @@ void wxFrame::DoSetClientSize( int width, int height ) #if wxUSE_TOOLBAR /* tool bar */ +/* if (m_frameToolBar) { if (!m_toolBarDetached) @@ -666,6 +673,7 @@ void wxFrame::DoSetClientSize( int width, int height ) else height += wxPLACE_HOLDER; } +*/ #endif DoSetSize( -1, -1, width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0 ); @@ -729,7 +737,8 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height } #if wxUSE_TOOLBAR - if (m_frameToolBar) + if ((m_frameToolBar) && + (m_frameToolBar->m_widget->parent == m_mainWidget)) { int xx = m_miniEdge; int yy = m_miniEdge + m_miniTitle; @@ -745,8 +754,8 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height if (m_toolBarDetached) hh = wxPLACE_HOLDER; m_frameToolBar->m_x = xx; m_frameToolBar->m_y = yy; - /* m_frameToolBar->m_height = hh; don't change the toolbar's height */ - m_frameToolBar->m_width = ww; + /* m_frameToolBar->m_height = hh; don't change the toolbar's reported size + m_frameToolBar->m_width = ww; */ gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), m_frameToolBar->m_widget, xx, yy, ww, hh ); diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 82b5bb2..ae049da 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -144,7 +144,7 @@ gtk_listbox_button_press_callback( GtkWidget *widget, if (!listbox->m_hasVMT) return FALSE; - int sel = listbox->GetIndex( widget ); + int sel = listbox->GtkGetIndex( widget ); #if wxUSE_CHECKLISTBOX if ((listbox->m_hasCheckBoxes) && (gdk_event->x < 15) && (gdk_event->type != GDK_2BUTTON_PRESS)) @@ -182,7 +182,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if (gdk_event->keyval != ' ') return FALSE; - int sel = listbox->GetIndex( widget ); + int sel = listbox->GtkGetIndex( widget ); wxCheckListBox *clb = (wxCheckListBox *)listbox; @@ -322,53 +322,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, for (int i = 0; i < n; i++) { + // add one by one DoAppend(choices[i]); - -#if 0 - wxString str(choices[i]); - -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - str.Prepend(CHECKBOX_STRING); - } -#endif // wxUSE_CHECKLISTBOX - - GtkWidget *list_item = gtk_list_item_new_with_label( str.mbc_str() ); - - gtk_container_add( GTK_CONTAINER(m_list), list_item ); - - gtk_signal_connect( GTK_OBJECT(list_item), "select", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - - if (style & wxLB_MULTIPLE) - gtk_signal_connect( GTK_OBJECT(list_item), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); - - gtk_signal_connect( GTK_OBJECT(list_item), - "button_press_event", - (GtkSignalFunc)gtk_listbox_button_press_callback, - (gpointer) this ); - - gtk_signal_connect_after( GTK_OBJECT(list_item), - "button_release_event", - (GtkSignalFunc)gtk_listbox_button_release_callback, - (gpointer) this ); - -#if wxUSE_CHECKLISTBOX - if (m_hasCheckBoxes) - { - gtk_signal_connect( GTK_OBJECT(list_item), - "key_press_event", - (GtkSignalFunc)gtk_listbox_key_press_callback, - (gpointer)this ); - } -#endif // wxUSE_CHECKLISTBOX - - ConnectWidget( list_item ); - - gtk_widget_show( list_item ); -#endif // 0 } m_parent->DoAddChild( this ); @@ -393,129 +348,73 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - // code elsewhere supposes we have as many items in m_clientData as items + // VZ: notice that InsertItems knows nothing about sorting, so calling it + // from outside (and not from our own Append) is likely to break + // everything + + // code elsewhere supposes we have as many items in m_clientList as items // in the listbox - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), + wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), wxT("bug in client data management") ); GList *children = m_list->children; int length = g_list_length(children); + wxCHECK_RET( pos <= length, wxT("invalid index in wxListBox::InsertItems") ); - // VZ: it seems that GTK 1.0.6 doesn't has a function to insert an item - // into a listbox at the given position, this is why we first delete - // all items after this position, then append these items and then - // reappend back the old ones. - - // VZ: notice that InsertItems knows nothing about sorting, so calling it - // from outside (and not from our own Append) is likely to break - // everything - size_t nItems = items.GetCount(); - size_t n; // loop var - - // optimise for this trivial case - if ( pos == length ) + if (pos == length) { - // no need to do anything complicated - for ( n = 0; n < nItems; n++ ) + for ( size_t n = 0; n < nItems; n++ ) { - AppendWithoutSorting(items[n]); + GtkAddItem( items[n] ); - m_clientData.Append((wxObject *)NULL); + m_clientList.Append((wxObject *)NULL); } - - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); - - return; } - - // remove the old items - wxArrayString deletedLabels; -#if wxUSE_CHECKLISTBOX - wxArrayInt deletedChecks; -#endif - - GList *child = g_list_nth( children, pos ); - for ( n = 0; child != NULL; n++, child = child->next ) + else { - // save label - GtkBin *bin = GTK_BIN( child->data ); - GtkLabel *label = GTK_LABEL( bin->child ); - - wxString str(GET_REAL_LABEL(label->label),*wxConvCurrent); - deletedLabels.Add(str); - -#if wxUSE_CHECKLISTBOX - // save check state - if ( m_hasCheckBoxes ) + wxNode *node = m_clientList.Nth( pos ); + for ( size_t n = 0; n < nItems; n++ ) { - deletedChecks.Add(((wxCheckListBox *)this)->IsChecked(pos + n)); - } -#endif // wxUSE_CHECKLISTBOX - } - - size_t nDeletedCount = n; - - gtk_list_clear_items( m_list, pos, length ); - - // now append the new items - wxNode *node = m_clientData.Item(pos); - for ( n = 0; n < nItems; n++ ) - { - AppendWithoutSorting(items[n]); - - // make sure we have the correct number of items in this list - m_clientData.Insert(node, (wxObject *)NULL); - } - - // and append the old items too - pos += nItems; // now the indices are shifted - for ( n = 0; n < nDeletedCount; n++ ) - { - AppendWithoutSorting(deletedLabels[n]); - - // the data is already correct - the indices have been rearranged in - // such manner that we now correspond to the same node as before + GtkAddItem( items[n], pos+n ); -#if wxUSE_CHECKLISTBOX - if ( m_hasCheckBoxes ) - { - ((wxCheckListBox *)this)->Check(pos + n, (bool)deletedChecks[n]); + m_clientList.Insert( node, (wxObject *)NULL ); } -#endif // wxUSE_CHECKLISTBOX } - wxASSERT_MSG( m_clientData.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); + wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), + wxT("bug in client data management") ); } int wxListBox::DoAppend( const wxString& item ) { - int index; - if ( m_strings ) + if (m_strings) { // need to determine the index - index = m_strings->Add(item); - - InsertItems(1, &item, index); + int index = m_strings->Add( item ); + + // only if not at the end anyway + if (index != GetCount()) + { + GtkAddItem( item, index ); + + wxNode *node = m_clientList.Nth( index ); + m_clientList.Insert( node, (wxObject *)NULL ); + + return index; + } } - else - { - // not sorted, just append - AppendWithoutSorting(item); + + GtkAddItem(item); - m_clientData.Append((wxObject *)NULL); + m_clientList.Append((wxObject *)NULL); - index = GetCount() - 1; - } - - return index; + return GetCount() - 1; } -void wxListBox::AppendWithoutSorting( const wxString &item ) +void wxListBox::GtkAddItem( const wxString &item, int pos ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); @@ -531,7 +430,13 @@ void wxListBox::AppendWithoutSorting( const wxString &item ) list_item = gtk_list_item_new_with_label( label.mbc_str() ); - gtk_container_add( GTK_CONTAINER(m_list), list_item ); + GList *gitem_list = g_list_alloc (); + gitem_list->data = list_item; + + if (pos == -1) + gtk_list_append_items( GTK_LIST (m_list), gitem_list ); + else + gtk_list_insert_items( GTK_LIST (m_list), gitem_list, pos ); gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); @@ -569,21 +474,15 @@ void wxListBox::AppendWithoutSorting( const wxString &item ) gtk_widget_realize( list_item ); gtk_widget_realize( GTK_BIN(list_item)->child ); - //if (m_widgetStyle) ApplyWidgetStyle(); - if (m_widgetStyle) { - // Apply current widget style to the new list_item + // Apply current widget style to the new list_item + if (m_widgetStyle) + { gtk_widget_set_style( GTK_WIDGET( list_item ), m_widgetStyle ); GtkBin *bin = GTK_BIN( list_item ); GtkWidget *label = GTK_WIDGET( bin->child ); gtk_widget_set_style( label, m_widgetStyle ); } -#if wxUSE_DRAG_AND_DROP - #ifndef NEW_GTK_DND_CODE - if (m_dropTarget) m_dropTarget->RegisterWidget( list_item ); - #endif -#endif - #if wxUSE_TOOLTIPS if (m_tooltip) m_tooltip->Apply( this ); #endif @@ -615,7 +514,7 @@ void wxListBox::DoSetItemClientData( int n, void* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientData") ); node->SetData( (wxObject*) clientData ); @@ -625,7 +524,7 @@ void* wxListBox::DoGetItemClientData( int n ) const { wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_MSG( node, NULL, wxT("invalid index in wxListBox::DoGetItemClientData") ); return node->Data(); @@ -635,7 +534,7 @@ void wxListBox::DoSetItemClientObject( int n, wxClientData* clientData ) { wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientObject") ); wxClientData *cd = (wxClientData*) node->Data(); @@ -648,7 +547,7 @@ wxClientData* wxListBox::DoGetItemClientObject( int n ) const { wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid listbox control") ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); wxCHECK_MSG( node, (wxClientData *)NULL, wxT("invalid index in wxListBox::DoGetItemClientObject") ); @@ -666,14 +565,14 @@ void wxListBox::Clear() // destroy the data (due to Robert's idea of using wxList // and not wxList we can't just say // m_clientList.DeleteContents(TRUE) - this would crash! - wxNode *node = m_clientData.First(); + wxNode *node = m_clientList.First(); while ( node ) { delete (wxClientData *)node->Data(); node = node->Next(); } } - m_clientData.Clear(); + m_clientList.Clear(); if ( m_strings ) m_strings->Clear(); @@ -691,7 +590,7 @@ void wxListBox::Delete( int n ) gtk_list_remove_items( m_list, list ); g_list_free( list ); - wxNode *node = m_clientData.Nth( n ); + wxNode *node = m_clientList.Nth( n ); if ( node ) { if ( m_clientDataItemsType == ClientData_Object ) @@ -700,7 +599,7 @@ void wxListBox::Delete( int n ) delete cd; } - m_clientData.DeleteNode( node ); + m_clientList.DeleteNode( node ); } if ( m_strings ) @@ -760,15 +659,8 @@ int wxListBox::GetCount() const { wxCHECK_MSG( m_list != NULL, -1, wxT("invalid listbox") ); - GList *child = m_list->children; - int count = 0; - while (child) - { - count++; - child = child->next; - } - - return count; + GList *children = m_list->children; + return g_list_length(children); } int wxListBox::FindString( const wxString &item ) const @@ -869,14 +761,14 @@ void wxListBox::SetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - DisableEvents(); + GtkDisableEvents(); if (select) gtk_list_select_item( m_list, n ); else gtk_list_unselect_item( m_list, n ); - EnableEvents(); + GtkEnableEvents(); } void wxListBox::DoSetFirstItem( int WXUNUSED(n) ) @@ -888,7 +780,7 @@ void wxListBox::DoSetFirstItem( int WXUNUSED(n) ) // helpers // ---------------------------------------------------------------------------- -int wxListBox::GetIndex( GtkWidget *item ) const +int wxListBox::GtkGetIndex( GtkWidget *item ) const { if (item) { @@ -916,40 +808,7 @@ void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) } #endif // wxUSE_TOOLTIPS -#if wxUSE_DRAG_AND_DROP -void wxListBox::SetDropTarget( wxDropTarget *dropTarget ) -{ - wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - -#ifndef NEW_GTK_DND_CODE - if (m_dropTarget) - { - GList *child = m_list->children; - while (child) - { - m_dropTarget->UnregisterWidget( GTK_WIDGET( child->data ) ); - child = child->next; - } - } -#endif - - wxWindow::SetDropTarget( dropTarget ); - -#ifndef NEW_GTK_DND_CODE - if (m_dropTarget) - { - GList *child = m_list->children; - while (child) - { - m_dropTarget->RegisterWidget( GTK_WIDGET( child->data ) ); - child = child->next; - } - } -#endif -} -#endif - -void wxListBox::DisableEvents() +void wxListBox::GtkDisableEvents() { GList *child = m_list->children; while (child) @@ -965,7 +824,7 @@ void wxListBox::DisableEvents() } } -void wxListBox::EnableEvents() +void wxListBox::GtkEnableEvents() { GList *child = m_list->children; while (child) diff --git a/src/gtk1/minifram.cpp b/src/gtk1/minifram.cpp index 9fa95cf..26a08de 100644 --- a/src/gtk1/minifram.cpp +++ b/src/gtk1/minifram.cpp @@ -281,7 +281,6 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title { style = style | wxSIMPLE_BORDER; style = style | wxCAPTION; - style = style | wxSYSTEM_MENU; if ((style & wxCAPTION) || (style & wxTINY_CAPTION_HORIZ) || (style & wxTINY_CAPTION_VERT)) m_miniTitle = 13; diff --git a/src/iodbc/connect.c b/src/iodbc/connect.c index b444f77..bd803f7 100644 --- a/src/iodbc/connect.c +++ b/src/iodbc/connect.c @@ -849,7 +849,7 @@ SQLDriverConnect ( break; } - sprintf (cnstr2drv, "DSN=%s;", dsn); + sprintf ((char*)cnstr2drv, "DSN=%s;", dsn); cbConnStrIn += STRLEN (cnstr2drv); STRNCAT (cnstr2drv, szConnStrIn, cbConnStrIn); szConnStrIn = cnstr2drv; diff --git a/src/iodbc/info.c b/src/iodbc/info.c index 0c8fda5..f64c081 100644 --- a/src/iodbc/info.c +++ b/src/iodbc/info.c @@ -198,7 +198,7 @@ SQLDataSources ( * And find the description that goes with this entry */ _iodbcdm_getkeyvalbydsn (sect[cur_entry], strlen (sect[cur_entry]), - "Description", szDesc, cbDescMax); + "Description", (char*) szDesc, cbDescMax); /* * Next record diff --git a/src/unix/dialup.cpp b/src/unix/dialup.cpp index d97ea36..6dc5671 100644 --- a/src/unix/dialup.cpp +++ b/src/unix/dialup.cpp @@ -124,7 +124,7 @@ public: // NB: this won't result in DISCONNECTED event being sent virtual bool CancelDialing(); - unsigned int GetISPNames(class wxArrayString &) const + size_t GetISPNames(class wxArrayString &) const { return 0; } // sometimes the built-in logic for determining the online status may fail, diff --git a/src/unix/gsocket.c b/src/unix/gsocket.c index 1d0c60e..5873952 100644 --- a/src/unix/gsocket.c +++ b/src/unix/gsocket.c @@ -906,7 +906,7 @@ void _GSocket_Detected_Write(GSocket *socket) socket->m_establishing = FALSE; len = sizeof(error); - getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, &error, &len); + getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, (void*) &error, &len); if (error) { diff --git a/utils/wxPython/lib/floatbar.py b/utils/wxPython/lib/floatbar.py index ce846b4..fefca18 100644 --- a/utils/wxPython/lib/floatbar.py +++ b/utils/wxPython/lib/floatbar.py @@ -104,9 +104,8 @@ class wxFloatBar(wxToolBar): self.floatframe.SetToolBar(self) self.oldcolor = self.GetBackgroundColour() barsize = self.GetSizeTuple() -# self.floatframe.SetSize(wxSize(barsize[0], barsize[1] + self.titleheight)) -# self.floatframe.SetClientSize(wxSize(barsize[0], barsize[1])) - self.floatframe.SetClientSize(wxSize(50,200)) + self.floatframe.SetSize(wxSize(barsize[0], barsize[1] + self.titleheight)) + self.floatframe.SetClientSize(wxSize(barsize[0], barsize[1])) newpos = self.parentframe.GetPosition() newpos.y = newpos.y + self.titleheight self.floatframe.SetPosition(newpos) -- 2.7.4