Index: extensions/pLoader/trunk/src/Uploader/GUI/DlgCommon.pm
===================================================================
--- extensions/pLoader/trunk/src/Uploader/GUI/DlgCommon.pm	(revision 5183)
+++ extensions/pLoader/trunk/src/Uploader/GUI/DlgCommon.pm	(revision 5184)
@@ -46,4 +46,8 @@
         'Wx::CheckBox' => sub { my ( $ctrl ) = @_; Wx::Event::EVT_CHECKBOX( $ctrl, $ctrl, sub { $self->OnCheckBox(@_) } ); },
         'Wx::DatePickerCtrl' => sub { my ( $ctrl ) = @_; Wx::Event::EVT_DATE_CHANGED( $ctrl, $ctrl, sub { $self->OnDatePicker(@_) } ); },
+        'Wx::ComboBox' => sub { my ( $ctrl ) = @_;
+                              Wx::Event::EVT_COMBOBOX( $ctrl, $ctrl, sub { $self->OnComboBox(@_) } );
+                              Wx::Event::EVT_TEXT( $ctrl, $ctrl, sub { $self->OnComboBoxText(@_) } );
+                          },
     };
     
@@ -83,4 +87,25 @@
 
 
+sub OnComboBoxText {
+    my ( $self, $ctrl, $event ) = @_;
+
+    if( exists $ctrl->{_value}){
+        $event->Skip(1);
+    }
+    else{
+        my $id = $ctrl->GetId;
+        # change the property value
+        $self->properties->{$id}->{value}->(
+            $event->GetString
+        ) if exists $self->properties->{$id}->{value};
+
+        # exec the callback
+        $self->properties->{$id}->{frame_callback}->($self, $ctrl, $event) if exists
+            $self->properties->{$id}->{frame_callback};    
+    }
+
+}
+
+
 # what does happen when the text changes
 sub OnTextCtrl {
@@ -97,5 +122,4 @@
         $self->properties->{$id}->{frame_callback};    
     
-    $event->Skip;
 }
 
@@ -163,4 +187,35 @@
     $event->Skip;
 }
+
+
+sub OnComboBox {
+    my ( $self, $ctrl, $event ) = @_;
+     
+    my $id = $ctrl->GetId;
+
+    $ctrl->{_multi_selection_mode} = $self->properties->{$id}->{multi_selection_mode}->()
+        if exists $self->properties->{$id}->{multi_selection_mode};
+
+    my $selection = exists $self->properties->{$id}->{string_selection} ? $event->GetString : $event->GetSelection;
+
+    my $value = $self->properties->{$id}->{pre_process}->( $selection ) if exists
+        $self->properties->{$id}->{pre_process};    
+
+    if( exists $self->properties->{$id}->{value} ){
+        $value = $self->properties->{$id}->{value}->(
+            $value,
+            $selection,
+        );
+        # the item selected in the list is not the real value
+        # we place here the actual value
+        # to use in EVT_IDLE event, and overwrite the text field with it
+        $ctrl->{_value} = $value;
+    }
+
+    # exec the callback
+    $self->properties->{$id}->{frame_callback}->($self, $ctrl, $event) if exists
+        $self->properties->{$id}->{frame_callback};    
+}
+
 
 sub OnDatePicker {
@@ -196,4 +251,8 @@
                                   $ctrl->SetValue($date);
                             },
+    'Wx::ComboBox' => sub { 
+                          my ($ctrl, $value ) = @_; 
+                          $ctrl->SetValue($value) ; 
+                      },
 };
 
