From 0180dad680ecbe4cb5cf8e6e45ce569f7a1029f7 Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
Date: Fri, 11 Jun 1999 17:27:57 +0000
Subject: [PATCH]   Implemented ListCtrl::SetColumnWidth() wxLIST_AUTOSIZE  
 Fixed typo in configure   Added docs for wxINTXX_SWAP_XX macros

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2763 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 configure.in                  |  2 +-
 docs/latex/wx/function.tex    | 49 +++++++++++++++++++++++++++
 docs/latex/wx/listctrl.tex    | 20 ++++++-----
 include/wx/generic/listctrl.h |  4 +--
 samples/listctrl/listtest.cpp | 63 +++++++++++++++++++----------------
 src/generic/listctrl.cpp      | 39 +++++++++++++++++++++-
 6 files changed, 136 insertions(+), 41 deletions(-)

diff --git a/configure.in b/configure.in
index 04073d1d23..27c0017d3f 100644
--- a/configure.in
+++ b/configure.in
@@ -28,7 +28,7 @@ dnl WX_BINARY_AGE += 1
 dnl
 dnl if any functions have been added, do:
 dnl
-dnl WX_INTERFACE_AGE = 1
+dnl WX_INTERFACE_AGE = 0
 
 WX_MAJOR_VERSION_NUMBER=2
 WX_MINOR_VERSION_NUMBER=1
diff --git a/docs/latex/wx/function.tex b/docs/latex/wx/function.tex
index 6bf8961e47..bb08c1b42d 100644
--- a/docs/latex/wx/function.tex
+++ b/docs/latex/wx/function.tex
@@ -1586,6 +1586,55 @@ function.
 
 These macros are defined in wxWindows.
 
+\membersection{wxINTXX\_SWAP\_ALWAYS}\label{intswapalways}
+
+\func{wxInt32}{wxINT32\_SWAP\_ALWAYS}{\param{wxInt32 }{value}}
+
+\func{wxUint32}{wxUINT32\_SWAP\_ALWAYS}{\param{wxUint32 }{value}}
+
+\func{wxInt16}{wxINT16\_SWAP\_ALWAYS}{\param{wxInt16 }{value}}
+
+\func{wxUint16}{wxUINT16\_SWAP\_ALWAYS}{\param{wxUint16 }{value}}
+
+This macro will swap the bytes of the {\it value} variable from little
+endian to big endian or vice versa.
+
+\membersection{wxINTXX\_SWAP\_ON\_BE}\label{intswaponbe}
+
+\func{wxInt32}{wxINT32\_SWAP\_ON\_BE}{\param{wxInt32 }{value}}
+
+\func{wxUint32}{wxUINT32\_SWAP\_ON\_BE}{\param{wxUint32 }{value}}
+
+\func{wxInt16}{wxINT16\_SWAP\_ON\_BE}{\param{wxInt16 }{value}}
+
+\func{wxUint16}{wxUINT16\_SWAP\_ON\_BE}{\param{wxUint16 }{value}}
+
+This macro will swap the bytes of the {\it value} variable from little
+endian to big endian or vice versa if the program is compiled on a
+big-endian architecture (such as Sun work stations). If the program has 
+been compiled on a little-endian architecture, the value will be unchanged.
+
+Use these macros to read data from and write data to a file that stores 
+data in little endian (Intel i386) format.
+
+\membersection{wxINTXX\_SWAP\_ON\_LE}\label{intswaponle}
+
+\func{wxInt32}{wxINT32\_SWAP\_ON\_LE}{\param{wxInt32 }{value}}
+
+\func{wxUint32}{wxUINT32\_SWAP\_ON\_LE}{\param{wxUint32 }{value}}
+
+\func{wxInt16}{wxINT16\_SWAP\_ON\_LE}{\param{wxInt16 }{value}}
+
+\func{wxUint16}{wxUINT16\_SWAP\_ON\_LE}{\param{wxUint16 }{value}}
+
+This macro will swap the bytes of the {\it value} variable from little
+endian to big endian or vice versa if the program is compiled on a
+little-endian architecture (such as Intel PCs). If the program has 
+been compiled on a big-endian architecture, the value will be unchanged.
+
+Use these macros to read data from and write data to a file that stores 
+data in big endian format.
+
 \membersection{CLASSINFO}\label{classinfo}
 
 \func{wxClassInfo *}{CLASSINFO}{className}
