]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/listbox.cpp
xti additions / changes, trying to reduce dependencies
[wxWidgets.git] / src / msw / listbox.cpp
index a274222a8ae8c0e070f8d7ce35b0074ad13b1d70..9b06a34e94bda0580c122bc6437f05a281025ed7 100644 (file)
@@ -6,10 +6,10 @@
 // Created:
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "listbox.h"
 #endif
 
 
 #include <windowsx.h>
 
-#ifdef __WXWINE__
-  #if defined(GetWindowStyle)
-    #undef GetWindowStyle
-  #endif
-#endif
-
 #include "wx/dynarray.h"
 #include "wx/log.h"
 
     #include  "wx/ownerdrw.h"
 #endif
 
-#ifndef __TWIN32__
-    #ifdef __GNUWIN32_OLD__
-        #include "wx/msw/gnuwin32/extra.h"
-    #endif
+#ifdef __GNUWIN32_OLD__
+    #include "wx/msw/gnuwin32/extra.h"
 #endif
 
-#ifdef __WXWINE__
-  #ifndef ListBox_SetItemData
-    #define ListBox_SetItemData(hwndCtl, index, data) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
-  #endif
-  #ifndef ListBox_GetHorizontalExtent
-    #define ListBox_GetHorizontalExtent(hwndCtl) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_GETHORIZONTALEXTENT, 0L, 0L))
-  #endif
-  #ifndef ListBox_GetSelCount
-    #define ListBox_GetSelCount(hwndCtl) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELCOUNT, 0L, 0L))
-  #endif
-  #ifndef ListBox_GetSelItems
-    #define ListBox_GetSelItems(hwndCtl, cItems, lpItems) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_GETSELITEMS, (WPARAM)(int)(cItems), (LPARAM)(int *)(lpItems)))
-  #endif
-  #ifndef ListBox_GetTextLen
-    #define ListBox_GetTextLen(hwndCtl, index) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L))
-  #endif
-  #ifndef ListBox_GetText
-    #define ListBox_GetText(hwndCtl, index, lpszBuffer) \
-      ((int)(DWORD)SendMessage((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCTSTR)(lpszBuffer)))
-  #endif
+#if wxUSE_EXTENDED_RTTI
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxListBox, wxControl,"wx/listbox.h")
+
+WX_BEGIN_PROPERTIES_TABLE(wxListBox)
+    // TODO DELEGATES
+       WX_PROPERTY( Font , wxFont , SetFont , GetFont  , )
+    WX_PROPERTY_COLLECTION( Choices , wxArrayString , wxString , AppendString , GetStrings )
+       WX_PROPERTY( Selection ,int, SetSelection, GetSelection, )
+WX_END_PROPERTIES_TABLE()
+
+WX_BEGIN_HANDLERS_TABLE(wxListBox)
+WX_END_HANDLERS_TABLE()
+
+WX_CONSTRUCTOR_4( wxListBox , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size ) 
+#else
+IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
 #endif
 
-    IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+/*
+TODO PROPERTIES
+       selection
+       content
+               item
+*/
 
 // ============================================================================
 // list box item declaration and implementation
@@ -156,8 +144,8 @@ bool wxListBox::Create(wxWindow *parent,
     int height = size.y;
     m_windowStyle = style;
 
-    DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |
-                   LBS_NOTIFY | LBS_HASSTRINGS /* | WS_CLIPSIBLINGS */;
+    DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_TABSTOP |
+                   LBS_NOTIFY | LBS_HASSTRINGS ;
 
     wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
                   _T("only one of listbox selection modes can be specified") );