@@ -210,4 +269,5 @@
         my $ctrl =$self->FindWindow($_);
         if(defined $ctrl){
+            #printf("%s\n", $ctrl);
             # checkbox, static text
             $change_value->{ref $ctrl}->(
@@ -269,5 +329,5 @@
     my ( $self ) = @_;
 
-        map {
+    map {
         my $ctrl =$self->FindWindow($_);
         #printf("ctrl %s : %s\n", $_, $ctrl);        
Index: extensions/pLoader/trunk/src/Uploader/GUI/Frame.pm
===================================================================
--- extensions/pLoader/trunk/src/Uploader/GUI/Frame.pm	(revision 5183)
+++ extensions/pLoader/trunk/src/Uploader/GUI/Frame.pm	(revision 5184)
@@ -309,10 +309,18 @@
         {
             $main::CAPTION => { label=>gettext("Caption")},
-            $main::PHOTO_PROPERTIES_CAPTION => { 
+            $main::PHOTO_PROPERTIES_CAPTION => {
+                multi_selection_mode => sub { $self->multi_selection_mode },
+                string_selection => sub { return 1; },
                 value => sub {
+                    $self->imagelist->SetImageSelectionName(@_);
                     $self->multi_selection_mode ?
-                    $self->imagelist->SetImageSelectionName(@_):
-                    $self->imagelist->current_image->site_name(@_) 
+                    $self->imagelist->image_selection_name :
+                    $self->imagelist->current_image->site_name;
                 },
+                pre_process => sub { sub { $self->imagelist->GetCurrentImageDefaultName(@_); } },
+                choices =>
+                [
+                    map { gettext $_ } @{wxTheApp->default_photo_names}
+                ],
                 frame_callback => sub { $self->imageviewer_item_refresh(1); },
             },
Index: extensions/pLoader/trunk/src/Uploader/GUI/Layout/PhotoPropertiesCategoriesTags.pm
===================================================================
--- extensions/pLoader/trunk/src/Uploader/GUI/Layout/PhotoPropertiesCategoriesTags.pm	(revision 5183)
+++ extensions/pLoader/trunk/src/Uploader/GUI/Layout/PhotoPropertiesCategoriesTags.pm	(revision 5184)
@@ -12,5 +12,5 @@
 use Wx qw( wxALIGN_RIGHT wxALIGN_BOTTOM wxALIGN_CENTER wxALIGN_CENTER_VERTICAL wxALIGN_CENTER_HORIZONTAL );
 use Wx qw( wxTR_HAS_BUTTONS wxTR_LINES_AT_ROOT wxSUNKEN_BORDER wxLI_HORIZONTAL wxTE_MULTILINE );
-use Wx qw( wxDP_DROPDOWN );
+use Wx qw( wxDP_DROPDOWN wxCB_READONLY);
 
 # Bitmap functions
@@ -117,6 +117,6 @@
     my $topsizer = Wx::BoxSizer->new( wxVERTICAL );
 
-    $topsizer->Add( 
-        TextField(
+    $topsizer->Add(
+        ComboField(
             $parent,
             $main::CAPTION,
@@ -314,4 +314,67 @@
 }
 
+
+sub ComboField {
+    my ( $parent, $id_label, $id_ctrl, $expand ) = @_;
+
+    $expand ||=0;
+
+    my( $sizer ) = Wx::BoxSizer->new( wxVERTICAL );
+
+    $expand||=0;
+    
+    $sizer->Add( 
+        Wx::StaticText->new(
+            $parent,
+            $id_label,
+            "text",
+            wxDefaultPosition,
+            wxDefaultSize,
+            0
+        ),
+        0,
+        wxALL,
+        1 
+    );
+
+    my $ctrl = Wx::ComboBox->new(
+        $parent,
+        $id_ctrl,
+        "",
+        wxDefaultPosition,
+        [-1,-1],
+        [],
+        
+    );
+
+    # the EVT_COMBOBOX has set _value if we need to overwrite the default
+    # text. The list contains function names. We want to have the value returned by the function
+    # in the text field
+    Wx::Event::EVT_IDLE(
+        $ctrl,
+        sub { 
+            my ( $ctrl, $event ) = @_;
+            if(exists $ctrl->{_value}){
+                $ctrl->SetValue($ctrl->{_value}) if !$ctrl->{_multi_selection_mode};
+                delete $ctrl->{_value};
+                delete $ctrl->{_multi_selection_mode};
+            }
+        } 
+    );
+
+
+    $sizer->Add(
+        $ctrl,
+        $expand,
+        wxEXPAND|wxALL,
+        1 
+    );
+
+
+
+    $sizer;
+}
+
+
 sub _multi_selection_mode_panel_layout{
     my ( $panel ) = @_;
@@ -335,2 +398,5 @@
 
 }
+
+1;
+
Index: extensions/pLoader/trunk/src/Uploader/ImageList.pm
===================================================================
--- extensions/pLoader/trunk/src/Uploader/ImageList.pm	(revision 5183)
+++ extensions/pLoader/trunk/src/Uploader/ImageList.pm	(revision 5184)
@@ -30,5 +30,5 @@
 use Digest::MD5::File qw/file_md5_hex md5_hex/;
 use Wx::Locale qw/:default/;
-use Wx;
+use Wx qw/wxTheApp/;
 
 # this class implements a collection of image files with associated data
@@ -342,25 +342,51 @@
 }
 
+sub GetCurrentImageDefaultName {
+    my ( $self, $index, $pattern ) = @_;
+
+    $pattern = wxTheApp->eng_default_photo_names->{$pattern};
+
+    $self->SetCurrentImage($index);
+
+    my $img = $self->current_image;
+
+    $self->_photo_name_from_pattern(
+        $img->file,
+        $img->create_date,
+        $index,
+        $pattern
+    );
+}
 
 sub _default_photo_name {
     my ( $self, $file, $info, $i ) = @_;
-    
-    
+
+    my $create_date = $info->{CreateDate};
+    
+    
+    $self->_photo_name_from_pattern($file, $create_date, $i, $self->default_photo_name);
+}
+
+
+sub _photo_name_from_pattern {
+    my ( $self, $file, $create_date, $i, $pattern ) = @_;
+
+    my ( $yyyy, $mm, $dd, $hh, $mi, $ss ) = split /[:\s]/, $create_date ;
+  
+    my $chrono = join('', $yyyy, $mm, $dd);
+
     my $name;
-    my $create_date = $info->{CreateDate};
     my $ext;
     my ( $vol, $path, $filename ) = File::Spec->splitpath($file);
     ( $filename, $ext ) = split /\.\w+$/, $filename;
     
-    my ( $yyyy, $mm, $dd, $hh, $mi, $ss ) = split /[:\s]/, $create_date ;
-  
-    my $chrono = join('', $yyyy, $mm, $dd);
-    if('Prefix' eq $self->default_photo_name){
+
+    if('Prefix' eq $pattern){
         $name = $self->default_name_prefix
     }
-    elsif('File name' eq $self->default_photo_name){
+    elsif('File name' eq $pattern){
         $name = $filename
     }
-    elsif('File path and name' eq $self->default_photo_name){
+    elsif('File path and name' eq $pattern){
         $name = sprintf(
             "%s", 
@@ -368,5 +394,5 @@
         )        
     }    
-    elsif('Prefix + rank number' eq $self->default_photo_name){
+    elsif('Prefix + rank number' eq $pattern){
         $name = sprintf(
             "%s%s", 
@@ -375,5 +401,5 @@
         )        
     }    
-    elsif('Rank number + prefix' eq $self->default_photo_name){
+    elsif('Rank number + prefix' eq $pattern){
         $name = sprintf(
             "%s%s", 
@@ -382,5 +408,5 @@
         )        
     }    
-    elsif('Prefix + create date chrono' eq $self->default_photo_name){
+    elsif('Prefix + create date chrono' eq $pattern){
         $name = sprintf(
             "%s%s", 
@@ -389,5 +415,5 @@
         )        
     }    
-    elsif('Create date chrono + prefix' eq $self->default_photo_name){
+    elsif('Create date chrono + prefix' eq $pattern){
         $name = sprintf(
             "%s%s", 
@@ -1422,5 +1448,4 @@
     $self->image_selection_tags($tags) if 'ARRAY' eq ref $tags;
 
-    #print Dumper $self->image_selection_tags;
     # append to each image
     # if multiple selection
@@ -1466,21 +1491,21 @@
 }
 
+
 sub SetImageSelectionName {
-    my ( $self, $name ) = @_;
-
-    # append to each image
-    # if multiple selection
-    if($self->multi_selection_mode){
-        if(defined $name){
-            $self->image_selection_name($name);
-            map {
-                $self->GetImage($_)->site_name(
-                    $name
-                ) ;
-            }@{$self->image_selection}
-        };
-    }
-
-    $self->image_selection_name;
+    my ( $self, $name, $param ) = @_;
+    
+    # works in single and multi selection mode
+    if(defined $name){
+        map {
+            my $_name = 'CODE' eq ref $name ?
+                $name->($_, $param) :
+                $name;
+            $self->image_selection_name($_name);
+
+            $self->GetImage($_)->site_name(
+                $_name
+            ) ;
+        }@{$self->image_selection}
+    }
 }
 
