]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/listbox.cpp
Option for variable line heights (MSW and GTK+ sofar)
[wxWidgets.git] / src / gtk / listbox.cpp
index f1e5f96b1ebd071bcb212f15853b40014b6d6705..b159d8de729b175416e23088efab6f15163d5e4a 100644 (file)
@@ -203,6 +203,7 @@ gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget),
         int index = listbox->GetSelection();
         if (index != wxNOT_FOUND)
         {
+        
             wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() );
             event.SetEventObject( listbox );
             
@@ -221,11 +222,12 @@ gtk_listbox_key_press_callback( GtkWidget *WXUNUSED(widget),
             else if ( listbox->HasClientUntypedData() )
                 event.SetClientData( gtk_tree_entry_get_userdata(entry) );
 
-            bool ret = listbox->HandleWindowEvent( event );
+            /* bool ret = */ listbox->HandleWindowEvent( event );
 
             g_object_unref (entry);
             
-            if (!ret)
+//          wxMac and wxMSW always invoke default action
+//          if (!ret)
             {
                 // DClick not handled -> invoke default action
                 wxWindow *tlw = wxGetTopLevelParent( listbox );
@@ -844,7 +846,7 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent)
     m_blockEvent = false;
 }
 
-void wxListBox::DoSetFirstItem( int n )
+void wxListBox::DoScrollToCell(int n, float alignY, float alignX)
 {
     wxCHECK_RET( m_treeview, wxT("invalid listbox") );
     wxCHECK_RET( IsValid(n), wxT("invalid index"));
@@ -862,11 +864,21 @@ void wxListBox::DoSetFirstItem( int n )
 
     // Scroll to the desired cell (0.0 == topleft alignment)
     gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
-                                 TRUE, 0.0f, 0.0f);
+                                 TRUE, alignY, alignX);
 
     gtk_tree_path_free(path);
 }
 
+void wxListBox::DoSetFirstItem(int n)
+{
+    DoScrollToCell(n, 0, 0);
+}
+
+void wxListBox::EnsureVisible(int n)
+{
+    DoScrollToCell(n, 0.5, 0);
+}
+
 // ----------------------------------------------------------------------------
 // hittest
 // ----------------------------------------------------------------------------
@@ -951,43 +963,40 @@ wxSize wxListBox::DoGetBestSize() const
     // Start with a minimum size that's not too small
     int cx, cy;
     GetTextExtent( wxT("X"), &cx, &cy);
-    int lbWidth = 3 * cx;
+    int lbWidth = 0;
     int lbHeight = 10;
 
-    // Get the visible area of the tree view (limit to the 10th item
-    // so that it isn't too big)
-    unsigned int count = GetCount();
-    if (count)
+    // Find the widest string.
+    const unsigned int count = GetCount();
+    if ( count )
     {
         int wLine;
-
-        // Find the widest line
-        for(unsigned int i = 0; i < count; i++) {
-            wxString str(GetString(i));
-            GetTextExtent(str, &wLine, NULL);
-            lbWidth = wxMax(lbWidth, wLine);
+        for ( unsigned int i = 0; i < count; i++ )
+        {
+            GetTextExtent(GetString(i), &wLine, NULL);
+            if ( wLine > lbWidth )
+                lbWidth = wLine;
         }
+    }
 
-        lbWidth += 3 * cx;
+    lbWidth += 3 * cx;
 
-        // And just a bit more for the checkbox if present and then some
-        // (these are rough guesses)
+    // And just a bit more for the checkbox if present and then some
+    // (these are rough guesses)
 #if wxUSE_CHECKLISTBOX
-        if ( m_hasCheckBoxes )
-        {
-            lbWidth += 35;
-            cy = cy > 25 ? cy : 25; // rough height of checkbox
-        }
-#endif
-
-        // don't make the listbox too tall (limit height to around 10 items) but don't
-        // make it too small neither
-        lbHeight = (cy+4) * wxMin(wxMax(count, 3), 10);
+    if ( m_hasCheckBoxes )
+    {
+        lbWidth += 35;
+        cy = cy > 25 ? cy : 25; // rough height of checkbox
     }
+#endif
 
     // Add room for the scrollbar
     lbWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
 
+    // Don't make the listbox too tall but don't make it too small neither
+    lbHeight = (cy+4) * wxMin(wxMax(count, 3), 10);
+
     wxSize best(lbWidth, lbHeight);
     CacheBestSize(best);
     return best;