Index: rbutil/rbutil.ini
===================================================================
--- rbutil/rbutil.ini	(Revision 12646)
+++ rbutil/rbutil.ini	(Arbeitskopie)
@@ -7,6 +7,7 @@
 last_release=2.5
 prog_name=rockbox
 bootloader_url=http://download.rockbox.org/bootloader
+themes_url=http://www.rockbox-themes.org/
 
 [platforms]
 platform1=player
@@ -44,6 +45,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=11x2x1
 
 [recorder]
 name=Archos Jukebox Recorder 10, 20
@@ -54,6 +56,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [recorder8mb]
 name=Archos Jukebox Recorder 10, 20 (with 8mb memory)
@@ -64,6 +67,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [recorderv2]
 name=Archos Jukebox Recorder v2 (20GB)
@@ -74,6 +78,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [fmrecorder]
 name=Archos Jukebox Recorder FM
@@ -84,6 +89,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [fmrecorder8mb]
 name=Archos Jukebox Recorder FM (with 8mb memory)
@@ -94,6 +100,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [ondiosp]
 name=Archos Ondio SP
@@ -104,6 +111,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [ondiofm]
 name=Archos Ondio FM
@@ -114,6 +122,7 @@
 bootloadername=
 autodetect=no
 combinedname=
+resolution=112x64x1
 
 [h100]
 name=Iriver iHP100, iHP110
@@ -124,6 +133,7 @@
 bootloadername=bootloader-h100.bin
 autodetect=no
 combinedname=
+resolution=160x128x2
 
 [h120]
 name=Iriver iHP120, iHP140, H120, H140
@@ -134,6 +144,7 @@
 bootloadername=bootloader-h120.bin
 autodetect=no
 combinedname=
+resolution=160x128x2
 
 [h300]
 name=Iriver H320, H340
@@ -144,9 +155,10 @@
 bootloadername=bootloader-h300.bin
 autodetect=no
 combinedname=
+resolution=220x176x16
 
 [h10_5gbums]
-name=Iriver H10 (5GB) UMS
+name=Iriver H10 (5/6GB) UMS
 platform=h10_5gb
 released=no
 needsbootloader=yes
@@ -154,9 +166,10 @@
 bootloadername=H10.mi4
 autodetect=no
 combinedname=
+resolution=128x128x16
 
 [h10_5gbmtp]
-name=Iriver H10 (5GB) MTP
+name=Iriver H10 (5/6GB) MTP
 platform=h10_5gb
 released=no
 needsbootloader=yes
@@ -164,6 +177,7 @@
 bootloadername=H10_5GB-MTP/H10.mi4
 autodetect=no
 combinedname=
+resolution=128x128x16
 
 [h10]
 name=Iriver H10 (20GB)
@@ -174,6 +188,7 @@
 bootloadername=H10_20GC.mi4
 autodetect=no
 combinedname=
+resolution=160x128x16
 
 [ipodcolor]
 name=Apple Ipod Colour/Photo/U2 (4th gen)
@@ -184,6 +199,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=220x176x16
 
 [ipodnano]
 name=Apple Ipod Nano (1st gen)
@@ -194,6 +210,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=176x132x16
 
 [ipod4gray]
 name=Apple Ipod (4th gen, greyscale)
@@ -204,6 +221,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=160x128x2
 
 [ipodvideo]
 name=Apple Ipod Video (5th gen)
@@ -214,6 +232,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=320x240x16
 
 [ipod3g]
 name=Apple Ipod (3rd gen)
@@ -224,6 +243,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=160x128x2
 
 [ipodmini1g]
 name=Apple Ipod Mini (1st gen)
@@ -234,6 +254,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=138x110x2
 
 [ipodmini2g]
 name=Apple Ipod Mini (2nd gen)
@@ -244,6 +265,7 @@
 bootloadername=none
 autodetect=yes
 combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
+resolution=138x110x2
 
 [iaudiox5]
 name=Cowon iAudio X5 , X5L
@@ -254,6 +276,7 @@
 bootloadername=x5_fw.bin
 autodetect=no
 combinedname=
+resolution=160x128x16
 
 [iaudiox5v]
 name=Cowon iAudio X5V
@@ -264,6 +287,7 @@
 bootloadername=x5v_fw.bin
 autodetect=no
 combinedname=
+resolution=160x128x2
 
 [iaudiom5]
 name=Cowon iAudio M5 , M5L
@@ -274,6 +298,7 @@
 bootloadername=m5_fw.bin
 autodetect=no
 combinedname=
+resolution=160x128x16
 
 [gigabeatf]
 name=Toshiba Gigabeat F , X
@@ -283,3 +308,4 @@
 bootloadername=FWIMG01.DAT
 autodetect=no
 combinedname=
+resolution=240x320x16
Index: rbutil/rbutil.cpp
===================================================================
--- rbutil/rbutil.cpp	(Revision 12646)
+++ rbutil/rbutil.cpp	(Arbeitskopie)
@@ -58,15 +58,70 @@
 const wxArrayString* rootmatch = new wxArrayString(
     (size_t) (sizeof(_rootmatch) / sizeof(wxChar*)), _rootmatch);
 
