git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4408 
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
     file_menu->Append(Menu_Quit, "E&xit");
 
     wxMenu *log_menu = new wxMenu;
     file_menu->Append(Menu_Quit, "E&xit");
 
     wxMenu *log_menu = new wxMenu;
-    log_menu->Append(Menu_Clear, "Clear\tDel");
+    log_menu->Append(Menu_Clear, "Clear\tCtrl-L");
 
     wxMenu *help_menu = new wxMenu;
     help_menu->Append(Menu_Help, "&Help...");
 
     wxMenu *help_menu = new wxMenu;
     help_menu->Append(Menu_Help, "&Help...");
 void DnDFrame::OnLogClear(wxCommandEvent& /* event */ )
 {
     m_ctrlLog->Clear();
 void DnDFrame::OnLogClear(wxCommandEvent& /* event */ )
 {
     m_ctrlLog->Clear();
+    m_ctrlText->Clear();
+    m_ctrlFile->Clear();
 }
 
 void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
 }
 
 void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
         wxTextDataObject textData(m_strText);
 /*
         wxFileDataObject textData;
         wxTextDataObject textData(m_strText);
 /*
         wxFileDataObject textData;
-       textData.AddFile( "/file1.txt" );
-       textData.AddFile( "/file2.txt" );
+        textData.AddFile( "/file1.txt" );
+        textData.AddFile( "/file2.txt" );
 */
         wxDropSource source(textData, this
 #ifdef __WXMSW__
 */
         wxDropSource source(textData, this
 #ifdef __WXMSW__
-                            ,wxCURSOR_PENCIL,            // for copy
+                            ,wxCURSOR_PENCIL,           // for copy
                             wxCURSOR_SPRAYCAN,          // for move
                             wxCURSOR_SPRAYCAN,          // for move
-                            wxCURSOR_QUESTION_ARROW   // for nothing
+                            wxCURSOR_QUESTION_ARROW     // for nothing
 
 
 void wxDataFormat::PrepareFormats()
 {
 
 void wxDataFormat::PrepareFormats()
 {
+    // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the
+    //     atoms STRING and file:ALL as the old code was
-        g_textAtom = gdk_atom_intern( "STRING", FALSE );
+        g_textAtom = gdk_atom_intern( "text/plain", FALSE );
     if (!g_pngAtom)
         g_pngAtom = gdk_atom_intern( "image/png", FALSE );
     if (!g_fileAtom)
     if (!g_pngAtom)
         g_pngAtom = gdk_atom_intern( "image/png", FALSE );
     if (!g_fileAtom)
-        g_fileAtom = gdk_atom_intern( "file:ALL", FALSE );
+        g_fileAtom = gdk_atom_intern( "text/uri-list", FALSE );
 }
 
 //-------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------
 
 bool wxFileDataObject::SetData(size_t size, const void *buf)
 {
 
 bool wxFileDataObject::SetData(size_t size, const void *buf)
 {
+    // VZ: old format
+#if 0
     // filenames are stores as a string with #0 as deliminators
     // filenames are stores as a string with #0 as deliminators
     const char *filenames = (const char*) buf;
     size_t pos = 0;
     for(;;)
     {
         if (filenames[0] == 0)
     const char *filenames = (const char*) buf;
     size_t pos = 0;
     for(;;)
     {
         if (filenames[0] == 0)
-           break;
-       if (pos >= size)
-           break;
+            break;
+        if (pos >= size)
+            break;
         wxString file( filenames );  // this returns the first file
         AddFile( file );
         wxString file( filenames );  // this returns the first file
         AddFile( file );
-       pos += file.Len()+1;
-       filenames += file.Len()+1;
+        pos += file.Len()+1;
+        filenames += file.Len()+1;
+    }
+#else // 1
+    m_filenames.Empty();
+
+    // the text/uri-list format is a sequence of URIs (filenames prefixed by
+    // "file:" as far as I see) delimited by "\r\n" of total length size
+    // (I wonder what happens if the file has '\n' in its filename??)
+    wxString filename;
+    for ( const char *p = (const char *)buf; *p; p++ )
+    {
+        if ( *p == '\r' && *(p+1) == '\n' )
+        {
+            static const int lenPrefix = 5; // strlen("file:")
+            if ( filename.Left(lenPrefix).MakeLower() == _T("file:") )
+            {
+                filename.erase(0, lenPrefix);
+            }
+
+            AddFile(filename);
+            filename.Empty();
+
+            // skip '\r'
+            p++;
+        }
+        else
+        {
+            filename += *p;
+        }
 
 
     // disable the debug message from GetMatchingPair() - there are too many
     // of them otherwise
 
     // disable the debug message from GetMatchingPair() - there are too many
     // of them otherwise
     wxLogNull noLog;
 #endif // Debug
 
     wxLogNull noLog;
 #endif // Debug
 
 
 
 void wxDataFormat::PrepareFormats()
 {
 
 void wxDataFormat::PrepareFormats()
 {
+    // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the
+    //     atoms STRING and file:ALL as the old code was
-        g_textAtom = gdk_atom_intern( "STRING", FALSE );
+        g_textAtom = gdk_atom_intern( "text/plain", FALSE );
     if (!g_pngAtom)
         g_pngAtom = gdk_atom_intern( "image/png", FALSE );
     if (!g_fileAtom)
     if (!g_pngAtom)
         g_pngAtom = gdk_atom_intern( "image/png", FALSE );
     if (!g_fileAtom)
-        g_fileAtom = gdk_atom_intern( "file:ALL", FALSE );
+        g_fileAtom = gdk_atom_intern( "text/uri-list", FALSE );
 }
 
 //-------------------------------------------------------------------------
 }
 
 //-------------------------------------------------------------------------
 
 bool wxFileDataObject::SetData(size_t size, const void *buf)
 {
 
 bool wxFileDataObject::SetData(size_t size, const void *buf)
 {
+    // VZ: old format
+#if 0
     // filenames are stores as a string with #0 as deliminators
     // filenames are stores as a string with #0 as deliminators
     const char *filenames = (const char*) buf;
     size_t pos = 0;
     for(;;)
     {
         if (filenames[0] == 0)
     const char *filenames = (const char*) buf;
     size_t pos = 0;
     for(;;)
     {
         if (filenames[0] == 0)
-           break;
-       if (pos >= size)
-           break;
+            break;
+        if (pos >= size)
+            break;
         wxString file( filenames );  // this returns the first file
         AddFile( file );
         wxString file( filenames );  // this returns the first file
         AddFile( file );
-       pos += file.Len()+1;
-       filenames += file.Len()+1;
+        pos += file.Len()+1;
+        filenames += file.Len()+1;
+    }
+#else // 1
+    m_filenames.Empty();
+
+    // the text/uri-list format is a sequence of URIs (filenames prefixed by
+    // "file:" as far as I see) delimited by "\r\n" of total length size
+    // (I wonder what happens if the file has '\n' in its filename??)
+    wxString filename;
+    for ( const char *p = (const char *)buf; *p; p++ )
+    {
+        if ( *p == '\r' && *(p+1) == '\n' )
+        {
+            static const int lenPrefix = 5; // strlen("file:")
+            if ( filename.Left(lenPrefix).MakeLower() == _T("file:") )
+            {
+                filename.erase(0, lenPrefix);
+            }
+
+            AddFile(filename);
+            filename.Empty();
+
+            // skip '\r'
+            p++;
+        }
+        else
+        {
+            filename += *p;
+        }
 
 
     // disable the debug message from GetMatchingPair() - there are too many
     // of them otherwise
 
     // disable the debug message from GetMatchingPair() - there are too many
     // of them otherwise
     wxLogNull noLog;
 #endif // Debug
 
     wxLogNull noLog;
 #endif // Debug