@@ -180,7 +168,7 @@ bool wxListBox::Create(wxWindow *parent,
     if (m_windowStyle & wxLB_SORT)
         wstyle |= LBS_SORT;
 
-#if wxUSE_OWNER_DRAWN
+#if wxUSE_OWNER_DRAWN && !defined(__WXWINCE__)
     if ( m_windowStyle & wxLB_OWNERDRAW ) {
         // we don't support LBS_OWNERDRAWVARIABLE yet
         wstyle |= LBS_OWNERDRAWFIXED;
@@ -191,32 +179,17 @@ bool wxListBox::Create(wxWindow *parent,
     // doesn't work properly
     wstyle |= LBS_NOINTEGRALHEIGHT;
 
-    bool want3D;
-    WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D);
-
-    // Even with extended styles, need to combine with WS_BORDER for them to
-    // look right.
-    if ( want3D || wxStyleHasBorder(m_windowStyle) )
-    {
-        wstyle |= WS_BORDER;
-    }
+    WXDWORD exStyle = 0;
+    (void) MSWGetStyle(m_windowStyle, & exStyle) ;
 
     m_hWnd = (WXHWND)::CreateWindowEx(exStyle, wxT("LISTBOX"), NULL,
-            wstyle | WS_CHILD,
+            wstyle ,
             0, 0, 0, 0,
             (HWND)parent->GetHWND(), (HMENU)m_windowId,
             wxGetInstance(), NULL);
 
     wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create listbox") );
 
-#if wxUSE_CTL3D
-    if (want3D)
-    {
-        Ctl3dSubclassCtl(GetHwnd());
-        m_useCtl3D = TRUE;
-    }
-#endif
-
     // Subclass again to catch messages
     SubclassWin(m_hWnd);
 
@@ -504,8 +477,7 @@ wxString wxListBox::GetString(int N) const
 
     // +1 for terminating NUL
     wxString result;
-    ListBox_GetText(GetHwnd(), N, result.GetWriteBuf(len + 1));
-    result.UngetWriteBuf();
+    ListBox_GetText(GetHwnd(), N, wxStringBuffer(result, len + 1));
 
     return result;
 }
@@ -633,13 +605,15 @@ void wxListBox::SetHorizontalExtent(const wxString& s)
             oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle());
 
         GetTextMetrics(dc, &lpTextMetric);
-        int i;
-        for (i = 0; i < m_noItems; i++)
+
+        // FIXME: buffer overflow!!
+        wxChar buf[1024];
+        for (int i = 0; i < m_noItems; i++)
         {
-            int len = (int)SendMessage(GetHwnd(), LB_GETTEXT, i, (LONG)wxBuffer);
-            wxBuffer[len] = 0;
+            int len = (int)SendMessage(GetHwnd(), LB_GETTEXT, i, (LPARAM)buf);
+            buf[len] = 0;
             SIZE extentXY;
-            ::GetTextExtentPoint(dc, (LPTSTR)wxBuffer, len, &extentXY);
+            ::GetTextExtentPoint(dc, buf, len, &extentXY);
             int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth);
             if (extentX > largestExtent)
                 largestExtent = extentX;
@@ -708,20 +682,17 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
     wxCommandEvent event(evtType, m_windowId);
     event.SetEventObject( this );
 
-    wxArrayInt aSelections;
-    int n, count = GetSelections(aSelections);
-    if ( count > 0 )
+    // retrieve the affected item
+    int n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0);
+    if ( n != LB_ERR )
     {
-        n = aSelections[0];
         if ( HasClientObjectData() )
             event.SetClientObject( GetClientObject(n) );
         else if ( HasClientUntypedData() )
             event.SetClientData( GetClientData(n) );
+
         event.SetString( GetString(n) );
-    }
-    else
-    {
-        n = -1;
+        event.SetExtraLong( HasMultipleSelection() ? IsSelected(n) : TRUE );
     }
 
     event.m_commandInt = n;
@@ -754,7 +725,11 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item)
 
     MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item;
 
+#ifdef __WXWINCE__
+    HDC hdc = GetDC(NULL);
+#else
     HDC hdc = CreateIC(wxT("DISPLAY"), NULL, NULL, 0);
+#endif
 
     wxDC dc;
     dc.SetHDC((WXHDC)hdc);