diff --git a/docs/latex/wx/listctrl.tex b/docs/latex/wx/listctrl.tex
index 7d7a0873bb..870041f7f3 100644
--- a/docs/latex/wx/listctrl.tex
+++ b/docs/latex/wx/listctrl.tex
@@ -26,12 +26,12 @@ the list wraps, unlike a wxListBox.}
 \twocolitem{\windowstyle{wxLC\_REPORT}}{single or multicolumn report view, with optional header.}
 \twocolitem{\windowstyle{wxLC\_ICON}}{Large icon view, with optional labels.}
 \twocolitem{\windowstyle{wxLC\_SMALL\_ICON}}{Small icon view, with optional labels.}
-\twocolitem{\windowstyle{wxLC\_ALIGN\_TOP}}{Icons align to the top (default).}
-\twocolitem{\windowstyle{wxLC\_ALIGN\_LEFT}}{Icons align to the left.}
-\twocolitem{\windowstyle{wxLC\_AUTOARRANGE}}{Icons arrange themselves.}
-\twocolitem{\windowstyle{wxLC\_USER\_TEXT}}{The application provides label text on demand, except for column headers.}
+\twocolitem{\windowstyle{wxLC\_ALIGN\_TOP}}{Icons align to the top. Win32 default, Win32 only. }
+\twocolitem{\windowstyle{wxLC\_ALIGN\_LEFT}}{Icons align to the left. }
+\twocolitem{\windowstyle{wxLC\_AUTOARRANGE}}{Icons arrange themselves. Win32 only. }
+\twocolitem{\windowstyle{wxLC\_USER\_TEXT}}{The application provides label text on demand, except for column headers. Win32 only. }
 \twocolitem{\windowstyle{wxLC\_EDIT\_LABELS}}{Labels are editable: the application will be notified when editing starts.}