+bool InstallTheme(wxString Themesrc)
+{
+    wxString dest,src,err;
+
+    int pos = Themesrc.Find('/',true);
+    wxString themename = Themesrc.SubString(pos+1,Themesrc.Length());
+
+    src.Printf(wxT("%s/%s"), gv->themes_url.c_str(),Themesrc.c_str());
+    dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
+                  gv->stdpaths->GetUserDataDir().c_str(),themename.c_str());
+    if( DownloadURL(src, dest) )
+    {
+        wxRemoveFile(dest);
+        err.Printf(wxT("Unable to download %s"), src.c_str() );
+        ERR_DIALOG(err, wxT("Install Theme"));
+        return false;
+    }
+
+    if(!checkZip(dest))
+    {
+        err.Printf(wxT("The Zip %s does not contain the correct dir structure"), dest.c_str());
+        ERR_DIALOG(err, wxT("Install Theme"));
+        return false;
+    }
+
+    if(UnzipFile(dest,gv->curdestdir, true))
+    {
+        err.Printf(wxT("Unable to unzip %s to %s"), dest.c_str(), gv->curdestdir.c_str());
+        ERR_DIALOG(err, wxT("Install Theme"));
+        return false;
+    }
+
+    return true;
+}
+
+bool checkZip(wxString zipname)
+{
+    wxZipEntryPtr       entry;
+
+    wxFFileInputStream* in_file = new wxFFileInputStream(zipname);
+    wxZipInputStream* in_zip = new wxZipInputStream(*in_file);
+
+    entry.reset(in_zip->GetNextEntry());
+
+    wxString name = entry->GetName();
+    if(entry->IsDir())
+    {
+        if(name.Contains(wxT(".rockbox\\")))
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 int DownloadURL(wxString src, wxString dest)
 {
     int input, errnum = 0, success = false;
     wxString buf, errstr;
-    wxLogVerbose(_("=== begin DownloadURL(%s,%s)"), src.c_str(),
+    wxLogVerbose(wxT("=== begin DownloadURL(%s,%s)"), src.c_str(),
         dest.c_str());
 
-    buf.Printf(_("Fetching %s"), src.c_str());
-    wxProgressDialog* progress = new wxProgressDialog(_("Downloading"),
+    buf.Printf(wxT("Fetching %s"), src.c_str());
+    wxProgressDialog* progress = new wxProgressDialog(wxT("Downloading"),
                 buf, 100, NULL, wxPD_APP_MODAL |
                 wxPD_AUTO_HIDE | wxPD_SMOOTH | wxPD_ELAPSED_TIME |
                 wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
@@ -105,7 +160,7 @@
                             current += os->LastWrite();
                             if (!progress->Update(current * 100 / filesize))
                             {
-                                errstr = _("Download aborted by user");
+                                errstr = wxT("Download aborted by user");
                                 errnum = 1000;
                                 break;
                             }
@@ -113,7 +168,7 @@
                         } else
                         {
                             errnum = os->GetLastError();
-                            errstr.Printf(_("Can't write to output stream (%s)"),
+                            errstr.Printf(wxT("Can't write to output stream (%s)"),
                                         stream_err_str(errnum).c_str() );
 
                             break;
@@ -127,7 +182,7 @@
                             errnum = 0;
                             break;
                         }
-                        errstr.Printf(_("Can't read from input stream (%s)"),
+                        errstr.Printf(wxT("Can't read from input stream (%s)"),
                                       stream_err_str(errnum).c_str() );
                     }
                 }
@@ -136,7 +191,7 @@
                 if (! errnum)
                 {
                     errnum = os->GetLastError();
-                    errstr.Printf(_("Can't close output file (%s)"),
+                    errstr.Printf(wxT("Can't close output file (%s)"),
                             stream_err_str(errnum).c_str() );
 
                     input = false;
@@ -147,26 +202,26 @@
                 } else
                 {
                     errnum = is->GetLastError();
-                    errstr.Printf(_("Can't get input stream size (%s)"),
+                    errstr.Printf(wxT("Can't get input stream size (%s)"),
                             stream_err_str(errnum).c_str() );
 
                 }
             } else
             {
                 errnum = in_http->GetError();
-                errstr.Printf(_("Can't get input stream (%d)"), errnum);
+                errstr.Printf(wxT("Can't get input stream (%d)"), errnum);
             }
             delete is;
         } else
         {
             errnum = os->GetLastError();
-            errstr.Printf(_("Can't create output stream (%s)"),
+            errstr.Printf(wxT("Can't create output stream (%s)"),
                     stream_err_str(errnum).c_str() );
         }
         delete os;
     } else
     {
-        errstr.Printf(_("Can't open URL %s (%d)"), src.c_str(),
+        errstr.Printf(wxT("Can't open URL %s (%d)"), src.c_str(),
             in_http->GetError() );
         errnum = 100;
     }
@@ -179,19 +234,19 @@
         if (errnum == 0) errnum = 999;
         if (input)
         {
-            buf.Printf(_("%s reading\n%s"),
+            buf.Printf(wxT("%s reading\n%s"),
                 errstr.c_str(), src.c_str());
-            ERR_DIALOG(buf, _("Download URL"));
+            ERR_DIALOG(buf, wxT("Download URL"));
         } else
         {
-            buf.Printf(_("%s writing to download\n/%s"),
+            buf.Printf(wxT("%s writing to download\n/%s"),
                 errstr.c_str(), dest.c_str());
-            ERR_DIALOG(buf, _("Download URL"));
+            ERR_DIALOG(buf, wxT("Download URL"));
         }
 
     }
 
-    wxLogVerbose(_("=== end DownloadURL"));
+    wxLogVerbose(wxT("=== end DownloadURL"));
     return errnum;
 }
 
@@ -202,7 +257,7 @@
     int                 errnum = 0, curfile = 0, totalfiles = 0;
     InstallLog*         log = NULL;
 
-    wxLogVerbose(_("===begin UnzipFile(%s,%s,%i)"),
+    wxLogVerbose(wxT("===begin UnzipFile(%s,%s,%i)"),
                src.c_str(), destdir.c_str(), isInstall);
 
     wxFFileInputStream* in_file = new wxFFileInputStream(src);
@@ -212,9 +267,9 @@
         if (! in_zip->IsOk() )
         {
             errnum = in_zip->GetLastError();
-            buf.Printf(_("Can't open ZIP stream %s for reading (%s)"),
+            buf.Printf(wxT("Can't open ZIP stream %s for reading (%s)"),
                 src.c_str(), stream_err_str(errnum).c_str() );
-            ERR_DIALOG(buf, _("Unzip File") );
+            ERR_DIALOG(buf, wxT("Unzip File") );
             delete in_zip;
             delete in_file;
             return true;
@@ -224,9 +279,9 @@
         if (! in_zip->IsOk() )
         {
             errnum = in_zip->GetLastError();
-            buf.Printf(_("Error Getting total ZIP entries for %s (%s)"),
+            buf.Printf(wxT("Error Getting total ZIP entries for %s (%s)"),
                 src.c_str(), stream_err_str(errnum).c_str() );
-            ERR_DIALOG(buf, _("Unzip File") );
+            ERR_DIALOG(buf, wxT("Unzip File") );
             delete in_zip;
             delete in_file;
             return true;
@@ -234,16 +289,16 @@
     } else
     {
         errnum = in_file->GetLastError();
-        buf.Printf(_("Can't open %s (%s)"), src.c_str(),
+        buf.Printf(wxT("Can't open %s (%s)"), src.c_str(),
                    stream_err_str(errnum).c_str() );
-        ERR_DIALOG(buf, _("Unzip File") );
+        ERR_DIALOG(buf, wxT("Unzip File") );
         delete in_zip;
         delete in_file;
         return true;
     }
 
-    wxProgressDialog* progress = new wxProgressDialog(_("Unpacking archive"),
-                  _("Preparing to unpack the downloaded files to your audio"
+    wxProgressDialog* progress = new wxProgressDialog(wxT("Unpacking archive"),
+                  wxT("Preparing to unpack the downloaded files to your audio"
                   "device"), totalfiles, NULL, wxPD_APP_MODAL |
                   wxPD_AUTO_HIDE | wxPD_SMOOTH | wxPD_ELAPSED_TIME |
                   wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
@@ -262,9 +317,9 @@
 
         curfile++;
         wxString name = entry->GetName();
-        progress_msg.Printf(_("Unpacking %s"), name.c_str());
+        progress_msg.Printf(wxT("Unpacking %s"), name.c_str());
         if (! progress->Update(curfile, progress_msg) ) {
-            buf.Printf(_("Unpacking cancelled by user"));
+            buf.Printf(wxT("Unpacking cancelled by user"));
             MESG_DIALOG(buf);
             errnum = 1000;
             break;
@@ -275,7 +330,7 @@
         if (entry->IsDir() ) {
             if (!wxDirExists(in_str) ) {
                 if (! wxMkdir(in_str, 0777) ) {
-                    buf.Printf(_("Unable to create directory %s"),
+                    buf.Printf(wxT("Unable to create directory %s"),
                                in_str.c_str() );
                     errnum = 100;
                     break;
@@ -288,7 +343,7 @@
         wxFFileOutputStream* out = new wxFFileOutputStream(in_str);
         if (! out->IsOk() )
         {
-            buf.Printf(_("Can't open file %s for writing"), in_str.c_str() );
+            buf.Printf(wxT("Can't open file %s for writing"), in_str.c_str() );
             delete out;
             return 100;
         } else if (isInstall)
@@ -298,19 +353,19 @@
 
         in_zip->Read(*out);
         if (! out->IsOk()) {
-            buf.Printf(_("Can't write to %s (%d)"), in_str.c_str(),
+            buf.Printf(wxT("Can't write to %s (%d)"), in_str.c_str(),
                         errnum = out->GetLastError() );
         }
 
         if (!in_zip->IsOk() && ! in_file->GetLastError() == wxSTREAM_EOF)
         {
-            buf.Printf(_("Can't read from %s (%d)"), src.c_str(),
+            buf.Printf(wxT("Can't read from %s (%d)"), src.c_str(),
             errnum = in_file->GetLastError() );
         }
 
         if (! out->Close() && errnum == 0)
         {
-            buf.Printf(_("Unable to close %s (%d)"), in_str.c_str(),
+            buf.Printf(wxT("Unable to close %s (%d)"), in_str.c_str(),
                 errnum = out->GetLastError() );
 
         }
@@ -323,11 +378,11 @@
 
     if (errnum)
     {
-        ERR_DIALOG(buf, _("Unzip File"));
+        ERR_DIALOG(buf, wxT("Unzip File"));
     }
 
     if (log) delete log;
-    wxLogVerbose(_("=== end UnzipFile"));
+    wxLogVerbose(wxT("=== end UnzipFile"));
     return(errnum);
 }
 
@@ -339,10 +394,10 @@
     InstallLog *log = NULL;
     wxArrayString* FilesToRemove = NULL;
 
-    wxLogVerbose(_("=== begin Uninstall(%s,%i)"), dir.c_str(), isFullUninstall);
+    wxLogVerbose(wxT("=== begin Uninstall(%s,%i)"), dir.c_str(), isFullUninstall);
 
-    wxProgressDialog* progress = new wxProgressDialog(_("Uninstalling"),
-                _("Reading uninstall data from jukebox"), 100, NULL,
+    wxProgressDialog* progress = new wxProgressDialog(wxT("Uninstalling"),
+                wxT("Reading uninstall data from jukebox"), 100, NULL,
                 wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_SMOOTH |
                 wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
     progress->Update(0);
@@ -358,19 +413,19 @@
         if (FilesToRemove == NULL || FilesToRemove->GetCount() < 1) {
             wxLogNull lognull;
             if ( wxMessageDialog(NULL,
-                _("Rockbox Utility can't find any uninstall data on this "
+                wxT("Rockbox Utility can't find any uninstall data on this "
                 "jukebox.\n"
                 "Would you like to attempt a full uninstall?\n"
                 "(WARNING: A full uninstall removes all files in your Rockbox "
                 "folder)"),
-                _("Standard uninstall not possible"),
+                wxT("Standard uninstall not possible"),
                 wxICON_EXCLAMATION | wxYES_NO | wxNO_DEFAULT).ShowModal()
                 == wxID_YES)
             {
                 isFullUninstall = true;
             }
             else {
-                MESG_DIALOG(_("Uninstall cancelled by user"));
+                MESG_DIALOG(wxT("Uninstall cancelled by user"));
                 delete progress;
                 return 1000;
             }
@@ -382,8 +437,8 @@
         buf.Printf(wxT("%s" PATH_SEP ".rockbox"), dir.c_str());
         if (rm_rf(buf) )
         {
-            WARN_DIALOG(_("Unable to completely remove Rockbox directory"),
-            _("Full uninstall") );
+            WARN_DIALOG(wxT("Unable to completely remove Rockbox directory"),
+            wxT("Full uninstall") );
             errflag = true;
         }
 
@@ -413,8 +468,8 @@
             {
                 if (! wxRemoveFile((*special)[i]) )
                 {
-                    buf.Printf(_("Can't delete %s"), (*special)[i].c_str());
-                    WARN_DIALOG(buf.c_str(), _("Full uninstall"));
+                    buf.Printf(wxT("Can't delete %s"), (*special)[i].c_str());
+                    WARN_DIALOG(buf.c_str(), wxT("Full uninstall"));
                     errflag = true;
                 }
             }
@@ -441,11 +496,11 @@
 
             wxString* buf2 = new wxString;
             buf.Printf("%s%s", dir.c_str() , FilesToRemove->Item(i).c_str() );
-            buf2->Format(_("Deleting %s"), buf.c_str());
+            buf2->Format(wxT("Deleting %s"), buf.c_str());
 
             if (! progress->Update((i + 1) * 100 / totalfiles, *buf2) )
             {
-                WARN_DIALOG(_("Cancelled by user"), _("Normal Uninstall"));
+                WARN_DIALOG(wxT("Cancelled by user"), wxT("Normal Uninstall"));
                 delete progress;
                 return true;
             }
@@ -463,41 +518,41 @@
 
                 if ( rc = ! wxRmdir(buf) )
                 {
-                    buf = buf.Format(_("Can't remove directory %s"),
+                    buf = buf.Format(wxT("Can't remove directory %s"),
                         buf.c_str());
                     errflag = true;
-                    WARN_DIALOG(buf.c_str(), _("Standard uninstall"));
+                    WARN_DIALOG(buf.c_str(), wxT("Standard uninstall"));
                 }
             } else if (wxFileExists(buf) )
             {
                 if ( rc = ! wxRemoveFile(buf) )
                 {
-                    buf = buf.Format(_("Can't delete file %s"),
+                    buf = buf.Format(wxT("Can't delete file %s"),
                         buf.c_str());
                     errflag = true;
-                    WARN_DIALOG(buf.c_str(), _("Standard uninstall"));
+                    WARN_DIALOG(buf.c_str(), wxT("Standard uninstall"));
                 }
             } else
             {
                 errflag = true;
-                buf = buf.Format(_("Can't find file or directory %s"),
+                buf = buf.Format(wxT("Can't find file or directory %s"),
                     buf.c_str() );
-                WARN_DIALOG(buf.c_str(), _("Standard uninstall") );
+                WARN_DIALOG(buf.c_str(), wxT("Standard uninstall") );
             }
 
             uninst = uninst.AfterFirst('\n');
         }
         if (errflag)
         {
-            ERR_DIALOG(_("Unable to remove some files"),
-                _("Standard uninstall"))    ;
+            ERR_DIALOG(wxT("Unable to remove some files"),
+                wxT("Standard uninstall"))    ;
         }
 
         if (FilesToRemove != NULL) delete FilesToRemove;
     }
 
     delete progress;
-    wxLogVerbose(_("=== end Uninstall"));
+    wxLogVerbose(wxT("=== end Uninstall"));
     return errflag;
 }
 
@@ -553,8 +608,8 @@
         if (! wxMkdir(destdir, 0777) )
         {
             buf.Printf(wxT("%s (%s)"),
-                _("Unable to create directory for installer"), destdir.c_str());
-            WARN_DIALOG(buf , _("Portable install") );
+                wxT("Unable to create directory for installer"), destdir.c_str());
+            WARN_DIALOG(buf , wxT("Portable install") );
             return false;
         }
         log->WriteFile(wxT("RockboxUtility"), true);
@@ -564,7 +619,7 @@
         wxDIR_FILES);
     if (filestocopy.GetCount() < 1)
     {
-        WARN_DIALOG(_("No files to copy"), _("Portable install") );
+        WARN_DIALOG(wxT("No files to copy"), wxT("Portable install") );
         return false;
     }
 
@@ -581,8 +636,8 @@
         if (! wxCopyFile(filestocopy[i], dstr) )
         {
             buf.Printf(wxT("%s (%s -> %s)"),
-                _("Error copying file"), filestocopy[i].c_str(), dstr.c_str());
-            WARN_DIALOG(buf, _("Portable Install") );
+                wxT("Error copying file"), filestocopy[i].c_str(), dstr.c_str());
+            WARN_DIALOG(buf, wxT("Portable Install") );
             return false;
         }
         buf = dstr;
@@ -599,7 +654,7 @@
         {
             buf.Printf(wxT("Can't copy program binary %s -> %s"),
                 str.c_str(), dstr.c_str() );
-            WARN_DIALOG(buf, _("Portable Install") );
+            WARN_DIALOG(buf, wxT("Portable Install") );
             return false;
         }
         buf = dstr;
@@ -613,9 +668,9 @@
     if (! wxCopyFile(gv->UserConfigFile, dstr) )
     {
         buf.Printf(wxT("%s (%s -> %s)"),
-            _("Unable to install user config file"), gv->UserConfigFile.c_str(),
+            wxT("Unable to install user config file"), gv->UserConfigFile.c_str(),
             dstr.c_str() );
-        WARN_DIALOG(buf, _("Portable Install") );
+        WARN_DIALOG(buf, wxT("Portable Install") );
         return false;
     }
     buf = dstr;
@@ -628,7 +683,7 @@
 
 bool rm_rf(wxString file)
 {
-    wxLogVerbose(_("=== begin rm-rf(%s)"), file.c_str() );
+    wxLogVerbose(wxT("=== begin rm-rf(%s)"), file.c_str() );
 
     wxString buf;
     wxArrayString selected;
@@ -649,8 +704,8 @@
         selected.Sort(true);
         selected.Add(file);
 
-        wxProgressDialog* progress = new wxProgressDialog(_("Removing files"),
-                _("Deleting files"), selected.GetCount(), NULL,
+        wxProgressDialog* progress = new wxProgressDialog(wxT("Removing files"),
+                wxT("Deleting files"), selected.GetCount(), NULL,
                 wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_SMOOTH |
                 wxPD_ELAPSED_TIME | wxPD_REMAINING_TIME | wxPD_CAN_ABORT);
 
@@ -659,10 +714,10 @@
             wxLogVerbose(selected[i]);
             if (progress != NULL)
             {
-                buf.Printf(_("Deleting %s"), selected[i].c_str() );
+                buf.Printf(wxT("Deleting %s"), selected[i].c_str() );
                 if (! progress->Update(i, buf))
                 {
-                    WARN_DIALOG(_("Cancelled by user"), _("Erase Files"));
+                    WARN_DIALOG(wxT("Cancelled by user"), wxT("Erase Files"));
                     delete progress;
                     return true;
                 }
@@ -672,27 +727,27 @@
             {
                 if (rc = ! wxRmdir(selected[i]) )
                 {
-                    buf.Printf(_("Can't remove directory %s"),
+                    buf.Printf(wxT("Can't remove directory %s"),
                         selected[i].c_str());
                     errflag = true;
-                    WARN_DIALOG(buf.c_str(), _("Erase files"));
+                    WARN_DIALOG(buf.c_str(), wxT("Erase files"));
                 }
             } else if (rc = ! wxRemoveFile(selected[i]) )
             {
-                buf.Printf(_("Error deleting file %s"), selected[i].c_str() );
+                buf.Printf(wxT("Error deleting file %s"), selected[i].c_str() );
                 errflag = true;
-                WARN_DIALOG(buf.c_str(),_("Erase files"));
+                WARN_DIALOG(buf.c_str(),wxT("Erase files"));
             }
         }
         delete progress;
     } else
     {
-        buf.Printf(_("Can't find expected file %s"), file.c_str());
-        WARN_DIALOG(buf.c_str(), _("Erase files"));
+        buf.Printf(wxT("Can't find expected file %s"), file.c_str());
+        WARN_DIALOG(buf.c_str(), wxT("Erase files"));
         return true;
     }
 
-    wxLogVerbose(_("=== end rm-rf"));
+    wxLogVerbose(wxT("=== end rm-rf"));
     return rc ? true : false;
 }
 
Index: rbutil/rbutilFrm.h
===================================================================
--- rbutil/rbutilFrm.h	(Revision 12646)
+++ rbutil/rbutilFrm.h	(Arbeitskopie)
@@ -58,13 +58,13 @@
 public:
 		wxMenuBar *WxMenuBar1;
 		wxStaticText *WxStaticText3;
-		wxStaticText *WxStaticText4;
 		wxBitmapButton *WxBitmapButton2;
 		wxStaticText *WxStaticText2;
 		wxBitmapButton *WxBitmapButton1;
 		wxBitmapButton *WxBitmapButton3;
 		wxBitmapButton *WxBitmapButton4;
 		wxBitmapButton *WxBitmapButton5;
+		wxBitmapButton *WxBitmapButton6;
 		wxFlexGridSizer *WxFlexGridSizer1;
 		wxStaticBoxSizer *WxStaticBoxSizer3;
 		wxStaticBitmap *WxStaticBitmap1;
@@ -87,6 +87,7 @@
 			ID_INSTALL_BTN = 1028,
 			ID_WXSTATICBITMAP1 = 1053,
             ID_FONT_BTN = 1128,
+            ID_THEMES_BTN = 1139,
             ID_BOOTLOADER_BTN = 1129,
 			ID_WXPANEL1 = 1064,
 
@@ -102,6 +103,7 @@
 	void OnInstallBtn(wxCommandEvent& event);
 	void OnRemoveBtn(wxCommandEvent& event);
 	void OnFontBtn(wxCommandEvent& event);
+	void OnThemesBtn(wxCommandEvent& event);
 	void OnBootloaderBtn(wxCommandEvent& event);
 	void OnPortableInstall(wxCommandEvent& event);
 	void OnBootloaderRemoveBtn(wxCommandEvent& event);
Index: rbutil/bootloaders.cpp
===================================================================
--- rbutil/bootloaders.cpp	(Revision 12646)
+++ rbutil/bootloaders.cpp	(Arbeitskopie)
@@ -42,14 +42,14 @@
     // downloading files
     if(mode == BOOTLOADER_ADD)
     {
-        src.Printf("%s/ipod/%s.ipod", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
-        dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
+        src.Printf(wxT("%s/ipod/%s.ipod"), gv->bootloader_url.c_str(),gv->curbootloader.c_str());
+        dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
                     gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
         if ( DownloadURL(src, dest) )
         {
             wxRemoveFile(dest);
-            buf.Printf(_("Unable to download %s"), src.c_str() );
-            ERR_DIALOG(buf, _("Install"));
+            buf.Printf(wxT("Unable to download %s"), src.c_str() );
+            ERR_DIALOG(buf, wxT("Install"));
             return false;
         }
     }
@@ -59,45 +59,45 @@
     int n = ipod_scan(&ipod);
     if (n == 0)
     {
-         ERR_DIALOG("[ERR]  No ipods found.", _("Scanning for Ipods"));
+         ERR_DIALOG(wxT("[ERR]  No ipods found."), wxT("Scanning for Ipods"));
          return false;
     }
     if (n > 1)
     {
-         ERR_DIALOG("[ERR]  to many ipods found.", _("Scanning for Ipods"));
+         ERR_DIALOG(wxT("[ERR]  to many ipods found."), wxT("Scanning for Ipods"));
          return false;
     }
 
     if (ipod_open(&ipod, 0) < 0)
     {
-       ERR_DIALOG("[ERR] could not open ipod", _("open Ipod"));
+       ERR_DIALOG(wxT("[ERR] could not open ipod"), wxT("open Ipod"));
        return false;
     }
 
     if (read_partinfo(&ipod,0) < 0)
     {
-       ERR_DIALOG("[ERR] could not read partitiontable", _("reading partitiontable"));
+       ERR_DIALOG(wxT("[ERR] could not read partitiontable"), wxT("reading partitiontable"));
        return false;
     }
 
     if (ipod.pinfo[0].start==0)
     {
-       ERR_DIALOG("[ERR]  No partition 0 on disk", _("reading partitiontable"));
+       ERR_DIALOG(wxT("[ERR]  No partition 0 on disk"), wxT("reading partitiontable"));
        int i;
        double sectors_per_MB = (1024.0*1024.0)/ipod.sector_size;
 
-       buf.Printf("[INFO] Part    Start Sector    End Sector   Size (MB)   Type\n");
-       ERR_DIALOG(buf, _("reading partitiontable"));
+       buf.Printf(wxT("[INFO] Part    Start Sector    End Sector   Size (MB)   Type\n"));
+       ERR_DIALOG(buf, wxT("reading partitiontable"));
        for ( i = 0; i < 4; i++ ) {
          if (ipod.pinfo[i].start != 0) {
-             buf.Printf("[INFO]    %d      %10ld    %10ld  %10.1f   %s (0x%02x)\n",
+             buf.Printf(wxT("[INFO]    %d      %10ld    %10ld  %10.1f   %s (0x%02x)\n"),
                    i,
                    ipod.pinfo[i].start,
                    ipod.pinfo[i].start+ipod.pinfo[i].size-1,
                    ipod.pinfo[i].size/sectors_per_MB,
                    get_parttype(ipod.pinfo[i].type),
                    ipod.pinfo[i].type);
-             ERR_DIALOG(buf, _("reading partitiontable"));
+             ERR_DIALOG(buf, wxT("reading partitiontable"));
         }
     }
        return false;
@@ -107,52 +107,52 @@
 
     if (ipod.nimages <= 0)
     {
-        ERR_DIALOG("[ERR]  Failed to read firmware directory", _("reading directory"));
+        ERR_DIALOG(wxT("[ERR]  Failed to read firmware directory"), wxT("reading directory"));
         return false;
     }
     if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0)
     {
-       buf.Printf(_("[ERR] Unknown version number in firmware (%08x)\n"),
+       buf.Printf(wxT("[ERR] Unknown version number in firmware (%08x)\n"),
                                         ipod.ipod_directory[0].vers );
-       ERR_DIALOG(buf, _("reading directory"));
+       ERR_DIALOG(buf, wxT("reading directory"));
        return false;
     }
 
     if (ipod.macpod)
     {
-      WARN_DIALOG("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod",_("MacPod"));
+      WARN_DIALOG(wxT("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod"),wxT("MacPod"));
     }
 
 
     if(mode == BOOTLOADER_ADD)
     {
         if (ipod_reopen_rw(&ipod) < 0) {
-          ERR_DIALOG("[ERR] Could not open Ipod in RW mode", _("Bootloader add"));
+          ERR_DIALOG(wxT("[ERR] Could not open Ipod in RW mode"), wxT("Bootloader add"));
           return false;
         }
 
         if (add_bootloader(&ipod, (char*)dest.c_str(), FILETYPE_DOT_IPOD)==0) {
 
         } else {
-           ERR_DIALOG("[ERR] failed to add Bootloader", _("Bootloader add"));
+           ERR_DIALOG(wxT("[ERR] failed to add Bootloader"), wxT("Bootloader add"));
            return false;
         }
     }
     else if(mode == BOOTLOADER_REM)
     {
         if (ipod_reopen_rw(&ipod) < 0) {
-          ERR_DIALOG("[ERR] Could not open Ipod in RW mode", _("Bootloader add"));
+          ERR_DIALOG(wxT("[ERR] Could not open Ipod in RW mode"), wxT("Bootloader add"));
           return false;
         }
 
         if (ipod.ipod_directory[0].entryOffset==0) {
-            ERR_DIALOG("[ERR]  No bootloader detected.\n", _("Bootloader del"));
+            ERR_DIALOG(wxT("[ERR]  No bootloader detected.\n"), wxT("Bootloader del"));
             return false;
         } else {
             if (delete_bootloader(&ipod)==0) {
 
             } else {
-               ERR_DIALOG("[ERR]  --delete-bootloader failed.\n", _("Bootloader del"));
+               ERR_DIALOG(wxT("[ERR]  --delete-bootloader failed.\n"), wxT("Bootloader del"));
                return false;
             }
         }
@@ -169,65 +169,65 @@
    wxString err;
    wxString src,dest;
 
-   path1.Printf("%s" PATH_SEP "GBSYSTEM" PATH_SEP "FWIMG" PATH_SEP "FWIMG01.DAT",gv->curdestdir.c_str());
+   path1.Printf(wxT("%s" PATH_SEP "GBSYSTEM" PATH_SEP "FWIMG" PATH_SEP "FWIMG01.DAT"),gv->curdestdir.c_str());
 
     if(mode == BOOTLOADER_ADD)
     {
         //Files downloaden
-        src.Printf("%s/gigabeat/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
-        dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
+        src.Printf(wxT("%s/gigabeat/%s"), gv->bootloader_url.c_str(),gv->curbootloader.c_str());
+        dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
                     gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
          if( DownloadURL(src, dest) )
          {
               wxRemoveFile(dest);
-              err.Printf(_("Unable to download %s"), src.c_str() );
-              ERR_DIALOG(err, _("Install"));
+              err.Printf(wxT("Unable to download %s"), src.c_str() );
+              ERR_DIALOG(err, wxT("Install"));
               return false;
          }
 
 
       if(!wxFileExists(path1))
       {
-          err.Printf("[ERR] Coud not find %s",path1.c_str());
-          ERR_DIALOG(err, _("Bootloader add"));
+          err.Printf(wxT("[ERR] Coud not find %s"),path1.c_str());
+          ERR_DIALOG(err, wxT("Bootloader add"));
           return false;
       }
       path2 = path1;
-      path2.Append(".ORIG");
+      path2.Append(wxT(".ORIG"));
       if(wxFileExists(path2))
       {
-          err = "Its seems there is already a Bootloader install, if not, delete the *.IMG.ORIG file";
-          ERR_DIALOG(err, _("Bootloader add"));
+          err = wxT("Its seems there is already a Bootloader install, if not, delete the *.IMG.ORIG file");
+          ERR_DIALOG(err, wxT("Bootloader add"));
           return false;
       }
 
       if(!wxRenameFile(path1,path2,false))
       {
-         err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
-         ERR_DIALOG(err, _("Bootloader add"));
+         err.Printf(wxT("[ERR] Coud not rename %s to %s"),path1.c_str(),path2.c_str());
+         ERR_DIALOG(err, wxT("Bootloader add"));
          return false;
       }
       if(!wxCopyFile(dest,path1))
       {
-         err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path2.c_str());
-         ERR_DIALOG(err, _("Bootloader add"));
+         err.Printf(wxT("[ERR] Coud not copy %s to %s"),dest.c_str(),path2.c_str());
+         ERR_DIALOG(err, wxT("Bootloader add"));
          return false;
       }
     }
     else if(mode == BOOTLOADER_REM)
     {
       path2 = path1;
-      path2.Append(".ORIG");
+      path2.Append(wxT(".ORIG"));
       if(!wxFileExists(path2))
       {
-          err.Printf("[ERR] Coud not find %s",path1.c_str());
-          ERR_DIALOG(err, _("Bootloader del"));
+          err.Printf(wxT("[ERR] Coud not find %s"),path1.c_str());
+          ERR_DIALOG(err, wxT("Bootloader del"));
           return false;
       }
       if(!wxRenameFile(path2,path1,true))
       {
-         err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
-         ERR_DIALOG(err, _("Bootloader del"));
+         err.Printf(wxT("[ERR] Coud not rename %s to %s"),path1.c_str(),path2.c_str());
+         ERR_DIALOG(err, wxT("Bootloader del"));
          return false;
       }
     }
@@ -241,27 +241,27 @@
     wxString err;
     wxString src,dest;
 
-    path1.Printf("%s" PATH_SEP "FIRMWARE" PATH_SEP "%s",gv->curdestdir.c_str(),gv->curbootloader.c_str());
+    path1.Printf(wxT("%s" PATH_SEP "FIRMWARE" PATH_SEP "%s"),gv->curdestdir.c_str(),gv->curbootloader.c_str());
 
     if(mode == BOOTLOADER_ADD)
     {
         //Files downloaden
-        src.Printf("%s/iaudio/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
-        dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
+        src.Printf(wxT("%s/iaudio/%s"), gv->bootloader_url.c_str(),gv->curbootloader.c_str());
+        dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
                     gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
          if( DownloadURL(src, dest) )
          {
               wxRemoveFile(dest);
-              err.Printf(_("Unable to download %s"), src.c_str() );
-              ERR_DIALOG(err, _("Install"));
+              err.Printf(wxT("Unable to download %s"), src.c_str() );
+              ERR_DIALOG(err, wxT("Install"));
               return false;
          }
 
          // copy file
          if(!wxCopyFile(dest,path1))
          {
-            err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path2.c_str());
-            ERR_DIALOG(err, _("Bootloader add"));
+            err.Printf(wxT("[ERR] Coud not copy %s to %s"),dest.c_str(),path2.c_str());
+            ERR_DIALOG(err, wxT("Bootloader add"));
             return false;
          }
 
@@ -276,7 +276,7 @@
 {
   wxString err,src,dest,path1,path2;
 
-   int pos = gv->curbootloader.Find('/');
+   int pos = gv->curbootloader.Find('/');
    if(pos == wxNOT_FOUND) pos = 0;
    wxString firmwarename = gv->curbootloader.SubString(pos,gv->curbootloader.Length());
    //wxString firmDir = gv->curbootloader.SubString(0,pos);
@@ -284,46 +284,46 @@
   if(mode == BOOTLOADER_ADD)
   {
      //Files downloaden
-     src.Printf("%s/iriver/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
-     dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
+     src.Printf(wxT("%s/iriver/%s"), gv->bootloader_url.c_str(),gv->curbootloader.c_str());
+     dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
                   gv->stdpaths->GetUserDataDir().c_str(),firmwarename.c_str());
      if( DownloadURL(src, dest) )
      {
            wxRemoveFile(dest);
-           err.Printf(_("Unable to download %s"), src.c_str() );
-           ERR_DIALOG(err, _("Install"));
+           err.Printf(wxT("Unable to download %s"), src.c_str() );
+           ERR_DIALOG(err, wxT("Install"));
            return false;
      }
 
-     path1.Printf("%sSYSTEM" PATH_SEP "%s",gv->curdestdir.c_str(),firmwarename.c_str());
-     path2.Printf("%sSYSTEM" PATH_SEP "Original.mi4",gv->curdestdir.c_str());
+     path1.Printf(wxT("%sSYSTEM" PATH_SEP "%s"),gv->curdestdir.c_str(),firmwarename.c_str());
+     path2.Printf(wxT("%sSYSTEM" PATH_SEP "Original.mi4"),gv->curdestdir.c_str());
 
      if(!wxFileExists(path1))  //Firmware dosent exists on player
      {
-        path1.Printf("%sSYSTEM" PATH_SEP "H10EMP.mi4");   //attempt other firmwarename
+        path1.Printf(wxT("%sSYSTEM" PATH_SEP "H10EMP.mi4"));   //attempt other firmwarename
         if(!wxFileExists(path1))  //Firmware dosent exists on player
         {
-            err.Printf("[ERR] File %s does not Exist",path1.c_str());
-            ERR_DIALOG(err, _("Bootloader add"));
+            err.Printf(wxT("[ERR] File %s does not Exist"),path1.c_str());
+            ERR_DIALOG(err, wxT("Bootloader add"));
             return false;
         }
      }
      if(wxFileExists(path2))  //there is already a original firmware
      {
-        err.Printf("[ERR2] File %s does Exist",path2.c_str());
-        ERR_DIALOG(err, _("Bootloader add"));
+        err.Printf(wxT("[ERR2] File %s does Exist"),path2.c_str());
+        ERR_DIALOG(err, wxT("Bootloader add"));
         return false;
      }
      if(!wxRenameFile(path1,path2,false))  //rename Firmware to Original
      {
-         err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
-         ERR_DIALOG(err, _("Bootloader add"));
+         err.Printf(wxT("[ERR] Coud not rename %s to %s"),path1.c_str(),path2.c_str());
+         ERR_DIALOG(err, wxT("Bootloader add"));
          return false;
      }
      if(!wxCopyFile(dest,path1))  // copy file
      {
-        err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path1.c_str());
-        ERR_DIALOG(err, _("Bootloader add"));
+        err.Printf(wxT("[ERR] Coud not copy %s to %s"),dest.c_str(),path1.c_str());
+        ERR_DIALOG(err,wxT("Bootloader add"));
         return false;
      }
 
@@ -332,30 +332,30 @@
   }
   else if(mode == BOOTLOADER_REM)
   {
-     path1.Printf("%sSYSTEM" PATH_SEP "%s",gv->curdestdir.c_str(),firmwarename.c_str());
-     path2.Printf("%sSYSTEM" PATH_SEP "Original.mi4",gv->curdestdir.c_str());
+     path1.Printf(wxT("%sSYSTEM" PATH_SEP "%s"),gv->curdestdir.c_str(),firmwarename.c_str());
+     path2.Printf(wxT("%sSYSTEM" PATH_SEP "Original.mi4"),gv->curdestdir.c_str());
      if(!wxFileExists(path1))  //Firmware dosent exists on player
      {
-         path1.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "H10EMP.mi4");   //attempt other firmwarename
+         path1.Printf(wxT("%s" PATH_SEP "SYSTEM" PATH_SEP "H10EMP.mi4"));   //attempt other firmwarename
          if(!wxFileExists(path1))  //Firmware dosent exists on player
          {
-            err.Printf("[ERR] File %s does not Exist",path1.c_str());
-            ERR_DIALOG(err, _("Bootloader rem"));
+            err.Printf(wxT("[ERR] File %s does not Exist"),path1.c_str());
+            ERR_DIALOG(err, wxT("Bootloader rem"));
             return false;
          }
      }
 
      if(!wxFileExists(path2))  //Original Firmware dosent exists on player
      {
-         err.Printf("[ERR] File %s does not Exist",path2.c_str());
-         ERR_DIALOG(err, _("Bootloader rem"));
+         err.Printf(wxT("[ERR] File %s does not Exist"),path2.c_str());
+         ERR_DIALOG(err, wxT("Bootloader rem"));
          return false;
      }
 
      if(!wxRenameFile(path2,path1,true))  //rename Firmware to Original
      {
-         err.Printf("[ERR] Coud not rename %s to %s",path2.c_str(),path1.c_str());
-         ERR_DIALOG(err, _("Bootloader add"));
+         err.Printf(wxT("[ERR] Coud not rename %s to %s"),path2.c_str(),path1.c_str());
+         ERR_DIALOG(err, wxT("Bootloader add"));
          return false;
      }
 
@@ -372,7 +372,7 @@
         int series,table_entry;
 
         if (!FileMD5(gv->curfirmware, &md5sum_str)) {
-        ERR_DIALOG("Could not open firmware", _("Open Firmware"));
+        ERR_DIALOG(wxT("Could not open firmware"), wxT("Open Firmware"));
         return false;
        }
        else {
@@ -398,44 +398,44 @@
                     }
                 }
                 if (series == 0) {
-                    ERR_DIALOG("Could not detect firmware type", _("Detect Player out of Firmware"));
+                    ERR_DIALOG(wxT("Could not detect firmware type"), wxT("Detect Player out of Firmware"));
                     return false;
                 }
                 else
                 {
                     //Download bootloader
-                    src.Printf("%s/iriver/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
-                    dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
+                    src.Printf(wxT("%s/iriver/%s"), gv->bootloader_url.c_str(),gv->curbootloader.c_str());
+                    dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
                             gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
                     if( DownloadURL(src, dest) )
                     {
                         wxRemoveFile(dest);
-                        err.Printf(_("Unable to download %s"), src.c_str() );
-                        ERR_DIALOG(err, _("Install"));
+                        err.Printf(wxT("Unable to download %s"), src.c_str() );
+                        ERR_DIALOG(err, wxT("Install"));
                         return false;
                     }
 
                     if(!PatchFirmware(gv->curfirmware,dest,series, table_entry))  // Patch firmware
                     {
-                        ERR_DIALOG("Patching Firmware failed", _("Patching Firmware"));
+                        ERR_DIALOG(wxT("Patching Firmware failed"), wxT("Patching Firmware"));
                         return false;
                     }
                 }
 
                 // Load patched Firmware to player
-                src.Printf("%s" PATH_SEP "download" PATH_SEP "new.hex",
+                src.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "new.hex"),
                         gv->stdpaths->GetUserDataDir().c_str());
 
                 if(gv->curplat == "h100")
-                    dest.Printf("%s" PATH_SEP "ihp_100.hex",gv->curdestdir.c_str());
+                    dest.Printf(wxT("%s" PATH_SEP "ihp_100.hex"),gv->curdestdir.c_str());
                 else if(gv->curplat == "h120")
-                    dest.Printf("%s" PATH_SEP "ihp_120.hex",gv->curdestdir.c_str());
+                    dest.Printf(wxT("%s" PATH_SEP "ihp_120.hex"),gv->curdestdir.c_str());
                 else if(gv->curplat == "h300")
-                dest.Printf("%s" PATH_SEP "H300.hex",gv->curdestdir.c_str());
+                dest.Printf(wxT("%s" PATH_SEP "H300.hex"),gv->curdestdir.c_str());
 
                 if(!wxRenameFile(src,dest))
                 {
-                     ERR_DIALOG("Copying Firmware to Device failed", _("Copying Firmware"));
+                     ERR_DIALOG(wxT("Copying Firmware to Device failed"), wxT("Copying Firmware"));
                      return false;
                 }
                 else
Index: rbutil/irivertools.cpp
===================================================================
--- rbutil/irivertools.cpp	(Revision 12646)
+++ rbutil/irivertools.cpp	(Arbeitskopie)
@@ -61,13 +61,13 @@
     wxFile f;
     if(!f.Open(infile))
     {
-        err.Printf("Could not open: %s",infile.c_str());
-        ERR_DIALOG(err, _("mkboot"));
+        err.Printf(wxT("Could not open: %s"),infile.c_str());
+        ERR_DIALOG(err, wxT("mkboot"));
         return false;
     }
     i = f.Read(image,16);
     if(i < 16) {
-        ERR_DIALOG("reading header failed", _("mkboot"));
+        ERR_DIALOG(wxT("reading header failed"), wxT("mkboot"));
         return false;
     }
 
@@ -80,7 +80,7 @@
     len = binary_length+0x200-16;
     i = f.Read(image+16, len);
     if(i < len) {
-        ERR_DIALOG("reading firmware failed", _("mkboot"));
+        ERR_DIALOG(wxT("reading firmware failed"),wxT("mkboot"));
         return false;
     }
 
@@ -88,8 +88,8 @@
     /* Now, read the boot loader into the image */
     if(!f.Open(bootloader))
     {
-        err.Printf("Could not open: %s",bootloader.c_str());
-        ERR_DIALOG(err, _("mkboot"));
+        err.Printf(wxT("Could not open: %s"),bootloader.c_str());
+        ERR_DIALOG(err, wxT("mkboot"));
         return false;
     }
 
@@ -97,7 +97,7 @@
 
     i = f.Read(image+0x220 + origin, bllen);
     if(i < bllen) {
-       ERR_DIALOG("reading bootloader failed", _("mkboot"));
+       ERR_DIALOG(wxT("reading bootloader failed"), wxT("mkboot"));
        return false;
     }
 
@@ -105,8 +105,8 @@
 
     if(!f.Open(outfile,wxFile::write))
     {
-        err.Printf("Could not open: %s",outfile.c_str());
-        ERR_DIALOG(err, _("mkboot"));
+        err.Printf(wxT("Could not open: %s"),outfile.c_str());
+        ERR_DIALOG(err, wxT("mkboot"));
         return false;
     }
 
@@ -158,7 +158,7 @@
 
     i = f.Write(image,total_length);
     if(i < total_length) {
-        ERR_DIALOG("writing bootloader failed", _("mkboot"));
+        ERR_DIALOG(wxT("writing bootloader failed"), wxT("mkboot"));
         return false;
     }
 
@@ -230,21 +230,21 @@
 
     if(!infile.Open(infile_name))
     {
-        err.Printf("Could not open: %s",infile_name.c_str());
-        ERR_DIALOG(err, _("iriver_decode"));
+        err.Printf(wxT("Could not open: %s"),infile_name.c_str());
+        ERR_DIALOG(err, wxT("iriver_decode"));
         return -1;
     }
     if(!outfile.Open(outfile_name,wxFile::write))
     {
-        err.Printf("Could not open: %s",outfile_name.c_str());
-        ERR_DIALOG(err, _("iriver_decode"));
+        err.Printf(wxT("Could not open: %s"),outfile_name.c_str());
+        ERR_DIALOG(err, wxT("iriver_decode"));
         return -1;
     }
     lenread = infile.Read( headerdata, 512);
     if( lenread != 512 )
     {
-        ERR_DIALOG(_("This doesn't look like a valid encrypted iHP "
-                 "firmware - reason: header length\n"),_("iriver_decode"));
+        ERR_DIALOG(wxT("This doesn't look like a valid encrypted iHP "
+                 "firmware - reason: header length\n"),wxT("iriver_decode"));
 
         infile.Close();
         outfile.Close();
@@ -254,8 +254,8 @@
     i = testheader( headerdata );
     if( i == -1 )
     {
-        ERR_DIALOG( _( "This firmware is for an unknown model, or is not"
-                 " a valid encrypted iHP firmware\n" ),_("iriver_decode"));
+        ERR_DIALOG( wxT( "This firmware is for an unknown model, or is not"
+                 " a valid encrypted iHP firmware\n" ),wxT("iriver_decode"));
         infile.Close();
         outfile.Close();
         return -1;
@@ -277,8 +277,8 @@
         dwLength2>>9 != dwLength3 ||
         dwLength2+dwLength3+512 != dwLength1 )
     {
-        ERR_DIALOG( _( "This doesn't look like a valid encrypted "
-                 "iHP firmware - reason: file 'length' data\n" ),_("iriver_decode"));
+        ERR_DIALOG( wxT( "This doesn't look like a valid encrypted "
+                 "iHP firmware - reason: file 'length' data\n" ),wxT("iriver_decode"));
 		infile.Close();
         outfile.Close();
         return -1;
@@ -339,8 +339,8 @@
 
     if( fp != dwLength2 )
     {
-        ERR_DIALOG( _(  "This doesn't look like a valid encrypted "
-                 "iHP firmware - reason: 'length2' mismatch\n" ),_("iriver_decode"));
+        ERR_DIALOG( wxT(  "This doesn't look like a valid encrypted "
+                 "iHP firmware - reason: 'length2' mismatch\n" ),wxT("iriver_decode"));
 		infile.Close();
         outfile.Close();
         return -1;
@@ -356,8 +356,8 @@
             outfile.Write( blockdata, lenread );
         if( memcmp( ppChecksums, blockdata, lenread ) != 0 )
         {
-            ERR_DIALOG( _(  "This doesn't look like a valid encrypted "
-                     "iHP firmware - reason: Checksum mismatch!" ),_("iriver_decode"));
+            ERR_DIALOG( wxT(  "This doesn't look like a valid encrypted "
+                     "iHP firmware - reason: Checksum mismatch!" ),wxT("iriver_decode"));
 			infile.Close();
             outfile.Close();
             return -1;
@@ -367,8 +367,8 @@
 
     if( fp != dwLength3 )
     {
-        ERR_DIALOG(_(  "This doesn't look like a valid encrypted "
-                 "iHP firmware - reason: 'length3' mismatch\n" ),_("iriver_decode"));
+        ERR_DIALOG(wxT(  "This doesn't look like a valid encrypted "
+                 "iHP firmware - reason: 'length3' mismatch\n" ),wxT("iriver_decode"));
 		infile.Close();
         outfile.Close();
         return -1;
@@ -419,22 +419,22 @@
 
     if(!infile.Open(infile_name,wxFile::read))
     {
-        err.Printf("Could not open: %s",infile_name.c_str());
-        ERR_DIALOG(err, _("iriver_decode"));
+        err.Printf(wxT("Could not open: %s"),infile_name.c_str());
+        ERR_DIALOG(err, wxT("iriver_decode"));
         return -1;
     }
     if(!outfile.Open(outfile_name,wxFile::write))
     {
-        err.Printf("Could not open: %s",outfile_name.c_str());
-        ERR_DIALOG(err, _("iriver_decode"));
+        err.Printf(wxT("Could not open: %s"),outfile_name.c_str());
+        ERR_DIALOG(err, wxT("iriver_decode"));
         return -1;
     }
 
     lenread = infile.Read( headerdata, 512 );
     if( lenread != 512 )
     {
-        ERR_DIALOG("This doesn't look like a valid decoded "
-                 "iHP firmware - reason: header length\n", _("iriver_decode"));
+        ERR_DIALOG(wxT("This doesn't look like a valid decoded "
+                 "iHP firmware - reason: header length\n"), wxT("iriver_decode"));
         infile.Close();
         outfile.Close();
     };
@@ -447,8 +447,8 @@
     i = testheader( headerdata );
     if( i == -1 )
     {
-        ERR_DIALOG("This firmware is for an unknown model, or is not"
-                 " a valid decoded iHP firmware\n", _("iriver_decode"));
+        ERR_DIALOG(wxT("This firmware is for an unknown model, or is not"
+                 " a valid decoded iHP firmware\n"), wxT("iriver_decode"));
        infile.Close();
        outfile.Close();
     };
@@ -468,8 +468,8 @@
         dwLength3 > dwLength1 ||
         dwLength2+dwLength3+512 != dwLength1 )
     {
-        ERR_DIALOG("This doesn't look like a valid decoded iHP"
-                 " firmware - reason: file 'length' data\n", _("iriver_decode"));
+        ERR_DIALOG(wxT("This doesn't look like a valid decoded iHP"
+                 " firmware - reason: file 'length' data\n"), wxT("iriver_decode"));
        infile.Close();
        outfile.Close();
     };
@@ -506,8 +506,8 @@
 
     if( fp != dwLength2 )
     {
-        ERR_DIALOG("This doesn't look like a valid decoded "
-                 "iHP firmware - reason: 'length1' mismatch\n", _("iriver_decode"));
+        ERR_DIALOG(wxT("This doesn't look like a valid decoded "
+                 "iHP firmware - reason: 'length1' mismatch\n"), wxT("iriver_decode"));
         infile.Close();
         outfile.Close();
     };
@@ -526,8 +526,8 @@
 
     if( fp != dwLength3 )
     {
-       ERR_DIALOG("This doesn't look like a valid decoded "
-                 "iHP firmware - reason: 'length2' mismatch\n", _("iriver_decode"));
+       ERR_DIALOG(wxT("This doesn't look like a valid decoded "
+                 "iHP firmware - reason: 'length2' mismatch\n"), wxT("iriver_decode"));
        infile.Close();
        outfile.Close();
     };
@@ -565,30 +565,30 @@
             break;
     }
 
-    name1.Printf("%s" PATH_SEP "download" PATH_SEP "firmware.bin",
+    name1.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "firmware.bin"),
                         gv->stdpaths->GetUserDataDir().c_str());
                                         /* descrambled file */
-    name2.Printf("%s" PATH_SEP "download" PATH_SEP "new.bin",
+    name2.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "new.bin"),
                         gv->stdpaths->GetUserDataDir().c_str());
                                     /* patched file */
-    name3.Printf("%s" PATH_SEP "download" PATH_SEP "new.hex",
+    name3.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "new.hex"),
                        gv->stdpaths->GetUserDataDir().c_str());
     if (iriver_decode(firmware, name1, FALSE, STRIP_NONE) == -1) {
-        ERR_DIALOG("Error in descramble", _("Descramble Firmware"));
+        ERR_DIALOG(wxT("Error in descramble"), wxT("Descramble Firmware"));
         wxRemoveFile(name1);
         wxRemoveFile(name2);
         wxRemoveFile(name3);
         return false;
     }
     if (!mkboot(name1, name2, bootloader, origin)) {
-        ERR_DIALOG("Error in patching",_("Patching Firmware"));
+        ERR_DIALOG(wxT("Error in patching"),wxT("Patching Firmware"));
         wxRemoveFile(name1);
         wxRemoveFile(name2);
         wxRemoveFile(name3);
         return false;
     }
     if (iriver_encode(name2, name3, FALSE) == -1) {
-        ERR_DIALOG("Error in scramble",_("Scramble Firmware"));
+        ERR_DIALOG(wxT("Error in scramble"),wxT("Scramble Firmware"));
         wxRemoveFile(name1);
         wxRemoveFile(name2);
         wxRemoveFile(name3);
@@ -596,7 +596,7 @@
     }
     /* now md5sum it */
     if (!FileMD5(name3, &md5sum_str)) {
-        ERR_DIALOG("Error in checksumming",_("Checksumming Firmware"));
+        ERR_DIALOG(wxT("Error in checksumming"),wxT("Checksumming Firmware"));
         wxRemoveFile(name1);
         wxRemoveFile(name2);
         wxRemoveFile(name3);
Index: rbutil/wizard_pages.h
===================================================================
--- rbutil/wizard_pages.h	(Revision 12646)
+++ rbutil/wizard_pages.h	(Arbeitskopie)
@@ -24,6 +24,60 @@
 
 #include "rbutil.h"
 
+
+////// Dialog for Preview of Theme //////////////
+class wxThemeImageDialog : public wxDialog
+{
+private:
+   DECLARE_EVENT_TABLE()
+
+public:
+    wxThemeImageDialog(wxWindow* parent,wxWindowID id,wxString title,wxBitmap bmp);
+    void OnPaint(wxPaintEvent& WXUNUSED(event));
+
+private:
+    wxBitmap m_bitmap;
+};
+
+
+
+class wxThemesPage : public wxWizardPageSimple
+{
+private:
+    DECLARE_EVENT_TABLE()
+
+public:
+    enum {
+         ID_PREVIEW_BTN      = 1000,
+         ID_LISTBOX          = 1001,
+         ID_INSTALLCHECKBOX  = 1002,
+    };
+
+public:
+    wxThemesPage(wxWizard *parent);
+    virtual bool TransferDataFromWindow(void);
+    void OnPageShown(wxWizardEvent& event);
+    void OnPreviewBtn(wxCommandEvent& event);
+    void OnListBox(wxCommandEvent& event);
+    void OnCheckBox(wxCommandEvent& event);
+    void OnWizardPageChanging(wxWizardEvent& event);
+
+public:
+   wxListBox* ThemesListBox;
+   wxButton* m_previewBtn;
+   wxStaticText* m_desc;
+   wxStaticText* m_size;
+   wxCheckBox* m_InstallCheckBox;
+
+   wxArrayString m_Themes;
+   wxArrayString m_Themes_path;
+   wxArrayString m_Themes_image;
+   wxArrayString m_Themes_desc;
+   wxArrayString m_Themes_size;
+   wxArrayInt    m_installTheme;
+
+};
+
 class wxBootPlatformPage : public wxWizardPageSimple
 {
 public:
Index: rbutil/rbutilApp.cpp
===================================================================
--- rbutil/rbutilApp.cpp	(Revision 12646)
+++ rbutil/rbutilApp.cpp	(Arbeitskopie)
@@ -27,7 +27,7 @@
 
 bool rbutilFrmApp::OnInit()
 {
-    wxString buf = "";
+    wxString buf = wxT("");
 
     wxLogVerbose(wxT("=== begin rbutilFrmApp::Oninit()"));
 
@@ -48,7 +48,7 @@
         wxLogNull lognull;
         if (! wxMkdir(buf, 0777))
         {
-            wxLogFatalError(_("Can't create data directory %s"),
+            wxLogFatalError(wxT("Can't create data directory %s"),
                 buf.c_str());
         }
     }
@@ -56,7 +56,7 @@
     buf += wxT(PATH_SEP "rbutil.log");
     gv->logfile = new wxFFile(buf, "w");
     if (! gv->logfile->IsOpened() )
-        wxLogFatalError(_("Unable to open log file"));
+        wxLogFatalError(wxT("Unable to open log file"));
 
     gv->loggui = new wxLogGui();
     gv->loggui->SetActiveTarget(gv->loggui);
@@ -73,7 +73,7 @@
 
     if (!ReadGlobalConfig(NULL))
     {
-        ERR_DIALOG(gv->ErrStr->GetData(), _("Rockbox Utility"));
+        ERR_DIALOG(gv->ErrStr->GetData(), wxT("Rockbox Utility"));
         return FALSE;
     }
     ReadUserConfig();
@@ -83,6 +83,8 @@
     myFrame->Show(TRUE);
 
     initIpodpatcher();             // reserve mem for ipodpatcher
+    wxInitAllImageHandlers();       //init Image handlers
+
     wxLogVerbose(wxT("=== end rbUtilFrmApp::OnInit()"));
     return TRUE;
 }
@@ -136,7 +138,7 @@
     wxFileInputStream* cfgis = new wxFileInputStream(buf);
 
     if (!cfgis->CanRead()) {
-        gv->ErrStr = new wxString(_("Unable to open configuration file"));
+        gv->ErrStr = new wxString(wxT("Unable to open configuration file"));
         return false;
     }
 
@@ -175,6 +177,9 @@
         gv->GlobalConfig->Read(buf.Format(wxT("/%s/combinedname"),
             cur.c_str()), &tmpstr);
         gv->plat_combinedname.Add(tmpstr);
+        gv->GlobalConfig->Read(buf.Format(wxT("/%s/resolution"),
+            cur.c_str()), &tmpstr);
+        gv->plat_resolution.Add(tmpstr);
 
         i++;
     }
@@ -210,6 +215,9 @@
     gv->GlobalConfig->Read(wxT("bootloader_url"), &tmpstr);
     gv->bootloader_url = tmpstr;
 
+    gv->GlobalConfig->Read(wxT("themes_url"), &tmpstr);
+    gv->themes_url = tmpstr;
+
 #ifdef __WXMSW__
     gv->curdestdir = wxT("D:\\");
 #else
Index: rbutil/rbutil.h
===================================================================
--- rbutil/rbutil.h	(Revision 12646)
+++ rbutil/rbutil.h	(Arbeitskopie)
@@ -90,6 +90,7 @@
     wxArrayString           plat_bootloadername;
     wxArrayInt              plat_autodetect;
     wxArrayString           plat_combinedname;
+    wxArrayString           plat_resolution;
     wxString                download_url;
     wxString                daily_url;
     wxString                bleeding_url;
@@ -98,6 +99,7 @@
     wxString                last_release;
     wxString                prog_name;
     wxString                bootloader_url;
+    wxString                themes_url;
 
     // User configuration data.
     wxString                curplat;
@@ -110,6 +112,8 @@
     wxString                curbootloadermethod;
     wxString                curbootloader;
     wxString                curfirmware;
+    wxString                curresolution;
+    wxArrayString           themesToInstall;
 
     // Global system variables
     wxFFile*                 logfile;
@@ -126,6 +130,8 @@
 int UnzipFile(wxString src, wxString destdir, bool isInstall = false);
 int Uninstall(const wxString dir, bool isFullUninstall = false);
 bool InstallRbutil(wxString dest);
+bool InstallTheme(wxString src);
+bool checkZip(wxString zipname);
 wxString stream_err_str(int errnum);
 bool rm_rf(wxString file);
 
Index: rbutil/rbutilFrm.cpp
===================================================================
--- rbutil/rbutilFrm.cpp	(Revision 12646)
+++ rbutil/rbutilFrm.cpp	(Arbeitskopie)
@@ -27,6 +27,8 @@
 #include "fonts_3d.xpm"
 #include "tools2_3d.xpm"
 #include "rblogo.xpm"
+#include "untools2_3d.xpm"
+#include "themes_3d.xpm"
 
 #include "bootloaders.h"
 
@@ -40,6 +42,7 @@
 	EVT_BUTTON      (ID_INSTALL_BTN, rbutilFrm::OnInstallBtn)
 	EVT_BUTTON      (ID_REMOVE_BTN, rbutilFrm::OnRemoveBtn)
 	EVT_BUTTON      (ID_FONT_BTN, rbutilFrm::OnFontBtn)
+	EVT_BUTTON      (ID_THEMES_BTN, rbutilFrm::OnThemesBtn)
 	EVT_BUTTON      (ID_BOOTLOADER_BTN, rbutilFrm::OnBootloaderBtn)
 	EVT_BUTTON      (ID_BOOTLOADERREMOVE_BTN, rbutilFrm::OnBootloaderRemoveBtn)
 
@@ -83,7 +86,7 @@
 	WxBoxSizer2->Add(WxStaticBitmap1,0,wxALIGN_CENTER_HORIZONTAL | wxALL,5);
 
 	wxStaticBox* WxStaticBoxSizer3_StaticBoxObj = new wxStaticBox(WxPanel1,
-        wxID_ANY, _("Please choose an option"));
+        wxID_ANY, wxT("Please choose an option"));
 	wxStaticBoxSizer* WxStaticBoxSizer3 =
         new wxStaticBoxSizer(WxStaticBoxSizer3_StaticBoxObj,wxHORIZONTAL);
 	WxBoxSizer2->Add(WxStaticBoxSizer3,1,wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
@@ -95,13 +98,13 @@
     WxBitmapButton4 = new wxBitmapButton(WxPanel1, ID_BOOTLOADER_BTN,
         BootloaderInstallButton, wxPoint(0,0), wxSize(64,54),
         wxRAISED_BORDER | wxBU_AUTODRAW);
-    WxBitmapButton4->SetToolTip(_("Instructions for installing the "
+    WxBitmapButton4->SetToolTip(wxT("Instructions for installing the "
         "Rockbox bootloader on your audio device"));
     WxFlexGridSizer1->Add(WxBitmapButton4, 0,
         wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
     wxStaticText* WxStaticText5 =  new wxStaticText(WxPanel1, wxID_ANY,
-        _("Bootloader installation instructions\n\n"
+        wxT("Bootloader installation instructions\n\n"
         "Before Rockbox can be installed on your audio player, you "
         "may have to\ninstall a bootloader.  This can not currently "
         "be done automatically, but is\nonly necessary the first time "
@@ -114,12 +117,12 @@
         WxBitmapButton1_BITMAP, wxPoint(0,0), wxSize(64,54),
         wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator,
         wxT("WxBitmapButton1"));
-	WxBitmapButton1->SetToolTip(_("Install Rockbox"));
+	WxBitmapButton1->SetToolTip(wxT("Install Rockbox"));
 	WxFlexGridSizer1->Add(WxBitmapButton1,0,
         wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
 	WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2,
-        _("Install Rockbox on your audio player"));
+        wxT("Install Rockbox on your audio player"));
 	WxFlexGridSizer1->Add(WxStaticText2,0,
         wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
@@ -127,13 +130,13 @@
     WxBitmapButton3 = new wxBitmapButton(WxPanel1, ID_FONT_BTN,
         FontInstallButton, wxPoint(0,0), wxSize(64,54),
         wxRAISED_BORDER | wxBU_AUTODRAW);
-    WxBitmapButton3->SetToolTip(_("Download the most up to date "
+    WxBitmapButton3->SetToolTip(wxT("Download the most up to date "
         "Rockbox fonts."));
     WxFlexGridSizer1->Add(WxBitmapButton3, 0,
         wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
     wxStaticText* WxStaticText4 =  new wxStaticText(WxPanel1, wxID_ANY,
-        _("Install the Rockbox fonts package\n\n"
+        wxT("Install the Rockbox fonts package\n\n"
         "This step is only needed if you have installed "
         "a daily build and want\nthe full set of Rockbox fonts.  You "
         "will not need to download these\nagain unless you uninstall "
@@ -141,48 +144,62 @@
 	WxFlexGridSizer1->Add(WxStaticText4, 0,
         wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
+
+    wxBitmap ThemesInstallButton (themes_3d_xpm);
+    WxBitmapButton5 = new wxBitmapButton(WxPanel1, ID_THEMES_BTN,
+        ThemesInstallButton, wxPoint(0,0), wxSize(64,54),
+        wxRAISED_BORDER | wxBU_AUTODRAW);
+    WxBitmapButton5->SetToolTip(wxT("Download other Themes for Rockbox."));
+    WxFlexGridSizer1->Add(WxBitmapButton5, 0,
+        wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
+
+    wxStaticText* WxStaticText6 =  new wxStaticText(WxPanel1, wxID_ANY,
+        wxT("Install more Themes for Rockbox.\n\n"));
+	WxFlexGridSizer1->Add(WxStaticText6, 0,
+        wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
+
 	wxBitmap WxBitmapButton2_BITMAP (uninstall_3d_xpm);
 	WxBitmapButton2 = new wxBitmapButton(WxPanel1, ID_REMOVE_BTN,
         WxBitmapButton2_BITMAP, wxPoint(0,0), wxSize(64,54),
         wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator,
         wxT("WxBitmapButton2"));
-	WxBitmapButton2->SetToolTip(_("Uninstall Rockbox"));
+	WxBitmapButton2->SetToolTip(wxT("Uninstall Rockbox"));
 	WxFlexGridSizer1->Add(WxBitmapButton2,0,
         wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
 	WxStaticText3 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT3,
-        _("Remove Rockbox from your audio player"));
+        wxT("Remove Rockbox from your audio player"));
 	WxFlexGridSizer1->Add(WxStaticText3,0,
         wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
-    wxBitmap WxBitmapButton4_BITMAP (uninstall_3d_xpm);
+    wxBitmap WxBitmapButton4_BITMAP (untools2_3d_xpm);
 	WxBitmapButton4 = new wxBitmapButton(WxPanel1, ID_BOOTLOADERREMOVE_BTN,
         WxBitmapButton4_BITMAP, wxPoint(0,0), wxSize(64,54),
         wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator,
         wxT("WxBitmapButton4"));
-	WxBitmapButton4->SetToolTip(_("Uninstall Bootloader"));
+	WxBitmapButton4->SetToolTip(wxT("Uninstall Bootloader"));
 	WxFlexGridSizer1->Add(WxBitmapButton4,0,
         wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
 	WxStaticText4 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT4,
-        _("Remove Rockbox Bootloader from your audio player"));
+        wxT("Remove Rockbox Bootloader from your audio player"));
 	WxFlexGridSizer1->Add(WxStaticText4,0,
         wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
 
 	WxMenuBar1 =  new wxMenuBar();
 	wxMenu *ID_FILE_MENU_Mnu_Obj = new wxMenu(0);
-	WxMenuBar1->Append(ID_FILE_MENU_Mnu_Obj, _("&File"));
+	WxMenuBar1->Append(ID_FILE_MENU_Mnu_Obj, wxT("&File"));
 
     ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_WIPECACHE,
-        _("&Empty local download cache"), wxT(""), wxITEM_NORMAL);
+        wxT("&Empty local download cache"), wxT(""), wxITEM_NORMAL);
     if (! gv->portable )
     {
         ID_FILE_MENU_Mnu_Obj->Append(ID_PORTABLE_INSTALL,
-            _("&Install Rockbox Utility on device"), wxT(""), wxITEM_NORMAL);
+            wxT("&Install Rockbox Utility on device"), wxT(""), wxITEM_NORMAL);
     }
-    ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_ABOUT, _("&About"), wxT(""),
+    ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_ABOUT, wxT("&About"), wxT(""),
         wxITEM_NORMAL);
-    ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_EXIT, _("E&xit\tCtrl+X"), wxT(""),
+    ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_EXIT, wxT("E&xit\tCtrl+X"), wxT(""),
         wxITEM_NORMAL);
 
 	this->SetMenuBar(WxMenuBar1);
@@ -191,24 +208,24 @@
 	GetSizer()->SetSizeHints(this);
 	if (gv->portable)
 	{
-	    this->SetTitle(_("Rockbox Utility (portable)"));
+	    this->SetTitle(wxT("Rockbox Utility (portable)"));
 	} else
 	{
-        this->SetTitle(_("Rockbox Utility"));
+        this->SetTitle(wxT("Rockbox Utility"));
 	}
 	this->Center();
 	wxIcon rbutilFrm_ICON (rbutilFrm_XPM);
 	this->SetIcon(rbutilFrm_XPM);
 	this->SetToolTip(wxT("Install Rockbox"));
 
-    wxLogVerbose("=== end rbutilFrm::CreateGUIControls");
+    wxLogVerbose(wxT("=== end rbutilFrm::CreateGUIControls"));
 }
 
 void rbutilFrm::rbutilFrmClose(wxCloseEvent& event)
 {
-    wxLogVerbose("=== begin rbutilFrm::rbutilFrmClose(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::rbutilFrmClose(event)"));
     Destroy();
-    wxLogVerbose("=== end rbutilFrm::rbutilFrmClose");
+    wxLogVerbose(wxT("=== end rbutilFrm::rbutilFrmClose"));
 }
 
 
@@ -217,9 +234,9 @@
  */
 void rbutilFrm::OnFileExit(wxCommandEvent& event)
 {
-    wxLogVerbose("=== begin rbutilFrm::OnFileExit(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnFileExit(event)"));
 	Close();
-	wxLogVerbose("=== end rbutilFrm::OnFileExit");
+	wxLogVerbose(wxT("=== end rbutilFrm::OnFileExit"));
 }
 
 // The routines this code uses are in the wxWidgets documentation, but
@@ -230,11 +247,11 @@
 /*
     wxAboutDialogInfo *info = new wxAboutDialogInfo();
 
-    info->SetName(_(RBUTIL_FULLNAME));
-    info->SetVersion(_(RBUTIL_VERSION));
-    info->SetCopyright(_(RBUTIL_COPYRIGHT));
-    info->SetDescription(_(RBUTIL_DESCRIPTION));
-    info->SetWebSite(_(RBUTIL_WEBSITE));
+    info->SetName(wxT(RBUTIL_FULLNAME));
+    info->SetVersion(wxT(RBUTIL_VERSION));
+    info->SetCopyright(wxT(RBUTIL_COPYRIGHT));
+    info->SetDescription(wxT(RBUTIL_DESCRIPTION));
+    info->SetWebSite(wxT(RBUTIL_WEBSITE));
 
     long i = 0;
     while (rbutil_developers[i] != "")
@@ -256,8 +273,8 @@
     datadir = gv->stdpaths->GetUserDataDir();
     if (datadir == "")
     {
-        ERR_DIALOG(_("Can't locate user data directory.  Unable to delete "
-            "cache."), _("Delete download cache.") );
+        ERR_DIALOG(wxT("Can't locate user data directory.  Unable to delete "
+            "cache."), wxT("Delete download cache.") );
         return;
     }
 
@@ -266,13 +283,13 @@
 
     if (! rm_rf(cacheloc) )
     {
-        wxMessageDialog* msg = new wxMessageDialog(this, _("Local download cache has been deleted.")
+        wxMessageDialog* msg = new wxMessageDialog(this, wxT("Local download cache has been deleted.")
                             ,"Cache deletion", wxOK |wxICON_INFORMATION);
         msg->ShowModal();
         delete msg;
     }
     else {
-        MESG_DIALOG(_("Errors occured deleting the local download cache."));
+        MESG_DIALOG(wxT("Errors occured deleting the local download cache."));
     }
 
     wxMkdir(cacheloc, 0777);
@@ -280,10 +297,10 @@
 
 void rbutilFrm::OnBootloaderRemoveBtn(wxCommandEvent& event)
 {
-    wxLogVerbose("=== begin rbutilFrm::OnBootloaderRemoveBtn(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnBootloaderRemoveBtn(event)"));
 
     wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Bootloader Uninstallation Wizard"),
+                    wxT("Rockbox Bootloader Uninstallation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -302,83 +319,83 @@
     if (wizard->RunWizard(page1) )
     {
         // uninstall the bootloader
-        if(gv->curbootloadermethod == "ipodpatcher")
+        if(gv->curbootloadermethod == wxT("ipodpatcher"))
         {
 
             if(ipodpatcher(BOOTLOADER_REM))
             {
-                wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been uninstalled.")
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
                 msg->ShowModal();
                 delete msg;
             }
             else
             {
-                MESG_DIALOG(_("The Uninstallation has failed.") );
+                MESG_DIALOG(wxT("The Uninstallation has failed.") );
             }
         }
-        else if(gv->curbootloadermethod == "gigabeatf")
+        else if(gv->curbootloadermethod == wxT("gigabeatf"))
         {
 
             if(gigabeatf(BOOTLOADER_REM))
             {
-                wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been uninstalled.")
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
                 msg->ShowModal();
                 delete msg;
             }
             else
-                MESG_DIALOG(_("The Uninstallation has failed.") );
+                MESG_DIALOG(wxT("The Uninstallation has failed.") );
         }
-        else if(gv->curbootloadermethod == "h10")
+        else if(gv->curbootloadermethod == wxT("h10"))
         {
             if(h10(BOOTLOADER_REM))
             {
-                wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been uninstalled.")
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
                 msg->ShowModal();
                 delete msg;
             }
             else
-               MESG_DIALOG(_("The Uninstallation has failed.") );
+               MESG_DIALOG(wxT("The Uninstallation has failed.") );
 
         }
-        else if(gv->curbootloadermethod == "iaudio" )
+        else if(gv->curbootloadermethod == wxT("iaudio") )
         {
-           wxMessageDialog* msg = new wxMessageDialog(this, _("To uninstall the Bootloader on this Device,\n"
+           wxMessageDialog* msg = new wxMessageDialog(this, wxT("To uninstall the Bootloader on this Device,\n"
                     "you need to download and install an Original Firmware from the Manufacturer.")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
            msg->ShowModal();
            delete msg;
         }
-        else if(gv->curbootloadermethod == "fwpatcher" )
+        else if(gv->curbootloadermethod == wxT("fwpatcher") )
         {
-           wxMessageDialog* msg = new wxMessageDialog(this, _("To uninstall the Bootloader on this Device,\n"
+           wxMessageDialog* msg = new wxMessageDialog(this, wxT("To uninstall the Bootloader on this Device,\n"
                          "you need to download and install an original Firmware from the Manufacturer.\n"
                          "To do this, you need to boot into the original Firmware.")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
            msg->ShowModal();
            delete msg;
         }
         else
         {
-           MESG_DIALOG(_("Unsupported Bootloader Method") );
+           MESG_DIALOG(wxT("Unsupported Bootloader Method") );
         }
     }
     else
     {
-        MESG_DIALOG(_("The bootloader Uninstallation wizard was cancelled") );
+        MESG_DIALOG(wxT("The bootloader Uninstallation wizard was cancelled") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnBootloaderRemoveBtn");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnBootloaderRemoveBtn"));
 }
 
 void rbutilFrm::OnBootloaderBtn(wxCommandEvent& event)
 {
-    wxLogVerbose("=== begin rbutilFrm::OnBootloaderBtn(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnBootloaderBtn(event)"));
 
     wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Installation Wizard"),
+                    wxT("Rockbox Installation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -399,84 +416,84 @@
     if (wizard->RunWizard(page1) )
     {
         // start installation depending on player
-        if(gv->curbootloadermethod == "ipodpatcher")
+        if(gv->curbootloadermethod == wxT("ipodpatcher"))
         {
 
             if(ipodpatcher(BOOTLOADER_ADD))
             {
-               wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+               wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been installed on your device.")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
                msg->ShowModal();
                delete msg;
             }
             else
             {
-                MESG_DIALOG(_("The installation has failed.") );
+                MESG_DIALOG(wxT("The installation has failed.") );
             }
         }
-        else if(gv->curbootloadermethod == "gigabeatf")
+        else if(gv->curbootloadermethod == wxT("gigabeatf"))
         {
 
             if(gigabeatf(BOOTLOADER_ADD))
             {
-               wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+               wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been installed on your device.")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
                msg->ShowModal();
                delete msg;
             }
             else
-                MESG_DIALOG(_("The installation has failed.") );
+                MESG_DIALOG(wxT("The installation has failed.") );
         }
-        else if(gv->curbootloadermethod == "iaudio" )
+        else if(gv->curbootloadermethod == wxT("iaudio") )
         {
             if(iaudiox5(BOOTLOADER_ADD))
             {
-               wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.\n"
+               wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been installed on your device.\n"
                              "Now turn OFF your Device, unplug USB,and insert Charger\n"
                              "Your Device will automatically upgrade the flash with the Rockbox bootloader")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
                msg->ShowModal();
                delete msg;
             }
             else
-                MESG_DIALOG(_("The installation has failed.") );
+                MESG_DIALOG(wxT("The installation has failed.") );
         }
-        else if(gv->curbootloadermethod == "fwpatcher")
+        else if(gv->curbootloadermethod == wxT("fwpatcher"))
         {
             if(fwpatcher(BOOTLOADER_ADD))
             {
-               wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been patched and copied on your device.\n"
+               wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been patched and copied on your device.\n"
                              "Now use the Firmware upgrade option of your Device\n")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
                msg->ShowModal();
                delete msg;
             }
             else
-                MESG_DIALOG(_("The installation has failed.") );
+                MESG_DIALOG(wxT("The installation has failed.") );
         }
-        else if(gv->curbootloadermethod == "h10")
+        else if(gv->curbootloadermethod == wxT("h10"))
         {
             if(h10(BOOTLOADER_ADD))
             {
-               wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been patched and copied on your device.\n")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+               wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Bootloader has been patched and copied on your device.\n")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
                msg->ShowModal();
                delete msg;
             }
             else
-              MESG_DIALOG(_("The installation has failed.") );
+              MESG_DIALOG(wxT("The installation has failed.") );
         }
         else
         {
-           MESG_DIALOG(_("Unsupported Bootloader Method") );
+           MESG_DIALOG(wxT("Unsupported Bootloader Method") );
         }
     }
     else
     {
-        MESG_DIALOG(_("The bootloader installation wizard was cancelled") );
+        MESG_DIALOG(wxT("The bootloader installation wizard was cancelled") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnBootloaderBtn");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnBootloaderBtn"));
 
 }
 
@@ -485,13 +502,13 @@
     wxString src, dest, buf;
     wxDateTime date;
     wxTimeSpan day(24);
-    wxLogVerbose("=== begin rbutilFrm::OnInstallBtn(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnInstallBtn(event)"));
     wxFileSystem fs;
     wxFileConfig* buildinfo;
     wxDateSpan oneday;
 
     wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Installation Wizard"),
+                    wxT("Rockbox Installation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -511,20 +528,20 @@
         {
             case BUILD_RELEASE:
                 // This is a URL - don't use PATH_SEP
-                src.Printf("%s%s-%s-%s.zip",
+                src.Printf(wxT("%s%s-%s-%s.zip"),
                     gv->download_url.c_str(), gv->prog_name.c_str(),
                     gv->last_release.c_str(), gv->curplat.c_str());
-                dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip",
+                dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip"),
                     gv->stdpaths->GetUserDataDir().c_str(),
                     gv->prog_name.c_str(), gv->last_release.c_str(),
                     gv->curplat.c_str());
                 break;
             case BUILD_DAILY:
-                dest.Printf("%s" PATH_SEP "download" PATH_SEP "build-info",
+                dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "build-info"),
                     gv->stdpaths->GetUserDataDir().c_str());
                 if (DownloadURL(gv->server_conf_url, dest)) {
-                    WARN_DIALOG(_("Unable to download build status."),
-                    _("Install"));
+                    WARN_DIALOG(wxT("Unable to download build status."),
+                    wxT("Install"));
                     buf = "";
                 } else
                 {
@@ -534,41 +551,41 @@
                     buildinfo->DeleteAll();
 
                     if (buf.Len() != 8) {
-                        dest.Printf(_("Invalid build date: %s"), buf.c_str());
-                        WARN_DIALOG(dest, _("Install"));
-                        buf = "";
+                        dest.Printf(wxT("Invalid build date: %s"), buf.c_str());
+                        WARN_DIALOG(dest, wxT("Install"));
+                        buf = wxT("");
                     }
                 }
 
                 if (buf == "") {
-                    WARN_DIALOG(_("Can't get date of latest build from "
-                        "server.  Using yesterday's date."), _("Install") );
+                    WARN_DIALOG(wxT("Can't get date of latest build from "
+                        "server.  Using yesterday's date."), wxT("Install") );
                     date = wxDateTime::Now();
                     date.Subtract(oneday.Day());
                     buf = date.Format(wxT("%Y%m%d")); // yes, we want UTC
                 }
 
-                src.Printf("%s%s/%s-%s-%s.zip",
+                src.Printf(wxT("%s%s/%s-%s-%s.zip"),
                     gv->daily_url.c_str(), gv->curplat.c_str(),
                     gv->prog_name.c_str(), gv->curplat.c_str(),
                     buf.c_str() );
 
-                dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip",
+                dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip"),
                     gv->stdpaths->GetUserDataDir().c_str(),
                     gv->prog_name.c_str(),
                     gv->curplat.c_str(), buf.c_str() );
                 break;
             case BUILD_BLEEDING:
-                 src.Printf("%s%s/%s.zip",
+                 src.Printf(wxT("%s%s/%s.zip"),
                     gv->bleeding_url.c_str(), gv->curplat.c_str(),
                     gv->prog_name.c_str() );
-                dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s.zip",
+                dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s.zip"),
                     gv->stdpaths->GetUserDataDir().c_str(),
                     gv->prog_name.c_str() );
                 break;
             default:
-                ERR_DIALOG(_("Something seriously odd has happened."),
-                    _("Install"));
+                ERR_DIALOG(wxT("Something seriously odd has happened."),
+                    wxT("Install"));
                 return;
                 break;
         }
@@ -578,30 +595,30 @@
             if ( DownloadURL(src, dest) )
             {
                 wxRemoveFile(dest);
-                buf.Printf(_("Unable to download %s"), src.c_str() );
-                ERR_DIALOG(buf, _("Install"));
+                buf.Printf(wxT("Unable to download %s"), src.c_str() );
+                ERR_DIALOG(buf, wxT("Install"));
                 return;
             }
         }
 
         if ( !UnzipFile(dest, gv->curdestdir, true) )
         {
-            wxMessageDialog* msg = new wxMessageDialog(this, _("Rockbox has been installed on your device.")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+            wxMessageDialog* msg = new wxMessageDialog(this, wxT("Rockbox has been installed on your device.")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
             msg->ShowModal();
             delete msg;
         } else
         {
             wxRemoveFile(dest);
-            buf.Printf(_("Unable to unzip %s"), dest.c_str() );
-            ERR_DIALOG(buf, _("Install"));
+            buf.Printf(wxT("Unable to unzip %s"), dest.c_str() );
+            ERR_DIALOG(buf, wxT("Install"));
         }
     } else
     {
-        MESG_DIALOG(_("The installation wizard was cancelled") );
+        MESG_DIALOG(wxT("The installation wizard was cancelled") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnInstallBtn");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnInstallBtn"));
 }
 
 void rbutilFrm::OnFontBtn(wxCommandEvent& event)
@@ -609,13 +626,13 @@
     wxString src, dest, buf;
     wxDateTime date;
     wxTimeSpan day(24);
-    wxLogVerbose("=== begin rbutilFrm::OnFontBtn(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnFontBtn(event)"));
     wxFileSystem fs;
     wxFileConfig* buildinfo;
     wxDateSpan oneday;
 
     wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Font Installation Wizard"),
+                    wxT("Rockbox Font Installation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -628,9 +645,9 @@
         buf.Printf(wxT("%s" PATH_SEP ".rockbox"), gv->curdestdir.c_str()) ;
         if (! wxDirExists(buf) )
         {
-            buf.Printf(_("Rockbox is not yet installed on %s - install "
+            buf.Printf(wxT("Rockbox is not yet installed on %s - install "
                 "Rockbox first."), buf.c_str() );
-            WARN_DIALOG(buf, _("Can't install fonts") );
+            WARN_DIALOG(buf, wxT("Can't install fonts") );
             return;
         }
 
@@ -638,8 +655,8 @@
         gv->stdpaths->GetUserDataDir().c_str());
         if (DownloadURL(gv->server_conf_url, dest))
         {
-            WARN_DIALOG(_("Unable to download build status."),
-                _("Font Install"));
+            WARN_DIALOG(wxT("Unable to download build status."),
+                wxT("Font Install"));
                 buf = "";
         } else
         {
@@ -649,25 +666,25 @@
                 buildinfo->DeleteAll();
 
             if (buf.Len() != 8) {
-                dest.Printf(_("Invalid build date: %s"), buf.c_str());
-                WARN_DIALOG(dest, _("Font Install"));
+                dest.Printf(wxT("Invalid build date: %s"), buf.c_str());
+                WARN_DIALOG(dest, wxT("Font Install"));
                 buf = "";
             }
         }
 
         if (buf == "") {
-            WARN_DIALOG(_("Can't get date of latest build from "
+            WARN_DIALOG(wxT("Can't get date of latest build from "
                 "server.  Using yesterday's date."),
-                _("Font Install") );
+                wxT("Font Install") );
             date = wxDateTime::Now();
             date.Subtract(oneday.Day());
              buf = date.Format(wxT("%Y%m%d")); // yes, we want UTC
         }
 
-        src.Printf("%s%s.zip", gv->font_url.c_str(), buf.c_str() );
+        src.Printf(wxT("%s%s.zip"), gv->font_url.c_str(), buf.c_str() );
 
-        dest.Printf("%s" PATH_SEP "download" PATH_SEP
-            "rockbox-fonts-%s.zip", gv->stdpaths->GetUserDataDir().c_str(),
+        dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP
+            "rockbox-fonts-%s.zip"), gv->stdpaths->GetUserDataDir().c_str(),
             buf.c_str() );
 
         if ( ! wxFileExists(dest)  )
@@ -675,38 +692,88 @@
             if ( DownloadURL(src, dest) )
             {
                 wxRemoveFile(dest);
-                buf.Printf(_("Unable to download %s"), src.c_str() );
-                ERR_DIALOG(buf, _("Font Install"));
+                buf.Printf(wxT("Unable to download %s"), src.c_str() );
+                ERR_DIALOG(buf, wxT("Font Install"));
                 return;
             }
         }
 
         if ( !UnzipFile(dest, gv->curdestdir, true) )
         {
-            wxMessageDialog* msg = new wxMessageDialog(this, _("The Rockbox fonts have been installed on your device.")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+            wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Rockbox fonts have been installed on your device.")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
             msg->ShowModal();
             delete msg;
         } else
         {
             wxRemoveFile(dest);
-            buf.Printf(_("Unable to unzip %s"), dest.c_str() );
-            ERR_DIALOG(buf, _("Font Install"));
+            buf.Printf(wxT("Unable to unzip %s"), dest.c_str() );
+            ERR_DIALOG(buf, wxT("Font Install"));
         }
     } else
     {
-        MESG_DIALOG(_("The font installation wizard was cancelled") );
+        MESG_DIALOG(wxT("The font installation wizard was cancelled") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnFontBtn");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnFontBtn"));
 }
 
+
+void rbutilFrm::OnThemesBtn(wxCommandEvent& event)
+{
+    wxString src, dest, buf;
+    wxTimeSpan day(24);
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnThemesBtn(event)"));
+
+    wxWizard *wizard = new wxWizard(this, wxID_ANY,
+                    wxT("Rockbox Themes Installation Wizard"),
+                    wxBitmap(wizard_xpm),
+                    wxDefaultPosition,
+                    wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
+    wxPlatformPage* page1 = new wxPlatformPage(wizard);
+    wxLocationPage* page2 = new wxLocationPage(wizard);
+    wxThemesPage* page3 = new wxThemesPage(wizard);
+    page1->SetNext(page2);
+    page2->SetPrev(page1);
+    page2->SetNext(page3);
+    page3->SetPrev(page2);
+
+    wizard->GetPageAreaSizer()->Add(page1);
+
+    if (wizard->RunWizard(page1) )
+    {
+        bool success=true;
+        for(int i=0 ;i < gv->themesToInstall.GetCount();i++)
+        {
+            if(!InstallTheme(gv->themesToInstall[i]))
+            {
+                MESG_DIALOG(wxT("The Themes installation has failed") );
+                success=false;
+                break;
+            }
+        }
+        if(success)
+        {
+            MESG_DIALOG(wxT("The Theme installation completed successfully.") );
+        }
+
+
+    }
+    else
+    {
+        MESG_DIALOG(wxT("The Themes installation wizard was cancelled") );
+    }
+
+     wxLogVerbose(wxT("=== end rbutilFrm::OnThemesBtn(event)"));
+}
+
+
 void rbutilFrm::OnRemoveBtn(wxCommandEvent& event)
 {
-     wxLogVerbose("=== begin rbutilFrm::OnRemoveBtn(event)");
+   wxLogVerbose(wxT("=== begin rbutilFrm::OnRemoveBtn(event)"));
 
    wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Uninstallation Wizard"),
+                    wxT("Rockbox Uninstallation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -722,33 +789,33 @@
         if (Uninstall(gv->curdestdir, gv->curisfull) )
         {
            MESG_DIALOG(
-           _("The uninstallation wizard was cancelled or completed with "
+           wxT("The uninstallation wizard was cancelled or completed with "
              "some errors.") );
         } else {
-            wxMessageDialog* msg = new wxMessageDialog(this, _("The uninstall wizard completed successfully\n"
+            wxMessageDialog* msg = new wxMessageDialog(this, wxT("The uninstall wizard completed successfully\n"
                           "Depending on which Device you own, you also have to uninstall the Bootloader")
-                            ,"Uninstallation", wxOK |wxICON_INFORMATION);
+                            ,wxT("Uninstallation"), wxOK |wxICON_INFORMATION);
             msg->ShowModal();
             delete msg;
         }
     } else
     {
-        MESG_DIALOG(_("The uninstallation wizard was cancelled.") );
+        MESG_DIALOG(wxT("The uninstallation wizard was cancelled.") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnRemoveBtn");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnRemoveBtn"));
 }
 
 void rbutilFrm::OnPortableInstall(wxCommandEvent& event)
 {
     wxString src, dest, buf;
-    wxLogVerbose("=== begin rbutilFrm::OnPortableInstall(event)");
+    wxLogVerbose(wxT("=== begin rbutilFrm::OnPortableInstall(event)"));
     wxFileSystem fs;
     wxFileConfig* buildinfo;
     wxDateSpan oneday;
 
     wxWizard *wizard = new wxWizard(this, wxID_ANY,
-                    _("Rockbox Utility Portable Installation Wizard"),
+                    wxT("Rockbox Utility Portable Installation Wizard"),
                     wxBitmap(wizard_xpm),
                     wxDefaultPosition,
                     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
@@ -760,24 +827,24 @@
     {
         if ( InstallRbutil(gv->curdestdir) )
         {
-            wxMessageDialog* msg = new wxMessageDialog(this, _("The Rockbox Utility has been installed on your device.")
-                            ,"Installation", wxOK |wxICON_INFORMATION);
+            wxMessageDialog* msg = new wxMessageDialog(this, wxT("The Rockbox Utility has been installed on your device.")
+                            ,wxT("Installation"), wxOK |wxICON_INFORMATION);
             msg->ShowModal();
             delete msg;
         } else
         {
-            ERR_DIALOG(_("Installation failed"), _("Portable Install"));
+            ERR_DIALOG(wxT("Installation failed"), wxT("Portable Install"));
         }
     } else
     {
-        MESG_DIALOG(_("The portable installation wizard was cancelled") );
+        MESG_DIALOG(wxT("The portable installation wizard was cancelled") );
     }
 
-    wxLogVerbose("=== end rbutilFrm::OnUnstallPortable");
+    wxLogVerbose(wxT("=== end rbutilFrm::OnUnstallPortable"));
 }
 
 AboutDlg::AboutDlg(rbutilFrm* parent)
-    : wxDialog(parent, -1, _("About"), wxDefaultPosition, wxDefaultSize,
+    : wxDialog(parent, -1, wxT("About"), wxDefaultPosition, wxDefaultSize,
     wxDEFAULT_DIALOG_STYLE)
 {
     wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
@@ -792,13 +859,13 @@
     WxBoxSizer2->Add(WxStaticBitmap1, 0, wxALL | wxCENTER, 5);
 
     wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
-        _(RBUTIL_FULLNAME), wxDefaultPosition, wxDefaultSize,
+        wxT(RBUTIL_FULLNAME), wxDefaultPosition, wxDefaultSize,
         wxALIGN_CENTER | wxST_NO_AUTORESIZE );
     WxBoxSizer2->Add(WxStaticText1, 0, wxALL | wxCENTER, 5);
     WxBoxSizer1->Add(WxBoxSizer2, 0, wxALL, 5);
 
     wxStaticText* WxStaticText2 = new wxStaticText(this, wxID_ANY,
-        _(RBUTIL_VERSION "\n" RBUTIL_DESCRIPTION "\n\n" RBUTIL_COPYRIGHT));
+        wxT(RBUTIL_VERSION "\n" RBUTIL_DESCRIPTION "\n\n" RBUTIL_COPYRIGHT));
     WxStaticText2->Wrap(400);
     WxBoxSizer1->Add(WxStaticText2, 0, wxALL, 5);
 
@@ -806,7 +873,7 @@
         wxT(RBUTIL_WEBSITE), wxT(RBUTIL_WEBSITE) );
     WxBoxSizer1->Add(WxHyperlink1, 0, wxALL, 5);
 
-    wxStaticBox* WxStaticBox1 = new wxStaticBox(this, wxID_ANY, _("Contributors:"));
+    wxStaticBox* WxStaticBox1 = new wxStaticBox(this, wxID_ANY, wxT("Contributors:"));
     wxStaticBoxSizer* WxStaticBoxSizer2 = new wxStaticBoxSizer(WxStaticBox1,
         wxVERTICAL);
     wxTextCtrl* WxTextCtrl1 = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
@@ -816,7 +883,7 @@
     while ( rbutil_developers[i] != "")
     {
         WxTextCtrl1->AppendText(rbutil_developers[i++]);
-        WxTextCtrl1->AppendText("\n");
+        WxTextCtrl1->AppendText(wxT("\n"));
     }
 
     WxBoxSizer1->Add(WxStaticBoxSizer2, 1, wxGROW | wxALL, 5);
Index: rbutil/wizard_pages.cpp
===================================================================
--- rbutil/wizard_pages.cpp	(Revision 12646)
+++ rbutil/wizard_pages.cpp	(Arbeitskopie)
@@ -21,12 +21,17 @@
 #include "wizard_pages.h"
 #include "bootloaders.h"
 
+
+#include <wx/regex.h>
+#include <wx/tokenzr.h>
+
+/////// Bootplatform page ///////////////////////////////////77
 wxBootPlatformPage::wxBootPlatformPage(wxWizard *parent) : wxWizardPageSimple(parent)
 {
     wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
 
     wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
-        _("Please select the model of audio device that you would like to"
+        wxT("Please select the model of audio device that you would like to"
         "\ninstall the Rockbox Bootloader on from the list below:"));
     WxBoxSizer1->Add(WxStaticText1,0,wxGROW | wxALL,5);
 
@@ -61,12 +66,12 @@
 
 wxWizardPage * wxBootPlatformPage::GetNext() const
 {
-   if(gv->curbootloadermethod != "fwpatcher"&& gv->curbootloadermethod != "ipodpatcher")
+   if(gv->curbootloadermethod != wxT("fwpatcher")&& gv->curbootloadermethod != wxT("ipodpatcher"))
    {
        if(wxWizardPageSimple::GetNext()->GetNext() != NULL)  // not iriver hx0 and ipod, skip one page
            return wxWizardPageSimple::GetNext()->GetNext();
    }
-   else if(gv->curbootloadermethod == "ipodpatcher")
+   else if(gv->curbootloadermethod == wxT("ipodpatcher"))
    {
         if(wxWizardPageSimple::GetNext()->GetNext() != NULL)
             if(wxWizardPageSimple::GetNext()->GetNext()->GetNext() != NULL)
@@ -83,8 +88,8 @@
 {
     if (BootPlatformListBox->GetSelection() == wxNOT_FOUND )
     {
-        WARN_DIALOG(_("You must select an audio device type before proceeding"),
-            _("Select Platform"));
+        WARN_DIALOG(wxT("You must select an audio device type before proceeding"),
+            wxT("Select Platform"));
         return false;
     } else
     {
@@ -98,13 +103,13 @@
         return true;
     }
 }
-
+//// Plattfor Page //////////////////////////
 wxPlatformPage::wxPlatformPage(wxWizard *parent) : wxWizardPageSimple(parent)
 {
     wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
 
     wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
-        _("Please select the model of audio device that you would like to"
+        wxT("Please select the model of audio device that you would like to"
         "\ninstall Rockbox on from the list below:"));
     WxBoxSizer1->Add(WxStaticText1,0,wxGROW | wxALL,5);
 
@@ -124,17 +129,274 @@
 {
     if (PlatformListBox->GetSelection() == wxNOT_FOUND )
     {
-        WARN_DIALOG(_("You must select an audio device type before proceeding"),
-            _("Select Platform"));
+        WARN_DIALOG(wxT("You must select an audio device type before proceeding"),
+            wxT("Select Platform"));
         return false;
     } else
     {
         gv->curplatnum = PlatformListBox->GetSelection();
         gv->curplat = gv->plat_id[gv->curplatnum];
+        gv->curresolution = gv->plat_resolution[gv->curplatnum];
         return true;
     }
 }
 
+
+//////////////// ThemeImage Dialog /////////////////
+BEGIN_EVENT_TABLE(wxThemeImageDialog,wxDialog)
+   EVT_PAINT(wxThemeImageDialog::OnPaint)
+END_EVENT_TABLE();
+wxThemeImageDialog::wxThemeImageDialog(wxWindow* parent,wxWindowID id,wxString title,wxBitmap bmp)  :
+   wxDialog(parent, id, title)
+{
+    wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
+    m_bitmap = bmp;
+
+    sizerTop->SetMinSize(m_bitmap.GetWidth(),m_bitmap.GetHeight());
+
+    SetSizer(sizerTop);
+
+    sizerTop->SetSizeHints(this);
+    sizerTop->Fit(this);
+
+}
+
+void wxThemeImageDialog::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+    wxPaintDC dc( this );
+    dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
+}
+
+////////////////// Themes page ////////////////////////
+BEGIN_EVENT_TABLE(wxThemesPage,wxWizardPageSimple)
+	EVT_WIZARD_PAGE_CHANGED          (wxID_ANY, wxThemesPage::OnPageShown)
+	EVT_WIZARD_PAGE_CHANGING         (wxID_ANY, wxThemesPage::OnWizardPageChanging)
+	EVT_LISTBOX                      (ID_LISTBOX,wxThemesPage::OnListBox)
+	EVT_BUTTON                       (ID_PREVIEW_BTN, wxThemesPage::OnPreviewBtn)
+	EVT_CHECKBOX                     (ID_INSTALLCHECKBOX, wxThemesPage::OnCheckBox)
+END_EVENT_TABLE();
+
+wxThemesPage::wxThemesPage(wxWizard *parent) : wxWizardPageSimple(parent)
+{
+    m_parent = parent;
+    wxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
+
+    wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
+        wxT("Please select the Theme you would like to"
+        "\ninstall on your Device from the list below:"));
+    mainSizer->Add(WxStaticText1,0,wxGROW | wxALL,5);
+
+    // create theme listbox
+    wxArrayString list;
+    for(int i = 0; i< 35;i++)
+        list.Add("");
+    ThemesListBox= new wxListBox(this, ID_LISTBOX, wxDefaultPosition,
+        wxDefaultSize,list, wxLB_SINGLE);
+    mainSizer->Add(ThemesListBox,10,wxGROW | wxALL,5);
+
+    // create groupbox
+    wxStaticBox* groupbox= new wxStaticBox(this,wxID_ANY,wxT("Selected Theme:"));
+    wxBoxSizer* styleSizer = new wxStaticBoxSizer( groupbox, wxVERTICAL );
+    mainSizer->Add(styleSizer,11,wxGROW | wxALL,5);
+
+    // horizontal sizer
+    wxBoxSizer* wxBoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
+    styleSizer->Add(wxBoxSizer2,0,wxGROW | wxALL,0);
+
+    // preview button
+    m_previewBtn = new wxButton(this, ID_PREVIEW_BTN, wxT("Preview"),
+         wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator,
+        wxT("PreviewBtn"));
+    wxBoxSizer2->Add(m_previewBtn,0,wxGROW | wxALL,5);
+
+    // checkbox for Install
+    m_InstallCheckBox= new wxCheckBox(this,ID_INSTALLCHECKBOX,wxT("Install")
+        ,wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator,
+        wxT("InstallCheckbox"));
+    wxBoxSizer2->Add(m_InstallCheckBox,0,wxGROW | wxALL,5);
+
+    // horizontal sizer
+    wxBoxSizer* wxBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
+    styleSizer->Add(wxBoxSizer3,0,wxGROW | wxALL,0);
+
+    // File size
+    wxStaticText* size= new wxStaticText(this,wxID_ANY,wxT("Filesize:"));
+    wxBoxSizer3->Add(size,0,wxGROW | wxALL,5);
+
+    m_size= new wxStaticText(this,wxID_ANY,wxT(""));
+    wxBoxSizer3->Add(m_size,0,wxGROW | wxALL,5);
+
+    // Description
+    wxStaticText* desc= new wxStaticText(this,wxID_ANY,wxT("Description:"));
+    styleSizer->Add(desc,0,wxGROW | wxALL,5);
+
+    m_desc= new wxStaticText(this,wxID_ANY,wxT(""));
+    styleSizer->Add(m_desc,0,wxGROW | wxALL,5);
+
+    SetSizer(mainSizer);
+    mainSizer->Fit(this);
+
+}
+
+bool wxThemesPage::TransferDataFromWindow()
+{
+    gv->themesToInstall.Clear();
+
+    for(int i=0; i < m_installTheme.GetCount(); i++)
+    {
+        if(m_installTheme[i])
+        {
+            gv->themesToInstall.Add(m_Themes_path[i]);
+        }
+    }
+
+    return true;
+
+}
+
+void wxThemesPage::OnWizardPageChanging(wxWizardEvent& event)
+{
+   if(event.GetDirection())  // going forwards in the Wizard
+   {
+        if(gv->themesToInstall.GetCount() == 0)
+        {
+            WARN_DIALOG(wxT("You have not selected a Theme to Install"), wxT("Select a Theme"));
+            event.Veto();
+        }
+   }
+}
+
+void wxThemesPage::OnCheckBox(wxCommandEvent& event)
+{
+    int index = ThemesListBox->GetSelection();         //get Index
+    if(index == wxNOT_FOUND)
+        return;
+
+    m_installTheme[index]= ! m_installTheme[index];    // Toggle install
+
+}
+
+void wxThemesPage::OnListBox(wxCommandEvent& event)
+{
+    int index = ThemesListBox->GetSelection();  //get Index
+    if(index == wxNOT_FOUND)
+        return;
+
+    m_desc->SetLabel(m_Themes_desc[index]);     //set Desc
+    m_desc->Wrap(270);                       // wrap desc
+    m_size->SetLabel(m_Themes_size[index]+wxT(" kb"));  //set file size
+    m_InstallCheckBox->SetValue(m_installTheme[index]);  // set the install checkbox
+
+    this->GetSizer()->Layout();
+
+}
+
+void wxThemesPage::OnPreviewBtn(wxCommandEvent& event)
+{
+
+    int index = ThemesListBox->GetSelection();
+    if(index == wxNOT_FOUND)
+        return;
+
+    wxString src,dest;
+
+    int pos = m_Themes_image[index].Find('/',true);
+    wxString filename = m_Themes_image[index](pos+1,m_Themes_image[index].Length());
+
+    dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s"),
+            gv->stdpaths->GetUserDataDir().c_str(),gv->curresolution.c_str());
+
+    if(!wxDirExists(dest))
+        wxMkdir(dest);
+
+    //this is a URL no PATH_SEP
+    src.Printf("%s/data/%s/%s",gv->themes_url.c_str(),gv->curresolution.c_str(),filename.c_str());
+    dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s" PATH_SEP "%s"),
+        gv->stdpaths->GetUserDataDir().c_str(),gv->curresolution.c_str(),filename.c_str());
+
+    if(DownloadURL(src, dest))
+    {
+        MESG_DIALOG(wxT("Unable to download image."));
+        return;
+    }
+
+    wxBitmap bmp;
+    bmp.LoadFile(dest,wxBITMAP_TYPE_PNG);
+
+    wxThemeImageDialog dlg(this,wxID_ANY,wxT("Preview"),bmp);
+    dlg.ShowModal();
+
+}
+
+void wxThemesPage::OnPageShown(wxWizardEvent& event)
+{
+    // clear Theme info
+    m_Themes.Clear();
+    m_Themes_image.Clear();
+    m_Themes_path.Clear();
+    m_Themes_desc.Clear();
+    m_Themes_size.Clear();
+    m_installTheme.Clear();
+    m_desc->SetLabel(wxT(""));
+    m_size->SetLabel(wxT(""));
+    m_InstallCheckBox->SetValue(false);
+
+    //get correct Themes list
+    wxString src,dest,err;
+
+    src.Printf("%srbutil.php?res=%s",gv->themes_url.c_str(),gv->curresolution.c_str());
+    dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "%s.list"),
+        gv->stdpaths->GetUserDataDir().c_str(),gv->curresolution.c_str());
+
+    if(DownloadURL(src, dest))
+    {
+        MESG_DIALOG(wxT("Unable to download themes list."));
+        return;
+    }
+
+    //read and parse Themes list
+    wxString themelistraw;
+    wxFFile themefile;
+    if(!themefile.Open(dest))       //open file
+    {
+        MESG_DIALOG(wxT("Unable to open themes list."));
+        return;
+    }
+    if(!themefile.ReadAll(&themelistraw))  //read complete file
+    {
+        MESG_DIALOG(wxT("Unable to read themes list."));
+        return;
+    }
+    wxRegEx reAll(wxT("<body >(.+)</body>"));  //extract body part
+    if(! reAll.Matches(themelistraw))
+    {
+        MESG_DIALOG(wxT("Themes list is in wrong Format."));
+        return;
+    }
+    wxString lines = reAll.GetMatch(themelistraw,1);
+
+    // prepare text
+    lines.Replace(wxT("<br />"),wxT(""),true);   //replace <br /> with nothing
+    lines.Replace(wxT("\n"),wxT(""),true);   //replace \n with nothing
+    lines.Trim(true);                         //strip WS at end
+    lines.Trim(false);                         //strip WS at beginning
+    wxStringTokenizer tkz(lines,wxT("|"));   //tokenize it
+
+    while ( tkz.HasMoreTokens() )           // read all entrys
+    {
+        m_Themes.Add(tkz.GetNextToken());         //Theme name
+        m_Themes_path.Add(tkz.GetNextToken());    //Theme path
+        m_Themes_size.Add(tkz.GetNextToken());    //File size
+        m_Themes_image.Add(tkz.GetNextToken());   //Screenshot
+        m_Themes_desc.Add(tkz.GetNextToken());    //Description
+        m_installTheme.Add(false);                //Theme should be installed ?
+    }
+
+    // set ThemeList
+    ThemesListBox->Set(m_Themes);
+}
+
+ //////////////////// Ipod Locaction Page /////////////////////////////
 BEGIN_EVENT_TABLE(wxIpodLocationPage,wxWizardPageSimple)
 	EVT_BUTTON   (ID_IPODLOCATION_BTN, wxIpodLocationPage::OnIpodLocationBtn)
 	EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxIpodLocationPage::OnWizardPageChanging)
@@ -178,7 +440,7 @@
 
 wxWizardPage* wxIpodLocationPage::GetPrev() const
 {
-    if(gv->curbootloadermethod == "ipodpatcher")   //if ipod, skip previous
+    if(gv->curbootloadermethod == wxT("ipodpatcher"))   //if ipod, skip previous
     {
         if(wxWizardPageSimple::GetPrev()->GetPrev() != NULL)
             return wxWizardPageSimple::GetPrev()->GetPrev();
@@ -190,13 +452,13 @@
 {
    if(event.GetDirection())  // going forwards in the Wizard
    {
-       if(gv->curbootloadermethod=="ipodpatcher")
+       if(gv->curbootloadermethod==wxT("ipodpatcher"))
        {
-            if(IpodLocationText->GetLabel() == "no Ipod found" ||
-                    IpodLocationText->GetLabel() =="More than 1 Ipod found" ||
-                    IpodLocationText->GetLabel() =="")
+            if(IpodLocationText->GetLabel() == wxT("no Ipod found") ||
+                    IpodLocationText->GetLabel() ==wxT("More than 1 Ipod found") ||
+                    IpodLocationText->GetLabel() ==wxT(""))
             {
-                WARN_DIALOG(_("No valid ipod found!"), _("Select Location"));
+                WARN_DIALOG(wxT("No valid ipod found!"), wxT("Select Location"));
                 event.Veto();       //stop pagechanging
             }
        }
@@ -205,27 +467,27 @@
 
 void wxIpodLocationPage::OnIpodLocationBtn(wxCommandEvent& event)
 {
-    wxLogVerbose("=== begin wxIpodLocationPage::OnIpodLocationBtn");
+    wxLogVerbose(wxT("=== begin wxIpodLocationPage::OnIpodLocationBtn"));
     struct ipod_t ipod;
     int n = ipod_scan(&ipod);
-    gv->curbootloader="";
+    gv->curbootloader=wxT("");
 
     if(n == 0)
-      IpodLocationText->SetLabel("no Ipod found");
+      IpodLocationText->SetLabel(wxT("no Ipod found"));
     else if( n==1)
     {
-      gv->curbootloader="bootloader-";
+      gv->curbootloader=wxT("bootloader-");
       gv->curbootloader.Append(ipod.targetname);
       IpodLocationText->SetLabel(ipod.modelstr);
     }
     else
-      IpodLocationText->SetLabel("More than 1 Ipod found");
+      IpodLocationText->SetLabel(wxT("More than 1 Ipod found"));
 
     if(ipod.macpod)
-      IpodLocationExtraText->SetLabel("This Ipod is a Mac formated Ipod\n"
+      IpodLocationExtraText->SetLabel(wxT("This Ipod is a Mac formated Ipod\n"
                                       "Rockbox will not work on this.\n"
-                                      "You have to convert it first to Fat32");
-    wxLogVerbose("=== end wxIpodLocationPage::OnIpodLocationBtn");
+                                      "You have to convert it first to Fat32"));
+    wxLogVerbose(wxT("=== end wxIpodLocationPage::OnIpodLocationBtn"));
 
 }
 
@@ -251,7 +513,7 @@
    	WxBoxSizer1->Add(WxBoxSizer3,0,
         wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
 
-    if (gv->curdestdir == wxT("")) gv->curdestdir = _("<none>");
+    if (gv->curdestdir == wxT("")) gv->curdestdir = wxT("<none>");
   	BootLocationText = new wxStaticText(this, wxID_ANY, gv->curdestdir,
         wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
     WxBoxSizer3->Add(BootLocationText,1,
@@ -269,7 +531,7 @@
 
 wxWizardPage* wxBootLocationPage::GetPrev() const
 {
-    if(gv->curbootloadermethod != "fwpatcher")
+    if(gv->curbootloadermethod != wxT("fwpatcher"))
     {
         if(wxWizardPageSimple::GetPrev()->GetPrev() != NULL)
             return wxWizardPageSimple::GetPrev()->GetPrev();
@@ -281,7 +543,7 @@
 
 wxWizardPage* wxBootLocationPage::GetNext() const
 {
-    if(gv->curbootloadermethod == "ipodpatcher")
+    if(gv->curbootloadermethod == wxT("ipodpatcher"))
     {
         return wxWizardPageSimple::GetNext();  // if ipod then this is not the last page
     }
@@ -294,8 +556,8 @@
    {
       if(!wxDirExists(BootLocationText->GetLabel()))
       {
-          WARN_DIALOG(_("You have not selected a valid location for your audio "
-                    "device"), _("Select Location"));
+          WARN_DIALOG(wxT("You have not selected a valid location for your audio "
+                    "device"), wxT("Select Location"));
            event.Veto();
       }
 
@@ -313,13 +575,13 @@
 void wxBootLocationPage::OnBootLocationBtn(wxCommandEvent& event)
 {
    const wxString& temp = wxDirSelector(
-        _("Please select the location of your audio device"), gv->curdestdir);
-   wxLogVerbose("=== begin wxBootLocationPage::OnBootLocationBtn(event)");
+        wxT("Please select the location of your audio device"), gv->curdestdir);
+   wxLogVerbose(wxT("=== begin wxBootLocationPage::OnBootLocationBtn(event)"));
    if (!temp.empty())
    {
            BootLocationText->SetLabel(temp);
    }
-   wxLogVerbose("=== end wxBootLocationPage::OnBootLocationBtn");
+   wxLogVerbose(wxT("=== end wxBootLocationPage::OnBootLocationBtn"));
 
 }
 
@@ -368,8 +630,8 @@
    {
         if( !wxFileExists(gv->curfirmware))
         {
-            WARN_DIALOG(_("You have not selected a valid location for the firmware "
-                      "file"), _("Select File"));
+            WARN_DIALOG(wxT("You have not selected a valid location for the firmware "
+                      "file"), wxT("Select File"));
             event.Veto();
         }
    }
@@ -379,8 +641,8 @@
 void wxFirmwareLocationPage::OnFirmwareFilenameBtn(wxCommandEvent& event)
 {
      wxString temp = wxFileSelector(
-        _("Please select the location of the original Firmware"), gv->curdestdir,"","","*.hex");
-       wxLogVerbose("=== begin wxFirmwareLocationPage::OnFirmwareFilenameBtn(event)");
+        wxT("Please select the location of the original Firmware"), gv->curdestdir,"","","*.hex");
+       wxLogVerbose(wxT("=== begin wxFirmwareLocationPage::OnFirmwareFilenameBtn(event)"));
        if (!temp.empty())
        {
            gv->curfirmware=temp;
@@ -391,7 +653,7 @@
            }
            FirmwareLocationFilename->SetLabel(temp);
        }
-       wxLogVerbose("=== end wxFirmwareLocationPage::OnFirmwareFilenameBtn");
+       wxLogVerbose(wxT("=== end wxFirmwareLocationPage::OnFirmwareFilenameBtn"));
 }
 
 BEGIN_EVENT_TABLE(wxLocationPage,wxWizardPageSimple)
@@ -413,7 +675,7 @@
    	WxBoxSizer1->Add(WxBoxSizer3,0,
         wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
 
-    if (gv->curdestdir == wxT("")) gv->curdestdir = _("<none>");
+    if (gv->curdestdir == wxT("")) gv->curdestdir = wxT("<none>");
   	LocationText = new wxStaticText(this, wxID_ANY, gv->curdestdir,
         wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
     WxBoxSizer3->Add(LocationText,1,
@@ -436,8 +698,8 @@
    {
         if(!wxDirExists(LocationText->GetLabel()))
         {
-              WARN_DIALOG(_("You have not selected a valid location for your audio "
-            "device"), _("Select Location"));
+              WARN_DIALOG(wxT("You have not selected a valid location for your audio "
+            "device"), wxT("Select Location"));
             event.Veto();
         }
    }
@@ -452,13 +714,13 @@
 void wxLocationPage::OnLocationBtn(wxCommandEvent& event)
 {
     const wxString& temp = wxDirSelector(
-        _("Please select the location of your audio device"), gv->curdestdir);
-    wxLogVerbose("=== begin wxLocationPage::OnLocationBtn(event)");
+        wxT("Please select the location of your audio device"), gv->curdestdir);
+    wxLogVerbose(wxT("=== begin wxLocationPage::OnLocationBtn(event)"));
     if (!temp.empty())
     {
         LocationText->SetLabel(temp);
     }
-    wxLogVerbose("=== end wxLocationPage::OnLocationBtn");
+    wxLogVerbose(wxT("=== end wxLocationPage::OnLocationBtn"));
 }
 
 BEGIN_EVENT_TABLE(wxBuildPage,wxWizardPageSimple)
@@ -479,17 +741,17 @@
     WxBoxSizer1->Add(WxStaticText1,0,wxGROW | wxALL,5);
 
     wxArrayString* array = new wxArrayString();
-    buf.Printf(_("Rockbox stable version (%s)") , gv->last_release.c_str());
+    buf.Printf(wxT("Rockbox stable version (%s)") , gv->last_release.c_str());
     array->Add(buf);
-    array->Add(_("Archived Build"));
-    array->Add(_("Current Build "));
+    array->Add(wxT("Archived Build"));
+    array->Add(wxT("Current Build "));
 
-    BuildRadioBox = new wxRadioBox(this, ID_BUILD_BOX, _("Version"),
+    BuildRadioBox = new wxRadioBox(this, ID_BUILD_BOX, wxT("Version"),
         wxDefaultPosition, wxDefaultSize, *array, 0, wxRA_SPECIFY_ROWS);
     WxBoxSizer1->Add(BuildRadioBox, 0, wxGROW | wxALL, 5);
     delete array;
 
-    wxStaticBox* WxStaticBox1 = new wxStaticBox(this, wxID_ANY, _("Details:"));
+    wxStaticBox* WxStaticBox1 = new wxStaticBox(this, wxID_ANY, wxT("Details:"));
     wxStaticBoxSizer* WxStaticBoxSizer2 = new wxStaticBoxSizer(WxStaticBox1,
         wxVERTICAL);
     DetailText = new wxStaticText(this, wxID_ANY, wxT(""));
@@ -497,13 +759,13 @@
     WxStaticBoxSizer2->Add(DetailText, 1, wxGROW | wxALL, 5);
 
     wxStaticText* WxStaticText2 = new wxStaticText(this, wxID_ANY,
-        _("Rockbox Utility stores copies of Rockbox it has downloaded on the\n"
+        wxT("Rockbox Utility stores copies of Rockbox it has downloaded on the\n"
         "local hard disk to save network traffic.  If your local copy is\n"
         "no longer working, tick this box to download a fresh copy.") );
     WxBoxSizer1->Add(WxStaticText2, 0 , wxALL, 5);
 
     NoCacheCheckBox = new wxCheckBox(this, wxID_ANY,
-        _("Don't use locally cached copies of Rockbox") );
+        wxT("Don't use locally cached copies of Rockbox") );
     WxBoxSizer1->Add(NoCacheCheckBox, 0, wxALL, 5);
 
     SetSizer(WxBoxSizer1);
@@ -577,7 +839,7 @@
 	wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
 
     wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
-        _("Rockbox Utility normally uninstalls Rockbox using an uninstall\n"
+        wxT("Rockbox Utility normally uninstalls Rockbox using an uninstall\n"
           "file created during installation.  This means that when Rockbox is\n"
           "uninstalled all your configuration files are preserved.  However,\n"
           "you can also perform a full uninstall, which will completely\n"
@@ -588,7 +850,7 @@
     WxBoxSizer1->Add(WxStaticText1,0,wxGROW | wxALL,5);
 
     FullCheckBox = new wxCheckBox(this, wxID_ANY,
-        _("Perform a full uninstall"));
+        wxT("Perform a full uninstall"));
     WxBoxSizer1->Add(FullCheckBox, 0, wxALL, 5);
 
     SetSizer(WxBoxSizer1);
Index: rbutil/uninstall_3d.xpm
===================================================================
--- rbutil/uninstall_3d.xpm	(Revision 12646)
+++ rbutil/uninstall_3d.xpm	(Arbeitskopie)
@@ -1,286 +1,313 @@
-/* WxBitmapButton2 XPM */
-static char *uninstall_3d_xpm[]={
-"56 46 236 2",
-"      c None",
-" 0    c #BEBABE",
-" 1    c #BEC3BE",
-" 2    c #000011",
-" 3    c #AEAAAE",
-" 4    c #9E9A9E",
-" 5    c #C0B3AE",
-" 6    c #C97577",
-" 7    c #C45759",
-" 8    c #BF6B6D",
-" 9    c #BEB9BD",
-" a    c #BFB1B5",
-" b    c #C49793",
-" c    c #CE5254",
-" d    c #D81413",
-" e    c #DB0505",
-" f    c #DB0303",
-" g    c #D81717",
-" h    c #CB6668",
-" i    c #C1A6AA",
-" j    c #C64E50",
-" k    c #D71E1F",
-" l    c #D31F1F",
-" m    c #CF4C4D",
-" n    c #BA797D",
-" o    c #C29EA2",
-" p    c #AFA4A8",
-" q    c #C0AAAE",
-" r    c #C25C5E",
-" s    c #D6201E",
-" t    c #DA0606",
-" u    c #D81A1B",
-" v    c #CD5D5F",
-" w    c #D90E0D",
-" x    c #D62423",
-" y    c #C68789",
-" z    c #010101",
-" A    c #130101",
-" B    c #650101",
-" C    c #C40202",
-" D    c #DA0202",
-" E    c #DB0202",
-" F    c #D42F30",
-" G    c #D81516",
-" H    c #C3595B",
-" I    c #C2A49F",
-" J    c #D62424",
-" K    c #DA0607",
-" L    c #D14244",
-" M    c #DB0404",
-" N    c #D90909",
-" O    c #A10101",
-" P    c #CA6B6D",
-" Q    c #070101",
-" R    c #3F000C",
-" S    c #CD0202",
-" T    c #DB0203",
-" U    c #D90C0C",
-" V    c #CE5556",
-" W    c #C0B2AD",
-" X    c #C7BAC7",
-" Y    c #C59591",
-" Z    c #D41E1E",
-" &    c #CE0203",
-"0     c #A1246B",
-"00    c #6F42C7",
-"01    c #604BE2",
-"02    c #9D2774",
-"03    c #D80409",
-"04    c #B40202",
-"05    c #AE3C48",
-"06    c #8E687A",
-"07    c #AFA5A9",
-"08    c #C49397",
-"09    c #D04546",
-"0a    c #CB0202",
-"0b    c #DA0305",
-"0c    c #D60409",
-"0d    c #A91F5D",
-"0e    c #300101",
-"0f    c #BEB4B8",
-"0g    c #8E8A8E",
-"0h    c #79869E",
-"0i    c #B49194",
-"0j    c #C77D7F",
-"0k    c #D41A1B",
-"0l    c #783CB5",
-"0m    c #5552F7",
-"0n    c #AEAEB6",
-"0o    c #B19B9F",
-"0p    c #CC6163",
-"0q    c #CC0202",
-"0r    c #DA0A0A",
-"0s    c #932D85",
-"0t    c #5155FF",
-"0u    c #C16263",
-"0v    c #D33432",
-"0w    c #D90707",
-"0x    c #C50F29",
-"0y    c #6449DC",
-"0z    c #B6AEB6",
-"0A    c #CFC7CF",
-"0B    c #B58D91",
-"0C    c #CF0202",
-"0D    c #B21B4C",
-"0E    c #1F0101",
-"0F    c #C80202",
-"0G    c #6847D4",
-"0H    c #BA0202",
-"0I    c #D4060F",
-"0J    c #86349C",
-"0K    c #C11130",
-"0L    c #D5070F",
-"0M    c #773EB8",
-"0N    c #202496",
-"0O    c #252291",
-"0P    c #541A6D",
-"0Q    c #CE050D",
-"0R    c #D10202",
-"0S    c #5C4DE9",
-"0T    c #CC0B1E",
-"0U    c #D70509",
-"0V    c #8335A0",
-"0W    c #9696AE",
-"0X    c #511A6E",
-"0Y    c #CD050E",
-"0Z    c #D90B0B",
-"0&    c #400101",
-"1     c #6B44CD",
-"10    c #D4070F",
-"11    c #CE091A",
-"12    c #7992B6",
-"13    c #717986",
-"14    c #3F1E7D",
-"15    c #CE040C",
-"16    c #DA0909",
-"17    c #BA7B7E",
-"18    c #250101",
-"19    c #D30202",
-"1a    c #D51919",
-"1b    c #D81010",
-"1c    c #CF4644",
-"1d    c #C49894",
-"1e    c #690101",
-"1f    c #D80B0C",
-"1g    c #B97D80",
-"1h    c #DA0203",
-"1i    c #8B0101",
-"1j    c #060010",
-"1k    c #B48F92",
-"1l    c #D60202",
-"1m    c #BEB1B5",
-"1n    c #D71918",
-"1o    c #DA0B0B",
-"1p    c #C49194",
-"1q    c #B19C9F",
-"1r    c #CE2222",
-"1s    c #7A0101",
-"1t    c #CB6467",
-"1u    c #DC0404",
-"1v    c #DC0303",
-"1w    c #D33435",
-"1x    c #FCEAEA",
-"1y    c #C35C5E",
-"1z    c #DA0404",
-"1A    c #D90808",
-"1B    c #D81616",
-"1C    c #D20202",
-"1D    c #570101",
-"1E    c #9F9599",
-"1F    c #CC3839",
-"1G    c #CB6967",
-"1H    c #970101",
-"1I    c #B78587",
-"1J    c #BB0101",
-"1K    c #B48D91",
-"1L    c #FBE9E9",
-"1M    c #D9100F",
-"1N    c #D40202",
-"1O    c #3E0101",
-"1P    c #C04444",
-"1Q    c #D80202",
-"1R    c #AB777A",
-"1S    c #8D0202",
-"1T    c #9F0101",
-"1U    c #D41919",
-"1V    c #D51617",
-"1W    c #867488",
-"1X    c #D70607",
-"1Y    c #D40B0C",
-"1Z    c #7C0101",
-"1&    c #C0252C",
-"2     c #DA0304",
-"20    c #8186A7",
-"21    c #B8595B",
-"22    c #B78487",
-"23    c #B9787B",
-"24    c #CF6B72",
-"25    c #CF3031",
-"26    c #D80A0A",
-"27    c #CE0202",
-"28    c #D21F20",
-"29    c #D51112",
-"2a    c #D02728",
-"2b    c #CF2E2F",
-"2c    c #DA0303",
-"2d    c #B48E91",
-"2e    c #DA0505",
-"2f    c #BE4749",
-"2g    c #5E0101",
-"2h    c #B46163",
-"2i    c #AC7578",
-"2j    c #310101",
-"2k    c #CE2122",
-"2l    c #C33E40",
-"2m    c #C50202",
-"2n    c #D90202",
-"2o    c #600101",
-"2p    c #C63537",
-"2q    c #C94445",
-"2r    c #A69EA6",
-"2s    c #7F7D93",
-"2t    c #CF1215",
-"2u    c #CA191D",
-"2v    c #CA2C2D",
-"2w    c #DA0707",
-"2x    c #D60F0F",
-"2y    c #C43C3D",
-"2z    c #A58589",
-"2A    c #A97C7F",
-"2B    c #CE2223",
-"2C    c #A68589",
-"2D    c #A97D80",
-"2E    c #B59093",
-"2F    c #A09296",
-"2G    c #9E999D",
-"                                                                                                               0",
-"   0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 2",
-"   1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 2",
-"   1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 2",
-"   3 0 3 0 4 1 0 3 3 1 3 0 4 1 0 3 3 1 3 0 4 1 0 3 3 1 3 0 4 1 0 3 3 1 3 0 4 5 6 7 8 5 3 0 4 1 0 3 3 1 3 0 3 1 2",
-"   0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 9 a b c d e f g h 1 0 1 0 1 0 1 0 0 1 0 0 2",
-"   3 0 3 0 3 0 3 0 3 i j k l m n o p 1 3 0 3 0 3 0 3 0 3 0 3 0 3 q r s t f f f f f f u 3 0 3 0 3 0 3 1 3 0 3 0 2",
-"   0 1 0 1 0 3 0 0 1 v w f f f f x y 0 1 0 1 z z z z z z z z A B C D E E E E f f f f u 1 0 1 3 1 0 1 0 0 1 0 3 2",
-"   3 0 4 1 3 0 3 1 4 F f f f f f E E G H q z 0 1 0 1 0 1 0 I J f f f f f f f E f f K h 3 0 3 0 4 0 3 0 4 0 3 0 2",
-"   0 1 0 3 0 1 0 3 0 L M f f f E f E f f N O P A z 2 z Q R S T E T E T E T f E f U V W 0 3 1 0 1 3 1 0 1 3 0 1 2",
-"   3 0 3 0 3 X 4 1 3 Y Z f f E f f E f f f E f &0 00010203 f f f f f f f E t040506 p X 3 0 4 0 3 0 3 1 3 0 3 0 2",
-"   0 3 0 1 0 3 1 3 00708090a f f E f E E f E f E f f0b f f f f f f f0c0d0e0f 20g0h 0 3 1 0 1 3 0 3 0 3 0 0 1 3 2",
-"   3 0 3 0 4 0 3 0 3 0 4 Q0i0j04 f f f E E E E E E f f f f f f f f0k0l0m z 1 20h0h0n 0 3 0 3 0 3 0 4 1 3 1 3 0 2",
-"   0 3 X 3 0 3 0 3 0 3 1 z 1 z 00o0p0q f f f f E E f f f f f f0r0s W0t0t z 0 z0h0h 0 3 0 3 1 3 X 3 0 3 0 3 0 3 2",
-"   3 1 3 1 3 0 3 0 3 0 3 z z 0 3 0 z W0u0v0w E f E f f f f f f0x0y 30t0t z 1 z0h0h0z 0 3 0 4 0 3 1 3 0 3 0 4 1 2",
-"   3 3 0 3 3 30A 3 3 3 0 3 z 3 z z z z 00B0C f f E f f f f f f f0D 10t0t 2 0 z0h0h 3 3 0 3 3 3 0 3 3 3 X 3 3 3 2",
-"   3 0 3 0 3 0 4 0 3 0 3 0 3 z 3 0 3 00E0F f f f E f f f f f f f f0G0t0t z 1 z 40h 3 0 3 1 3 0 3 0 3 0 3 0 3 0 2",
-"   3 3 3 3 3 3 3 3 3 3 3 3 3 z z z z0E0H f f f f E0I0J0K f f f f f0L0M0m z 0 z0h0h 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2",
-"   3 0 3 0 3 0 3 0 3 X 3 0 3 z0N0O0P0Q E f f f f0R0G0t0S0T f f f f f0U0V z 1 20h0W 3 0 3 0 3 0 4 1 3 0 3 0 3 0 2",
-"   3 3 3 3 3 3 3 3 3 3 3 3 3 z0N0X0Y f E f f f0Z0&0t0t0t1 10 f f f f f11 z 0 z1213 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2",
-"   3 3 3 0 3 3 3 0 3 3 3 0 3 z1415 f f E f f1617 Q z z z z1819 E E E E E Q 1 z0h0h0n 3 3 0 3 3 3 0 3 3 3 0 3 3 2",
-"   3 3 3 3 3 3 3 3 3 3 3 3 3 A1a f f f E f1b17 3 z 1 1 1 1 11c f f f f f1d 0 z0h0h 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2",
-"   3 3 3 3 3 3 3 3 3 3 3 3 31e f f f f E1f1g p 3 z z 2 z 2 z0&1h E E E T1i1j z z z 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2",
-"   3 3 3 3 3 3 3 3 3 3 3 31k19 f f f f1l17 3 z 0 z 1 0 0 1 01m1n f f f f1o1p 1 0 0 z 3 3 3 3 3 3 3 3 3 3 3 3 3 2",
-"   4 3 3 3 4 3 3 3 4 3 31q1r E f f f f1s p z 3 3 z 0   1 0   11t1u f f1v f1w1x 1 0 z0h 3 3 4 3 3 3 4 3 3 3 4 3 2",
-"   3 3 3 3 3 3 3 3 3 3 31y1z E f f f1A A 3 3 z 3 z 1 0 0 1 0 0 W1B E E E E1C1D 0 0 z0h0h 3 3 3 3 3 3 3 3 3 3 3 2",
-"   3 3 4 3 4 3 4 3 3 31E0k f E f E f1F z 3 z 3 4 z 0 1 0 1 0 1 01G M E E f E1H Q 1 z0h0h0z 4 3 4 3 3 3 4 3 4 3 2",
-"   3 3 3 3 3 3 3 3 3 31I1z f E f f1J1K z 3 3 z 3 z 0   1 0   0 01L1M f E E E1N1O z z0h0h 3 3 3 3 3 3 3 3 3 3 3 2",
-"   4 3 4 3 4 3 4 3 4 31P f f E f1Q1R 3 z 3 z 3 4 z z z z z z z z z1S D E E E E1T z0h0h0h 3 4 3 4 3 4 3 4 3 4 3 2",
-"   3 3 3 3 3 3 3 3 3 31U f f E f1V Q 3 z 3 3 3 3 z0h0h0h0h0h0h0h0h1W1X f f f f1Y12130W0h 3 3 3 3 3 3 3 3 3 3 3 2",
-"   4 3 4 3 4 3 4 3 41q1z f f E f1Z 4 3 z 3 4 3 z z0h0h0h0W13120h0h0g1& f f f f2 201312 4 3 4 3 4 3 4 3 4 3 4 3 2",
-"   3 4 3 3 3 4 3 3 321 f f f E f22 z 4 z 3 3 z0h z z z z z z z z 20n23 f f f f f24 3 4 3 3 3 4 3 3 3 4 3 3 3 4 2",
-"   4 3 4 3 4 3 4 3 425 f f f E26 Q 4 3 z 3 z0h0h z 4 0 0 0 3 0 z z z Q27 E E f f281E 3 4 3 4 3 4 3 4 3 4 3 4 3 2",
-"   3 4 3 4 3 4 3 4 329 f f f E2a 4 3 4 z z0h0h0h0h z z z z z z z 3 0 02b f f E f2c2d 4 3 4 3 4 3 4 3 4 3 4 3 4 2",
-"   4 3 4 3 4 3 4 31E2e f f f E2f 3 4 3 z0h0h0W130z 4 z z z z 0 z z z z2g E E E E f2h 3 4 3 4 3 4 3 4 3 4 3 4 3 2",
-"   4 4 3 4 4 4 3 42i f f f f E2j z z z0W1312130n 4 4 4 z z z z z z z z A f E E E E2k 4 3 4 4 4 3 4 4 4 3 4 4 4 2",
-"   4 3 4 3 4 3 4 32l f f f f f1E0h0h0h0h0h0h0z0W 3 4 3 40h z z z z z z z2m E E E E2n 3 4 3 4 3 4 3 4 3 4 3 4 3 2",
-"   4 4 4 4 4 4 4 42k f f f f0w 40h0h0h0h0h 4 4 4 4 4 4 4 40h0h0h0h0h0h z2o E E E E E0h 4 4 4 4 4 4 4 4 4 4 4 4 2",
-"   4 3 4 3 4 3 4 32p2e f f M2q 4 32r 3 40n 4 3 4 3 4 3 4 0 4 3 4 X 4 30h2s2t f f f2u0h0h 3 4 3 4 3 4 3 4 3 4 3 2",
-"   4 4 4 4 4 4 4 42i2v2w2x2y2z 4 4 4 42r 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 42A2B f2B2A 42r 4 4 4 4 4 4 4 4 4 4 4 2",
-"   4 4 4 3 4 4 4 31E2C2D2E2F2G 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 2",
-"   4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2",
-"   4 3 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 4 4 4 4 2",
-"   4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2",
-"   4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2",
-" 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2"};
-
+/* XPM */
+static char * uninstall_3d_xpm[] = {
+"56 46 264 2",
+"  	c #FFFFFF",
+". 	c #BEBABE",
+"+ 	c #BEC3BE",
+"@ 	c #000011",
+"# 	c #AEAAAE",
+"$ 	c #9E9A9E",
+"% 	c #010101",
+"& 	c #79869E",
+"* 	c #C7BAC7",
+"= 	c #5155FF",
+"- 	c #5558FC",
+"; 	c #6A66E3",
+"> 	c #5F3C3B",
+", 	c #C67175",
+"' 	c #623841",
+") 	c #949194",
+"! 	c #BEBFBB",
+"~ 	c #BA7F82",
+"{ 	c #C97173",
+"] 	c #431C1D",
+"^ 	c #241D1D",
+"/ 	c #ADAAAE",
+"( 	c #6E5EDE",
+"_ 	c #BD8587",
+": 	c #A25A94",
+"< 	c #C2344A",
+"[ 	c #DA0909",
+"} 	c #DB0302",
+"| 	c #D51617",
+"1 	c #9A8B98",
+"2 	c #AEAEB6",
+"3 	c #C07B7E",
+"4 	c #D81111",
+"5 	c #DA0707",
+"6 	c #D71314",
+"7 	c #D13434",
+"8 	c #C49094",
+"9 	c #C0BCB8",
+"0 	c #0D0D0D",
+"a 	c #5558FE",
+"b 	c #5449BC",
+"c 	c #A2484A",
+"d 	c #CF1D26",
+"e 	c #DC0000",
+"f 	c #DD0000",
+"g 	c #A1848F",
+"h 	c #CE5456",
+"i 	c #DC0101",
+"j 	c #D01717",
+"k 	c #943857",
+"l 	c #4B1A1A",
+"m 	c #524ACB",
+"n 	c #4C4FEE",
+"o 	c #4A4DE5",
+"p 	c #7D57A6",
+"q 	c #D71F26",
+"r 	c #DB0000",
+"s 	c #DC0100",
+"t 	c #E20200",
+"u 	c #E10000",
+"v 	c #E00201",
+"w 	c #D90707",
+"x 	c #A13C3C",
+"y 	c #868EA1",
+"z 	c #B6AEB6",
+"A 	c #CFC7CF",
+"B 	c #452F2E",
+"C 	c #C92B2B",
+"D 	c #DE0101",
+"E 	c #DF0809",
+"F 	c #B80E1A",
+"G 	c #7D308D",
+"H 	c #6E3FBA",
+"I 	c #7F2C85",
+"J 	c #C70102",
+"K 	c #DE0000",
+"L 	c #DD0302",
+"M 	c #DE0203",
+"N 	c #B00E28",
+"O 	c #AC2945",
+"P 	c #6C0E18",
+"Q 	c #B4949B",
+"R 	c #222020",
+"S 	c #A6989C",
+"T 	c #A67578",
+"U 	c #9D3234",
+"V 	c #C90D0D",
+"W 	c #E50B0B",
+"X 	c #E50202",
+"Y 	c #E40304",
+"Z 	c #E40303",
+"` 	c #DF0303",
+" .	c #DB0303",
+"..	c #D90306",
+"+.	c #CE1723",
+"@.	c #753FC5",
+"#.	c #5449DC",
+"$.	c #5459F3",
+"%.	c #100C0D",
+"&.	c #48459B",
+"*.	c #63376A",
+"=.	c #B6374A",
+"-.	c #D1171C",
+";.	c #DB0202",
+">.	c #DE0202",
+",.	c #9F206C",
+"'.	c #6660EB",
+").	c #202496",
+"!.	c #202495",
+"~.	c #343798",
+"{.	c #B48083",
+"].	c #D80101",
+"^.	c #DC0303",
+"/.	c #DF0100",
+"(.	c #DE0200",
+"_.	c #DD0202",
+":.	c #B31143",
+"<.	c #645CEB",
+"[.	c #9696AE",
+"}.	c #1F2390",
+"|.	c #867274",
+"1.	c #BB1C1D",
+"2.	c #E40101",
+"3.	c #AF1F58",
+"4.	c #C51539",
+"5.	c #E30202",
+"6.	c #DC0201",
+"7.	c #A62566",
+"8.	c #5255FE",
+"9.	c #7992B6",
+"0.	c #717986",
+"a.	c #8E6C81",
+"b.	c #C40505",
+"c.	c #E10100",
+"d.	c #930000",
+"e.	c #0D040A",
+"f.	c #200610",
+"g.	c #B30307",
+"h.	c #E20102",
+"i.	c #DD0001",
+"j.	c #891034",
+"k.	c #080309",
+"l.	c #010103",
+"m.	c #9B7795",
+"n.	c #D80B16",
+"o.	c #E30201",
+"p.	c #DB0201",
+"q.	c #C84848",
+"r.	c #938D8A",
+"s.	c #887B78",
+"t.	c #D11111",
+"u.	c #E00202",
+"v.	c #EE0100",
+"w.	c #4D6A15",
+"x.	c #ADA9AD",
+"y.	c #28080B",
+"z.	c #DD0D11",
+"A.	c #DC0102",
+"B.	c #9F3435",
+"C.	c #322D2E",
+"D.	c #060707",
+"E.	c #77312F",
+"F.	c #8F2926",
+"G.	c #010111",
+"H.	c #B0A6AA",
+"I.	c #B30807",
+"J.	c #C66265",
+"K.	c #292728",
+"L.	c #B5A7AA",
+"M.	c #D60B0B",
+"N.	c #CF0303",
+"O.	c #A89595",
+"P.	c #A19CA0",
+"Q.	c #C35557",
+"R.	c #E00101",
+"S.	c #9E1717",
+"T.	c #A9A2A6",
+"U.	c #BFC4BF",
+"V.	c #CB6B6C",
+"W.	c #DF0000",
+"X.	c #E35A59",
+"Y.	c #BFC0BC",
+"Z.	c #B28C90",
+"`.	c #E80A0A",
+" +	c #370C0D",
+".+	c #C6BEBB",
+"++	c #E12F2E",
+"@+	c #DE0303",
+"#+	c #D60000",
+"$+	c #260000",
+"%+	c #121213",
+"&+	c #C05B5C",
+"*+	c #963334",
+"=+	c #A6A1A5",
+"-+	c #BBB8BC",
+";+	c #B05956",
+">+	c #E40202",
+",+	c #AE1414",
+"'+	c #040101",
+")+	c #AFA7AB",
+"!+	c #D30F0F",
+"~+	c #DC0202",
+"{+	c #CC0203",
+"]+	c #95898C",
+"^+	c #040404",
+"/+	c #BDB9BD",
+"(+	c #D0C9CB",
+"_+	c #D8171A",
+":+	c #261C23",
+"<+	c #513436",
+"[+	c #E10101",
+"}+	c #AE4042",
+"|+	c #131212",
+"1+	c #090909",
+"2+	c #812A2D",
+"3+	c #60333C",
+"4+	c #C05658",
+"5+	c #E60303",
+"6+	c #986365",
+"7+	c #766775",
+"8+	c #E30606",
+"9+	c #D12829",
+"0+	c #82899D",
+"a+	c #B72223",
+"b+	c #DD0101",
+"c+	c #D20607",
+"d+	c #A79194",
+"e+	c #928B8F",
+"f+	c #AF1113",
+"g+	c #DB0101",
+"h+	c #DA0404",
+"i+	c #9C8387",
+"j+	c #D01E1F",
+"k+	c #E10202",
+"l+	c #A50E0E",
+"m+	c #A49DA1",
+"n+	c #ADADB5",
+"o+	c #882C2D",
+"p+	c #EA0101",
+"q+	c #BD6063",
+"r+	c #ADAEB6",
+"s+	c #D90708",
+"t+	c #A9292A",
+"u+	c #1D0203",
+"v+	c #D90102",
+"w+	c #BE454A",
+"x+	c #CF2121",
+"y+	c #D51313",
+"z+	c #603A3B",
+"A+	c #080808",
+"B+	c #B4B1B6",
+"C+	c #BB6065",
+"D+	c #DB0807",
+"E+	c #5C3035",
+"F+	c #AE9598",
+"G+	c #AC8083",
+"H+	c #AE989C",
+"I+	c #080707",
+"J+	c #050506",
+"K+	c #141011",
+"L+	c #453133",
+"M+	c #453333",
+"N+	c #090808",
+"O+	c #A69EA6",
+"                                                                                                              . ",
+"  . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + @ ",
+"  + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . @ ",
+"  + . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . . + . . @ ",
+"  # . # . $ + . # # + # . $ + . # # + # . $ + . # # + # . $ + . # # + # . $ + . # # + # . $ + . # # + # . # + @ ",
+"  . + . + . + . + . . + . + . + . + . . + . + . + . . + . + . + . + . . + . + . + . . + . + . + . + . . + . . @ ",
+"  # . # . # . # . # . # . # . # . # + # . # . # . # . # . # . # . # + # . # . # . # . # . # . # . # + # . # . @ ",
+"  . + . + . # . . + . + . + # . + . . + . + % % % % % % % % % % % % % % % % # . . + . + . + # + . + . . + . # @ ",
+"  # . $ + # . # + $ . # . # . $ % % . # . % . + . + . + . + . + . + . . + . % # . $ . # . # . $ . # . $ . # . @ ",
+"  . + . # . + . # . . + # . + % # % + . # % . % % @ % % @ % @ % @ % @ % @ . % & # . + . # + . + # + . + # . + @ ",
+"  # . # . # * $ + # + # . # % # . % . # . % + @ = = = = = = = = = = = = % + % & & # * # . $ . # . # + # . # . @ ",
+"  . # . + . # + # . # . . % # . % + % % + % . % = = = = = = = + = + - ; > , ' ) & . # + . + # . # . # . . + # @ ",
+"  # . # . $ . # . # . $ % # . % ! ~ { ] ^ % % % % = = = = = = / ( _ : < [ } | 1 & 2 . # . # . # . $ + # + # . @ ",
+"  . # * # . # . # . # + % + % . 3 4 5 6 7 8 9 0 % = = = = a b c d e f f e f f g & . # . # + # * # . # . # . # @ ",
+"  # + # + # . # . # . # % % . # h e i e e e j k l m n = o p q r e s t u v w x y & z . # . $ . # + # . # . $ + @ ",
+"  # # . # # # A # # # . # % # % B C D e f e e f E F G H I J K L f M N O P Q R & & # # . # # # . # # # * # # # @ ",
+"  # . # . # . $ . # . # . # % # . S T U V W e e e u X Y Z `  ...+.@.#.$.% + % $ & # . # + # . # . # . # . # . @ ",
+"  # # # # # # # # # # # # # % % % % % %.&.*.=.-. .;.;. . . .>.,.'.= = = % . % & & # # # # # # # # # # # # # # @ ",
+"  # . # . # . # . # * # . # % ).).).).% ).!.~.{.].^.;./.(. ._.:.<.= = = % + @ & [.# . # . # . $ + # . # . # . @ ",
+"  # # # # # # # # # # # # # % ).).).).% ).}.|.1.` } 2.3.4.5.} 6.7.8.= = % . % 9.0.# # # # # # # # # # # # # # @ ",
+"  # # # . # # # . # # # . # % ).).).).% ).a.b.c. .e d.e.f.g.h.} i.j.k.% % + % & & 2 # # . # # # . # # # . # # @ ",
+"  # # # # # # # # # # # # # % # # # # l.m.n.o.p.K q.r.+ + s.t.u.6.v.w.+ + . % & & # # # # # # # # # # # # # # @ ",
+"  # # # # # # # # # # # # # % # # # x.y.z./.A.K B.C.@ % @ D.E.r  .u F.G.% @ % % % # # # # # # # # # # # # # # @ ",
+"  # # # # # # # # # # # # # % # # # H.I.c. .r J.K.+ . . + . L.M.i _.N.O.. . + . . % # # # # # # # # # # # # # @ ",
+"  $ # # # $ # # # $ # # # $ % # # P.Q.R. .X S.T.% .   + .   U.V.e ;.W.X.Y..   + . % & # # $ # # # $ # # # $ # @ ",
+"  # # # # # # # # # # # # # % # # Z.^.i i `. +# % + . . + . . .+++r @+#+$+% % . . % & & # # # # # # # # # # # @ ",
+"  # # $ # $ # $ # # # $ # $ % $ %+&+K ;.K *+=+$ % . + . + . + -+;+e ;.>+,+'+% % + % & & z $ # $ # # # $ # $ # @ ",
+"  # # # # # # # # # # # # # % # )+!+i ~+{+]+^+# % .   + .   . /+(+_+i ~+W.:+% % % % & & # # # # # # # # # # # @ ",
+"  $ # $ # $ # $ # $ # $ # $ % $ <+e  .[+}+|+# $ % % % % % % % % 1+2+K  .W.3+% % % & & & # $ # $ # $ # $ # $ # @ ",
+"  # # # # # # # # # # # # # % # 4+f ;.5+6+# # # % & & & & & & & & 7+8+;.e 9+0+& 9.0.[.& # # # # # # # # # # # @ ",
+"  $ # $ # $ # $ # $ # $ # $ % $ a+f b+c+d+$ # % % & & & [.0.9.& & e+f+[+g+h+i+0.9.0.9.$ # $ # $ # $ # $ # $ # @ ",
+"  # $ # # # $ # # # $ # # # % # j+f k+l+m+# % & % % % % % % % % @ n+o+p+;.f q+r+* # $ # # # $ # # # $ # # # $ @ ",
+"  $ # $ # $ # $ # $ # $ # $ % $ s+s W.t+/ % & & % $ . . . # . % % % u+v+W.u w+$ # $ # $ # $ # $ # $ # $ # $ # @ ",
+"  # $ # $ # $ # $ # $ # $ # % # x+f y+z+A+& & & & % % % % % % % # . B+C+b+D+E+# $ # $ # $ # $ # $ # $ # $ # $ @ ",
+"  $ # $ # $ # $ # $ # $ # $ % $ F+G+H+I+& & [.0.z $ % % % % . % % % J+K+L+M+N+% # $ # $ # $ # $ # $ # $ # $ # @ ",
+"  $ $ # $ $ $ # $ $ $ # $ $ % % % % % [.0.9.0.2 $ $ $ % % % % % % % % % $ % % % % $ $ # $ $ $ # $ $ $ # $ $ $ @ ",
+"  $ # $ # $ # $ # $ # $ # $ # $ & & & & & & z [.# $ # $ & % % % % % % % % % % % % % # $ # $ # $ # $ # $ # $ # @ ",
+"  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ & & & & & $ $ $ $ $ $ $ $ & & & & & & % % % % % % % & $ $ $ $ $ $ $ $ $ $ $ $ @ ",
+"  $ # $ # $ # $ # $ # $ # $ # $ # O+# $ 2 $ # $ # $ # $ . $ # $ * $ # & & & & & & & & & # $ # $ # $ # $ # $ # @ ",
+"  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ O+$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ O+$ $ $ $ $ $ $ $ $ $ $ @ ",
+"  $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ $ # $ $ @ ",
+"  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @ ",
+"  $ # $ $ $ $ $ $ $ # $ $ $ $ $ $ $ # $ $ $ $ $ $ $ # $ $ $ $ $ $ $ # $ $ $ $ $ $ $ # $ $ $ $ $ $ $ # $ $ $ $ @ ",
+"  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @ ",
+"  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @ ",
+"+ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ "};
Index: rbutil/rbutil.cbp
===================================================================
--- rbutil/rbutil.cbp	(Revision 12646)
+++ rbutil/rbutil.cbp	(Arbeitskopie)
@@ -82,6 +82,10 @@
 			<Add library="oleaut32" />
 			<Add library="uuid" />
 			<Add library="libwxzlib" />
+			<Add library="libwxregex" />
+			<Add library="libwxpng" />
+			<Add library="libwxjpeg" />
+			<Add library="libwxtiff" />
 			<Add directory="$(#WX.lib)\gcc_lib$(WX_CFG)" />
 			<Add directory="$(#WX.lib)" />
 			<Add directory=".\" />
@@ -127,8 +131,10 @@
 		<Unit filename="rbutilFrm.cpp" />
 		<Unit filename="rbutilFrm.h" />
 		<Unit filename="rbutilFrm_XPM.xpm" />
+		<Unit filename="themes_3d.xpm" />
 		<Unit filename="tools2_3d.xpm" />
 		<Unit filename="uninstall_3d.xpm" />
+		<Unit filename="untools2_3d.xpm" />
 		<Unit filename="wizard.xpm" />
 		<Unit filename="wizard_pages.cpp" />
 		<Unit filename="wizard_pages.h" />