-\twocolitem{\windowstyle{wxLC\_NO\_HEADER}}{No header in report mode.}
+\twocolitem{\windowstyle{wxLC\_NO\_HEADER}}{No header in report mode. Win32 only. }
 \twocolitem{\windowstyle{wxLC\_SINGLE\_SEL}}{Single selection.}
 \twocolitem{\windowstyle{wxLC\_SORT\_ASCENDING}}{Sort in ascending order (must still supply a comparison callback in SortItems.}
 \twocolitem{\windowstyle{wxLC\_SORT\_DESCENDING}}{Sort in descending order (must still supply a comparison callback in SortItems.}
@@ -111,7 +111,7 @@ Destructor, destroying the list control.
 
 \func{bool}{Arrange}{\param{int }{flag = wxLIST\_ALIGN\_DEFAULT}}
 
-Arranges the items in icon or small icon view. {\it flag} is one of:
+Arranges the items in icon or small icon view. This only has effect on Win32. {\it flag} is one of:
 
 \twocolwidtha{5cm}
 \begin{twocollist}\itemsep=0pt
@@ -455,6 +455,8 @@ information.
 Sets the column width.
 
 {\it width} can be a width in pixels or wxLIST\_AUTOSIZE (-1) or wxLIST\_AUTOSIZE\_USEHEADER (-2).
+wxLIST\_AUTOSIZE will resize the column to the length of its longest item. wxLIST\_AUTOSIZE\_USEHEADER
+will resize the column to the length of the header (Win32) or 80 pixels (other platforms).
 
 In small or normal icon view, {\it col} must be -1, and the column width is set for all columns.
 
@@ -504,11 +506,11 @@ The {\bf m\_stateMask} and {\bf m\_state} members take flags from the following:
 
 \twocolwidtha{5cm}
 \begin{twocollist}\itemsep=0pt
-\twocolitem{wxLIST\_STATE\_DONTCARE}{Don't care what the state is.}
-\twocolitem{wxLIST\_STATE\_DROPHILITED}{The item is highlighted to receive a drop event.}
+\twocolitem{wxLIST\_STATE\_DONTCARE}{Don't care what the state is. Win32 only. }
+\twocolitem{wxLIST\_STATE\_DROPHILITED}{The item is highlighted to receive a drop event. Win32 only. }
 \twocolitem{wxLIST\_STATE\_FOCUSED}{The item has the focus.}
 \twocolitem{wxLIST\_STATE\_SELECTED}{The item is selected.}
-\twocolitem{wxLIST\_STATE\_CUT}{The item is in the cut state.}
+\twocolitem{wxLIST\_STATE\_CUT}{The item is in the cut state. Win32 only. }
 \end{twocollist}
 
 \func{long}{SetItem}{\param{long }{index}, \param{int }{col}, \param{const wxString\& }{label}, \param{int }{imageId = -1}}
diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h
index b9a9e74ce5..70afe45135 100644
--- a/include/wx/generic/listctrl.h
+++ b/include/wx/generic/listctrl.h
@@ -145,8 +145,8 @@ enum {
 
 // Autosize values for SetColumnWidth
 enum {
-    wxLIST_AUTOSIZE = -1,          // always 80 in wxGLC (what else?)
-    wxLIST_AUTOSIZE_USEHEADER = -2
+    wxLIST_AUTOSIZE = -1,           // width of longest item
+    wxLIST_AUTOSIZE_USEHEADER = -2  // always 80 in wxGLC
 };
 
 // Flag values for GetItemRect
diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp
index 7e3afcc677..acdf26adfd 100644
--- a/samples/listctrl/listtest.cpp
+++ b/samples/listctrl/listtest.cpp
@@ -205,55 +205,62 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 void MyFrame::OnDeselectAll(wxCommandEvent& WXUNUSED(event))
 {
    int n = m_listCtrl->GetItemCount();
-   int i;
-   for(i = 0; i < n; i++)
+   for (int i = 0; i < n; i++)
       m_listCtrl->SetItemState(i,0,wxLIST_STATE_SELECTED);
 }
 
 void MyFrame::OnSelectAll(wxCommandEvent& WXUNUSED(event))
 {
    int n = m_listCtrl->GetItemCount();
-   int i;
-   for(i = 0; i < n; i++)
+   for (int i = 0; i < n; i++)
       m_listCtrl->SetItemState(i,wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
 }
 
 void MyFrame::OnListView(wxCommandEvent& WXUNUSED(event))
 {
-	m_listCtrl->DeleteAllItems();
-	m_logWindow->Clear();
-	m_listCtrl->SetSingleStyle(wxLC_LIST);
+    m_listCtrl->DeleteAllItems();
+    m_logWindow->Clear();
+    m_listCtrl->SetSingleStyle(wxLC_LIST);
     m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_NORMAL);
     m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_SMALL);
 
-	for ( int i=0; i < 30; i++)
-	{
-		wxChar buf[20];
-		wxSprintf(buf, _T("Item %d"), i);
-		m_listCtrl->InsertItem(i, buf);
-	}
+    for ( int i=0; i < 30; i++)
+    {
+	wxChar buf[20];
+	wxSprintf(buf, _T("Item %d"), i);
+	m_listCtrl->InsertItem(i, buf);
+    }
 }
 
 void MyFrame::OnReportView(wxCommandEvent& WXUNUSED(event))
 {
-	m_listCtrl->DeleteAllItems();
-	m_logWindow->Clear();
-	m_listCtrl->SetSingleStyle(wxLC_REPORT);
+    m_listCtrl->DeleteAllItems();
+    m_logWindow->Clear();
+   
+    m_listCtrl->SetSingleStyle(wxLC_REPORT);
     m_listCtrl->SetImageList((wxImageList *) NULL, wxIMAGE_LIST_NORMAL);
     m_listCtrl->SetImageList(wxGetApp().m_imageListSmall, wxIMAGE_LIST_SMALL);
 
-	m_listCtrl->InsertColumn(0, "Column 1", wxLIST_FORMAT_LEFT, 140);
-	m_listCtrl->InsertColumn(1, "Column 2", wxLIST_FORMAT_LEFT, 140);
-
-	for ( int i=0; i < 30; i++)
-	{
-		wxChar buf[50];
-		wxSprintf(buf, _T("Item %d, col 1"), i);
-		long tmp = m_listCtrl->InsertItem(i, buf, 0);
-
-		wxSprintf(buf, _T("Item %d, broad column 2"), i);
-		tmp = m_listCtrl->SetItem(i, 1, buf);
-	}
+    m_listCtrl->InsertColumn(0, "Column 1"); // , wxLIST_FORMAT_LEFT, 140);
+    m_listCtrl->InsertColumn(1, "Column 2"); // , wxLIST_FORMAT_LEFT, 140);
+    m_listCtrl->InsertColumn(2, "One More Column (2)"); // , wxLIST_FORMAT_LEFT, 140);
+
+    for ( int i=0; i < 30; i++)
+    {
+	wxChar buf[50];
+	wxSprintf(buf, _T("This is item %d"), i);
+	long tmp = m_listCtrl->InsertItem(i, buf, 0);
+
+	wxSprintf(buf, _T("Col 1, item %d"), i);
+	tmp = m_listCtrl->SetItem(i, 1, buf);
+	
+	wxSprintf(buf, _T("Item %d in column 2"), i);
+	tmp = m_listCtrl->SetItem(i, 2, buf);
+    }
+    
+    m_listCtrl->SetColumnWidth( 0, wxLIST_AUTOSIZE );
+    m_listCtrl->SetColumnWidth( 1, wxLIST_AUTOSIZE );
+    m_listCtrl->SetColumnWidth( 2, wxLIST_AUTOSIZE );
 }
 
 void MyFrame::OnIconView(wxCommandEvent& WXUNUSED(event))
diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp
index c64f7e4229..25364ef23f 100644
--- a/src/generic/listctrl.cpp
+++ b/src/generic/listctrl.cpp
@@ -1695,7 +1695,44 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
 
     m_dirty = TRUE;
 
-    wxNode *node = m_columns.Nth( col );
+    wxNode *node = (wxNode*) NULL;
+
+    if (width == wxLIST_AUTOSIZE_USEHEADER) width = 80;
+    if (width == wxLIST_AUTOSIZE)
+    {
+        wxClientDC dc(this);
+        dc.SetFont( GetFont() );
+        int max = 10;
+        node = m_lines.First();
+        while (node)
+        {
+            wxListLineData *line = (wxListLineData*)node->Data();
+            wxNode *n = line->m_items.Nth( col );
+            if (n)
+            {
+                wxListItemData *item = (wxListItemData*)n->Data();
+		int current = 0, ix = 0, iy = 0;
+		long lx = 0, ly = 0;
+		if (item->HasImage())
+		{
+                    GetImageSize( item->GetImage(), ix, iy );
+		    current = ix + 5;
+		}
+		if (item->HasText())
+		{
+		    wxString str;
+		    item->GetText( str );
+		    dc.GetTextExtent( str, &lx, &ly );
+		    current += lx;
+		}
+		if (current > max) max = current;
+            }
+            node = node->Next();
+        }
+	width = max+10;
+    }
+
+    node = m_columns.Nth( col );
     if (node)
     {
         wxListHeaderData *column = (wxListHeaderData*)node->Data();
-- 
2.50.0

